Skip to content

Commit 039ec01

Browse files
authored
Merge pull request #4090 from parasharrajat/tests
[No QA] Add test for matching Translations keys
2 parents 9226b06 + f9baac6 commit 039ec01

File tree

2 files changed

+133
-38
lines changed

2 files changed

+133
-38
lines changed

src/languages/es.js

Lines changed: 88 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export default {
44
cancel: 'Cancelar',
55
yes: 'Si',
66
no: 'No',
7+
ok: 'OK',
78
attachment: 'Archivo Adjunto',
89
to: 'A',
910
optional: 'Opcional',
@@ -21,10 +22,14 @@ export default {
2122
not: 'No',
2223
signIn: 'Conectarse',
2324
continue: 'Continuar',
25+
firstName: 'Primer nombre',
26+
lastName: 'Apellido',
2427
phoneNumber: 'Número de teléfono',
2528
email: 'Email',
2629
and: 'y',
2730
details: 'Detalles',
31+
privacy: 'Intimidad',
32+
privacyPolicy: 'Política de privacidad',
2833
delete: 'Eliminar',
2934
deleted: 'eliminado',
3035
contacts: 'Contactos',
@@ -105,11 +110,14 @@ export default {
105110
writeSomething: 'Escribe algo...',
106111
blockedFromConcierge: 'Comunicación no permitida',
107112
youAppearToBeOffline: 'Parece que estás desconectado.',
113+
fileUploadFailed: 'Subida fallida. El archivo no es compatible.',
108114
roomIsArchived: 'Esta sala de chat ha sido eliminada',
109115
},
110-
reportActionContextMenu: {
116+
contextMenuItem: {
111117
copyToClipboard: 'Copiar al Portapapeles',
112118
copied: '¡Copiado!',
119+
},
120+
reportActionContextMenu: {
113121
copyLink: 'Copiar Enlace',
114122
markAsUnread: 'Marcar como no leído',
115123
editComment: 'Editar Commentario',
@@ -138,6 +146,7 @@ export default {
138146
confirm: 'Confirmar',
139147
splitBill: 'Dividir Factura',
140148
requestMoney: 'Pedir Dinero',
149+
sendMoney: 'Enviar Dinero',
141150
pay: 'Pagar',
142151
viewDetails: 'Ver detalles',
143152
settleExpensify: 'Pagar con Expensify',
@@ -149,6 +158,7 @@ export default {
149158
owes: ({manager, owner}) => `${manager} debe a ${owner}`,
150159
paid: ({owner, manager}) => `${manager} pagó a ${owner}`,
151160
split: ({amount}) => `Dividir ${amount}`,
161+
send: ({amount}) => `Enviar ${amount}`,
152162
choosePaymentMethod: 'Elige el método de pago:',
153163
noReimbursableExpenses: 'El monto de este informe es inválido',
154164
},
@@ -172,9 +182,7 @@ export default {
172182
profilePage: {
173183
profile: 'Perfil',
174184
tellUsAboutYourself: '¡Cuéntanos algo sobre tí, nos encantaría conocerte!',
175-
firstName: 'Nombre',
176185
john: 'Juan',
177-
lastName: 'Apellidos',
178186
doe: 'Nadie',
179187
preferredPronouns: 'Pronombres preferidos',
180188
selectYourPronouns: 'Selecciona tus pronombres',
@@ -233,7 +241,8 @@ export default {
233241
enterYourUsernameToGetPaidViaPayPal: 'Escribe tu nombre de usuario para que otros puedan pagarte a través de PayPal.',
234242
payPalMe: 'PayPal.me/',
235243
yourPayPalUsername: 'Tu usuario de PayPal',
236-
addPayPalAccount: 'Agregar cuenta de PayPal',
244+
addPayPalAccount: 'Agregar Cuenta de PayPal',
245+
growlMessageOnSave: 'Su nombre de usuario de PayPal se agregó correctamente',
237246
editPayPalAccount: 'Actualizar cuenta de PayPal',
238247
},
239248
paymentsPage: {
@@ -263,6 +272,14 @@ export default {
263272
expensifyIsOpenSource: 'Expensify.cash es open source',
264273
theCode: 'el código',
265274
openJobs: 'trabajos disponibles',
275+
heroHeading: 'Dividir cuentas\ny chatear con amigos.',
276+
heroDescription: {
277+
phrase1: 'El dinero habla. Y ahora que el chat y los pagos están en un solo lugar, también es fácil. Sus pagos le llegan tan rápido como puede transmitir su punto.',
278+
phrase2: 'New Expensify es de código abierto. Vista',
279+
phrase3: 'el código',
280+
phrase4: 'Vista',
281+
phrase5: 'vacantes',
282+
},
266283
},
267284
termsOfUse: {
268285
phrase1: 'Al usar Expensify.cash, estás aceptando los',
@@ -271,9 +288,11 @@ export default {
271288
phrase4: 'política de privacidad',
272289
phrase5: 'El envío de dinero es brindado por Expensify Payments LLC (NMLS ID:2017010) de conformidad con sus',
273290
phrase6: 'licencias',
291+
phrase7: 'licenses',
274292
},
275293
passwordForm: {
276294
pleaseFillOutAllFields: 'Por favor completa todos los campos',
295+
enterYourTwoFactorAuthenticationCodeToContinue: 'Ingrese su código de autenticación de dos factores para continuar',
277296
forgot: '¿Te has olvidado?',
278297
twoFactorCode: 'Autenticación de 2 factores',
279298
requiredWhen2FAEnabled: 'Obligatorio cuando A2F está habilitado',
@@ -309,7 +328,10 @@ export default {
309328
},
310329
setPasswordPage: {
311330
enterPassword: 'Escribe una contraseña',
331+
confirmNewPassword: 'Confirma la contraseña',
312332
setPassword: 'Configura tu Contraseña',
333+
passwordsDontMatch: 'Las contraseñas deben coincidir',
334+
newPasswordPrompt: 'Su contraseña debe tener al menos 8 caracteres, \n1 letra mayúscula, 1 letra minúscula, 1 número.',
313335
},
314336
bankAccount: {
315337
accountNumber: 'Número de cuenta',
@@ -372,6 +394,68 @@ export default {
372394
noPhoneNumber: 'Por favor escribe un número de teléfono que incluya el código de país e.g +447814266907',
373395
maxParticipantsReached: 'Has llegado al número máximo de participantes para un grupo.',
374396
},
397+
onfidoStep: {
398+
acceptTerms: 'Al continuar con la solicitud para activar su billetera Expensify, confirma que ha leído, comprende y acepta ',
399+
facialScan: 'Política y lanzamiento de la exploración facial de Onfido',
400+
tryAgain: 'Intentar otra vez',
401+
verifyIdentity: 'Verificar identidad',
402+
genericError: 'Hubo un error al procesar este paso. Inténtalo de nuevo.',
403+
},
404+
additionalDetailsStep: {
405+
headerTitle: 'Detalles adicionales',
406+
helpText: 'Necesitamos confirmar la siguiente información antes de que podamos procesar este pago.',
407+
helpLink: 'Obtenga más información sobre por qué necesitamos esto.',
408+
legalFirstNameLabel: 'Primer nombre legal',
409+
legalMiddleNameLabel: 'Segundo nombre legal',
410+
legalLastNameLabel: 'Apellido legal',
411+
},
412+
termsStep: {
413+
headerTitle: 'Condiciones y tarifas',
414+
haveReadAndAgree: 'He leído y acepto recibir ',
415+
electronicDisclosures: 'divulgaciones electrónicas',
416+
agreeToThe: 'Estoy de acuerdo con la ',
417+
walletAgreement: 'Acuerdo de billetera',
418+
enablePayments: 'Habilitar pagos',
419+
termsMustBeAccepted: 'Se deben aceptar los términos',
420+
},
421+
activateStep: {
422+
headerTitle: 'Habilitar pagos',
423+
activated: 'Su billetera Expensify está lista para usar.',
424+
checkBackLater: 'Todavía estamos revisando tu información. Por favor, vuelva más tarde.',
425+
},
426+
companyStep: {
427+
headerTitle: 'Información de la Empresa',
428+
subtitle: 'Dé más información sobre su empresa.',
429+
legalBusinessName: 'Nombre Comercial Legal',
430+
companyWebsite: 'Company Website',
431+
taxIDNumber: 'Tax ID Number',
432+
companyType: 'Página Web de la Empresa',
433+
incorporationDate: 'Fecha de Incorporación',
434+
industryClassificationCode: 'Código de Clasificación Industrial',
435+
confirmCompanyIsNot: 'Confirmo que esta empresa no está en el',
436+
listOfRestrictedBusinesses: 'lista de negocios restringidos',
437+
incorporationDatePlaceholder: 'Fecha de inicio (aaaa-mm-dd)',
438+
companyPhonePlaceholder: '10 dígitos, sin guiones',
439+
},
440+
requestorStep: {
441+
headerTitle: 'Información del solicitante',
442+
financialRegulations: 'Las leyes fiscales y el reglamento bancario nos obliga a verificar la identidad de todo individuo que desee añadir una cuenta bancaria representando a una compañía. ',
443+
learnMore: 'Más información',
444+
isMyDataSafe: '¿Están seguros mis datos?',
445+
onFidoConditions: 'Al continuar con la solicitud de añadir esta cuenta bancaria, confirma que ha leído, entiende y acepta ',
446+
onFidoFacialScan: 'Onfido’s Facial Scan Policy and Release',
447+
isControllingOfficer: 'Estoy autorizado a utilizar la cuenta bancaria de mi compañía para gastos de empresa',
448+
isControllingOfficerError: 'Debe ser un oficial controlador con autorización para operar la cuenta bancaria de la compañía',
449+
},
450+
validationStep: {
451+
headerTitle: 'Validar',
452+
buttonText: 'Finalizar Configuración',
453+
maxAttemptError: 'Se ha inhabilitado la validación de esta cuenta bancaria, debido a demasiados intentos incorrectos. Por favor contáctenos.',
454+
description: 'Uno o dos días después de agregar su cuenta a Expensify, enviamos tres (3) transacciones a su cuenta. Tienen una línea comercial como "Expensify, Inc. Validation"',
455+
descriptionCTA: 'Ingrese el monto de cada transacción en los campos a continuación. Ejemplo: 1.51',
456+
reviewingInfo: '¡Gracias! Estamos revisando tu información y nos comunicaremos contigo en breve. Consulte su chat con Concierge ',
457+
forNextSteps: ' para conocer los próximos pasos para terminar de configurar su cuenta bancaria.',
458+
},
375459
beneficialOwnersStep: {
376460
beneficialOwners: 'Beneficial Owners',
377461
additionalInformation: 'Additional Information',
@@ -433,39 +517,6 @@ export default {
433517
welcomeNote: ({workspaceName}) => `¡Has sido invitado a la ${workspaceName} Espacio de trabajo! Descargue la aplicación móvil Expensify para comenzar a rastrear sus gastos.`,
434518
},
435519
},
436-
companyStep: {
437-
headerTitle: 'Información de la Empresa',
438-
subtitle: 'Dé más información sobre su empresa.',
439-
legalBusinessName: 'Nombre Comercial Legal',
440-
companyWebsite: 'Company Website',
441-
taxIDNumber: 'Tax ID Number',
442-
companyType: 'Página Web de la Empresa',
443-
incorporationDate: 'Fecha de Incorporación',
444-
industryClassificationCode: 'Código de Clasificación Industrial',
445-
confirmCompanyIsNot: 'Confirmo que esta empresa no está en el',
446-
listOfRestrictedBusinesses: 'lista de negocios restringidos',
447-
incorporationDatePlaceholder: 'Fecha de inicio (aaaa-mm-dd)',
448-
companyPhonePlaceholder: '10 dígitos, sin guiones',
449-
},
450-
validationStep: {
451-
headerTitle: 'Validar',
452-
buttonText: 'Finalizar Configuración',
453-
maxAttemptError: 'Se ha inhabilitado la validación de esta cuenta bancaria, debido a demasiados intentos incorrectos. Por favor contáctenos.',
454-
description: 'Uno o dos días después de agregar su cuenta a Expensify, enviamos tres (3) transacciones a su cuenta. Tienen una línea comercial como "Expensify, Inc. Validation"',
455-
descriptionCTA: 'Ingrese el monto de cada transacción en los campos a continuación. Ejemplo: 1.51',
456-
reviewingInfo: '¡Gracias! Estamos revisando tu información y nos comunicaremos contigo en breve. Consulte su chat con Concierge ',
457-
forNextSteps: ' para conocer los próximos pasos para terminar de configurar su cuenta bancaria.',
458-
},
459-
requestorStep: {
460-
headerTitle: 'Información del solicitante',
461-
financialRegulations: 'Las leyes fiscales y el reglamento bancario nos obliga a verificar la identidad de todo individuo que desee añadir una cuenta bancaria representando a una compañía. ',
462-
learnMore: 'Más información',
463-
isMyDataSafe: '¿Están seguros mis datos?',
464-
onFidoConditions: 'Al continuar con la solicitud de añadir esta cuenta bancaria, confirma que ha leído, entiende y acepta ',
465-
facialScan: 'la política de reconocimiento facial y la exención de Onfido',
466-
isControllingOfficer: 'Estoy autorizado a utilizar la cuenta bancaria de mi compañía para gastos de empresa',
467-
isControllingOfficerError: 'Debe ser un oficial controlador con autorización para operar la cuenta bancaria de la compañía',
468-
},
469520
requestCallPage: {
470521
requestACall: 'Llámame por teléfono',
471522
description: '¿Necesitas ayuda configurando tu cuenta? Nuestro equipo de guías puede ayudarte.',

tests/unit/TranslateTest.js

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
const _ = require('underscore');
2+
const {error: AnnotationError} = require('@actions/core');
13
const translate = require('../../src/libs/translate');
2-
const translations = require('../../src/languages/translations');
34
const CONFIG = require('../../src/CONFIG');
5+
const translations = require('../../src/languages/translations');
46

7+
const originalTranslations = _.clone(translations);
58
translations.default = {
69
en: {
710
testKey1: 'English',
@@ -52,3 +55,44 @@ describe('translate', () => {
5255
expect(translate.translate('en', ['testKeyGroup', 'testFunction'], {testVariable})).toBe(expectedValue);
5356
});
5457
});
58+
59+
describe('Translation Keys', () => {
60+
function traverseKeyPath(source, path, keyPaths) {
61+
const pathArray = keyPaths || [];
62+
const keyPath = path ? `${path}.` : '';
63+
_.each(_.keys(source), (key) => {
64+
if (_.isObject(source[key]) && !_.isFunction(source[key])) {
65+
traverseKeyPath(source[key], keyPath + key, pathArray);
66+
} else {
67+
pathArray.push(keyPath + key);
68+
}
69+
});
70+
return pathArray;
71+
}
72+
const excludeLanguages = ['en', 'es-ES'];
73+
const languages = _.without(_.keys(originalTranslations.default), ...excludeLanguages);
74+
const mainLanguage = originalTranslations.default.en;
75+
const mainLanguageKeys = traverseKeyPath(mainLanguage);
76+
77+
_.each(languages, (ln) => {
78+
const languageKeys = traverseKeyPath(originalTranslations.default[ln]);
79+
80+
it(`Does ${ln} locale has all the keys`, () => {
81+
const hasAllKeys = _.difference(mainLanguageKeys, languageKeys);
82+
if (hasAllKeys.length) {
83+
console.debug(`🏹 [ ${hasAllKeys.join(', ')} ] are missing from ${ln}.js`);
84+
AnnotationError(`🏹 [ ${hasAllKeys.join(', ')} ] are missing from ${ln}.js`);
85+
}
86+
expect(hasAllKeys).toEqual([]);
87+
});
88+
89+
it(`Does ${ln} locale has unused keys`, () => {
90+
const hasAllKeys = _.difference(languageKeys, mainLanguageKeys);
91+
if (hasAllKeys.length) {
92+
console.debug(`🏹 [ ${hasAllKeys.join(', ')} ] are unused keys in ${ln}.js`);
93+
AnnotationError(`🏹 [ ${hasAllKeys.join(', ')} ] are unused keys in ${ln}.js`);
94+
}
95+
expect(hasAllKeys).toEqual([]);
96+
});
97+
});
98+
});

0 commit comments

Comments
 (0)