From 8f4d64940787bdb732c2a5c9ea817727609428c0 Mon Sep 17 00:00:00 2001 From: JF Caringi <47096567+MrCaringi@users.noreply.github.com> Date: Wed, 27 Sep 2023 11:46:59 -0600 Subject: [PATCH 01/13] Create es.yml Adding Spanish language to locales --- src/locales/es.yml | 279 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100644 src/locales/es.yml diff --git a/src/locales/es.yml b/src/locales/es.yml new file mode 100644 index 0000000..405e834 --- /dev/null +++ b/src/locales/es.yml @@ -0,0 +1,279 @@ +commands: + start: Iniciar (greetings message) + settings: Configuración + help: Ayuda + +labels: + ACCOUNTS: 💳 Cuentas + ADD_CATEGORIES: ➕ Nueva Categoría + CANCEL: ✖ Cancelar + CATEGORIES: 🔖 Categorias + CHANGE_CATEGORY: 🔖 Categoría + CHANGE_DATE: 📆 Fecha + CHANGE_AMOUNT: 💸 Importe + CHANGE_DESCRIPTION: 📝 Descripción + CHANGE_SOURCE_ACCOUNT: 📤 Cuenta Origen + CHANGE_DEST_ACCOUNT: 📥 Cuenta Destino + CLASSIFICATION: 🏷️ Clasificación + CLOSE: 🔙 Regresar + DECLINE_CATEGORIES_LIST: ✏️ Ninguna, intente de nuevo + DEFAULT_ASSET_ACCOUNT_BUTTON: 💳 Cuenta primaria por defecto + DELETE: ❌ Eliminar + OPEN_IN_BROWSER: 🔗 Abrir en Navegador + OPEN_ASSET_ACCOUNTS_IN_BROWSER: 🔗 Ver cuentas primarias + DONE: ✅ OK + EDIT_TRANSACTION: ✏️ Editar + FIREFLY_ACCESS_TOKEN_BUTTON: 🔑 Token de Acceso + FIREFLY_URL_BUTTON: 🔗 Firefly URL + LIST_TAGS: 🏷️ Etiqueta + RENAME_CATEGORY: ✏️ Renombrar + REPORTS: 📈 Reportes + SETTINGS: 🔧 Configuración + TEST_CONNECTION: 🔌 Varificar conexión + TO_WITHDRAWALS: 📤 Nuevo retiro + TO_DEPOSITS: 📥 Nevo Depósito + TO_TRANSFERS: ↔️ Nueva trasnferencia + TRANSACTIONS: 🔀 Transacciones + YES: ✅ Sí + SWITCH_TO_ENGLISH: 🇬🇧 Cambiar a Ingles + SWITCH_TO_RUSSIAN: 🇷🇺 Cambiar a Ruso + SWITCH_TO_ITALIAN: 🇮🇹 Cambiar a Italiano + SWITCH_TO_SPANISH: 🇪🇸 Cambiar a Español + +welcome: > + 👋 Hola! Esto bot te ayudará a agregar trasacciones de forma rápida y cómoda a Firefly III. + También podrás gestionar algunas entidades de Firefly +needToSet: 'Para empezar a usar el bot, necesitas indicar lo siguiente:' +setFireflyUrl: ' - *🔗 Firefly URL* - Dirección web de tu instancia Firefly III' +setFireflyAccessToken: ' - *🔑 Token de Acceso* Creado en la interface web de Firefly III' +navigateToSettings: Para continuar el proceso, ve a *🔧 Connfiguración*. + +help: > + 🤖 Please navigate to bot *🔧 Settings* section and set up some stuff for using the bot. + + ❕ To add a transaction, send an amount. It can be a number, or a math expression, + like `100-5*3`. + Upon receiving amount, bot will ask additional questions for transaction parameters. + + You can also add transactions that do not require additional questions from the bot, + by sending transaction description and an amount, like so + + `Cafe 35` + + In this case a new withdrawal transaction from the default asset account and + description `Cafe` with amount of `35` will be created. + + ✨ Going further you can set up different *Rules* in a corresponding section of + Firefly III, in which case all your bot transactions will be created respecting those + rules. + +common: + errorOccurred: An error occurred! + noDefaultSourceAccountExist: | + 🙈 Whoa! You do not have any Asset accounts to withdraw money from! + + 🙏 Please, navigate to your Firefly III website and create at least one Asset account. +mdlwr: + noFireflyURLFound: To work with the bot, you need to specify *🔗 Firefly URL* in bot *🔧 Settings*. + noFireflyAccessTokenFound: To work with the bot, you need to specify a valid *🔑 Access Token* in bot *🔧 Settings*. +settings: + notSpecified: '🚨 ' + inputFireflyUrl: > + Type in URL address of your Firefly III instance. + It should be in the format of this: *https://firefly.example.com* + or this: *http://localhost:8080* + inputFireflyAccessToken: > + Paste your Personal Access Token. + You can create and copy it from the Firefly III web interface: + *Options → Profile → OAuth → Create new token* + defaultAssetAccountSet: Default asset account has been set! + whatDoYouWantToChange: > + 🔧 *Settings* + + What do you want to change? + + *🔗 Firefly URL*: ${fireflyUrl || '🚨 '} + + *🔑 Access Token*: ${accessToken || '🚨 '} + + *💳 Default asset account*: ${defaultSourceAccount.name || '🚨 '} + + *🌐 Language*: ${language} + selectDefaultAssetAccount: > + Choose an asset account which will be used as a default one for withdrawals. + If left unset, the very first asset account from the list below will be used by default: + specifySmthFirst: Specify ${smth} first. + connectionFailed: Connection has NOT been established! + connectionFailedUnauthenticated: Authentication error! Please make sure that specified Access Token is not malformed and not expired. + connectionFailedBadUrl: Error connecting to Firefly host! Please make sure that you specified the right Firefly URL. + connectionSuccess: > + Connection established! + + Hi, ${email}! + badAccessToken: Entered text does not look like an Access Token. Try again, please. + badUrl: > + Entered text does not look like a URL address. Try again, please. + Type in the URL address of your Firefly III instance, for example https://firefly.example.com: + +accounts: + labels: + asset: Asset accounts + expense: Expense accounts + revenue: Revenue accounts + liability: Liabilities + list: + noAccounts: No accounts yet🤷 + asset: > + Balance of your asset accounts: + +
${accounts.replace(/\n$/, '')}
+      
+      ──────────────────
+      
+      SUM: ${sums ? sums : '0'}
+ expense: > + Balance of your expense accounts: + +
${accounts.replace(/\n$/, '')}
+      
+      ──────────────────
+      
+      SUM: ${sums ? sums : '0'}
+ revenue: > + Balance of your revenue accounts: + +
${accounts.replace(/\n$/, '')}
+      
+      ──────────────────
+      
+      SUM: ${sums ? sums : '0'}
+ liability: > + Balance of your liabilities: + +
${accounts.replace(/\n$/, '')}
+      
+      ──────────────────
+      
+      SUM: ${sums ? sums : '0'}
+ +transactions: + list: + withdrawal: > + Your withdrawals for ${day}: + +
${transactions.replace(/\n$/, '')}
+      
+      ──────────────────
+      
+      SUM: ${sums ? sums : '0'}
+ deposit: > + Your revenues for ${day}: + +
${transactions.replace(/\n$/, '')}
+      
+      ──────────────────
+      
+      SUM: ${sums ? sums : '0'}
+ transfer: > + Your transactions for ${day}: + +
${transactions.replace(/\n$/, '')}
+ noTransactions: 🤷 No transactions + add: + dontUnderstand: > + 🤖 I don't understand that. + Enter a transaction amount, it needs to be a number! 😉 + withdrawalMessage: > + 📆 ${date} + + 📤 Added ${description === 'N/A' ? '' : '*' + description + '*'} + *${amount}* *${currency}*${category ? ' to category *' + category + '*' : ''} + + ${source} ➡️ ${destination} + depositMessage: > + 📆 ${date} + + 📥 Added ${description === 'N/A' ? '' : '*' + description + '* '} + *${amount}* *${currency}* + + ${source} ➡️ ${destination} + transferMessage: > + 📆 ${date} + + ↔️ Transfer *${amount}* *${currency}* from account *${source}* to account *${destination}* + selectCategory: In which category to add *${amount}*? + noCategoriesYet: | + 🤷 You haven't created any categories yet. + The transaction will be created without a category. Continue? + + 💡 You can ceasily create new categories from a corresponding *🔖 Categories* bot button. + transactionDeleted: Transaction deleted! + couldNotDelete: 'Could not delete transaction by id: ${id}' + selectRevenueAccount: 'Choose a revenue account to withdraw *${amount}*:' + selectAssetAccount: 'Choose an asset account to add *${amount}*:' + selectSourceAccount: 'Choose an account to transfer *${amount}* from:' + selectDestAccount: 'Choose an account to transfer to:' + transactionError: '❗😰 Ann error occurred during transaction creation: *${message}*' + created: Transaction created! + + edit: + whatToEdit: ❓What do you want to change? + updated: Transaction updated! + badAmountTyped: 'An amount should be a number. Type in new amount please:' + badDescriptionTyped: 'Description needs to be text. Type in new description please:' + typeNewAmount: > + Type in new amount. + + 💡 You can use the arithmetic signs for addition, subtraction, multiplication and division to perform the appropriate operation on the current value of the transaction. + + For example, "+35" would add 35 to existing amount of transaction. + noCategoriesYet: | + 🤷 You haven't created any categories yet. + + 💡 You can easily create new categories from a corresponding *🔖 Categories* bot button. + typeNewDescription: 'Type in new description:' + chooseNewCategory: 'Choose new category:' + chooseNewSourceAccount: 'Choose new source account:' + chooseNewDestinationAccount: 'Choose new destination account:' + chooseNewRevenueAccount: 'Choose new revenue account:' + noSuchTransactionAnymore: | + 🤖 This transaction (${id}) does not exist anymore! + It was probably deleted via the Firefly website. + +categories: + listEmpty: No categories yet :( + list: > + To view transactions for a specific category, choose it from the list bellow. + You can also rename or delete a category once it is chosen. + typeCategories: > + Type in your new categories so that each one would be on a separate line, for example: + + 💡 Utilities + + 👕 Clothes and shoes + + 🥦 Groceries + + *P.S.*: Category names can be changed later. + + *P.P.S.*: It's OK if a category with the same name already exists. + confirmCreation: > + ${categories.length} new category(s) will be created: + + ${categories.join('\n')} + + Is that OK? + typeNewName: 'Type in new category name:' + confirmDeletion: > + Are you sure that you want to delete this category? + Corresponding transactions won't be deleted. They can be found in *🔀 Transactions* section. + deleted: Category deleted! + noTransactions: No transactions + transactionsList: > + ${categoryName} withdrawals for the month of ${monthName}: + +
${transactions.replace(/\n$/, '')}
+    
+    ──────────────────
+    
+    SUM: ${sums ? sums : '0'}
From dabdb387c90bcff5ea5f4af81525e799be617d65 Mon Sep 17 00:00:00 2001 From: JF Caringi <47096567+MrCaringi@users.noreply.github.com> Date: Wed, 27 Sep 2023 12:12:38 -0600 Subject: [PATCH 02/13] Update es.yml --- src/locales/es.yml | 84 +++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/src/locales/es.yml b/src/locales/es.yml index 405e834..924bfbf 100644 --- a/src/locales/es.yml +++ b/src/locales/es.yml @@ -1,5 +1,5 @@ commands: - start: Iniciar (greetings message) + start: Iniciar (saludo) settings: Configuración help: Ayuda @@ -17,22 +17,22 @@ labels: CLASSIFICATION: 🏷️ Clasificación CLOSE: 🔙 Regresar DECLINE_CATEGORIES_LIST: ✏️ Ninguna, intente de nuevo - DEFAULT_ASSET_ACCOUNT_BUTTON: 💳 Cuenta primaria por defecto + DEFAULT_ASSET_ACCOUNT_BUTTON: 💳 Cuenta de Activo por defecto DELETE: ❌ Eliminar OPEN_IN_BROWSER: 🔗 Abrir en Navegador - OPEN_ASSET_ACCOUNTS_IN_BROWSER: 🔗 Ver cuentas primarias + OPEN_ASSET_ACCOUNTS_IN_BROWSER: 🔗 Ver cuentas de Activos DONE: ✅ OK EDIT_TRANSACTION: ✏️ Editar FIREFLY_ACCESS_TOKEN_BUTTON: 🔑 Token de Acceso - FIREFLY_URL_BUTTON: 🔗 Firefly URL + FIREFLY_URL_BUTTON: 🔗 URL de Firefly LIST_TAGS: 🏷️ Etiqueta RENAME_CATEGORY: ✏️ Renombrar REPORTS: 📈 Reportes SETTINGS: 🔧 Configuración - TEST_CONNECTION: 🔌 Varificar conexión - TO_WITHDRAWALS: 📤 Nuevo retiro - TO_DEPOSITS: 📥 Nevo Depósito - TO_TRANSFERS: ↔️ Nueva trasnferencia + TEST_CONNECTION: 🔌 Verificar conexión + TO_WITHDRAWALS: 📤 Nuevo Gasto + TO_DEPOSITS: 📥 Nuevo Depósito + TO_TRANSFERS: ↔️ Nueva transferencia TRANSACTIONS: 🔀 Transacciones YES: ✅ Sí SWITCH_TO_ENGLISH: 🇬🇧 Cambiar a Ingles @@ -41,64 +41,64 @@ labels: SWITCH_TO_SPANISH: 🇪🇸 Cambiar a Español welcome: > - 👋 Hola! Esto bot te ayudará a agregar trasacciones de forma rápida y cómoda a Firefly III. + 👋 Hola! Este bot te ayudará a agregar trasacciones de forma rápida y cómoda a Firefly III. También podrás gestionar algunas entidades de Firefly needToSet: 'Para empezar a usar el bot, necesitas indicar lo siguiente:' -setFireflyUrl: ' - *🔗 Firefly URL* - Dirección web de tu instancia Firefly III' +setFireflyUrl: ' - *🔗 URL de Firefly* - Dirección web de tu instancia Firefly III' setFireflyAccessToken: ' - *🔑 Token de Acceso* Creado en la interface web de Firefly III' -navigateToSettings: Para continuar el proceso, ve a *🔧 Connfiguración*. +navigateToSettings: 'Para continuar el proceso, ve a *🔧 Connfiguración*.' help: > - 🤖 Please navigate to bot *🔧 Settings* section and set up some stuff for using the bot. + 🤖 Por favor, ve a la sección de *🔧 Configuración* del bot y configura los requisitos para empezar a usar el bot. - ❕ To add a transaction, send an amount. It can be a number, or a math expression, - like `100-5*3`. - Upon receiving amount, bot will ask additional questions for transaction parameters. + ❕ Para agregar una transacción, Primero envía un monto o importe. Debe ser un número, o una expresión matemática, + por ejemplo `100-5*3`. + Una vez recibido el monto o importe, el bot pedirá datos adicionales para los parámetros de la transacción. - You can also add transactions that do not require additional questions from the bot, - by sending transaction description and an amount, like so + También puedes agregar transacciones que no requiren datos adicionales, + enviando la descripción y el importe, por ejemplo `Cafe 35` - In this case a new withdrawal transaction from the default asset account and - description `Cafe` with amount of `35` will be created. - - ✨ Going further you can set up different *Rules* in a corresponding section of - Firefly III, in which case all your bot transactions will be created respecting those - rules. + En este caso, se creará un nuevo retiro de la cuenta de activo por defecto + con la descripción `Cafe` por un importe de 35` + + ✨ Si requieres parametros o datos adicionales en la transacción, puedes usar la + funcionalidad de *Reglas* en Firefly III, la cual te permitirá complementar cualquier + información requerida en al transacción. common: - errorOccurred: An error occurred! + errorOccurred: Ha ocurrido un ERROR! noDefaultSourceAccountExist: | - 🙈 Whoa! You do not have any Asset accounts to withdraw money from! + 🙈 Recórcholis! No tienes ninguna cuenta de Activo de donde sacar dinero! - 🙏 Please, navigate to your Firefly III website and create at least one Asset account. + 🙏 Por favor, ve a tu pagina de Firefly III y crea al menos una cuenta de Activo. mdlwr: - noFireflyURLFound: To work with the bot, you need to specify *🔗 Firefly URL* in bot *🔧 Settings*. - noFireflyAccessTokenFound: To work with the bot, you need to specify a valid *🔑 Access Token* in bot *🔧 Settings*. + noFireflyURLFound: Para usar el bot, necesitas indicar una *🔗 URL de Firefly* válida en la *🔧 Configuración* del Bot. + noFireflyAccessTokenFound: Para usar el bot, necesitas indicar un *🔑 Token de Acceso* válido en la *🔧 Configuración* del Bot. settings: - notSpecified: '🚨 ' + notSpecified: '🚨 ' inputFireflyUrl: > - Type in URL address of your Firefly III instance. - It should be in the format of this: *https://firefly.example.com* - or this: *http://localhost:8080* + Indica la dirección web de tu instancia Firefly III. + Debe tener éste formato: *https://firefly.example.com* + o así: *http://localhost:8080* inputFireflyAccessToken: > - Paste your Personal Access Token. - You can create and copy it from the Firefly III web interface: - *Options → Profile → OAuth → Create new token* - defaultAssetAccountSet: Default asset account has been set! + Pega el testo de tu Token de Acceso + Puedes crearlo y copiarlo de la interface web de Firefly III + *Opciones → Perfil → OAuth → Crear nuevo token* + defaultAssetAccountSet: La cuenta de Activo pro defecto ha sido configurada! whatDoYouWantToChange: > - 🔧 *Settings* + 🔧 *Configuración* - What do you want to change? + Que te gustaría modificar? - *🔗 Firefly URL*: ${fireflyUrl || '🚨 '} + *🔗 URL de Firefly*: ${fireflyUrl || '🚨 '} - *🔑 Access Token*: ${accessToken || '🚨 '} + *🔑 Token de Acceso*: ${accessToken || '🚨 '} - *💳 Default asset account*: ${defaultSourceAccount.name || '🚨 '} + *💳 Cuenta de Activo por defecto*: ${defaultSourceAccount.name || '🚨 '} - *🌐 Language*: ${language} + *🌐 Idioma*: ${language} selectDefaultAssetAccount: > Choose an asset account which will be used as a default one for withdrawals. If left unset, the very first asset account from the list below will be used by default: From 4841a8ac2690bf3a17855da7833f864c67c839bf Mon Sep 17 00:00:00 2001 From: JF Caringi <47096567+MrCaringi@users.noreply.github.com> Date: Wed, 27 Sep 2023 13:10:23 -0600 Subject: [PATCH 03/13] Update es.yml --- src/locales/es.yml | 168 ++++++++++++++++++++++----------------------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/src/locales/es.yml b/src/locales/es.yml index 924bfbf..1b0078e 100644 --- a/src/locales/es.yml +++ b/src/locales/es.yml @@ -7,7 +7,7 @@ labels: ACCOUNTS: 💳 Cuentas ADD_CATEGORIES: ➕ Nueva Categoría CANCEL: ✖ Cancelar - CATEGORIES: 🔖 Categorias + CATEGORIES: 🔖 Categorías CHANGE_CATEGORY: 🔖 Categoría CHANGE_DATE: 📆 Fecha CHANGE_AMOUNT: 💸 Importe @@ -41,12 +41,12 @@ labels: SWITCH_TO_SPANISH: 🇪🇸 Cambiar a Español welcome: > - 👋 Hola! Este bot te ayudará a agregar trasacciones de forma rápida y cómoda a Firefly III. + 👋 Hola! Este bot te ayudará a agregar transacciones de forma rápida y cómoda a Firefly III. También podrás gestionar algunas entidades de Firefly needToSet: 'Para empezar a usar el bot, necesitas indicar lo siguiente:' setFireflyUrl: ' - *🔗 URL de Firefly* - Dirección web de tu instancia Firefly III' setFireflyAccessToken: ' - *🔑 Token de Acceso* Creado en la interface web de Firefly III' -navigateToSettings: 'Para continuar el proceso, ve a *🔧 Connfiguración*.' +navigateToSettings: 'Para continuar el proceso, ve a *🔧 Configuración*.' help: > 🤖 Por favor, ve a la sección de *🔧 Configuración* del bot y configura los requisitos para empezar a usar el bot. @@ -55,7 +55,7 @@ help: > por ejemplo `100-5*3`. Una vez recibido el monto o importe, el bot pedirá datos adicionales para los parámetros de la transacción. - También puedes agregar transacciones que no requiren datos adicionales, + También puedes agregar transacciones que no requieren datos adicionales, enviando la descripción y el importe, por ejemplo `Cafe 35` @@ -63,7 +63,7 @@ help: > En este caso, se creará un nuevo retiro de la cuenta de activo por defecto con la descripción `Cafe` por un importe de 35` - ✨ Si requieres parametros o datos adicionales en la transacción, puedes usar la + ✨ Si requieres parámetros o datos adicionales en la transacción, puedes usar la funcionalidad de *Reglas* en Firefly III, la cual te permitirá complementar cualquier información requerida en al transacción. @@ -72,7 +72,7 @@ common: noDefaultSourceAccountExist: | 🙈 Recórcholis! No tienes ninguna cuenta de Activo de donde sacar dinero! - 🙏 Por favor, ve a tu pagina de Firefly III y crea al menos una cuenta de Activo. + 🙏 Por favor, ve a tu página de Firefly III y crea al menos una cuenta de Activo. mdlwr: noFireflyURLFound: Para usar el bot, necesitas indicar una *🔗 URL de Firefly* válida en la *🔧 Configuración* del Bot. noFireflyAccessTokenFound: Para usar el bot, necesitas indicar un *🔑 Token de Acceso* válido en la *🔧 Configuración* del Bot. @@ -80,13 +80,13 @@ settings: notSpecified: '🚨 ' inputFireflyUrl: > Indica la dirección web de tu instancia Firefly III. - Debe tener éste formato: *https://firefly.example.com* + Debe tener este formato: *https://firefly.example.com* o así: *http://localhost:8080* inputFireflyAccessToken: > Pega el testo de tu Token de Acceso - Puedes crearlo y copiarlo de la interface web de Firefly III + Puedes crearlo y copiarlo de la interfaz web de Firefly III *Opciones → Perfil → OAuth → Crear nuevo token* - defaultAssetAccountSet: La cuenta de Activo pro defecto ha sido configurada! + defaultAssetAccountSet: La cuenta de Activo por defecto ha sido configurada! whatDoYouWantToChange: > 🔧 *Configuración* @@ -100,31 +100,31 @@ settings: *🌐 Idioma*: ${language} selectDefaultAssetAccount: > - Choose an asset account which will be used as a default one for withdrawals. - If left unset, the very first asset account from the list below will be used by default: - specifySmthFirst: Specify ${smth} first. - connectionFailed: Connection has NOT been established! - connectionFailedUnauthenticated: Authentication error! Please make sure that specified Access Token is not malformed and not expired. - connectionFailedBadUrl: Error connecting to Firefly host! Please make sure that you specified the right Firefly URL. + Escoge una cuenta de Activo la cual será usada por defecto en los retiros. + Si se deja sin configurar, se usará por defecto la primera cuenta de Activo de la siguiente lista: + specifySmthFirst: Primero indica ${smth}. + connectionFailed: La conexión NO ha sido establecida! + connectionFailedUnauthenticated: Error de Autenticación! Por favor asegurate que el Token de Acceso indicado no ha expirado o adulterado. + connectionFailedBadUrl: Error al conectarse a la instancia de Firefly! Por favor, asegúrate que has indicar la direccion web (URL) correcta de Firefly. connectionSuccess: > - Connection established! + Conexión establecida! - Hi, ${email}! - badAccessToken: Entered text does not look like an Access Token. Try again, please. + Hola, ${email}! + badAccessToken: El texto indicado no parece ser un Token de Acceso. Por favor, intentalo de nuevo. badUrl: > - Entered text does not look like a URL address. Try again, please. - Type in the URL address of your Firefly III instance, for example https://firefly.example.com: + El texto indicado no parece ser una Dirección Web. Por favor, intentalo de nuevo. + Indicar la Dirección URL de tu instancia Firefly III, por ejemplo https://firefly.example.com: accounts: labels: - asset: Asset accounts - expense: Expense accounts - revenue: Revenue accounts - liability: Liabilities + asset: Cuentas de Activos + expense: Cuentas de Gastos + revenue: Cuentas de Ingresos + liability: Pasivos list: - noAccounts: No accounts yet🤷 + noAccounts: No hay cuentas🤷 asset: > - Balance of your asset accounts: + Saldo de tus cuentas de Activos:
${accounts.replace(/\n$/, '')}
       
