1
0
Эх сурвалжийг харах

chore(core): Update i18next dependencies (#2263)

* chore: Update i18next

* refactor: consistent error message quotes, updated tests
Andreas Sonnleitner 2 жил өмнө
parent
commit
9b90b96103

+ 1 - 1
packages/core/e2e/administrator.e2e-spec.ts

@@ -117,7 +117,7 @@ describe('Administrator resolver', () => {
                         roleIds: ['999'],
                     },
                 }),
-            'No Role with the id \'999\' could be found',
+            'No Role with the id "999" could be found',
         ),
     );
 

+ 1 - 1
packages/core/e2e/asset.e2e-spec.ts

@@ -256,7 +256,7 @@ describe('Asset resolver', () => {
 
             expect(createAssets.length).toBe(1);
             expect(createAssets[0]).toEqual({
-                message: 'The MIME type \'text/plain\' is not permitted.',
+                message: 'The MIME type "text/plain" is not permitted.',
                 mimeType: 'text/plain',
                 fileName: 'dummy.txt',
             });

+ 1 - 1
packages/core/e2e/collection.e2e-spec.ts

@@ -1020,7 +1020,7 @@ describe('Collection resolver', () => {
                 >(DELETE_COLLECTION, {
                     id: 'T_999',
                 });
-            }, 'No Collection with the id \'999\' could be found'),
+            }, 'No Collection with the id "999" could be found'),
         );
 
         it('collection and product related prior to deletion', async () => {

+ 1 - 1
packages/core/e2e/configurable-operation.e2e-spec.ts

@@ -118,7 +118,7 @@ describe('Configurable operations', () => {
                         },
                     },
                 );
-            }, 'The argument \'required\' is required'),
+            }, 'The argument "required" is required'),
         );
     });
 

+ 10 - 10
packages/core/e2e/custom-fields.e2e-spec.ts

@@ -352,7 +352,7 @@ describe('Custom fields', () => {
                     }
                 }
             `);
-        }, "The custom field 'notNullable' value cannot be set to null"),
+        }, 'The custom field "notNullable" value cannot be set to null'),
     );
 
     it(
@@ -380,7 +380,7 @@ describe('Custom fields', () => {
                     }
                 }
             `);
-        }, "The custom field 'score' is readonly"),
+        }, 'The custom field "score" is readonly'),
     );
 
     it(
@@ -457,7 +457,7 @@ describe('Custom fields', () => {
                         }
                     }
                 `);
-            }, "The custom field 'validateString' value ['hello'] does not match the pattern [^[0-9][a-z]+$]"),
+            }, 'The custom field "validateString" value ["hello"] does not match the pattern [^[0-9][a-z]+$]'),
         );
 
         it(
@@ -470,7 +470,7 @@ describe('Custom fields', () => {
                         }
                     }
                 `);
-            }, "The custom field 'stringWithOptions' value ['tiny'] is invalid. Valid options are ['small', 'medium', 'large']"),
+            }, 'The custom field "stringWithOptions" value ["tiny"] is invalid. Valid options are [\'small\', \'medium\', \'large\']'),
         );
 
         it('valid string option', async () => {
@@ -522,7 +522,7 @@ describe('Custom fields', () => {
                         }
                     }
                 `);
-            }, "The custom field 'validateLocaleString' value ['servus'] does not match the pattern [^[0-9][a-z]+$]"),
+            }, 'The custom field "validateLocaleString" value ["servus"] does not match the pattern [^[0-9][a-z]+$]'),
         );
 
         it(
@@ -535,7 +535,7 @@ describe('Custom fields', () => {
                         }
                     }
                 `);
-            }, "The custom field 'validateInt' value [12] is greater than the maximum [10]"),
+            }, 'The custom field "validateInt" value [12] is greater than the maximum [10]'),
         );
 
         it(
@@ -548,7 +548,7 @@ describe('Custom fields', () => {
                         }
                     }
                 `);
-            }, "The custom field 'validateFloat' value [10.6] is greater than the maximum [10.5]"),
+            }, 'The custom field "validateFloat" value [10.6] is greater than the maximum [10.5]'),
         );
 
         it(
@@ -566,7 +566,7 @@ describe('Custom fields', () => {
                         }
                     }
                 `);
-            }, "The custom field 'validateDateTime' value [2019-01-01T05:25:00.000Z] is less than the minimum [2019-01-01T08:30]"),
+            }, 'The custom field "validateDateTime" value [2019-01-01T05:25:00.000Z] is less than the minimum [2019-01-01T08:30]'),
         );
 
         it(
@@ -711,7 +711,7 @@ describe('Custom fields', () => {
                     fail('Should have thrown');
                 } catch (e) {
                     expect(e.message).toContain(
-                        "The custom field 'validateInt' value [11] is greater than the maximum [10]",
+                        'The custom field "validateInt" value [11] is greater than the maximum [10]',
                     );
                 }
 
@@ -751,7 +751,7 @@ describe('Custom fields', () => {
                     fail('Should have thrown');
                 } catch (e) {
                     expect(e.message).toContain(
-                        "The custom field 'validateInt' value [11] is greater than the maximum [10]",
+                        'The custom field "validateInt" value [11] is greater than the maximum [10]',
                     );
                 }
 

+ 5 - 5
packages/core/e2e/customer-channel.e2e-spec.ts

@@ -99,7 +99,7 @@ describe('ChannelAware Customers', () => {
                         streetLine1: 'Dummy street',
                     },
                 });
-            }, "No Address with the id '1' could be found"),
+            }, 'No Address with the id "1" could be found'),
         );
 
         it(
@@ -116,7 +116,7 @@ describe('ChannelAware Customers', () => {
                         countryCode: 'BE',
                     },
                 });
-            }, "No Customer with the id '1' could be found"),
+            }, 'No Customer with the id "1" could be found'),
         );
 
         it(
@@ -129,7 +129,7 @@ describe('ChannelAware Customers', () => {
                 >(DELETE_ADDRESS, {
                     id: 'T_1',
                 });
-            }, "No Address with the id '1' could be found"),
+            }, 'No Address with the id "1" could be found'),
         );
     });
 
@@ -144,7 +144,7 @@ describe('ChannelAware Customers', () => {
                 >(DELETE_CUSTOMER, {
                     id: firstCustomer.id,
                 });
-            }, "No Customer with the id '1' could be found"),
+            }, 'No Customer with the id "1" could be found'),
         );
 
         it(
@@ -161,7 +161,7 @@ describe('ChannelAware Customers', () => {
                         lastName: 'Doe',
                     },
                 });
-            }, "No Customer with the id '1' could be found"),
+            }, 'No Customer with the id "1" could be found'),
         );
 
         it('creates customers on current and default channel', async () => {

+ 2 - 2
packages/core/e2e/customer.e2e-spec.ts

@@ -611,7 +611,7 @@ describe('Customer resolver', () => {
                             firstName: 'updated',
                         },
                     }),
-                "No Customer with the id '3' could be found",
+                'No Customer with the id "3" could be found',
             ),
         );
 
@@ -629,7 +629,7 @@ describe('Customer resolver', () => {
                             },
                         },
                     ),
-                "No Customer with the id '3' could be found",
+                'No Customer with the id "3" could be found',
             ),
         );
 

+ 1 - 1
packages/core/e2e/facet.e2e-spec.ts

@@ -647,7 +647,7 @@ describe('Facet resolver', () => {
                         },
                     ],
                 });
-            }, "No Facet with the id '1' could be found"),
+            }, 'No Facet with the id "1" could be found'),
         );
 
         it('removing from channel with error', async () => {

+ 2 - 2
packages/core/e2e/order.e2e-spec.ts

@@ -523,7 +523,7 @@ describe('Orders resolver', () => {
                 Codegen.GetOrderHistoryQuery,
                 Codegen.GetOrderHistoryQueryVariables
             >(GET_ORDER_HISTORY, { id: 'T_2', options: { sort: { id: SortOrder.ASC } } });
-            expect(order!.history.items.map(pick(['type', 'data']))).toEqual([
+            expect(order.history.items.map(pick(['type', 'data']))).toEqual([
                 {
                     type: HistoryEntryType.ORDER_STATE_TRANSITION,
                     data: {
@@ -1668,7 +1668,7 @@ describe('Orders resolver', () => {
                         paymentId: 'T_999',
                     },
                 });
-            }, "No Payment with the id '999' could be found"),
+            }, 'No Payment with the id "999" could be found'),
         );
 
         it('returns error result if payment and order lines do not belong to the same Order', async () => {

+ 1 - 1
packages/core/e2e/product-channel.e2e-spec.ts

@@ -482,7 +482,7 @@ describe('ChannelAware Products and ProductVariants', () => {
                         translations: [{ languageCode: LanguageCode.en, name: 'xyz' }],
                     },
                 });
-            }, "No Product with the id '2' could be found"),
+            }, 'No Product with the id "2" could be found'),
         );
     });
 });

+ 2 - 2
packages/core/e2e/product-option.e2e-spec.ts

@@ -109,7 +109,7 @@ describe('ProductOption resolver', () => {
                     ],
                 },
             });
