···1414 "export": "expo export --dump-sourcemap || expo export --dump-sourcemap",
1515 "check": "bash -c 'set -euo pipefail;export OUT=$(mktemp -d); npx tsc -p . --outDir $OUT; rm -rf $OUT'",
1616 "prebuild": "EXPO_NO_GIT_STATUS=1 expo prebuild --clean && sed -i.bak 's/org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m/org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m/' android/gradle.properties && pnpm run find-node",
1717- "prepare": "which pod && pnpm run prepare-ios || echo 'not a mac, not installing pods'",
1717+ "prepare": "which pod && pnpm run prepare-ios || echo 'not a mac, not installing pods' && cp -r ../components/public/locales ./public/locales",
1818 "prepare-ios": "cd ios && pod install && pnpm run find-node",
1919 "find-node": "node -p '`NODE_BINARY=${process.argv[0]}`' > ios/.xcode.env.local",
2020 "code-signing-dev": "mkdir -p code-signing-dev/keys code-signing-dev/certs && expo-updates codesigning:generate --key-output-directory code-signing-dev/keys --certificate-output-directory code-signing-dev/certs --certificate-validity-duration-years 10 --certificate-common-name 'Streamplace'",
+2-2
js/components/.gitignore
···11-# Ignore compiled translation files in source directory
11+# Ignore compiled translation files in source directory if they exist
22locales/**/messages.json
33-public/locales/**/*.ftl
33+public/locales/*
4455# Ignore extracted i18n keys (they're just for reference)
66locales/*/*.json
-54
js/components/public/locales/en-US/messages.json
···11-{
22- "app-version": "Streamplace v{ $version }",
33- "download-new-update": "Download New Update",
44- "check-for-updates": "Check for Updates",
55- "bundled-runtype": "Bundled",
66- "ota-runtype": "Over-the-Air (OTA)",
77- "recovery-runtype": "Recovery Mode",
88- "modal-latest-version": "You are using the latest version.",
99- "modal-no-update-available": "You are on the latest version of Streamplace, hooray!",
1010- "modal-update-available-title": "Update Available",
1111- "modal-update-available-description": "A new version of Streamplace is ready to download",
1212- "modal-update-failed": "Update check failed. You may need to update the app through the { $store }.",
1313- "modal-update-failed-title": "Update Failed",
1414- "modal-update-failed-description": "Update check failed. You may need to update the app through the { $store }.",
1515- "button-reload-app-on-update": "Apply Update (will reload app)",
1616- "use-custom-node": "Use Custom Node",
1717- "default-url": "Default: { $url }",
1818- "enter-custom-node-url": "Enter custom node URL",
1919- "save-button": "SAVE",
2020- "language-selection": "Language",
2121- "language-selection-description": "Choose your preferred language",
2222- "input-search-languages": "Search languages...",
2323- "debug-recording-title": "Allow { $host } to record your livestream for debugging and improving the service",
2424- "debug-recording-description": "Optional",
2525- "manage-keys": "Manage Keys",
2626- "settings-title": "Settings",
2727- "loading": "Loading...",
2828- "error": "Error",
2929- "cancel": "Cancel",
3030- "confirm": "Confirm",
3131- "welcome-user": "Welcome, { $username }!",
3232- "notification-count": "{ $count ->\n [0] No notifications\n [1] One notification\n *[other] { $count } notifications\n}",
3333- "search-placeholder": "Search...",
3434- "message-input": "Enter your message...",
3535- "success": "Success",
3636- "warning": "Warning",
3737- "info": "Information",
3838- "close": "Close",
3939- "open": "Open",
4040- "delete": "Delete",
4141- "edit": "Edit",
4242- "create": "Create",
4343- "update": "Update",
4444- "refresh": "Refresh",
4545- "save": "Save",
4646- "cancel-button": "Cancel",
4747- "ok": "OK",
4848- "yes": "Yes",
4949- "no": "No",
5050- "continue": "Continue",
5151- "back": "Back",
5252- "next": "Next",
5353- "finish": "Finish"
5454-}
-54
js/components/public/locales/es-ES/messages.json
···11-{
22- "app-version": "Streamplace v{ $version }",
33- "download-new-update": "Descargar Nueva Actualización",
44- "check-for-updates": "Buscar Actualizaciones",
55- "bundled-runtype": "Empaquetado",
66- "ota-runtype": "Over-the-Air (OTA)",
77- "recovery-runtype": "Modo de Recuperación",
88- "modal-latest-version": "Estás usando la última versión.",
99- "modal-no-update-available": "¡Tienes la versión más reciente de Streamplace, genial!",
1010- "modal-update-available-title": "Actualización Disponible",
1111- "modal-update-available-description": "Una nueva versión de Streamplace está lista para descargar",
1212- "modal-update-failed": "La búsqueda de actualizaciones falló. Es posible que necesites actualizar",
1313- "modal-update-failed-title": "Actualización Falló",
1414- "modal-update-failed-description": "La búsqueda de actualizaciones falló. Es posible que necesites actualizar",
1515- "button-reload-app-on-update": "Aplicar Actualización (recargará la aplicación)",
1616- "use-custom-node": "Usar Nodo Personalizado",
1717- "default-url": "Predeterminado: { $url }",
1818- "enter-custom-node-url": "Introduce la URL del nodo personalizado",
1919- "save-button": "GUARDAR",
2020- "language-selection": "Idioma",
2121- "language-selection-description": "Elige tu idioma preferido",
2222- "debug-recording-title": "Permitir que { $host } grabe tu retransmisión en directo para depuración y mejora del servicio",
2323- "debug-recording-description": "Opcional",
2424- "input-search-languages": "Buscar idiomas...",
2525- "manage-keys": "Gestionar Claves",
2626- "settings-title": "Configuración",
2727- "loading": "Cargando...",
2828- "error": "Error",
2929- "cancel": "Cancelar",
3030- "confirm": "Confirmar",
3131- "welcome-user": "¡Bienvenido, { $username }!",
3232- "notification-count": "{ $count ->\n [0] Sin notificaciones\n [1] Una notificación\n *[other] { $count } notificaciones\n}",
3333- "search-placeholder": "Buscar...",
3434- "message-input": "Introduce tu mensaje...",
3535- "success": "Éxito",
3636- "warning": "Aviso",
3737- "info": "Información",
3838- "close": "Cerrar",
3939- "open": "Abrir",
4040- "delete": "Eliminar",
4141- "edit": "Editar",
4242- "create": "Crear",
4343- "update": "Actualizar",
4444- "refresh": "Actualizar",
4545- "save": "Guardar",
4646- "cancel-button": "Cancelar",
4747- "ok": "Aceptar",
4848- "yes": "Sí",
4949- "no": "No",
5050- "continue": "Continuar",
5151- "back": "Volver",
5252- "next": "Siguiente",
5353- "finish": "Finalizar"
5454-}
-54
js/components/public/locales/fr-FR/messages.json
···11-{
22- "app-version": "Streamplace v{ $version }",
33- "download-new-update": "Télécharger la nouvelle mise à jour",
44- "check-for-updates": "Vérifier les mises à jour",
55- "bundled-runtype": "Inclus",
66- "ota-runtype": "Over-the-Air (OTA)",
77- "recovery-runtype": "Mode de récupération",
88- "modal-latest-version": "Vous utilisez la dernière version.",
99- "modal-no-update-available": "Vous avez la dernière version de Streamplace, génial !",
1010- "modal-update-available-title": "Mise à jour disponible",
1111- "modal-update-available-description": "Une nouvelle version de Streamplace est prête à télécharger",
1212- "modal-update-failed": "La vérification des mises à jour a échoué. Vous devrez peut-être mettre à jour l'application via { $store }.",
1313- "modal-update-failed-title": "Échec de la mise à jour",
1414- "modal-update-failed-description": "La vérification des mises à jour a échoué. Vous devrez peut-être mettre à jour l'application via { $store }.",
1515- "button-reload-app-on-update": "Appliquer la mise à jour (l'application va se recharger)",
1616- "use-custom-node": "Utiliser un nœud personnalisé",
1717- "default-url": "Par défaut : { $url }",
1818- "enter-custom-node-url": "Saisir l'URL du nœud personnalisé",
1919- "save-button": "ENREGISTRER",
2020- "language-selection": "Langue",
2121- "language-selection-description": "Choisissez votre langue préférée",
2222- "debug-recording-title": "Autoriser { $host } à enregistrer votre diffusion en direct pour le débogage et l'amélioration du service",
2323- "debug-recording-description": "Optionnel",
2424- "input-search-languages": "Rechercher des langues...",
2525- "manage-keys": "Gérer les clés",
2626- "settings-title": "Paramètres",
2727- "loading": "Chargement...",
2828- "error": "Erreur",
2929- "cancel": "Annuler",
3030- "confirm": "Confirmer",
3131- "welcome-user": "Bienvenue, { $username } !",
3232- "notification-count": "{ $count ->\n [0] Aucune notification\n [1] Une notification\n *[other] { $count } notifications\n}",
3333- "search-placeholder": "Rechercher...",
3434- "message-input": "Saisissez votre message...",
3535- "success": "Succès",
3636- "warning": "Attention",
3737- "info": "Information",
3838- "close": "Fermer",
3939- "open": "Ouvrir",
4040- "delete": "Supprimer",
4141- "edit": "Modifier",
4242- "create": "Créer",
4343- "update": "Mettre à jour",
4444- "refresh": "Actualiser",
4545- "save": "Enregistrer",
4646- "cancel-button": "Annuler",
4747- "ok": "OK",
4848- "yes": "Oui",
4949- "no": "Non",
5050- "continue": "Continuer",
5151- "back": "Retour",
5252- "next": "Suivant",
5353- "finish": "Terminer"
5454-}
-54
js/components/public/locales/pt-BR/messages.json
···11-{
22- "app-version": "Streamplace v{ $version }",
33- "download-new-update": "Baixar Nova Atualização",
44- "check-for-updates": "Verificar Atualizações",
55- "bundled-runtype": "Empacotado",
66- "ota-runtype": "Over-the-Air (OTA)",
77- "recovery-runtype": "Modo de Recuperação",
88- "modal-latest-version": "Você está usando a versão mais recente.",
99- "modal-no-update-available": "Você está na versão mais recente do Streamplace, eba!",
1010- "modal-update-available-title": "Atualização Disponível",
1111- "modal-update-available-description": "Uma nova versão do Streamplace está pronta para download",
1212- "modal-update-failed": "A verificação de atualizações falhou. Você pode precisar atualizar o aplicativo através do { $store }.",
1313- "modal-update-failed-title": "Atualização Falhou",
1414- "modal-update-failed-description": "A verificação de atualizações falhou. Você pode precisar atualizar o aplicativo através do { $store }.",
1515- "button-reload-app-on-update": "Aplicar Atualização (o aplicativo será recarregado)",
1616- "use-custom-node": "Usar Nó Personalizado",
1717- "default-url": "Padrão: { $url }",
1818- "enter-custom-node-url": "Digite a URL do nó personalizado",
1919- "save-button": "SALVAR",
2020- "language-selection": "Idioma",
2121- "language-selection-description": "Escolha seu idioma preferido",
2222- "debug-recording-title": "Permitir que { $host } grave sua transmissão ao vivo para depuração e melhoria do serviço",
2323- "debug-recording-description": "Opcional",
2424- "input-search-languages": "Pesquisar idiomas...",
2525- "manage-keys": "Gerenciar Chaves",
2626- "settings-title": "Configurações",
2727- "loading": "Carregando...",
2828- "error": "Erro",
2929- "cancel": "Cancelar",
3030- "confirm": "Confirmar",
3131- "welcome-user": "Bem-vindo, { $username }!",
3232- "notification-count": "{ $count ->\n [0] Nenhuma notificação\n [1] Uma notificação\n *[other] { $count } notificações\n}",
3333- "search-placeholder": "Pesquisar...",
3434- "message-input": "Digite sua mensagem...",
3535- "success": "Sucesso",
3636- "warning": "Aviso",
3737- "info": "Informação",
3838- "close": "Fechar",
3939- "open": "Abrir",
4040- "delete": "Excluir",
4141- "edit": "Editar",
4242- "create": "Criar",
4343- "update": "Atualizar",
4444- "refresh": "Atualizar",
4545- "save": "Salvar",
4646- "cancel-button": "Cancelar",
4747- "ok": "OK",
4848- "yes": "Sim",
4949- "no": "Não",
5050- "continue": "Continuar",
5151- "back": "Voltar",
5252- "next": "Próximo",
5353- "finish": "Finalizar"
5454-}
···166166 const messagesJsonPath = path.join(localeJsonDir, "messages.json");
167167168168 if (!fs.existsSync(messagesJsonPath)) {
169169- console.log(`⚠️ No messages.json found for ${locale}, skipping...`);
169169+ console.log(
170170+ `⚠️ No messages.json found for ${locale}! You may need to run pnpm i18n:compile first!`,
171171+ );
170172 continue;
171173 }
172174