@@ -132,7 +132,7 @@ accounts:
       
       SUM: ${sums ? sums : '0'}
expense: > - Balance of your expense accounts: + Saldo de tus cuentas de Gastos:
${accounts.replace(/\n$/, '')}
       
@@ -140,7 +140,7 @@ accounts:
       
       SUM: ${sums ? sums : '0'}
revenue: > - Balance of your revenue accounts: + Saldo de tus cuentas de Ingresos:
${accounts.replace(/\n$/, '')}
       
@@ -148,7 +148,7 @@ accounts:
       
       SUM: ${sums ? sums : '0'}
liability: > - Balance of your liabilities: + Saldo de tus cuentas de Pasivo:
${accounts.replace(/\n$/, '')}
       
@@ -159,7 +159,7 @@ accounts:
 transactions:
   list:
     withdrawal: >
-      Your withdrawals for ${day}:  
+      Tus Gastos al ${day}:  
         
       
${transactions.replace(/\n$/, '')}
       
@@ -167,7 +167,7 @@ transactions:
       
       SUM: ${sums ? sums : '0'}
deposit: > - Your revenues for ${day}: + Tus Ingresos al ${day}:
${transactions.replace(/\n$/, '')}
       
@@ -175,102 +175,102 @@ transactions:
       
       SUM: ${sums ? sums : '0'}