-        }, "No ProductOptionGroup with the id '999' could be found"),
+        }, 'No ProductOptionGroup with the id "999" could be found'),
     );
 
     it('createProductOption', async () => {
@@ -217,7 +217,7 @@ describe('ProductOption resolver', () => {
                     >(DELETE_PRODUCT_OPTION, {
                         id: '999999',
                     }),
-                "No ProductOption with the id '999999' could be found",
+                'No ProductOption with the id "999999" could be found',
             ),
         );
 

+ 9 - 9
packages/core/e2e/product.e2e-spec.ts

@@ -1204,7 +1204,7 @@ describe('Product resolver', () => {
                             },
                         },
                     ),
-                "No Product with the id '999' could be found",
+                'No Product with the id "999" could be found',
             ),
         );
 
@@ -1242,7 +1242,7 @@ describe('Product resolver', () => {
                         optionGroupId: 'T_1',
                         productId: 'T_999',
                     }),
-                "No Product with the id '999' could be found",
+                'No Product with the id "999" could be found',
             ),
         );
 
@@ -1272,7 +1272,7 @@ describe('Product resolver', () => {
                         optionGroupId: '999',
                         productId: newProduct.id,
                     }),
-                "No ProductOptionGroup with the id '999' could be found",
+                'No ProductOptionGroup with the id "999" could be found',
             ),
         );
 
@@ -1355,7 +1355,7 @@ describe('Product resolver', () => {
                         optionGroupId: '1',
                         productId: '999',
                     }),
-                "No Product with the id '999' could be found",
+                'No Product with the id "999" could be found',
             ),
         );
 
@@ -1370,7 +1370,7 @@ describe('Product resolver', () => {
                         optionGroupId: '999',
                         productId: newProduct.id,
                     }),
-                "No ProductOptionGroup with the id '999' could be found",
+                'No ProductOptionGroup with the id "999" could be found',
             ),
         );
 
@@ -1667,7 +1667,7 @@ describe('Product resolver', () => {
                                 },
                             ],
                         }),
-                    "No ProductVariant with the id '999' could be found",
+                    'No ProductVariant with the id "999" could be found',
                 ),
             );
 
@@ -2117,7 +2117,7 @@ describe('Product resolver', () => {
                             },
                         },
                     ),
-                "No Product with the id '1' could be found",
+                'No Product with the id "1" could be found',
             ),
         );
 
@@ -2132,7 +2132,7 @@ describe('Product resolver', () => {
                         optionGroupId: 'T_1',
                         productId: productToDelete.id,
                     }),
-                "No Product with the id '1' could be found",
+                'No Product with the id "1" could be found',
             ),
         );
 
@@ -2147,7 +2147,7 @@ describe('Product resolver', () => {
                         optionGroupId: 'T_1',
                         productId: productToDelete.id,
                     }),
-                "No Product with the id '1' could be found",
+                'No Product with the id "1" could be found',
             ),
         );
 

+ 1 - 1
packages/core/e2e/promotion.e2e-spec.ts

@@ -405,7 +405,7 @@ describe('Promotion resolver', () => {
                             enabled: false,
                         },
                     }),
-                "No Promotion with the id '1' could be found",
+                'No Promotion with the id "1" could be found',
             ),
         );
     });

+ 4 - 4
packages/core/e2e/role.e2e-spec.ts

@@ -289,7 +289,7 @@ describe('Role resolver', () => {
                         },
                     },
                 );
-            }, `The role '${SUPER_ADMIN_ROLE_CODE}' cannot be modified`),
+            }, `The role "${SUPER_ADMIN_ROLE_CODE}" cannot be modified`),
         );
 
         it(
@@ -311,7 +311,7 @@ describe('Role resolver', () => {
                         },
                     },
                 );
-            }, `The role '${CUSTOMER_ROLE_CODE}' cannot be modified`),
+            }, `The role "${CUSTOMER_ROLE_CODE}" cannot be modified`),
         );
     });
 
@@ -329,7 +329,7 @@ describe('Role resolver', () => {
                     id: customerRole.id,
                 },
             );
-        }, `The role '${CUSTOMER_ROLE_CODE}' cannot be deleted`),
+        }, `The role "${CUSTOMER_ROLE_CODE}" cannot be deleted`),
     );
 
     it(
@@ -346,7 +346,7 @@ describe('Role resolver', () => {
                     id: superAdminRole.id,
                 },
             );
-        }, `The role '${SUPER_ADMIN_ROLE_CODE}' cannot be deleted`),
+        }, `The role "${SUPER_ADMIN_ROLE_CODE}" cannot be deleted`),
     );
 
     it('deleteRole deletes a role', async () => {

+ 5 - 5
packages/core/e2e/shop-order.e2e-spec.ts

@@ -210,7 +210,7 @@ describe('Shop orders', () => {
                         productVariantId: 'T_999',
                         quantity: 1,
                     }),
-                "No ProductVariant with the id '999' could be found",
+                'No ProductVariant with the id "999" could be found',
             ),
         );
 
@@ -1937,7 +1937,7 @@ describe('Shop orders', () => {
                     productVariantId: bonsaiVariantId,
                     quantity: 1,
                 });
-            }, "No ProductVariant with the id '34' could be found"),
+            }, 'No ProductVariant with the id "34" could be found'),
         );
 
         it(
@@ -1971,7 +1971,7 @@ describe('Shop orders', () => {
                     productVariantId: bonsaiVariantId,
                     quantity: 1,
                 });
-            }, "No ProductVariant with the id '34' could be found"),
+            }, 'No ProductVariant with the id "34" could be found'),
         );
         it(
             'addItemToOrder errors when product is deleted',
@@ -1990,7 +1990,7 @@ describe('Shop orders', () => {
                     productVariantId: bonsaiVariantId,
                     quantity: 1,
                 });
-            }, "No ProductVariant with the id '34' could be found"),
+            }, 'No ProductVariant with the id "34" could be found'),
         );
         it(
             'addItemToOrder errors when product variant is deleted',
@@ -2009,7 +2009,7 @@ describe('Shop orders', () => {
                     productVariantId: bonsaiVariantId,
                     quantity: 1,
                 });
-            }, "No ProductVariant with the id '34' could be found"),
+            }, 'No ProductVariant with the id "34" could be found'),
         );
 
         let orderWithDeletedProductVariantId: string;

+ 1 - 1
packages/core/e2e/stock-control.e2e-spec.ts

@@ -861,7 +861,7 @@ describe('Stock control', () => {
 
             expect(addFulfillmentToOrder.errorCode).toBe(AdminErrorCode.INSUFFICIENT_STOCK_ON_HAND_ERROR);
             expect(addFulfillmentToOrder.message).toBe(
-                "Cannot create a Fulfillment as 'Laptop 15 inch 16GB' has insufficient stockOnHand (3)",
+                'Cannot create a Fulfillment as "Laptop 15 inch 16GB" has insufficient stockOnHand (3)',
             );
         });
 

+ 5 - 4
packages/core/package.json

@@ -68,11 +68,12 @@
         "graphql-tag": "^2.12.6",
         "graphql-upload": "^16.0.2",
         "http-proxy-middleware": "^2.0.1",
-        "i18next": "^19.8.1",
-        "i18next-express-middleware": "^2.0.0",
-        "i18next-fs-backend": "^1.1.1",
-        "i18next-icu": "^1.4.2",
+        "i18next": "^23.2.6",
+        "i18next-fs-backend": "^2.1.5",
+        "i18next-http-middleware": "^3.3.2",
+        "i18next-icu": "^2.3.0",
         "image-size": "^1.0.0",
+        "intl-messageformat": "^10.5.0",
         "mime-types": "^2.1.27",
         "ms": "^2.1.2",
         "nanoid": "^3.1.23",

+ 3 - 3
packages/core/src/i18n/i18n.service.ts

@@ -3,8 +3,8 @@ import { Handler, Request } from 'express';
 import * as fs from 'fs';
 import { GraphQLError } from 'graphql';
 import i18next, { TFunction } from 'i18next';
-import i18nextMiddleware from 'i18next-express-middleware';
 import Backend from 'i18next-fs-backend';
+import i18nextMiddleware from 'i18next-http-middleware';
 import ICU from 'i18next-icu';
 import path from 'path';
 
