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": { 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 041b020..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,9 +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('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 b8258c4..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,9 +7,9 @@ import type { MyContext } from '../types/MyContext' const bot = new Composer() -bot.hears(i18n.t('en', '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 fac5d10..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 } 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' @@ -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( { @@ -151,10 +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('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/composers/transactions/list-transactions.ts b/src/composers/transactions/list-transactions.ts index 148e6ce..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,9 +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('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 dfc60ec..b6a819d 100644 --- a/src/lib/i18n.ts +++ b/src/lib/i18n.ts @@ -3,8 +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' @@ -26,14 +29,6 @@ const params = { const i18n = new I18n(params) -export default i18n - -export function getLanguageIcon(language: string) { - const lang2icons = { - ru: '🇷🇺', - en: '🇬🇧', - it: '🇮🇹' - } +export const locales = ['ru', 'it', 'en', 'es'] - return lang2icons[language] -} +export default i18n diff --git a/src/lib/middlewares.ts b/src/lib/middlewares.ts index 0e600f5..956de14 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,25 +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('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)) @@ -70,12 +59,10 @@ 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 = [ - i18n.t('ru', 'labels.SETTINGS'), - i18n.t('en', 'labels.SETTINGS'), - i18n.t('it', 'labels.SETTINGS'), - ...Object.values(command) - ] + const whiteList = [ ...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 diff --git a/src/locales/es.yml b/src/locales/es.yml new file mode 100644 index 0000000..6189222 --- /dev/null +++ b/src/locales/es.yml @@ -0,0 +1,308 @@ +commands: + start: Iniciar (saludo) + settings: Configuración + help: Ayuda + +labels: + ACCOUNTS: 💳 Cuentas + ADD_CATEGORIES: ➕ Nueva Categoría + CANCEL: ✖ Cancelar + CATEGORIES: 🔖 Categorías + 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 de Activo por defecto + DELETE: ❌ Eliminar + OPEN_IN_BROWSER: 🔗 Abrir en Navegador + OPEN_ASSET_ACCOUNTS_IN_BROWSER: 🔗 Ver cuentas de Activos + DONE: ✅ OK + 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 + SETTINGS: 🔧 Configuración + TEST_CONNECTION: 🔌 Verificar conexión + 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_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. + 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 *🔧 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. + + ❕ 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. + + También puedes agregar transacciones que no requieren datos adicionales, + enviando la descripción y el importe, por ejemplo + + `Cafe 35` + + 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 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. + +common: + errorOccurred: Ha ocurrido un ERROR! + noDefaultSourceAccountExist: | + 🙈 Recórcholis! No tienes ninguna cuenta de Activo de donde sacar dinero! + + 🙏 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. +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* + 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 + *Opciones → Perfil → OAuth → Crear nuevo token* + defaultAssetAccountSet: La cuenta de Activo por defecto ha sido configurada! + whatDoYouWantToChange: > + 🔧 *Configuración* + + 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 || '🚨 '} + 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}! + 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. + Indicar la Dirección URL de tu instancia Firefly III, por ejemplo https://firefly.example.com: + +accounts: + labels: + asset: Cuentas de Activos + expense: Cuentas de Gastos + revenue: Cuentas de Ingresos + liability: Pasivos + list: + noAccounts: No hay cuentas🤷 + asset: > + Saldo de tus cuentas de Activos: + +
${accounts.replace(/\n$/, '')}
+      
+      ──────────────────
+      
+      SUM: ${sums ? sums : '0'}
+ expense: > + Saldo de tus cuentas de Gastos: + +
${accounts.replace(/\n$/, '')}
+      
+      ──────────────────
+      
+      SUM: ${sums ? sums : '0'}
+ revenue: > + Saldo de tus cuentas de Ingresos: + +
${accounts.replace(/\n$/, '')}
+      
+      ──────────────────
+      
+      SUM: ${sums ? sums : '0'}
+ liability: > + Saldo de tus cuentas de Pasivo: + +
${accounts.replace(/\n$/, '')}
+      
+      ──────────────────
+      
+      SUM: ${sums ? sums : '0'}
+ +transactions: + list: + withdrawal: > + Tus Gastos al ${day}: + +
${transactions.replace(/\n$/, '')}
+      
+      ──────────────────
+      
+      SUM: ${sums ? sums : '0'}
+ deposit: > + Tus Depósitos al ${day}: + +
${transactions.replace(/\n$/, '')}
+      
+      ──────────────────
+      
+      SUM: ${sums ? sums : '0'}
+ transfer: > + Tus Transacciones al ${day}: + +
${transactions.replace(/\n$/, '')}
+ noTransactions: 🤷 No hay transacciones + 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` + withdrawalMessage: > + 📆 ${date} + + 📤 Añadido ${description === 'N/A' ? '' : '*' + description + '*'} + *${amount}* *${currency}*${category ? ' a la categoría *' + category + '*' : ''} + + ${source} ➡️ ${destination} + depositMessage: > + 📆 ${date} + + 📥 Añadido ${description === 'N/A' ? '' : '*' + description + '* '} + *${amount}* *${currency}*${category ? ' a la categoría *' + category + '*' : ''} + + de ${source} → ${destination} + transferMessage: > + 📆 ${date} + + ↔️ 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. + La transacción será creada sin Categoría. Seguir? + + 💡 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}* 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? + 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: > + Ingresa un nuevo importe. + + 💡 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. + + Por ejemplo, "+35" sumará 35 al importe existente de la transacción. + noCategoriesYet: | + 🤷 Aún no has creado ninguna Categoría. + + 💡 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: | + 🤖 La transacción (${id}) ya no existe! + Posiblemente ha sido borrado desde la página web de Firefly. + +categories: + listEmpty: Aún no hay Categorías :( + list: > + 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: > + Ingresa tus nuevas Categorías, de tal manera que cada una esté en una línea por separado, por ejemplo: + + 💡 Servicios + + 👕 Ropa y Calzado + + 🥦 Comida + + *Postdata*: Los nombres de las Categorías se pueden cambiar posteriormente. + + *Post-Postdata*: No hay problema si ya existe una Categoría con ese nombre. + confirmCreation: > + ${categories.length} nueva(s) Categoría(s) serán creadas: + + ${categories.join('\n')} + + Está bien? + typeNewName: 'Ingresa el nuevo nombre del a Categoría:' + confirmDeletion: > + 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} Gastos del mes de ${monthName}: + +
${transactions.replace(/\n$/, '')}
+    
+    ──────────────────
+    
+    SUM: ${sums ? sums : '0'}
+ + +reports: + notImplemented: Disculpe, pero los Reportes aún no se han implementado 😞 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,