transfer: > - Your transactions for ${day}: + Tus Transacciones al ${day}:
${transactions.replace(/\n$/, '')}
- noTransactions: 🤷 No transactions + noTransactions: 🤷 No hay transacciones add: dontUnderstand: > - 🤖 I don't understand that. - Enter a transaction amount, it needs to be a number! 😉 + 🤖 No entendí esto. + Ingresa un importe para la transacción, debe ser un número! 😉 withdrawalMessage: > 📆 ${date} - 📤 Added ${description === 'N/A' ? '' : '*' + description + '*'} - *${amount}* *${currency}*${category ? ' to category *' + category + '*' : ''} + 📤 Añadido ${description === 'N/A' ? '' : '*' + description + '*'} + *${amount}* *${currency}*${category ? ' a la categoría *' + category + '*' : ''} ${source} ➡️ ${destination} depositMessage: > 📆 ${date} - 📥 Added ${description === 'N/A' ? '' : '*' + description + '* '} + 📥 Añadido ${description === 'N/A' ? '' : '*' + description + '* '} *${amount}* *${currency}* ${source} ➡️ ${destination} transferMessage: > 📆 ${date} - ↔️ Transfer *${amount}* *${currency}* from account *${source}* to account *${destination}* - selectCategory: In which category to add *${amount}*? + ↔️ Transferido *${amount}* *${currency}* de la Cuenta *${source}* a la Cuenta *${destination}* + selectCategory: A cual Categoría añadir *${amount}*? noCategoriesYet: | - 🤷 You haven't created any categories yet. - The transaction will be created without a category. Continue? + 🤷 Aún no has creado ninguna Categoría. + La transacción será creada sin Categoría. Seguir? - 💡 You can ceasily create new categories from a corresponding *🔖 Categories* bot button. - transactionDeleted: Transaction deleted! - couldNotDelete: 'Could not delete transaction by id: ${id}' - selectRevenueAccount: 'Choose a revenue account to withdraw *${amount}*:' - selectAssetAccount: 'Choose an asset account to add *${amount}*:' - selectSourceAccount: 'Choose an account to transfer *${amount}* from:' - selectDestAccount: 'Choose an account to transfer to:' - transactionError: '❗😰 Ann error occurred during transaction creation: *${message}*' - created: Transaction created! + 💡 Puedes crear Categorías fácilmente, usando el botón *🔖 Categorias*. + transactionDeleted: Transacción eliminada! + couldNotDelete: 'No se pudo eliminar la transacción con el id: ${id}' + selectRevenueAccount: 'Elige una cuenta de Ingreso para retirar *${amount}*:' + selectAssetAccount: 'Elige una cuenta de Activo para añadir *${amount}*:' + selectSourceAccount: 'Selecciona una cuenta desde donde se va a transferir *${amount}*:' + selectDestAccount: 'Selecciona una cuenta a la cual transferir:' + transactionError: '❗😰 Ocurrió un error durante la creación de la transacción: *${message}*' + created: Transacción creada! edit: - whatToEdit: ❓What do you want to change? - updated: Transaction updated! - badAmountTyped: 'An amount should be a number. Type in new amount please:' - badDescriptionTyped: 'Description needs to be text. Type in new description please:' + whatToEdit: ❓Que desea modificar? + updated: Transacción actualizada! + badAmountTyped: 'El Importe debe ser un número. Ingresa un nuevo Importe por favor:' + badDescriptionTyped: 'La Descripción debe ser un texto. Ingresa una nueva Descripción por favor:' typeNewAmount: > - Type in new amount. + Ingresa un nuevo importe. - 💡 You can use the arithmetic signs for addition, subtraction, multiplication and division to perform the appropriate operation on the current value of the transaction. + 💡 Puedes usar signos aritméticos para la suma, resta, multiplicación y división para que se realice el cálculo del importe de la transacción. - For example, "+35" would add 35 to existing amount of transaction. + Por ejemplo, "+35" sumará 35 al importe existente de la transacción. noCategoriesYet: | - 🤷 You haven't created any categories yet. + 🤷 Aún no has creado ninguna Categoría. - 💡 You can easily create new categories from a corresponding *🔖 Categories* bot button. - typeNewDescription: 'Type in new description:' - chooseNewCategory: 'Choose new category:' - chooseNewSourceAccount: 'Choose new source account:' - chooseNewDestinationAccount: 'Choose new destination account:' - chooseNewRevenueAccount: 'Choose new revenue account:' + 💡 Puedes agregar nuevas Categorías fácilmente usando el boton *🔖 Categorias* del bot. + typeNewDescription: 'Ingresa una nueva Descripción:' + chooseNewCategory: 'Elige una nueva Categoría:' + chooseNewSourceAccount: 'Elige una nueva Cuenta de origen:' + chooseNewDestinationAccount: 'Elige una nueva Cuenta de destino:' + chooseNewRevenueAccount: 'Elige una nueva Cuenta de Ingreso:' noSuchTransactionAnymore: | - 🤖 This transaction (${id}) does not exist anymore! - It was probably deleted via the Firefly website. + 🤖 La transacción (${id}) ya no existe! + Posiblemente ha sido borrado desde la página web de Firefly. categories: - listEmpty: No categories yet :( + listEmpty: Aún no hay Categorías :( list: > - To view transactions for a specific category, choose it from the list bellow. - You can also rename or delete a category once it is chosen. + Para ver las transacciones de una Categoría específica, selecciona de la lista debajo. + También puedes renombrar o borrar una categoría una vez que haya sido seleccionada. typeCategories: > - Type in your new categories so that each one would be on a separate line, for example: + Ingresa tus nuevas Categorías, de tal manera que cada una esté en una línea por separado, por ejemplo: - 💡 Utilities + 💡 Servicios - 👕 Clothes and shoes + 👕 Ropa y Calzado - 🥦 Groceries + 🥦 Comida - *P.S.*: Category names can be changed later. + *Postdata*: Los nombres de las Categorías se pueden cambiar posteriormente. - *P.P.S.*: It's OK if a category with the same name already exists. + *Post-Postdata*: No hay problema si ya existe una Categoría con ese nombre. confirmCreation: > - ${categories.length} new category(s) will be created: + ${categories.length} nueva(s) Categoría(s) serán creadas: ${categories.join('\n')} - Is that OK? - typeNewName: 'Type in new category name:' + Está bien? + typeNewName: 'Ingresa el nuevo nombre del a Categoría:' confirmDeletion: > - Are you sure that you want to delete this category? - Corresponding transactions won't be deleted. They can be found in *🔀 Transactions* section. - deleted: Category deleted! - noTransactions: No transactions + Estás seguro de que quieres eliminar ésta Categoría? + Las transacciones relacionadas no serán eliminadas. Éstas se puedes encontrar en la sección de *🔀 Transacciones*. + deleted: Categoría eliminada! + noTransactions: Sin transacciones transactionsList: > - ${categoryName} withdrawals for the month of ${monthName}: + ${categoryName} Gastos del mes de ${monthName}:
${transactions.replace(/\n$/, '')}
     

