diff --git a/CHANGELOG.md b/CHANGELOG.md index 90414da..fbab979 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Recipe scraps tips** — During cooking steps, detect "waste" generated (peels, cores, bones, eggshells, coffee grounds, citrus zest, etc.) and surface AI-powered tips on how to reuse them (compost, natural cleaner, broth, candied peel, etc.). Could be shown as an optional collapsible hint card below the step that generates the scrap. +## [1.7.17] - 2026-05-19 + +### Added +- **French translation (🇫🇷 Français)** — Complete `translations/fr.json` with all 1049 translation keys. Resolves [#77](https://github.com/dadaloop82/EverShelf/issues/77). +- **Spanish translation (🇪🇸 Español)** — Complete `translations/es.json` with all 1049 translation keys. Resolves [#77](https://github.com/dadaloop82/EverShelf/issues/77). +- Language selector in Settings now shows all 5 languages: 🇮🇹 Italiano, 🇬🇧 English, 🇩🇪 Deutsch, 🇫🇷 Français, 🇪🇸 Español. +- Default fallback language changed from Italian to English (for users with unsupported browser locale). +- Setup wizard "Done" screen and navigation buttons localised for French and Spanish. + ## [1.7.16] - 2026-05-17 ### Added diff --git a/README.md b/README.md index 53e3dbb..7fea76e 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ [](https://www.php.net/) [](https://www.sqlite.org/) [](Dockerfile) -[](translations/) -[](CHANGELOG.md) +[](translations/) +[](CHANGELOG.md) [](https://github.com/dadaloop82/EverShelf/stargazers) [](https://github.com/dadaloop82/EverShelf/commits/main) [](https://github.com/dadaloop82/EverShelf/graphs/contributors) @@ -365,6 +365,8 @@ The app supports multiple languages via JSON translation files in the `translati | 🇮🇹 Italian (it) | ✅ Complete (base) | | 🇬🇧 English (en) | ✅ Complete | | 🇩🇪 German (de) | ✅ Complete | +| 🇫🇷 French (fr) | ✅ Complete | +| 🇪🇸 Spanish (es) | ✅ Complete | **Want to add your language?** See the [Translation Guide](CONTRIBUTING.md#-adding-translations) — just copy `translations/it.json`, translate the values, and submit a PR! diff --git a/assets/js/app.js b/assets/js/app.js index d4be1ac..564ab90 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -1043,9 +1043,9 @@ async function discoverScaleGateway() { // ===== i18n TRANSLATION SYSTEM ===== let _i18nStrings = null; // current language translations (flat) let _i18nFallback = null; // Italian fallback (flat) -let _currentLang = localStorage.getItem('evershelf_lang') || navigator.language?.slice(0, 2) || 'it'; -const _SUPPORTED_LANGS = { it: 'Italiano', en: 'English', de: 'Deutsch' }; -if (!_SUPPORTED_LANGS[_currentLang]) _currentLang = 'it'; +let _currentLang = localStorage.getItem('evershelf_lang') || navigator.language?.slice(0, 2) || 'en'; +const _SUPPORTED_LANGS = { it: 'Italiano', en: 'English', de: 'Deutsch', fr: 'Français', es: 'Español' }; +if (!_SUPPORTED_LANGS[_currentLang]) _currentLang = 'en'; // Flatten nested JSON: { a: { b: "x" } } → { "a.b": "x" } function _flattenI18n(obj, prefix = '') { @@ -14566,9 +14566,11 @@ function _setupSteps() { ` }, { - title: '✅ ' + (_currentLang === 'it' ? 'Tutto pronto!' : _currentLang === 'de' ? 'Alles bereit!' : 'All set!'), + title: '✅ ' + (_currentLang === 'it' ? 'Tutto pronto!' : _currentLang === 'de' ? 'Alles bereit!' : _currentLang === 'fr' ? 'Tout est prêt !' : _currentLang === 'es' ? '¡Todo listo!' : 'All set!'), desc: _currentLang === 'it' ? 'La configurazione è completata. Puoi sempre modificare queste impostazioni dalla pagina Configurazione.' : _currentLang === 'de' ? 'Die Konfiguration ist abgeschlossen. Du kannst diese Einstellungen jederzeit ändern.' + : _currentLang === 'fr' ? 'La configuration est terminée. Vous pouvez toujours modifier ces paramètres depuis la page Paramètres.' + : _currentLang === 'es' ? 'La configuración está completa. Puedes cambiar estos ajustes desde la página Ajustes.' : 'Setup is complete. You can always change these settings from the Settings page.', render: () => { let summary = '