@@ -56,7 +56,7 @@ export class I18nService implements OnModuleInit {
         return i18next
             .use(i18nextMiddleware.LanguageDetector)
             .use(Backend as any)
-            .use(ICU as any)
+            .use(ICU)
             .init({
                 nsSeparator: false,
                 preload: ['en', 'de', 'ru', 'uk'],
@@ -141,7 +141,7 @@ export class I18nService implements OnModuleInit {
         let translation: string = error.message;
         const key = `errorResult.${error.message}`;
         try {
-            translation = t(key, error as any);
+            translation = t(key, error);
         } catch (e: any) {
             const message = typeof e.message === 'string' ? (e.message as string) : JSON.stringify(e.message);
             translation += ` (Translation format error: ${message})`;

+ 4 - 4
packages/core/src/i18n/messages/de.json

@@ -105,10 +105,10 @@
     "cannot-transition-without-modification-payment": "Die Bestellung kann nur in den Status \"ArrangingAdditionalPayment\" übergehen",
     "cannot-transition-without-settled-payments": "Die Bestellung kann nicht in den Status \"PaymentSettled\" übergehen, da die Summe noch nicht komplett abgerechnet ist",
     "country-used-in-addresses": "Das gewählte Land kann nicht gelöscht werden, da es von {count, plural, one {einer Adresse} other {# Adressen}} genutzt wird",
-    "facet-force-deleted": "Die Facette wurde gelöscht und ihre FacetValues wurden von {products, plural, =0 {} one {einem Produkt} other {# Produkten}}{both, select, both { und } single {}}{variants, plural, =0 {} one {einer Produktvariante} other {# Produktvariantem}} entfernt",
-    "facet-used": "Die ausgewählte Facette enthält FacetValues, die {products, plural, =0 {} one {einem Produkt} other {# Produkten}}{both, select, both { und } single {}}{variants, plural, =0 {} one {einer Produktvariante} other {# Produktvarianten}} zugewiesen sind",
-    "facet-value-force-deleted": "Der gewählte FacetValue wurde von {products, plural, =0 {} one {einem Produkt} other {# Produkten}}{both, select, both { und } single {}}{variants, plural, =0 {} one {einer Produktvariante} other {# Produktvarianten}} entfernt und gelöscht",
-    "facet-value-used": "Der FacetValue \"{ facetValueCode }\" wurde {products, plural, =0 {} one {einem Produkt} other {# Produkten}}{both, select, both { und } single {}}{variants, plural, =0 {} one {einer Produktvariante} other {# Produktvarianten}} zugewiesen",
+    "facet-force-deleted": "Die Facette wurde gelöscht und ihre FacetValues wurden von {products, plural, =0 {} one {einem Produkt} other {# Produkten}}{both, select, both { und } single {} other {}}{variants, plural, =0 {} one {einer Produktvariante} other {# Produktvariantem}} entfernt",
+    "facet-used": "Die ausgewählte Facette enthält FacetValues, die {products, plural, =0 {} one {einem Produkt} other {# Produkten}}{both, select, both { und } single {} other {}}{variants, plural, =0 {} one {einer Produktvariante} other {# Produktvarianten}} zugewiesen sind",
+    "facet-value-force-deleted": "Der gewählte FacetValue wurde von {products, plural, =0 {} one {einem Produkt} other {# Produkten}}{both, select, both { und } single {} other {}}{variants, plural, =0 {} one {einer Produktvariante} other {# Produktvarianten}} entfernt und gelöscht",
+    "facet-value-used": "Der FacetValue \"{ facetValueCode }\" wurde {products, plural, =0 {} one {einem Produkt} other {# Produkten}}{both, select, both { und } single {} other {}}{variants, plural, =0 {} one {einer Produktvariante} other {# Produktvarianten}} zugewiesen",
     "payment-method-used-in-channels": "Die gewählte Zahlungsmethode wird von den folgenden Kanälen verwendet: { channelCodes }. Mit \"force: true\" wird sie von allen Kanälen entfernt.",
     "zone-used-in-channels": "Die ausgewählte Zone kann nicht gelöscht werden, da sie als Standard in den folgenden Kanälen verwendet wird: { channelCodes }",
     "zone-used-in-tax-rates": "Die ausgewählte Zone kann nicht gelöscht werden, da sie in den folgenden Steuersätzen verwendet wird: { taxRateNames }"

+ 23 - 23
packages/core/src/i18n/messages/en.json

@@ -1,10 +1,10 @@
 {
   "error": {
     "active-user-does-not-have-sufficient-permissions": "Active user does not have sufficient permissions",
-    "cannot-delete-role": "The role '{ roleCode }' cannot be deleted",
+    "cannot-delete-role": "The role \"{ roleCode }\" cannot be deleted",
     "cannot-delete-sole-superadmin": "The sole SuperAdmin cannot be deleted",
     "cannot-locate-customer-for-user": "Cannot locate a Customer for the user",
-    "cannot-modify-role": "The role '{ roleCode }' cannot be modified",
+    "cannot-modify-role": "The role \"{ roleCode }\" cannot be modified",
     "cannot-create-sales-for-active-order": "Cannot create a Sale for an Order which is still active",
     "cannot-move-collection-into-self": "Cannot move a Collection into itself",
     "cannot-transition-payment-from-to": "Cannot transition Payment from \"{ fromState }\" to \"{ toState }\"",
@@ -13,30 +13,30 @@
     "channel-not-found": "No Channel with the token \"{ token }\" could be found",
     "collection-id-or-slug-must-be-provided": "Either the Collection id or slug must be provided",
     "collection-id-slug-mismatch": "The provided id and slug refer to different Collections",
-    "conditions-required-for-action": "The PromotionAction '{ action }' requires the following conditions: { conditions }",
-    "configurable-argument-is-required": "The argument '{ name }' is required",
+    "conditions-required-for-action": "The PromotionAction \"{ action }\" requires the following conditions: { conditions }",
+    "configurable-argument-is-required": "The argument \"{ name }\" is required",
     "country-code-not-valid": "The countryCode \"{ countryCode }\" was not recognized",
     "currency-not-available-in-channel": "The currency \"{ currencyCode }\" is not available in the current Channel",
     "customer-does-not-belong-to-customer-group": "Customer does not belong to this CustomerGroup",
     "default-channel-not-found": "Default channel not found",
-    "entity-has-no-translation-in-language": "Translatable entity '{ entityName }' has not been translated into the requested language ({ languageCode })",
-    "entity-with-id-not-found": "No { entityName } with the id '{ id }' could be found",
+    "entity-has-no-translation-in-language": "Translatable entity \"{ entityName }\" has not been translated into the requested language ({ languageCode })",
+    "entity-with-id-not-found": "No { entityName } with the id \"{ id }\" could be found",
     "items-cannot-be-removed-from-default-channel": "Items cannot be removed from the default Channel",
     "facetfilterinput-invalid-input": "A FacetValueFilterInput object may not specify the 'and' and 'or' fields simultaneously",
-    "field-invalid-datetime-range-max": "The custom field '{ name }' value [{ value }] is greater than the maximum [{ max }]",
-    "field-invalid-datetime-range-min": "The custom field '{ name }' value [{ value }] is less than the minimum [{ min }]",
-    "field-invalid-non-nullable": "The custom field '{ name }' value cannot be set to null",
-    "field-invalid-number-range-max": "The custom field '{ name }' value [{ value }] is greater than the maximum [{ max }]",
-    "field-invalid-number-range-min": "The custom field '{ name }' value [{ value }] is less than the minimum [{ min }]",
-    "field-invalid-readonly": "The custom field '{ name }' is readonly",
-    "field-invalid-string-option": "The custom field '{ name }' value ['{ value }'] is invalid. Valid options are [{ validOptions }]",
-    "field-invalid-string-pattern": "The custom field '{ name }' value ['{ value }'] does not match the pattern [{ pattern }]",
+    "field-invalid-datetime-range-max": "The custom field \"{ name }\" value [{ value }] is greater than the maximum [{ max }]",
+    "field-invalid-datetime-range-min": "The custom field \"{ name }\" value [{ value }] is less than the minimum [{ min }]",
+    "field-invalid-non-nullable": "The custom field \"{ name }\" value cannot be set to null",
+    "field-invalid-number-range-max": "The custom field \"{ name }\" value [{ value }] is greater than the maximum [{ max }]",
+    "field-invalid-number-range-min": "The custom field \"{ name }\" value [{ value }] is less than the minimum [{ min }]",
+    "field-invalid-readonly": "The custom field \"{ name }\" is readonly",
+    "field-invalid-string-option": "The custom field \"{ name }\" value [\"{ value }\"] is invalid. Valid options are [{ validOptions }]",
+    "field-invalid-string-pattern": "The custom field \"{ name }\" value [\"{ value }\"] does not match the pattern [{ pattern }]",
     "forbidden": "You are not currently authorized to perform this action",
-    "invalid-sort-field": "The sort field '{ fieldName }' is invalid. Valid fields are: { validFields }",
+    "invalid-sort-field": "The sort field \"{ fieldName }\" is invalid. Valid fields are: { validFields }",
     "list-query-limit-exceeded": "Cannot take more than { limit } results from a list query",
     "no-active-tax-zone": "The active tax zone could not be determined. Ensure a default tax zone is set for the current channel.",
-    "no-configurable-operation-def-with-code-found": "No { type } with the code '{ code }' could be found",
-    "no-price-found-for-channel": "No price information was found for ProductVariant ID '{ variantId}' in the Channel '{ channel }'.",
+    "no-configurable-operation-def-with-code-found": "No { type } with the code \"{ code }\" could be found",
+    "no-price-found-for-channel": "No price information was found for ProductVariant ID \"{ variantId}\" in the Channel \"{ channel }\".",
     "no-search-plugin-configured": "No search plugin has been configured",
     "order-could-not-be-determined-or-created": "No active Order could be determined nor created",
     "order-does-not-contain-line-with-id": "This order does not contain an OrderLine with the id { id }",
@@ -68,12 +68,12 @@
     "IDENTIFIER_CHANGE_TOKEN_INVALID_ERROR": "Identifier change token not recognized",
     "INELIGIBLE_SHIPPING_METHOD_ERROR": "This Order is not eligible for the selected ShippingMethod",
     "INSUFFICIENT_STOCK_ERROR": "{quantityAvailable, plural, =0 {No items were} one {Only 1 item was} other {Only # items were}} added to the order due to insufficient stock",
-    "INSUFFICIENT_STOCK_ON_HAND_ERROR": "Cannot create a Fulfillment as '{productVariantName}' has insufficient stockOnHand ({stockOnHand})",
+    "INSUFFICIENT_STOCK_ON_HAND_ERROR": "Cannot create a Fulfillment as \"{productVariantName}\" has insufficient stockOnHand ({stockOnHand})",
     "INVALID_CREDENTIALS_ERROR": "The provided credentials are invalid",
     "ITEMS_ALREADY_FULFILLED_ERROR": "One or more OrderItems are already part of a Fulfillment",
     "LANGUAGE_NOT_AVAILABLE_ERROR": "Language \"{languageCode}\" is not available. First enable it via GlobalSettings and try again",
     "MANUAL_PAYMENT_STATE_ERROR": "A manual payment may only be added when in the \"ArrangingPayment\" or \"ArrangingAdditionalPayment\" states",
-    "MIME_TYPE_ERROR": "The MIME type '{ mimeType }' is not permitted.",
+    "MIME_TYPE_ERROR": "The MIME type \"{ mimeType }\" is not permitted.",
     "MISSING_CONDITIONS_ERROR": "A Promotion must have either at least one condition or a coupon code set",
     "MISSING_PASSWORD_ERROR": "A password must be provided.",
     "NEGATIVE_QUANTITY_ERROR": "The quantity for an OrderItem cannot be negative",
@@ -120,10 +120,10 @@
     "cannot-transition-without-modification-payment": "Can only transition to the \"ArrangingAdditionalPayment\" state",
     "cannot-transition-without-settled-payments": "Cannot transition Order to the \"PaymentSettled\" state when the total is not covered by settled Payments",
     "country-used-in-addresses": "The selected Country cannot be deleted as it is used in {count, plural, one {1 Address} other {# Addresses}}",
-    "facet-force-deleted": "The Facet was deleted and its FacetValues were removed from {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
-    "facet-used": "The Facet \"{ facetCode }\" includes FacetValues which are assigned to {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
-    "facet-value-force-deleted": "The selected FacetValue was removed from {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}} and deleted",
-    "facet-value-used": "The FacetValue \"{ facetValueCode }\" is assigned to {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
+    "facet-force-deleted": "The Facet was deleted and its FacetValues were removed from {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
+    "facet-used": "The Facet \"{ facetCode }\" includes FacetValues which are assigned to {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
+    "facet-value-force-deleted": "The selected FacetValue was removed from {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}} and deleted",
+    "facet-value-used": "The FacetValue \"{ facetValueCode }\" is assigned to {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
     "payment-method-used-in-channels": "The selected PaymentMethod is assigned to the following Channels: { channelCodes }. Set \"force: true\" to delete from all Channels.",
     "product-option-used": "Cannot delete the option \"{code}\" as it is being used by {count, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
     "zone-used-in-channels": "The selected Zone cannot be deleted as it used as a default in the following Channels: { channelCodes }",

+ 8 - 8
packages/core/src/i18n/messages/es.json

@@ -1,6 +1,6 @@
 {
   "error": {
-    "cannot-modify-role": "El rol '{ roleCode }' no puede ser modificado",
+    "cannot-modify-role": "El rol \"{ roleCode }\" no puede ser modificado",
     "cannot-move-product-category-into-self": "No se puede mover la categoría de producto, a dentro de si misma",
     "cannot-transition-order-from-to": "No se puede cambiar el estado del pedido de \"{ fromState }\" a \"{ toState }\"",
     "cannot-transition-to-shipping-when-order-is-empty": "No se puede cambiar el estado del envío a \"ArrangingShipping\" cuando esta vacío",
@@ -8,10 +8,10 @@
     "channel-not-found":  "Ningún canal con el token \"{ token }\" existe",
     "country-code-not-valid":  "El código de país  \"{ countryCode }\" no fue reconocido",
     "email-address-not-verified": "Por favor verifica este email, antes de iniciar sesión",
-    "entity-has-no-translation-in-language": "Entidad traducible '{ entityName }' no ha sido traducida al idioma seleccionando ({ languageCode })",
-    "entity-with-id-not-found": "No { entityName } con el id '{ id }' se ha encontrado",
+    "entity-has-no-translation-in-language": "Entidad traducible \"{ entityName }\" no ha sido traducida al idioma seleccionando ({ languageCode })",
+    "entity-with-id-not-found": "No { entityName } con el id \"{ id }\" se ha encontrado",
     "forbidden": "Actualmente no estás autorizado a realizar esta acción",
-    "invalid-sort-field": "El campo de ordenar '{ fieldName }' es inválido. Campos válidos: { validFields }",
+    "invalid-sort-field": "El campo de ordenar \"{ fieldName }\" es inválido. Campos válidos: { validFields }",
     "missing-password-on-registration": "Una contraseña debe proporcionarse cuándo `authOptions.requireVerification` está en \"false\"",
     "no-search-plugin-configured": "No se ha configurado ningún plugin de búsqueda",
     "no-valid-channel-specified": "No se ha especificado ningún canal válido (asegúrate de que el encabezado 'vendure-token'  sea especificado en el requisito)",
@@ -29,10 +29,10 @@
   },
   "message": {
     "country-used-in-addresses": "El país seleccionado no puede ser eliminado ya que es usado en {count, plural, one {1 Dirección} other {# Direcciones}}",
-    "facet-force-deleted": "El valor de faceta fue eliminado, y sus instancias fueron eliminadas en {products, plural, =0 {} one {1 Producto} other {# Productos}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
-    "facet-used": "El valor de faceta seleccionado, incluye valores que están asignados a {products, plural, =0 {} one {1 Producto} other {# Productos}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
-    "facet-value-force-deleted": "El valor de faceta seleccionado, fue eliminnado de {products, plural, =0 {} one {1 Producto} other {# Productos}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}} and deleted",
-    "facet-value-used": "El valor de faceta seleccionado, está asignado a {products, plural, =0 {} one {1 Producto} other {# Productos}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
+    "facet-force-deleted": "El valor de faceta fue eliminado, y sus instancias fueron eliminadas en {products, plural, =0 {} one {1 Producto} other {# Productos}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
+    "facet-used": "El valor de faceta seleccionado, incluye valores que están asignados a {products, plural, =0 {} one {1 Producto} other {# Productos}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
+    "facet-value-force-deleted": "El valor de faceta seleccionado, fue eliminnado de {products, plural, =0 {} one {1 Producto} other {# Productos}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}} and deleted",
+    "facet-value-used": "El valor de faceta seleccionado, está asignado a {products, plural, =0 {} one {1 Producto} other {# Productos}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
     "zone-used-in-tax-rates": "La zona seleccionada no se puede eliminar, es usada por estas Tasas de impuestos: { taxRateNames }"
   }
 }

+ 16 - 16
packages/core/src/i18n/messages/pt_BR.json

@@ -3,9 +3,9 @@
     "cancel-order-lines-invalid-order-state": "Não é possível cancelar o OrderLines de um pedido no estado: \"{ state }\"",
     "cancel-order-lines-nothing-to-cancel": "Nada a cancelar",
     "cancel-order-lines-quantity-too-high": "A quantidade a cancelar é maior que a quantidade existente da OrderLine",
-    "cannot-delete-role": "A função '{ roleCode }' não pode ser excluída",
+    "cannot-delete-role": "A função \"{ roleCode }\" não pode ser excluída",
     "cannot-locate-customer-for-user": "Não é possível localizar um cliente para o usuário",
-    "cannot-modify-role": "A função '{ roleCode }' não pode ser modificada",
+    "cannot-modify-role": "A função \"{ roleCode }\" não pode ser modificada",
     "cannot-create-sales-for-active-order": "Não é possível criar uma venda para um pedido ainda ativo",
     "cannot-move-collection-into-self": "Não é possível mover uma coleção para si mesma",
     "cannot-remove-option-group-due-to-variants": "Não é possível remover o ProductOptionGroup \"{code}\", pois é usado por {count, plural, um {1 ProductVariant} outro {# ProductVariants}}",
@@ -40,20 +40,20 @@
     "email-address-must-be-unique": "O endereço de email deve ser único",
     "email-address-not-available": "Este endereço de email não está disponível",
     "email-address-not-verified": "Verifique este endereço de e-mail antes de fazer login",
-    "entity-has-no-translation-in-language": "A entidade traduzível '{ entityName }' não foi traduzida para o idioma solicitado ({languageCode})",
-    "entity-with-id-not-found": "Nenhum { entityName } com o código '{ id }' foi encontrado",
-    "field-invalid-datetime-range-max": "O valor do campo personalizado '{ name }' [{ value }] é maior que o máximo [{ max }]",
-    "field-invalid-datetime-range-min": "O valor do campo personalizado '{ name }' [{ value }] é menor que o mínimo [{ min }]",
-    "field-invalid-non-nullable": "O valor do campo personalizado '{ name }' não pode ser definido como nulo",
-    "field-invalid-number-range-max": "O valor do campo personalizado '{ name }' [{ value }] é maior que o máximo [{ max }]",
-    "field-invalid-number-range-min": "O valor do campo personalizado '{ name }' [{ value }] é menor que o mínimo [{ min }]",
-    "field-invalid-readonly": "O campo personalizado '{ name }' é somente leitura",
-    "field-invalid-string-option": "O valor do campo personalizado '{ name }' ['{ value }'] é inválido. As opções válidas são [{ validOptions }]",
-    "field-invalid-string-pattern": "O valor do campo personalizado '{ name }' ['{ value }'] não corresponde ao padrão [{ pattern }]",
+    "entity-has-no-translation-in-language": "A entidade traduzível \"{ entityName }\" não foi traduzida para o idioma solicitado ({languageCode})",
+    "entity-with-id-not-found": "Nenhum { entityName } com o código \"{ id }\" foi encontrado",
+    "field-invalid-datetime-range-max": "O valor do campo personalizado \"{ name }\" [{ value }] é maior que o máximo [{ max }]",
+    "field-invalid-datetime-range-min": "O valor do campo personalizado \"{ name }\" [{ value }] é menor que o mínimo [{ min }]",
+    "field-invalid-non-nullable": "O valor do campo personalizado \"{ name }\" não pode ser definido como nulo",
+    "field-invalid-number-range-max": "O valor do campo personalizado \"{ name }\" [{ value }] é maior que o máximo [{ max }]",
+    "field-invalid-number-range-min": "O valor do campo personalizado \"{ name }\" [{ value }] é menor que o mínimo [{ min }]",
+    "field-invalid-readonly": "O campo personalizado \"{ name }\" é somente leitura",
+    "field-invalid-string-option": "O valor do campo personalizado \"{ name }\" [\"{ value }\"] é inválido. As opções válidas são [{ validOptions }]",
+    "field-invalid-string-pattern": "O valor do campo personalizado \"{ name }\" [\"{ value }\"] não corresponde ao padrão [{ pattern }]",
     "forbidden": "No momento, você não está autorizado a executar esta ação",
     "identifier-change-token-not-recognized": "Token de alteração de identificador não reconhecido",
     "identifier-change-token-has-expired": "O token de alteração do identificador expirou",
-    "invalid-sort-field": "O campo de classificação '{ fieldName }' é inválido. Os campos válidos são: { validFields }",
+    "invalid-sort-field": "O campo de classificação \"{ fieldName }\" é inválido. Os campos válidos são: { validFields }",
     "language-not-available-in-global-settings": "O idioma \"{code}\" não está disponível. Primeiro, ative-o através do GlobalSettings e tente novamente.",
     "missing-password-on-registration": "Uma senha deve ser fornecida quando` authOptions.requireVerification` estiver definido como\"false\"",
     "no-active-tax-zone": "Não foi possível determinar a zona tributária ativa. Verifique se uma zona tributária padrão está definida para o canal atual.",
@@ -90,9 +90,9 @@
     "asset-to-be-deleted-is-featured": "A seleção {assetCount, plural, one {Asset is} other {Assets are}} apresentado por {products, plural, =0 {} one {1 Product} other {# Products}} {variants, plural, =0 {} one { 1 ProductVariant} other { # ProductVariants}} {collections, plural, =0 {} one { 1 Collection} other { # Collections}}",
     "country-used-in-addresses": "O país selecionado não pode ser excluído, pois é usado em {count, plural, um {1 Address} outro {# Addresses}}",
     "facet-force-deleted": "A Faceta foi excluída e seus Valores de Faceta foram removidos de {produtos, plural, = 0 {} um {1 Produto} outro {# Produtos}} {ambos, selecione, ambos {,} únicos {}} {variantes, plural, = 0 {} um {1 ProductVariant} outro {# ProductVariants}} ",
-    "facet-used": "A faceta selecionada inclui valores de faceta atribuídos a {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
-    "facet-value-force-deleted": "O FacetValue selecionado foi removido de {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}} e excluídos ",
-    "facet-value-used": "O FacetValue selecionado é atribuído a {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
+    "facet-used": "A faceta selecionada inclui valores de faceta atribuídos a {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
+    "facet-value-force-deleted": "O FacetValue selecionado foi removido de {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}} e excluídos ",
+    "facet-value-used": "O FacetValue selecionado é atribuído a {products, plural, =0 {} one {1 Product} other {# Products}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 ProductVariant} other {# ProductVariants}}",
     "zone-used-in-channels": "A zona selecionada não pode ser excluída, pois foi usada como padrão nos seguintes canais: { channelCodes }",
     "zone-used-in-tax-rates": "A zona selecionada não pode ser excluída, pois é usada nos seguintes TaxRates: { taxRateNames }"
   }

+ 24 - 24
packages/core/src/i18n/messages/pt_PT.json

@@ -1,8 +1,8 @@
 {
   "error": {
-    "cannot-delete-role": "A regra '{ roleCode }' não pode ser eliminada",
+    "cannot-delete-role": "A regra \"{ roleCode }\" não pode ser eliminada",
     "cannot-locate-customer-for-user": "Não é possível localizar a conta associada ao utilizador",
-    "cannot-modify-role": "A regra '{ roleCode }' não pode ser alterada",
+    "cannot-modify-role": "A regra \"{ roleCode }\" não pode ser alterada",
     "cannot-create-sales-for-active-order": "Não é possível criar uma venda para uma encomenda ativa",
     "cannot-move-collection-into-self": "Não é possível mover a colecção para ela mesma",
     "cannot-transition-payment-from-to": "Não é possível transitar o pagamento do estado \"{ fromState }\" para \"{ toState }\"",
@@ -10,28 +10,28 @@
     "cannot-transition-fulfillment-from-to": "Não é possível transitar o envio do estado \"{ fromState }\" para \"{ toState }\"",
     "collection-id-or-slug-must-be-provided": "O ID da colecção ou slug deve ser fornecido",
     "collection-id-slug-mismatch": "O ID e slug fornecidos referem-se a diferentes colecções",
-    "conditions-required-for-action": "A acção '{ action }' requer as seguintes condições: { conditions }",
-    "configurable-argument-is-required": "O argumento '{ name }' é obrigatório",
+    "conditions-required-for-action": "A acção \"{ action }\" requer as seguintes condições: { conditions }",
+    "configurable-argument-is-required": "O argumento \"{ name }\" é obrigatório",
     "country-code-not-valid": "O código do país \"{ countryCode }\" não é válido",
     "customer-does-not-belong-to-customer-group": "O cliente não pertence ao grupo",
     "default-channel-not-found": "Canal padrão não encontrado",
-    "entity-has-no-translation-in-language": "A entidade '{entityName}' não foi traduzida para o idioma solicitado ({languageCode})",
-    "entity-with-id-not-found": "A entidade { entityName } com o ID '{ id }' não foi encontrada",
+    "entity-has-no-translation-in-language": "A entidade \"{entityName}\" não foi traduzida para o idioma solicitado ({languageCode})",
+    "entity-with-id-not-found": "A entidade { entityName } com o ID \"{ id }\" não foi encontrada",
     "facetfilterinput-invalid-input": "O objecto FacetValueFilterInput não pode especificar os campos 'and' e 'or' simultaneamente",
-    "field-invalid-datetime-range-max": "O valor do campo personalizado '{name}' [{value}] é maior que o máximo de [{max}]",
-    "field-invalid-datetime-range-min": "O valor do campo personalizado '{name}' [{value}] é menor que o mínimo de [{min}]",
-    "field-invalid-non-nullable": "O valor do campo personalizado '{name}' não pode ser definido como nulo",
-    "field-invalid-number-range-max": "O valor do campo personalizado '{name}' [{value}] é maior que o máximo de [{max}]",
-    "field-invalid-number-range-min": "O valor do campo personalizado '{name}' [{value}] é menor que o mínimo de [{min}]",
-    "field-invalid-readonly": "O campo personalizado '{name}' é somente para leitura",
-    "field-invalid-string-option": "O campo personalizado '{name}' é inválido. As opções válidas são [{validOptions}]",
-    "field-invalid-string-pattern": "O campo personalizado '{ name }' é inválido e não corresponde a regra [{pattern}]",
+    "field-invalid-datetime-range-max": "O valor do campo personalizado \"{name}\" [{value}] é maior que o máximo de [{max}]",
+    "field-invalid-datetime-range-min": "O valor do campo personalizado \"{name}\" [{value}] é menor que o mínimo de [{min}]",
+    "field-invalid-non-nullable": "O valor do campo personalizado \"{name}\" não pode ser definido como nulo",
+    "field-invalid-number-range-max": "O valor do campo personalizado \"{name}\" [{value}] é maior que o máximo de [{max}]",
+    "field-invalid-number-range-min": "O valor do campo personalizado \"{name}\" [{value}] é menor que o mínimo de [{min}]",
+    "field-invalid-readonly": "O campo personalizado \"{name}\" é somente para leitura",
+    "field-invalid-string-option": "O campo personalizado \"{name}\" é inválido. As opções válidas são [{validOptions}]",
+    "field-invalid-string-pattern": "O campo personalizado \"{ name }\" é inválido e não corresponde a regra [{pattern}]",
     "forbidden": "Você não está autorizado a realizar esta acção no momento",
-    "invalid-sort-field": "O campo de classificação '{fieldName}' é inválido. Os campos válidos são: {validFields}",
+    "invalid-sort-field": "O campo de classificação \"{fieldName}\" é inválido. Os campos válidos são: {validFields}",
     "list-query-limit-exceeded": "Não é possível obter mais de {limit} resultados para uma consulta",
     "no-active-tax-zone": "A região fiscal activa não pôde ser determinada. Certifique-se de que uma região de imposto padrão seja definida para o canal actual",
-    "no-configurable-operation-def-with-code-found": "Nenhum {type} com o código '{code}' foi encontrado",
-    "no-price-found-for-channel": "Nenhuma informação de preço foi encontrada para a variante com o ID '{variantId}' no canal '{channel}'.",
+    "no-configurable-operation-def-with-code-found": "Nenhum {type} com o código \"{code}\" foi encontrado",
+    "no-price-found-for-channel": "Nenhuma informação de preço foi encontrada para a variante com o ID \"{variantId}\" no canal \"{channel}\".",
     "no-search-plugin-configured": "Nenhum plugin de pesquisa foi configurado",
     "order-does-not-contain-line-with-id": "A encomenda não possui uma linha com o ID {id}",
     "pending-identifier-missing": "Não foi possível encontrar o e-mail pendente para actualizar",
@@ -59,12 +59,12 @@
     "IDENTIFIER_CHANGE_TOKEN_INVALID_ERROR": "Token de mudança de identificador não reconhecido",
     "INELIGIBLE_SHIPPING_METHOD_ERROR": "A encomenda não é elegível para o método de envio seleccionado",
     "INSUFFICIENT_STOCK_ERROR": "{quantityAvailable, plural, =0 {Nenhum item foi} one {Apenas 1 item foi} other {Apenas # itens foram}} adicionado a encomenda devido ao estoque insuficiente",
-    "INSUFFICIENT_STOCK_ON_HAND_ERROR": "Não é possível criar o envio porque '{productVariantName}' tem estoque insuficiente ({stockOnHand})",
+    "INSUFFICIENT_STOCK_ON_HAND_ERROR": "Não é possível criar o envio porque \"{productVariantName}\" tem estoque insuficiente ({stockOnHand})",
     "INVALID_CREDENTIALS_ERROR": "As credenciais fornecidas são inválidas",
     "ITEMS_ALREADY_FULFILLED_ERROR": "Um ou mais itens já fazem parte de um envio",
     "LANGUAGE_NOT_AVAILABLE_ERROR": "O idioma \"{ languageCode }\" não está disponível. Primeiro habilite-o nas configurações globais e tente novamente",
     "MANUAL_PAYMENT_STATE_ERROR": "Um pagamento manual só pode ser adicionado quando a encomenda estiver no estado \"A configurar pagamento adicional\"",
-    "MIME_TYPE_ERROR": "O tipo MIME '{mimeType}' não é permitido.",
+    "MIME_TYPE_ERROR": "O tipo MIME \"{mimeType}\" não é permitido.",
     "MISSING_CONDITIONS_ERROR": "Uma promoção deve ter pelo menos uma condição ou um conjunto de cupoms",
     "MISSING_PASSWORD_ERROR": "A palavra-passe é obrigatória.",
     "NEGATIVE_QUANTITY_ERROR": "A quantidade des um item não pode ser negativa",
@@ -107,12 +107,12 @@
     "cannot-transition-without-modification-payment": "Pode apenas fazer a transição para o estado \"A configurar pagamento adicional\"",
     "cannot-transition-without-settled-payments": "Não é possível fazer a transição da encomenda para o estado \"Pagamento liquidado\" até que todos os itens sejam pagos",
     "country-used-in-addresses": "O país seleccionado não pode ser excluído porque está a ser utilizado em {count, plural, one {1 endereço} other {# endereços}}",
-    "facet-force-deleted": "A etiqueta foi eliminada e seus valores ​​foram removidos {products, plural, =0 {} one {de 1 produto} other {de # produtos}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 variante} other {# variantes}}",
-    "facet-used": "A etiqueta seleccionada inclui valores ​​que estão atribuídos a {products, plural, =0 {} one {1 produto} other {# produtos}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 variante} other {# variantes}}",
-    "facet-value-force-deleted": "A etiqueta seleccionada foi excluída e removida de {products, plural, =0 {} one {1 produto} other {# produtos}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 variante} other {# variantes}}",
-    "facet-value-used": "A etiqueta seleccionada está atribuída a {products, plural, =0 {} one {1 produto} other {# produtos}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 variante} other {# variantes}}",
+    "facet-force-deleted": "A etiqueta foi eliminada e seus valores ​​foram removidos {products, plural, =0 {} one {de 1 produto} other {de # produtos}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 variante} other {# variantes}}",
+    "facet-used": "A etiqueta seleccionada inclui valores ​​que estão atribuídos a {products, plural, =0 {} one {1 produto} other {# produtos}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 variante} other {# variantes}}",
+    "facet-value-force-deleted": "A etiqueta seleccionada foi excluída e removida de {products, plural, =0 {} one {1 produto} other {# produtos}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 variante} other {# variantes}}",
+    "facet-value-used": "A etiqueta seleccionada está atribuída a {products, plural, =0 {} one {1 produto} other {# produtos}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 variante} other {# variantes}}",
     "payment-method-used-in-channels": "O método de pagamento seleccionado está atribuído aos seguintes canais: { channelCodes }. Defina \"force: true\" para eliminar de todos os canais.",
     "zone-used-in-channels": "A região seleccionada não pode ser eliminada porque é utilizada como padrão nos seguintes canais: {channelCodes}",
     "zone-used-in-tax-rates": "A região seleccionada não pode ser eliminada, porque é utilizada nos seguintes impostos: {taxRateNames}"
   }
-}
+}

+ 23 - 23
packages/core/src/i18n/messages/ru.json

@@ -1,8 +1,8 @@
 {
   "error": {
-    "cannot-delete-role": "Роль '{ roleCode }' не может быть удалена",
+    "cannot-delete-role": "Роль \"{ roleCode }\" не может быть удалена",
     "cannot-locate-customer-for-user": "Невозможно найти Клиента для пользователя",
-    "cannot-modify-role": "Роль '{ roleCode }' не может быть изменена",
+    "cannot-modify-role": "Роль \"{ roleCode }\" не может быть изменена",
     "cannot-create-sales-for-active-order": "Невозможно создать Продажу для Заказа, который все еще активен",
     "cannot-move-collection-into-self": "Невозможно переместить Коллекцию в саму себя",
     "cannot-transition-payment-from-to": "Невозможно перевести Оплату из \"{ fromState }\" в \"{ toState }\"",
@@ -10,28 +10,28 @@
     "cannot-transition-fulfillment-from-to": "Невозможно перевести Выполнение из \"{ fromState }\" в \"{ toState }\"",
     "collection-id-or-slug-must-be-provided": "Необходимо указать либо идентификатор Коллекции, либо уникальный строковый идентификатор",
     "collection-id-slug-mismatch": "Предоставленный идентификатор и уникальный строковый идентификатор относятся к разным Коллекциям",
-    "conditions-required-for-action": "Промоакция '{ action }' требует следующих условий: { conditions }",
-    "configurable-argument-is-required": "Аргумент '{ name }' обязательный",
+    "conditions-required-for-action": "Промоакция \"{ action }\" требует следующих условий: { conditions }",
+    "configurable-argument-is-required": "Аргумент \"{ name }\" обязательный",
     "country-code-not-valid": "Код страны \"{ countryCode }\" не был признан",
     "customer-does-not-belong-to-customer-group": "Клиент не принадлежит к этой Группе Клиентов",
     "default-channel-not-found": "Канал по умолчанию не найден",
-    "entity-has-no-translation-in-language": "Переводимый объект '{ entityName }' не был переведен на запрашиваемый язык ({ languageCode })",
-    "entity-with-id-not-found": "Не удалось найти { entityName } с идентификатором '{ id }'",
+    "entity-has-no-translation-in-language": "Переводимый объект \"{ entityName }\" не был переведен на запрашиваемый язык ({ languageCode })",
+    "entity-with-id-not-found": "Не удалось найти { entityName } с идентификатором \"{ id }\"",
     "facetfilterinput-invalid-input": "Объект фильтра значения тега не может одновременно указывать поля 'и' и 'или'",
-    "field-invalid-datetime-range-max": "Специальное поле '{ name }' со значением [{ value }] больше максимального [{ max }]",
-    "field-invalid-datetime-range-min": "Специальное поле '{ name }' со значением [{ value }] меньше минимального [{ min }]",
-    "field-invalid-non-nullable": "Значение Специального поля '{ name }' не может быть установлено равным нулю",
-    "field-invalid-number-range-max": "Специальное поле '{ name }' со значением [{ value }] больше максимального [{ max }]",
-    "field-invalid-number-range-min": "Специальное поле '{ name }' со значением [{ value }] меньше минимального [{ min }]",
-    "field-invalid-readonly": "Специальное поле '{ name }' только для чтения",
-    "field-invalid-string-option": "Специальное поле '{ name }' со значением ['{ value }'] недействительно. Допустимыми вариантами являются [{ validOptions }]",
-    "field-invalid-string-pattern": "Специальное поле '{ name }' со значением ['{ value }'] не соответствует шаблону [{ pattern }]",
+    "field-invalid-datetime-range-max": "Специальное поле \"{ name }\" со значением [{ value }] больше максимального [{ max }]",
+    "field-invalid-datetime-range-min": "Специальное поле \"{ name }\" со значением [{ value }] меньше минимального [{ min }]",
+    "field-invalid-non-nullable": "Значение Специального поля \"{ name }\" не может быть установлено равным нулю",
+    "field-invalid-number-range-max": "Специальное поле \"{ name }\" со значением [{ value }] больше максимального [{ max }]",
+    "field-invalid-number-range-min": "Специальное поле \"{ name }\" со значением [{ value }] меньше минимального [{ min }]",
+    "field-invalid-readonly": "Специальное поле \"{ name }\" только для чтения",
+    "field-invalid-string-option": "Специальное поле \"{ name }\" со значением [\"{ value }\"] недействительно. Допустимыми вариантами являются [{ validOptions }]",
+    "field-invalid-string-pattern": "Специальное поле \"{ name }\" со значением [\"{ value }\"] не соответствует шаблону [{ pattern }]",
     "forbidden": "В настоящее время вы не имеете права выполнять это действие",
-    "invalid-sort-field": "Поле сортировки '{ fieldName }' недействительно. Допустимыми полями являются: { validFields }",
+    "invalid-sort-field": "Поле сортировки \"{ fieldName }\" недействительно. Допустимыми полями являются: { validFields }",
     "list-query-limit-exceeded": "Невозможно получить больше чем { limit } результатов из списка запроса",
     "no-active-tax-zone": "Активную налоговую зону определить не удалось. Убедитесь, что для текущего канала установлена налоговая зона по умолчанию.",
-    "no-configurable-operation-def-with-code-found": "Не удалось найти { type } с кодом '{ code }'",
-    "no-price-found-for-channel": "Информация о цене для идентификатора Варианта Товара '{ variantId}' не найдена в канале '{ channel }'.",
+    "no-configurable-operation-def-with-code-found": "Не удалось найти { type } с кодом \"{ code }\"",
+    "no-price-found-for-channel": "Информация о цене для идентификатора Варианта Товара \"{ variantId}\" не найдена в канале \"{ channel }\".",
     "no-search-plugin-configured": "Плагин поиска не был настроен",
     "order-does-not-contain-line-with-id": "Этот заказ не содержит Строки Заказа с идентификатором { id }",
     "pending-identifier-missing": "Не удалось найти адрес электронной почты ожидающий обновления",
@@ -59,12 +59,12 @@
     "IDENTIFIER_CHANGE_TOKEN_INVALID_ERROR": "Токен изменения идентификатора не распознан",
     "INELIGIBLE_SHIPPING_METHOD_ERROR": "Этот Заказа не подходит для выбранного Способа Доставки",
     "INSUFFICIENT_STOCK_ERROR": "{quantityAvailable, plural, =0 {Позиций не было} one {Только 1 позиция была} other {Только # позиций было}} добавлено в заказ через недостаточный запас на складе",
-    "INSUFFICIENT_STOCK_ON_HAND_ERROR": "Невозможно создать Выполнение поскольку '{productVariantName}' недостаточно запасов на складе ({stockOnHand})",
+    "INSUFFICIENT_STOCK_ON_HAND_ERROR": "Невозможно создать Выполнение поскольку \"{productVariantName}\" недостаточно запасов на складе ({stockOnHand})",
     "INVALID_CREDENTIALS_ERROR": "Предоставленные учетные данные недействительны",
     "ITEMS_ALREADY_FULFILLED_ERROR": "Один или несколько Позиций Заказа уже являются частью Выполнения",
     "LANGUAGE_NOT_AVAILABLE_ERROR": "Язык \"{languageCode}\" недоступен. Сначала включите его в Глобальных Настройках и попробуйте еще раз.",
     "MANUAL_PAYMENT_STATE_ERROR": "Оплата вручную может быть добавлена только когда состояние \"Организация дополнительной оплаты\"",
-    "MIME_TYPE_ERROR": "MIME тип '{ mimeType }' не разрешен.",
+    "MIME_TYPE_ERROR": "MIME тип \"{ mimeType }\" не разрешен.",
     "MISSING_CONDITIONS_ERROR": "Промоакция должна иметь хотя бы одно условие или установленный код купона",
     "MISSING_PASSWORD_ERROR": "Пароль должен быть предоставлен.",
     "NEGATIVE_QUANTITY_ERROR": "Количество Позиций Заказа не может быть отрицательным.",
@@ -107,10 +107,10 @@
     "cannot-transition-without-modification-payment": "Возможен переход только в состояние \"Организация дополнительной оплаты\"",
     "cannot-transition-without-settled-payments": "Невозможно перевести Заказ в состояние \"Оплата проведена\" когда общая сумма не покрывается проведенными Платежами",
     "country-used-in-addresses": "Выбранную Страну невозможно удалить, так как она использована в {count, plural, one {1 Адресе} other {# Адресах}}",
-    "facet-force-deleted": "Тег был удален, и его Значения Тега были удалены из {products, plural, =0 {} one {1 Товара} other {# Товаров}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 Варианта Товара} other {# Вариантов Товара}}",
-    "facet-used": "Выбранный Тег включает Значения Тега, которые назначены {products, plural, =0 {} one {1 Товара} other {# Товаров}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 Варианта Товара} other {# Вариантов Товара}}",
-    "facet-value-force-deleted": "Выбранное Значения Тега было удалено из {products, plural, =0 {} one {1 Товара} other {# Товаров}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 Варианта Товара} other {# Вариантов Товара}}",
-    "facet-value-used": "Выбранное Значения Тега назначено {products, plural, =0 {} one {1 Товара} other {# Товаров}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 Варианта Товара} other {# Вариантов Товара}}",
+    "facet-force-deleted": "Тег был удален, и его Значения Тега были удалены из {products, plural, =0 {} one {1 Товара} other {# Товаров}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 Варианта Товара} other {# Вариантов Товара}}",
+    "facet-used": "Выбранный Тег включает Значения Тега, которые назначены {products, plural, =0 {} one {1 Товара} other {# Товаров}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 Варианта Товара} other {# Вариантов Товара}}",
+    "facet-value-force-deleted": "Выбранное Значения Тега было удалено из {products, plural, =0 {} one {1 Товара} other {# Товаров}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 Варианта Товара} other {# Вариантов Товара}}",
+    "facet-value-used": "Выбранное Значения Тега назначено {products, plural, =0 {} one {1 Товара} other {# Товаров}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 Варианта Товара} other {# Вариантов Товара}}",
     "payment-method-used-in-channels": "Выбранный Способ Оплаты назначается следующим Каналам: { channelCodes }. Установите \"force: true\" для удаления со всех каналов.",
     "zone-used-in-channels": "Выбранную Зону невозможно удалить, так как она использована по умолчанию в следующих Каналах: { channelCodes }",
     "zone-used-in-tax-rates": "Выбранную Зону невозможно удалить, так как она использована в следующих Налоговых Ставках: { taxRateNames }"

+ 23 - 23
packages/core/src/i18n/messages/uk.json

@@ -1,8 +1,8 @@
 {
   "error": {
-    "cannot-delete-role": "Роль '{ roleCode }' не може бути видалена",
+    "cannot-delete-role": "Роль \"{ roleCode }\" не може бути видалена",
     "cannot-locate-customer-for-user": "Неможливо знайти Клієнта для користувача",
-    "cannot-modify-role": "Роль '{ roleCode }' не може бути змінена",
+    "cannot-modify-role": "Роль \"{ roleCode }\" не може бути змінена",
     "cannot-create-sales-for-active-order": "Неможливо створити Продаж для Замовлення, яке все ще активне",
     "cannot-move-collection-into-self": "Неможливо перемістити Колекцію в саму себе",
     "cannot-transition-payment-from-to": "Неможливо перевести Оплату з \"{ fromState }\" в \"{ toState }\"",
@@ -10,28 +10,28 @@
     "cannot-transition-fulfillment-from-to": "Неможливо перевести Виконання з \"{ fromState }\" в \"{ toState }\"",
     "collection-id-or-slug-must-be-provided": "Необхідно вказати або ідентифікатор Колекції, або унікальний рядковий ідентифікатор",
     "collection-id-slug-mismatch": "Наданий ідентифікатор і унікальний рядковий ідентифікатор відносяться до різних Колекцій",
-    "conditions-required-for-action": "Промоакція '{ action }' вимагає наступних умов: { conditions }",
-    "configurable-argument-is-required": "Аргумент '{ name }' обов'язковий",
+    "conditions-required-for-action": "Промоакція \"{ action }\" вимагає наступних умов: { conditions }",
+    "configurable-argument-is-required": "Аргумент \"{ name }\" обов'язковий",
     "country-code-not-valid": "Код країни \"{ countryCode }\" не було визнано",
     "customer-does-not-belong-to-customer-group": "Клієнт не належить до цієї Групи Клієнтів",
     "default-channel-not-found": "Канал за замовчуванням не знайдено",
-    "entity-has-no-translation-in-language": "Перекладаємий об'єкт '{ entityName }' не був переведений на запитану мову ({ languageCode })",
-    "entity-with-id-not-found": "Не вдалося знайти { entityName } з ідентифікатором '{ id }'",
+    "entity-has-no-translation-in-language": "Перекладаємий об'єкт \"{ entityName }\" не був переведений на запитану мову ({ languageCode })",
+    "entity-with-id-not-found": "Не вдалося знайти { entityName } з ідентифікатором \"{ id }\"",
     "facetfilterinput-invalid-input": "Об'єкт фільтра значення тега не може одночасно вказувати поля 'і' та 'або'",
-    "field-invalid-datetime-range-max": "Спеціальне поле '{ name }' зі значенням [{ value }] більше максимального [{ max }]",
-    "field-invalid-datetime-range-min": "Спеціальне поле '{ name }' зі значенням [{ value }] менше мінімального [{ min }]",
-    "field-invalid-non-nullable": "Значення Спеціального поля '{ name }' не може бути встановлено рівним нулю",
-    "field-invalid-number-range-max": "Спеціальне поле '{ name }' зі значенням [{ value }] більше максимального [{ max }]",
-    "field-invalid-number-range-min": "Спеціальне поле '{ name }' зі значенням [{ value }] менше мінімального [{ min }]",
-    "field-invalid-readonly": "Спеціальне поле '{ name }' тільки для читання",
-    "field-invalid-string-option": "Спеціальне поле '{ name }' зі значенням ['{ value }'] недійсне. Допустимими варіантами є [{ validOptions }]",
-    "field-invalid-string-pattern": "Спеціальне поле '{ name }' зі значенням ['{ value }'] не відповідає шаблону [{ pattern }]",
+    "field-invalid-datetime-range-max": "Спеціальне поле \"{ name }\" зі значенням [{ value }] більше максимального [{ max }]",
+    "field-invalid-datetime-range-min": "Спеціальне поле \"{ name }\" зі значенням [{ value }] менше мінімального [{ min }]",
+    "field-invalid-non-nullable": "Значення Спеціального поля \"{ name }\" не може бути встановлено рівним нулю",
+    "field-invalid-number-range-max": "Спеціальне поле \"{ name }\" зі значенням [{ value }] більше максимального [{ max }]",
+    "field-invalid-number-range-min": "Спеціальне поле \"{ name }\" зі значенням [{ value }] менше мінімального [{ min }]",
+    "field-invalid-readonly": "Спеціальне поле \"{ name }\" тільки для читання",
+    "field-invalid-string-option": "Спеціальне поле \"{ name }\" зі значенням [\"{ value }\"] недійсне. Допустимими варіантами є [{ validOptions }]",
+    "field-invalid-string-pattern": "Спеціальне поле \"{ name }\" зі значенням [\"{ value }\"] не відповідає шаблону [{ pattern }]",
     "forbidden": "На даний момент ви не маєте права виконувати цю дію",
-    "invalid-sort-field": "Поле сортування '{ fieldName }' недійсне. Допустимими полями є: { validFields }",
+    "invalid-sort-field": "Поле сортування \"{ fieldName }\" недійсне. Допустимими полями є: { validFields }",
     "list-query-limit-exceeded": "Неможливо отримати більше ніж { limit } результатів зі списку запиту",
     "no-active-tax-zone": "Активну податкову зону визначити не вдалося. Переконайтеся, що для поточного каналу встановлена зона оподаткування за замовчуванням.",
-    "no-configurable-operation-def-with-code-found": "Не вдалося знайти { type } з кодом '{ code }'",
-    "no-price-found-for-channel": "Інформація про ціну для ідентифікатора Варіанта Товару '{ variantId}' не знайдена в каналі '{ channel }'.",
+    "no-configurable-operation-def-with-code-found": "Не вдалося знайти { type } з кодом \"{ code }\"",
+    "no-price-found-for-channel": "Інформація про ціну для ідентифікатора Варіанта Товару \"{ variantId}\" не знайдена в каналі \"{ channel }\".",
     "no-search-plugin-configured": "Плагін пошуку не був налаштований",
     "order-does-not-contain-line-with-id": "Це замовлення не містить Рядка Замовлення з ідентифікатором { id }",
     "pending-identifier-missing": "Не вдалося знайти адресу електронної пошти що очікує оновлення",
@@ -59,12 +59,12 @@
     "IDENTIFIER_CHANGE_TOKEN_INVALID_ERROR": "Токен зміни ідентифікатора не розпізнаний",
     "INELIGIBLE_SHIPPING_METHOD_ERROR": "Це Замовлення не підходить для обраного Способу Доставки",
     "INSUFFICIENT_STOCK_ERROR": "{quantityAvailable, plural, =0 {Позицій не було} one {Лише 1 позиція була} other {Лише # позицій було}} додано до замовлення через недостатній запас на складі",
-    "INSUFFICIENT_STOCK_ON_HAND_ERROR": "Неможливо створити Виконання оскільки '{productVariantName}' недостатньо запасів на складі ({stockOnHand})",
+    "INSUFFICIENT_STOCK_ON_HAND_ERROR": "Неможливо створити Виконання оскільки \"{productVariantName}\" недостатньо запасів на складі ({stockOnHand})",
     "INVALID_CREDENTIALS_ERROR": "Надані облікові дані недійсні",
     "ITEMS_ALREADY_FULFILLED_ERROR": "Один або декілька Позицій Замовлення вже є частиною Виконання",
     "LANGUAGE_NOT_AVAILABLE_ERROR": "Мова \"{languageCode}\" недоступна. Спочатку увімкніть її в Глобальних налаштуваннях та спробуйте ще раз",
     "MANUAL_PAYMENT_STATE_ERROR": "Оплата вручну може бути додана тільки коли стан \"Організація додаткової оплати\"",
-    "MIME_TYPE_ERROR": "MIME тип '{ mimeType }' не дозволено.",
+    "MIME_TYPE_ERROR": "MIME тип \"{ mimeType }\" не дозволено.",
     "MISSING_CONDITIONS_ERROR": "Промоакція повинна мати принаймні одну умову або встановлений код купона",
     "MISSING_PASSWORD_ERROR": "Пароль повинен бути наданий.",
     "NEGATIVE_QUANTITY_ERROR": "Кількість Позицій Замовлення не може бути від’ємною",
@@ -107,10 +107,10 @@
     "cannot-transition-without-modification-payment": "Можливий перехід тільки в стан \"Організація додаткової оплати\"",
     "cannot-transition-without-settled-payments": "Неможливо перевести Замовлення в стан \"Оплата проведена\" коли загальна сума не покривається проведеними Платежами",
     "country-used-in-addresses": "Вибрану Країну неможливо видалити, так як вона використана в {count, plural, one {1 Адресі} other {# Адресах}}",
-    "facet-force-deleted": "Тег був видалений, і його Значення Тега були видалені з {products, plural, =0 {} one {1 Товару} other {# Товарів}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 Варіанта Товару} other {# Варіантів Товару}}",
-    "facet-used": "Вибраний Тег включає Значення Тега, які призначені {products, plural, =0 {} one {1 Товару} other {# Товарів}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 Варіанта Товару} other {# Варіантів Товару}}",
-    "facet-value-force-deleted": "Вибране Значення Тега було видалено з {products, plural, =0 {} one {1 Товару} other {# Товарів}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 Варіанта Товару} other {# Варіантів Товару}}",
-    "facet-value-used": "Вибране Значення Тега призначено {products, plural, =0 {} one {1 Товару} other {# Товарів}}{both, select, both { , } single {}}{variants, plural, =0 {} one {1 Варіанта Товару} other {# Варіантів Товару}}",
+    "facet-force-deleted": "Тег був видалений, і його Значення Тега були видалені з {products, plural, =0 {} one {1 Товару} other {# Товарів}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 Варіанта Товару} other {# Варіантів Товару}}",
+    "facet-used": "Вибраний Тег включає Значення Тега, які призначені {products, plural, =0 {} one {1 Товару} other {# Товарів}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 Варіанта Товару} other {# Варіантів Товару}}",
+    "facet-value-force-deleted": "Вибране Значення Тега було видалено з {products, plural, =0 {} one {1 Товару} other {# Товарів}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 Варіанта Товару} other {# Варіантів Товару}}",
+    "facet-value-used": "Вибране Значення Тега призначено {products, plural, =0 {} one {1 Товару} other {# Товарів}}{both, select, both {, } single {} other {}}{variants, plural, =0 {} one {1 Варіанта Товару} other {# Варіантів Товару}}",
     "payment-method-used-in-channels": "Вибраний Спосіб Оплати призначається наступним Каналам: { channelCodes }. Встановіть \"force: true\" для видалення з усіх каналів.",
     "zone-used-in-channels": "Вибрану Зону неможливо видалити, так як вона використана за замовчуванням в наступних Каналах: { channelCodes }",
     "zone-used-in-tax-rates": "Вибрану Зону неможливо видалити, так як вона використана в наступних Податкових Ставках: { taxRateNames }"