From 8b3d373e426accf1520e7dee47ccad673b47e3df Mon Sep 17 00:00:00 2001
From: Alex Sukhov 
Date: Mon, 6 Nov 2023 15:35:24 +0300
Subject: [PATCH 04/13] Bootstrap es locale

---
 src/composers/categories.ts                     | 1 +
 src/composers/reports.ts                        | 1 +
 src/composers/settings.ts                       | 1 +
 src/composers/transactions/list-transactions.ts | 1 +
 src/lib/i18n.ts                                 | 2 ++
 src/lib/middlewares.ts                          | 6 ++++++
 6 files changed, 12 insertions(+)

diff --git a/src/composers/categories.ts b/src/composers/categories.ts
index 041b020..f30e586 100644
--- a/src/composers/categories.ts
+++ b/src/composers/categories.ts
@@ -34,6 +34,7 @@ const router = new Router((ctx) => ctx.session.step)
 
 bot.hears(i18n.t('ru', 'labels.CATEGORIES'), listCategoriesCommandHandler)
 bot.hears(i18n.t('en', 'labels.CATEGORIES'), listCategoriesCommandHandler)
+bot.hears(i18n.t('es', 'labels.CATEGORIES'), listCategoriesCommandHandler)
 bot.hears(i18n.t('it', 'labels.CATEGORIES'), listCategoriesCommandHandler)
 bot.callbackQuery(CATEGORY_DETAILS, showCategoryDetails)
 bot.callbackQuery(ADD_CATEGORIES, addCategoriesCbQH)
diff --git a/src/composers/reports.ts b/src/composers/reports.ts
index b8258c4..eaddeae 100644
--- a/src/composers/reports.ts
+++ b/src/composers/reports.ts
@@ -8,6 +8,7 @@ import type { MyContext } from '../types/MyContext'
 const bot = new Composer()
 
 bot.hears(i18n.t('en', 'labels.REPORTS'), reportsHandler)
+bot.hears(i18n.t('es', 'labels.REPORTS'), reportsHandler)
 bot.hears(i18n.t('ru', 'labels.REPORTS'), reportsHandler)
 bot.hears(i18n.t('it', 'labels.REPORTS'), reportsHandler)
 
diff --git a/src/composers/settings.ts b/src/composers/settings.ts
index fac5d10..d7a056b 100644
--- a/src/composers/settings.ts
+++ b/src/composers/settings.ts
@@ -153,6 +153,7 @@ bot.use(requireSettings())
 
 bot.command(command.SETTINGS, settingsCommandHandler)
 bot.hears(i18n.t('en', 'labels.SETTINGS'), settingsCommandHandler)
+bot.hears(i18n.t('es', 'labels.SETTINGS'), settingsCommandHandler)
 bot.hears(i18n.t('ru', 'labels.SETTINGS'), settingsCommandHandler)
 bot.hears(i18n.t('it', 'labels.SETTINGS'), settingsCommandHandler)
 
diff --git a/src/composers/transactions/list-transactions.ts b/src/composers/transactions/list-transactions.ts
index 148e6ce..1a3d0cc 100644
--- a/src/composers/transactions/list-transactions.ts
+++ b/src/composers/transactions/list-transactions.ts
@@ -22,6 +22,7 @@ const bot = new Composer()
 
 // List transactions
 bot.hears(i18n.t('en', 'labels.TRANSACTIONS'), showTransactions)
+bot.hears(i18n.t('es', 'labels.TRANSACTIONS'), showTransactions)
 bot.hears(i18n.t('ru', 'labels.TRANSACTIONS'), showTransactions)
 bot.hears(i18n.t('it', 'labels.TRANSACTIONS'), showTransactions)
 bot.callbackQuery(mapper.list.regex(), showTransactions)
diff --git a/src/lib/i18n.ts b/src/lib/i18n.ts
index dfc60ec..c95d840 100644
--- a/src/lib/i18n.ts
+++ b/src/lib/i18n.ts
@@ -5,6 +5,7 @@ import dayjs from 'dayjs'
 import localizedFormat from 'dayjs/plugin/localizedFormat'
 import 'dayjs/locale/ru'
 import 'dayjs/locale/en'
+import 'dayjs/locale/es'
 
 const defaultLanguage = 'en'
 
@@ -32,6 +33,7 @@ export function getLanguageIcon(language: string) {
   const lang2icons = {
     ru: '🇷🇺',
     en: '🇬🇧',
+    es: '🇪🇸',
     it: '🇮🇹'
   }
 
diff --git a/src/lib/middlewares.ts b/src/lib/middlewares.ts
index 0e600f5..9452e4f 100644
--- a/src/lib/middlewares.ts
+++ b/src/lib/middlewares.ts
@@ -32,6 +32,12 @@ export function cleanup() {
       i18n.t('en', 'labels.REPORTS'),
       i18n.t('en', 'labels.CATEGORIES'),
 
+      i18n.t('es', 'labels.SETTINGS'),
+      i18n.t('es', 'labels.TRANSACTIONS'),
+      i18n.t('es', 'labels.ACCOUNTS'),
+      i18n.t('es', 'labels.REPORTS'),
+      i18n.t('es', 'labels.CATEGORIES'),
+
       i18n.t('it', 'labels.SETTINGS'),
       i18n.t('it', 'labels.TRANSACTIONS'),
       i18n.t('it', 'labels.ACCOUNTS'),

From 3f6a658d512e6329f3cc21e67c490415ae137e01 Mon Sep 17 00:00:00 2001
From: Alex Sukhov 
Date: Mon, 6 Nov 2023 16:25:52 +0300
Subject: [PATCH 05/13] introduce locales array and export it

---
 src/composers/accounts.ts                       | 8 ++++----
 src/composers/categories.ts                     | 9 ++++-----
 src/composers/reports.ts                        | 9 ++++-----
 src/composers/settings.ts                       | 4 ++--
 src/composers/transactions/list-transactions.ts | 9 ++++-----
 src/lib/i18n.ts                                 | 3 ++-
 6 files changed, 20 insertions(+), 22 deletions(-)

diff --git a/src/composers/accounts.ts b/src/composers/accounts.ts
index aa719d6..e40c820 100644
--- a/src/composers/accounts.ts
+++ b/src/composers/accounts.ts
@@ -5,7 +5,7 @@ import { table, getBorderCharacters } from 'table'
 import type { Alignment } from 'table'
 
 import type { MyContext } from '../types/MyContext'
-import i18n from '../lib/i18n'
+import i18n, { locales } from '../lib/i18n'
 import {
   listAccountsMapper as mapper,
   createAccountsMenuKeyboard
@@ -22,9 +22,9 @@ const debug = Debug(`bot:accounts`)
 const bot = new Composer()
 
 // List transactions
-bot.hears(i18n.t('en', 'labels.ACCOUNTS'), showAccounts)
-bot.hears(i18n.t('ru', 'labels.ACCOUNTS'), showAccounts)
-bot.hears(i18n.t('it', 'labels.ACCOUNTS'), showAccounts)
+for (const locale of locales) {
+  bot.hears(i18n.t(locale, 'labels.ACCOUNTS'), showAccounts)
+}
 bot.callbackQuery(mapper.list.regex(), showAccounts)
 bot.callbackQuery(mapper.close.regex(), closeHandler)
 
diff --git a/src/composers/categories.ts b/src/composers/categories.ts
index f30e586..ea302d3 100644
--- a/src/composers/categories.ts
+++ b/src/composers/categories.ts
@@ -6,7 +6,7 @@ import { Composer, InlineKeyboard } from 'grammy'
 import { Router } from "@grammyjs/router"
 
 import type { MyContext } from '../types/MyContext'
-import i18n from '../lib/i18n';
+import i18n, { locales } from '../lib/i18n';
 import firefly from '../lib/firefly'
 import { TransactionRead } from '../lib/firefly/model/transaction-read'
 import { TRANSACTIONS_PAGE_LIMIT } from './constants'
@@ -32,10 +32,9 @@ const DECLINE_CATEGORIES_LIST = 'DECLINE_CATEGORIES_LIST'
 const bot = new Composer()
 const router = new Router((ctx) => ctx.session.step)
 
-bot.hears(i18n.t('ru', 'labels.CATEGORIES'), listCategoriesCommandHandler)
-bot.hears(i18n.t('en', 'labels.CATEGORIES'), listCategoriesCommandHandler)
-bot.hears(i18n.t('es', 'labels.CATEGORIES'), listCategoriesCommandHandler)
-bot.hears(i18n.t('it', 'labels.CATEGORIES'), listCategoriesCommandHandler)
+for (const locale of locales) {
+  bot.hears(i18n.t(locale, 'labels.CATEGORIES'), listCategoriesCommandHandler)
+}
 bot.callbackQuery(CATEGORY_DETAILS, showCategoryDetails)
 bot.callbackQuery(ADD_CATEGORIES, addCategoriesCbQH)
 bot.callbackQuery(RENAME_CATEGORY, typeNewCategoryName)
diff --git a/src/composers/reports.ts b/src/composers/reports.ts
index eaddeae..2e4e624 100644
--- a/src/composers/reports.ts
+++ b/src/composers/reports.ts
@@ -1,5 +1,5 @@
 import { Composer } from 'grammy'
-import i18n from '../lib/i18n'
+import i18n, { locales } from '../lib/i18n'
 
 import type { MyContext } from '../types/MyContext'
 
@@ -7,10 +7,9 @@ import type { MyContext } from '../types/MyContext'
 
 const bot = new Composer()
 
-bot.hears(i18n.t('en', 'labels.REPORTS'), reportsHandler)
-bot.hears(i18n.t('es', 'labels.REPORTS'), reportsHandler)
-bot.hears(i18n.t('ru', 'labels.REPORTS'), reportsHandler)
-bot.hears(i18n.t('it', 'labels.REPORTS'), reportsHandler)
+for (const locale of locales) {
+  bot.hears(i18n.t(locale, 'labels.REPORTS'), reportsHandler)
+}
 
 async function reportsHandler(ctx: MyContext) {
   await ctx.reply(ctx.i18n.t('reports.notImplemented'), { parse_mode: 'Markdown' })
diff --git a/src/composers/settings.ts b/src/composers/settings.ts
index d7a056b..18ec0a3 100644
--- a/src/composers/settings.ts
+++ b/src/composers/settings.ts
@@ -5,7 +5,7 @@ import { Router } from "@grammyjs/router"
 import { Menu, MenuRange } from '@grammyjs/menu'
 
 import type { MyContext } from '../types/MyContext'
-import i18n, { getLanguageIcon } from '../lib/i18n';
+import i18n, { getLanguageIcon, locales } from '../lib/i18n';
 import { command, ACCOUNTS_PAGE_LIMIT } from './constants'
 import firefly from '../lib/firefly'
 import { AccountTypeFilter } from '../lib/firefly/model/account-type-filter'
@@ -68,7 +68,7 @@ const settingsMenu = new Menu('settings')
 const langMenu = new Menu('switch-lang')
   .dynamic(() => {
     const range = new MenuRange()
-    for (const locale of ['ru', 'it', 'en']) {
+    for (const locale of locales) {
       const langText = 'labels.' + `SWITCH_TO_${locale}`.toUpperCase()
       range.text(
         {
diff --git a/src/composers/transactions/list-transactions.ts b/src/composers/transactions/list-transactions.ts
index 1a3d0cc..afa25f7 100644
--- a/src/composers/transactions/list-transactions.ts
+++ b/src/composers/transactions/list-transactions.ts
@@ -4,7 +4,7 @@ import { Composer, InlineKeyboard } from 'grammy'
 import { table, getBorderCharacters } from 'table'
 
 import type { MyContext } from '../../types/MyContext'
-import i18n from '../../lib/i18n'
+import i18n, { locales } from '../../lib/i18n'
 import {
   listTransactionsMapper as mapper
 } from '../helpers'
@@ -21,10 +21,9 @@ const debug = Debug(`bot:transactions:list`)
 const bot = new Composer()
 
 // List transactions
-bot.hears(i18n.t('en', 'labels.TRANSACTIONS'), showTransactions)
-bot.hears(i18n.t('es', 'labels.TRANSACTIONS'), showTransactions)
-bot.hears(i18n.t('ru', 'labels.TRANSACTIONS'), showTransactions)
-bot.hears(i18n.t('it', 'labels.TRANSACTIONS'), showTransactions)
+for (const locale of locales) {
+  bot.hears(i18n.t(locale, 'labels.TRANSACTIONS'), showTransactions)
+}
 bot.callbackQuery(mapper.list.regex(), showTransactions)
 bot.callbackQuery(mapper.close.regex(), closeHandler)
 
diff --git a/src/lib/i18n.ts b/src/lib/i18n.ts
index c95d840..0ac18e4 100644
--- a/src/lib/i18n.ts
+++ b/src/lib/i18n.ts
@@ -27,6 +27,8 @@ const params = {
 
 const i18n = new I18n(params)
 
+export const locales = ['ru', 'it', 'en', 'es']
+
 export default i18n
 
 export function getLanguageIcon(language: string) {
@@ -36,6 +38,5 @@ export function getLanguageIcon(language: string) {
     es: '🇪🇸',
     it: '🇮🇹'
   }
-
   return lang2icons[language]
 }

From d8990a9e471934dcbc8c2891c24cf78821ab01bf Mon Sep 17 00:00:00 2001
From: Alex Sukhov 
Date: Mon, 6 Nov 2023 16:38:43 +0300
Subject: [PATCH 06/13] introduce locales array and export it

---
 src/composers/settings.ts |  7 +++----
 src/lib/middlewares.ts    | 41 ++++++++++++---------------------------
 src/locales/en.yaml       |  1 +
 3 files changed, 16 insertions(+), 33 deletions(-)

diff --git a/src/composers/settings.ts b/src/composers/settings.ts
index 18ec0a3..ae07304 100644
--- a/src/composers/settings.ts
+++ b/src/composers/settings.ts
@@ -151,11 +151,10 @@ settingsMenu.register(cancelMenu)
 bot.use(settingsMenu)
 bot.use(requireSettings())
 
+for (const locale of locales) {
+  bot.hears(i18n.t(locale, 'labels.SETTINGS'), settingsCommandHandler)
+}
 bot.command(command.SETTINGS, settingsCommandHandler)
-bot.hears(i18n.t('en', 'labels.SETTINGS'), settingsCommandHandler)
-bot.hears(i18n.t('es', 'labels.SETTINGS'), settingsCommandHandler)
-bot.hears(i18n.t('ru', 'labels.SETTINGS'), settingsCommandHandler)
-bot.hears(i18n.t('it', 'labels.SETTINGS'), settingsCommandHandler)
 
 // Local routes and handlers
 router.route('IDLE', (_, next) => next())
diff --git a/src/lib/middlewares.ts b/src/lib/middlewares.ts
index 9452e4f..c574199 100644
--- a/src/lib/middlewares.ts
+++ b/src/lib/middlewares.ts
@@ -1,6 +1,6 @@
 import debug from 'debug'
 
-import i18n from './i18n'
+import i18n, { locales } from './i18n'
 import { command } from '../composers/constants'
 import type { MyContext } from '../types/MyContext'
 import { createMainKeyboard } from '../composers/helpers'
@@ -19,31 +19,14 @@ export function cleanup() {
     if (ctx.msg!.from!.is_bot) return next()
 
     const text = ctx.msg!.text || ''
-    const keyboardCommandList = [
-      i18n.t('ru', 'labels.SETTINGS'),
-      i18n.t('ru', 'labels.TRANSACTIONS'),
-      i18n.t('ru', 'labels.ACCOUNTS'),
-      i18n.t('ru', 'labels.REPORTS'),
-      i18n.t('ru', 'labels.CATEGORIES'),
-
-      i18n.t('en', 'labels.SETTINGS'),
-      i18n.t('en', 'labels.TRANSACTIONS'),
-      i18n.t('en', 'labels.ACCOUNTS'),
-      i18n.t('en', 'labels.REPORTS'),
-      i18n.t('en', 'labels.CATEGORIES'),
-
-      i18n.t('es', 'labels.SETTINGS'),
-      i18n.t('es', 'labels.TRANSACTIONS'),
-      i18n.t('es', 'labels.ACCOUNTS'),
-      i18n.t('es', 'labels.REPORTS'),
-      i18n.t('es', 'labels.CATEGORIES'),
-
-      i18n.t('it', 'labels.SETTINGS'),
-      i18n.t('it', 'labels.TRANSACTIONS'),
-      i18n.t('it', 'labels.ACCOUNTS'),
-      i18n.t('it', 'labels.REPORTS'),
-      i18n.t('it', 'labels.CATEGORIES'),
-    ]
+    const keyboardCommandList = []
+    for (const locale of locales) {
+      keyboardCommandList.push(i18n.t(locale, 'labels.SETTINGS'))
+      keyboardCommandList.push(i18n.t(locale, 'labels.TRANSACTIONS'))
+      keyboardCommandList.push(i18n.t(locale, 'labels.ACCOUNTS'))
+      keyboardCommandList.push(i18n.t(locale, 'labels.REPORTS'))
+      keyboardCommandList.push(i18n.t(locale, 'labels.CATEGORIES'))
+    }
     log('keyboardCommandList: %O', keyboardCommandList)
     log('keyboardCommandList.includes(text): %O', keyboardCommandList.includes(text))
 
@@ -77,11 +60,11 @@ export function requireSettings() {
       // We allow only the commands routes to enter if Firefly URL or Firefly
       // Token are not set
       const whiteList = [
-        i18n.t('ru', 'labels.SETTINGS'),
-        i18n.t('en', 'labels.SETTINGS'),
-        i18n.t('it', 'labels.SETTINGS'),
         ...Object.values(command)
       ]
+      for (const locale of locales) {
+        whiteList.push(i18n.t(locale, 'labels.SETTINGS'))
+      }
       log('whiteList: %O', whiteList)
       log('callbackQuery: %O', ctx.callbackQuery)
       const isCallbackQuery = !!ctx.callbackQuery
diff --git a/src/locales/en.yaml b/src/locales/en.yaml
index 539abe6..b578bd0 100644
--- a/src/locales/en.yaml
+++ b/src/locales/en.yaml
@@ -41,6 +41,7 @@ labels:
   YES: ✅ Yes
   SWITCH_LANG: 🌐 Language
   SWITCH_TO_EN: 🇬🇧 English
+  SWITCH_TO_ES: 🇪🇸 Spanish
   SWITCH_TO_RU: 🇷🇺 Russian
   SWITCH_TO_IT: 🇮🇹 Italian
 

From 4b131c1baac1f8db30912e71292af8dff9ca5789 Mon Sep 17 00:00:00 2001
From: Alex Sukhov 
Date: Mon, 6 Nov 2023 16:45:26 +0300
Subject: [PATCH 07/13] Get rid of obsolete getLanguageIcon

---
 src/composers/settings.ts |  2 +-
 src/lib/i18n.ts           | 10 ----------
 2 files changed, 1 insertion(+), 11 deletions(-)

diff --git a/src/composers/settings.ts b/src/composers/settings.ts
index ae07304..dc2b741 100644
--- a/src/composers/settings.ts
+++ b/src/composers/settings.ts
@@ -5,7 +5,7 @@ import { Router } from "@grammyjs/router"
 import { Menu, MenuRange } from '@grammyjs/menu'
 
 import type { MyContext } from '../types/MyContext'
-import i18n, { getLanguageIcon, locales } from '../lib/i18n';
+import i18n, { locales } from '../lib/i18n';
 import { command, ACCOUNTS_PAGE_LIMIT } from './constants'
 import firefly from '../lib/firefly'
 import { AccountTypeFilter } from '../lib/firefly/model/account-type-filter'
diff --git a/src/lib/i18n.ts b/src/lib/i18n.ts
index 0ac18e4..50b971f 100644
--- a/src/lib/i18n.ts
+++ b/src/lib/i18n.ts
@@ -30,13 +30,3 @@ const i18n = new I18n(params)
 export const locales = ['ru', 'it', 'en', 'es']
 
 export default i18n
-
-export function getLanguageIcon(language: string) {
-  const lang2icons = {
-    ru: '🇷🇺',
-    en: '🇬🇧',
-    es: '🇪🇸',
-    it: '🇮🇹'
-  }
-  return lang2icons[language]
-}

From 9a49df8bef882805c8a702503d8aeda67ad9e4e8 Mon Sep 17 00:00:00 2001
From: Alex Sukhov 
Date: Mon, 6 Nov 2023 16:48:18 +0300
Subject: [PATCH 08/13] Add missin it locale import

---
 src/lib/i18n.ts | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/lib/i18n.ts b/src/lib/i18n.ts
index 50b971f..b6a819d 100644
--- a/src/lib/i18n.ts
+++ b/src/lib/i18n.ts
@@ -3,9 +3,11 @@ import { I18n, pluralize } from '@grammyjs/i18n';
 
 import dayjs from 'dayjs'
 import localizedFormat from 'dayjs/plugin/localizedFormat'
+
 import 'dayjs/locale/ru'
 import 'dayjs/locale/en'
 import 'dayjs/locale/es'
+import 'dayjs/locale/it'
 
 const defaultLanguage = 'en'
 

From 16e222e76d05e0fc69ba6237b8533900555932cf Mon Sep 17 00:00:00 2001
From: Alex Sukhov 
Date: Mon, 6 Nov 2023 16:50:25 +0300
Subject: [PATCH 09/13] Minor refactoring

---
 src/lib/middlewares.ts | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/src/lib/middlewares.ts b/src/lib/middlewares.ts
index c574199..956de14 100644
--- a/src/lib/middlewares.ts
+++ b/src/lib/middlewares.ts
@@ -59,9 +59,7 @@ export function requireSettings() {
       log('text: %O', text)
       // We allow only the commands routes to enter if Firefly URL or Firefly
       // Token are not set
-      const whiteList = [
-        ...Object.values(command)
-      ]
+      const whiteList = [ ...Object.values(command) ]
       for (const locale of locales) {
         whiteList.push(i18n.t(locale, 'labels.SETTINGS'))
       }

From 1cf5331b166d914036f87ccc9f54bb49cc61478d Mon Sep 17 00:00:00 2001
From: Alex Sukhov 
Date: Mon, 6 Nov 2023 16:53:46 +0300
Subject: [PATCH 10/13] Add SWITCH_TO_ES label to ru and it files

---
 src/locales/it.yaml | 1 +
 src/locales/ru.yaml | 7 ++++---
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/locales/it.yaml b/src/locales/it.yaml
index 29013c5..151bb03 100644
--- a/src/locales/it.yaml
+++ b/src/locales/it.yaml
@@ -41,6 +41,7 @@ labels:
   YES: ✅ Si
   SWITCH_LANG: 🌐 Lingua
   SWITCH_TO_EN: 🇬🇧 Inglese
+  SWITCH_TO_ES: 🇪🇸 Spagnolo
   SWITCH_TO_RU: 🇷🇺 Russo
   SWITCH_TO_IT: 🇮🇹 Italiano
 
diff --git a/src/locales/ru.yaml b/src/locales/ru.yaml
index 325ff3e..185e828 100644
--- a/src/locales/ru.yaml
+++ b/src/locales/ru.yaml
@@ -40,9 +40,10 @@ labels:
   TRANSACTIONS: 🔀 Транзакции
   YES: ✅ Да
   SWITCH_LANG: 🌐Язык 
-  SWITCH_TO_EN: 🇬🇧  Английский 
-  SWITCH_TO_RU: 🇷🇺  Русский
-  SWITCH_TO_IT: 🇮🇹  Итальянский
+  SWITCH_TO_EN: 🇬🇧 Английский 
+  SWITCH_TO_ES: 🇪🇸 Испанский
+  SWITCH_TO_RU: 🇷🇺 Русский
+  SWITCH_TO_IT: 🇮🇹 Итальянский
 
 welcome: >
   👋 Привет! Этот бот помогает быстро создавать транзакции в Firefly III, 

From ffdafa26008a0e1b2ee04bdf5dec2ffb1183a6a0 Mon Sep 17 00:00:00 2001
From: Alex Sukhov 
Date: Mon, 6 Nov 2023 17:12:50 +0300
Subject: [PATCH 11/13] Bump package.json version

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 9a61c77..8dd634a 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "firefly-iii-telegram-bot",
   "description": "A Telegram bot for working with Firefly III with a supersonic speed",
-  "version": "2.0.0",
+  "version": "2.1.0",
   "homepage": "https://github.com/cyxou/firefly-iii-telegram-bot#readme",
   "license": "GPL-3.0-or-later",
   "repository": {

From e912818b809de3e4235def3adf926fa70d78feb0 Mon Sep 17 00:00:00 2001
From: JF Caringi <47096567+MrCaringi@users.noreply.github.com>
Date: Mon, 6 Nov 2023 12:58:57 -0600
Subject: [PATCH 12/13] Update es.yml

new API version 2.0
---
 src/locales/es.yml | 60 ++++++++++++++++++++++++++++++++++------------
 1 file changed, 45 insertions(+), 15 deletions(-)

diff --git a/src/locales/es.yml b/src/locales/es.yml
index 1b0078e..c590cb0 100644
--- a/src/locales/es.yml
+++ b/src/locales/es.yml
@@ -25,6 +25,7 @@ labels:
   EDIT_TRANSACTION: ✏️ Editar
   FIREFLY_ACCESS_TOKEN_BUTTON: 🔑 Token de Acceso
   FIREFLY_URL_BUTTON: 🔗 URL de Firefly
+  FIREFLY_API_URL_BUTTON: 🔗 URL de la API Firefly											  
   LIST_TAGS: 🏷️  Etiqueta
   RENAME_CATEGORY: ✏️ Renombrar
   REPORTS: 📈 Reportes
@@ -33,12 +34,16 @@ labels:
   TO_WITHDRAWALS: 📤 Nuevo Gasto
   TO_DEPOSITS: 📥 Nuevo Depósito
   TO_TRANSFERS: ↔️ Nueva transferencia
+  SHOW_DEPOSITS: 📥 Depósito
+  SHOW_TRANSFERS: ↔️ Transferencias
+  SHOW_WITHDRAWALS: 📤 Gastos					  
   TRANSACTIONS: 🔀 Transacciones
   YES: ✅ Sí
-  SWITCH_TO_ENGLISH: 🇬🇧 Cambiar a Ingles
-  SWITCH_TO_RUSSIAN: 🇷🇺 Cambiar a Ruso
-  SWITCH_TO_ITALIAN: 🇮🇹 Cambiar a Italiano
-  SWITCH_TO_SPANISH: 🇪🇸 Cambiar a Español
+  SWITCH_LANG: 🌐 Idioma
+  SWITCH_TO_EN: 🇬🇧 Cambiar a Ingles
+  SWITCH_TO_RU: 🇷🇺 Cambiar a Ruso
+  SWITCH_TO_IT: 🇮🇹 Cambiar a Italiano
+  SWITCH_TO_ES: 🇪🇸 Cambiar a Español
 
 welcome: >
   👋 Hola! Este bot te ayudará a agregar transacciones de forma rápida y cómoda a Firefly III.
@@ -77,11 +82,16 @@ mdlwr:
   noFireflyURLFound: Para usar el bot, necesitas indicar una *🔗 URL de Firefly* válida en la *🔧 Configuración* del Bot.
   noFireflyAccessTokenFound: Para usar el bot, necesitas indicar un *🔑 Token de Acceso* válido en la *🔧 Configuración* del Bot.
 settings:
+  selectBotLang: 'Selecciona idioma del Bot:'
   notSpecified: '🚨 '
   inputFireflyUrl: >
     Indica la dirección web de tu instancia Firefly III.
     Debe tener este formato: *https://firefly.example.com*
-    o así: *http://localhost:8080*
+	o así: *http://localhost:8080*
+  inputFireflyApiUrl: >
+    Indica la dirección web de la API de tu instancia Firefly III.
+    Normalmente, es la misma URL de tu instancia Firefly III pero con un */api* al final, ejemplo:
+    *https://firefly.example.com/api* o así: *http://localhost:8080/api*
   inputFireflyAccessToken: >
     Pega el testo de tu Token de Acceso
     Puedes crearlo y copiarlo de la interfaz web de Firefly III
@@ -93,23 +103,27 @@ settings:
     Que te gustaría modificar?  
        
     *🔗 URL de Firefly*: ${fireflyUrl || '🚨 '}
+	
+    *🔗 URL de Firefly API*: ${fireflyApiUrl || '🚨 '}
 
     *🔑 Token de Acceso*: ${accessToken || '🚨 '}
 
     *💳 Cuenta de Activo por defecto*: ${defaultSourceAccount.name || '🚨 '}
-
-    *🌐 Idioma*: ${language}
   selectDefaultAssetAccount: >
     Escoge una cuenta de Activo la cual será usada por defecto en los retiros.
     Si se deja sin configurar, se usará por defecto la primera cuenta de Activo de la siguiente lista:
   specifySmthFirst: Primero indica ${smth}.
   connectionFailed: La conexión NO ha sido establecida!
   connectionFailedUnauthenticated: Error de Autenticación! Por favor asegurate que el Token de Acceso indicado no ha expirado o adulterado.
+  resourceNotFound: >
+    Recurso no encontrado!
+    Por favor, asegúrate de haber indicado la URL de la API de Firefly III correctamente.
+    Esto puede suceder sy estas intentando obtener o modificar un recurso no existente.
   connectionFailedBadUrl: Error al conectarse a la instancia de Firefly! Por favor, asegúrate que has indicar la direccion web (URL) correcta de Firefly.
   connectionSuccess: >
     Conexión establecida!
 
-    Hola, ${email}!
+    👋 Hola, ${email}!
   badAccessToken: El texto indicado no parece ser un Token de Acceso. Por favor, intentalo de nuevo.
   badUrl: >
     El texto indicado no parece ser una Dirección Web. Por favor, intentalo de nuevo.
@@ -167,7 +181,7 @@ transactions:
       
       SUM: ${sums ? sums : '0'}
deposit: > - Tus Ingresos al ${day}: + Tus Depósitos al ${day}:
${transactions.replace(/\n$/, '')}
       
@@ -181,8 +195,11 @@ transactions:
     noTransactions: 🤷 No hay transacciones
   add:
     dontUnderstand: >
-      🤖 No entendí esto.  
+      🤖 No entendí esto.
+	  
       Ingresa un importe para la transacción, debe ser un número! 😉
+	  
+	  O, puedes ingresar la description e importe de la transacción, ejemplo, `Comida 25`
     withdrawalMessage: >
       📆 ${date}  
         
@@ -194,13 +211,13 @@ transactions:
       📆 ${date}  
        
       📥 Añadido ${description === 'N/A' ? '' : '*' + description + '* '}
-      *${amount}* *${currency}*
+      *${amount}* *${currency}*${category ? ' a la categoría *' + category + '*' : ''}
       
-      ${source} ➡️ ${destination}
+      de ${source} → ${destination}
     transferMessage: >
       📆 ${date}  
          
-      ↔️ Transferido *${amount}* *${currency}* de la Cuenta *${source}* a la Cuenta *${destination}*
+      ↔️ Trasnferencia *${amount}* *${currency}* desde  *${source}* to account *${destination}*${foreignAmount ? " (" + foreignAmount + " " + foreignCurrencySymbol + ")" : ''}${category ? ' to category *' + category + '*' : ''}
     selectCategory: A cual Categoría añadir *${amount}*?
     noCategoriesYet: |
       🤷 Aún no has creado ninguna Categoría.
@@ -209,12 +226,21 @@ transactions:
       💡 Puedes crear Categorías fácilmente, usando el botón *🔖 Categorias*.
     transactionDeleted: Transacción eliminada!
     couldNotDelete: 'No se pudo eliminar la transacción con el id: ${id}'
-    selectRevenueAccount: 'Elige una cuenta de Ingreso para retirar *${amount}*:'
-    selectAssetAccount: 'Elige una cuenta de Activo para añadir *${amount}*:'
+    selectRevenueAccount: 'Elige una cuenta de Ingreso para retirar *${amount}* de:'
+    selectAssetAccount: 'Elige una cuenta de Activo para añadir *${amount}* a:'
     selectSourceAccount: 'Selecciona una cuenta desde donde se va a transferir *${amount}*:'
     selectDestAccount: 'Selecciona una cuenta a la cual transferir:'
     transactionError: '❗😰 Ocurrió un error durante la creación de la transacción: *${message}*'
     created: Transacción creada!
+    typeForeignAmount: >
+      ⚠️ La moneda de la cuenta destino (*${destCurrency}*) es diferente a la moneda de la cuenta origen (*${sourceCurrency}*)!
+      Ingresa el importe en moneda foránea, ejemplo, el importe en la moneda de la cuenta destino.
+        
+		
+      💡 Puedes usar los signos aritméticos para sumar, restar, multiplicar o dividir
+	  para realizar la operacion deseada en la cuenta origen de la transacción.
+        
+	  Por ejemplo, `*15` puede multiplicar el importe inicial por 15 para obtener el importe en moneda foranea (donde 15 es el tipo de cambio).
 
   edit:
     whatToEdit: ❓Que desea modificar?
@@ -277,3 +303,7 @@ categories:
     ──────────────────
     
     SUM: ${sums ? sums : '0'}
+ + +reports: + notImplemented: Disculpe, pero los Reportes aún no se han implementado 😞 From 4a4d5ac6101b75f6909d827a1e42b8f15ff5ed58 Mon Sep 17 00:00:00 2001 From: Alex Sukhov Date: Tue, 7 Nov 2023 20:49:33 +0300 Subject: [PATCH 13/13] Replace tabs with spaces --- src/locales/es.yml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/locales/es.yml b/src/locales/es.yml index c590cb0..6189222 100644 --- a/src/locales/es.yml +++ b/src/locales/es.yml @@ -87,7 +87,7 @@ settings: inputFireflyUrl: > Indica la dirección web de tu instancia Firefly III. Debe tener este formato: *https://firefly.example.com* - o así: *http://localhost:8080* + o así: *http://localhost:8080* inputFireflyApiUrl: > Indica la dirección web de la API de tu instancia Firefly III. Normalmente, es la misma URL de tu instancia Firefly III pero con un */api* al final, ejemplo: @@ -103,7 +103,7 @@ settings: Que te gustaría modificar? *🔗 URL de Firefly*: ${fireflyUrl || '🚨 '} - + *🔗 URL de Firefly API*: ${fireflyApiUrl || '🚨 '} *🔑 Token de Acceso*: ${accessToken || '🚨 '} @@ -196,10 +196,10 @@ transactions: add: dontUnderstand: > 🤖 No entendí esto. - + Ingresa un importe para la transacción, debe ser un número! 😉 - - O, puedes ingresar la description e importe de la transacción, ejemplo, `Comida 25` + + O, puedes ingresar la description e importe de la transacción, ejemplo, `Comida 25` withdrawalMessage: > 📆 ${date} @@ -235,12 +235,11 @@ transactions: typeForeignAmount: > ⚠️ La moneda de la cuenta destino (*${destCurrency}*) es diferente a la moneda de la cuenta origen (*${sourceCurrency}*)! Ingresa el importe en moneda foránea, ejemplo, el importe en la moneda de la cuenta destino. - - + 💡 Puedes usar los signos aritméticos para sumar, restar, multiplicar o dividir - para realizar la operacion deseada en la cuenta origen de la transacción. - - Por ejemplo, `*15` puede multiplicar el importe inicial por 15 para obtener el importe en moneda foranea (donde 15 es el tipo de cambio). + para realizar la operacion deseada en la cuenta origen de la transacción. + + Por ejemplo, `*15` puede multiplicar el importe inicial por 15 para obtener el importe en moneda foranea (donde 15 es el tipo de cambio). edit: whatToEdit: ❓Que desea modificar?