diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 46230230..a4700c91 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -7,12 +7,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- - uses: actions/setup-java@v2
+ - uses: actions/setup-java@v3
with:
java-version: '12.x'
distribution: 'adopt'
- - uses: subosito/flutter-action@v2.3.0
+ - uses: subosito/flutter-action@v2.7.0
with:
- flutter-version: '2.10.4'
+ flutter-version: '3.3.0'
- run: flutter pub get
- run: flutter build apk --debug
diff --git a/android/app/build.gradle b/android/app/build.gradle
index b05b1595..faf8867c 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -31,7 +31,7 @@ apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
- compileSdkVersion flutter.compileSdkVersion
+ compileSdkVersion 33
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 602cf00d..6a288c77 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -38,4 +38,12 @@
android:name="flutterEmbedding"
android:value="2" />
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/build.gradle b/android/build.gradle
index 714549c2..63d56d4a 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -6,7 +6,7 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:4.1.0'
+ classpath 'com.android.tools.build:gradle:7.0.4'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index f8865307..7d176995 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
\ No newline at end of file
diff --git a/assets/i18n/bg_BG.json b/assets/i18n/bg_BG.json
index bb9d1896..ea6ae655 100644
--- a/assets/i18n/bg_BG.json
+++ b/assets/i18n/bg_BG.json
@@ -26,8 +26,8 @@
"self_signed_certificate": "Игнориране на невалиден сертификат.\nНеобходимо е за самоподписани сертификати.\n(Използвате на свой собствен риск!)"
},
"button": "Вписване",
- "retry": "Retry Login!",
- "reset": "Reset Credentials!",
+ "retry": "Опитайте да влезете отново!",
+ "reset": "Възстановяване на идентификационни данни!",
"errors": {
"not_reachable": "Невъзможно достигане до: {server_url}\n{error_msg}",
"certificate_failed": "Сертификатът на сървъра не можа да бъде проверен: {server_url}\n{error_msg}",
@@ -39,8 +39,8 @@
"failed_remove_remote": "Неуспешно премахване на паролата за дистанционно приложение!",
"failure": "Процесът на вписване не можа да завърши правилно.\n{status_code}\n{status_message}",
"credentials_invalid": "Съхранените идентификационни данни вече не са валидни и сте отписани!",
- "no_internet": "Authentication check was not successful.\nMaybe there is no internet connection?\nError Message: {error_msg}",
- "wrong_status": "Authentication check was not successful.\nMaybe the provided server host is not correct?\nError Message: {error_msg}"
+ "no_internet": "Проверката за удостоверяване не беше успешна.\nМоже би няма интернет връзка?\nСъобщение за грешка: {error_msg}",
+ "wrong_status": "Проверката за удостоверяване не беше успешна.\nМоже би предоставеният хост на сървър не е правилен?\nСъобщение за грешка: {error_msg}"
}
},
"categories": {
@@ -82,23 +82,25 @@
"time": {
"prep": "Време за подготовка:",
"cook": "Време за готвене:",
- "total": "Общо време:"
+ "total": "Общо време:",
+ "hours": "Часове",
+ "minutes": "Минути "
},
"nutrition": {
- "title": "Nutrition Information",
+ "title": "Информация за храната",
"items": {
- "calories": "Energy",
- "carbohydrateContent": "Carbohydrate",
- "cholesterolContent": "Cholesterol",
- "fatContent": "Fat total",
- "fiberContent": "Fiber",
- "proteinContent": "Protein",
- "saturatedFatContent": "Saturated Fat",
- "servingSize": "Serving size",
- "sodiumContent": "Sodium",
- "sugarContent": "Sugar",
- "transFatContent": "Trans-fat content",
- "unsaturatedFatContent": "Unsaturated-fat content"
+ "calories": "Енергия",
+ "carbohydrateContent": "Въглехидрати",
+ "cholesterolContent": "Холестерол",
+ "fatContent": "Общо мазнини",
+ "fiberContent": "Фибри",
+ "proteinContent": "Протеин",
+ "saturatedFatContent": "Наситени мазнини",
+ "servingSize": "Размер на порция",
+ "sodiumContent": "Натрий",
+ "sugarContent": "Захар",
+ "transFatContent": "Съдържание на трансмазнини",
+ "unsaturatedFatContent": "Съдържание на ненаситени мазнини"
}
},
"tools": "Инструменти:",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Редактиране на Рецепта",
- "button": "Редакция",
+ "button": "Запиши",
"errors": {
"update_failed": "Актуализацията не беше успешна {error_msg}"
}
@@ -142,8 +144,9 @@
"timer": {
"title": "Вашите таймери",
"started": "Таймерът стартира.",
- "finished": "is finished.",
- "done": "Таймерът е готов."
+ "finished": " е завършен.",
+ "done": "Таймерът е готов.",
+ "missing": "Трябва да зададете времето за готвене, за да използвате таймер."
},
"settings": {
"title": "Настройки на приложението",
diff --git a/assets/i18n/cs_CZ.json b/assets/i18n/cs_CZ.json
index 904bd3ec..211dc372 100644
--- a/assets/i18n/cs_CZ.json
+++ b/assets/i18n/cs_CZ.json
@@ -22,8 +22,8 @@
},
"settings": {
"title": "Pokročilá nastavení",
- "app_password": "Použít vygenerované heslo pro aplikaci.\nPotřebné k účtům s dvoufázovým ověřováním se.",
- "self_signed_certificate": "Ignorovat neplatný certifikát.\nPotřebné pro certifikáty podepsané samotnou organizací.\n(Používejte na vlastní riziko!)"
+ "app_password": "Použít vygenerované heslo pro jednotlivou aplikaci.\nPotřebné pro účty s dvoufázovým ověřováním se.",
+ "self_signed_certificate": "Ignorovat neplatný certifikát.\nPotřebné pro certifikáty podepsané samy sebou.\n(Používejte na vlastní riziko!)"
},
"button": "Přihlásit",
"retry": "Zkusit se znovu přihlásit!",
@@ -31,9 +31,9 @@
"errors": {
"not_reachable": "Nelze se připojit k: {server_url}\n{error_msg}",
"certificate_failed": "Certifikát serveru se nepodařilo ověřit: {server_url}\n{error_msg}",
- "request_failed": "Žádost o heslo pro aplikaci se nezdařila:\n{error_msg}",
- "parse_failed": "Nedaří se zpracovat heslo pro aplikaci!\n{error_msg}",
- "parse_missing": "V odpovědi se nedaří najít heslo aplikace:\n{error_msg}",
+ "request_failed": "Žádost o heslo pro jednotlivou aplikaci se nezdařila:\n{error_msg}",
+ "parse_failed": "Nedaří se zpracovat odpověď s heslem pro jednotlivou aplikaci!\n{error_msg}",
+ "parse_missing": "V odpovědi se nedaří najít heslo pro jednotlivou aplikaci:\n{error_msg}",
"auth_failed": "Uživatelské jméno a / nebo heslo není správné!",
"authentication_not_found": "V úložišti nebyla nalezena autentifikace",
"failed_remove_remote": "Nepovedlo se odstranit heslo pro externí aplikaci!",
@@ -82,7 +82,9 @@
"time": {
"prep": "Doba přípravy:",
"cook": "Doba vaření:",
- "total": "Celková doba:"
+ "total": "Celková doba:",
+ "hours": "Hodin",
+ "minutes": "Minut"
},
"nutrition": {
"title": "Výživové informace",
@@ -101,7 +103,7 @@
"unsaturatedFatContent": "Obsah nenasycených tuků"
}
},
- "tools": "Nástroje:",
+ "tools": "Vybavení:",
"ingredients": "Přísady:",
"instructions": "Postup:"
},
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Upravit recept",
- "button": "Upravit",
+ "button": "Uložit",
"errors": {
"update_failed": "Aktualizace se nezdařila: {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "Vaše minutky",
"started": "Minutka spuštěna.",
"finished": "je dokončeno.",
- "done": "Minutka zvonila."
+ "done": "Minutka zvonila.",
+ "missing": "Pokud chcete použít časovač, je třeba nastavit dobu vaření."
},
"settings": {
"title": "Nastavení aplikace",
@@ -157,12 +160,12 @@
"title": "Jazyk"
},
"stay_awake": {
- "title": "Buďte bdělí",
+ "title": "Nezhasínat",
"subtitle": "Při zobrazování receptu se obrazovka nevypne."
},
"recipe_font_size": {
"title": "Velikost písma receptů",
- "subtitle": "Změní velikost písma nástrojů receptu, přísad a pokynů tak, aby bylo lépe čitelné."
+ "subtitle": "Změní velikost písma vybavení, přísad a pokynů pro recept tak, aby bylo lépe čitelné."
},
"category_font_size": {
"title": "Velikost písma kategorií",
diff --git a/assets/i18n/de.json b/assets/i18n/de.json
index 31db2a82..82899f86 100644
--- a/assets/i18n/de.json
+++ b/assets/i18n/de.json
@@ -10,7 +10,7 @@
"server_url": {
"field": "Server-URL",
"validator": {
- "empty": "Bitte die URL der Nextcloud-Instanz angeben.",
+ "empty": "Bitte die URL deiner Nextcloud-Instanz angeben.",
"pattern": "Bitte eine gültige URL angeben"
}
},
@@ -38,7 +38,7 @@
"authentication_not_found": "Keine Authentifizierung im Speicher gefunden",
"failed_remove_remote": "Remote-App-Passwort konnte nicht entfernt werden!",
"failure": "Anmeldevorgang konnte nicht ordnungsgemäß beendet werden.\n{status_code}\n{status_message}",
- "credentials_invalid": "Die gespeicherten Anmeldedaten waren nicht mehr gültig und Du wurdest abgemeldet!",
+ "credentials_invalid": "Die gespeicherten Anmeldedaten waren nicht mehr gültig und du wurdest abgemeldet!",
"no_internet": "Die Authentifizierungsprüfung war nicht erfolgreich.\nVielleicht gibt es keine Internetverbindung?\nFehlermeldung: {error_msg}",
"wrong_status": "Die Authentifizierungsprüfung war nicht erfolgreich.\nVielleicht ist der angegebene Server-Host nicht korrekt?\nFehlermeldung: {error_msg}"
}
@@ -82,7 +82,9 @@
"time": {
"prep": "Vorbereitungsdauer:",
"cook": "Kochdauer:",
- "total": "Gesamtzeit:"
+ "total": "Gesamtzeit:",
+ "hours": "Stunden",
+ "minutes": "Minuten"
},
"nutrition": {
"title": "Nährwertangaben",
@@ -111,16 +113,16 @@
},
"recipe_edit": {
"title": "Rezept bearbeiten",
- "button": "Bearbeiten",
+ "button": "Speichern",
"errors": {
"update_failed": "Aktualisierung fehlgeschlagen {error_msg}"
}
},
"recipe_create": {
- "title": "Neues Rezept anlegen",
+ "title": "Neues Rezept erstellen",
"button": "Erstellen",
"errors": {
- "update_failed": "Anlegen fehlgeschlagen {error_msg}"
+ "update_failed": "Erstellen fehlgeschlagen {error_msg}"
}
},
"recipe_import": {
@@ -140,10 +142,11 @@
}
},
"timer": {
- "title": "Benötigt keine Übersetzung. Hier wird nur die formelle Übersetzung verwendet (de_DE).",
+ "title": "Deine Timer",
"started": "Timer gestartet.",
"finished": "ist abgeschlossen.",
- "done": "Timer ist fertig."
+ "done": "Timer ist fertig.",
+ "missing": "Um einen Timer zu verwenden, musst du die Kochzeit angeben."
},
"settings": {
"title": "App-Einstellungen",
@@ -166,7 +169,7 @@
},
"category_font_size": {
"title": "Kategorie Schriftgröße",
- "subtitle": "Benötigt keine Übersetzung. Hier wird nur die formelle Übersetzung verwendet (de_DE)."
+ "subtitle": "Ändert die Schriftgröße des Kategorietitels. Dies kann nützlich sein, wenn du lange Kategorienamen verwendest."
}
}
}
diff --git a/assets/i18n/de_DE.json b/assets/i18n/de_DE.json
index c10ea215..7aea3e08 100644
--- a/assets/i18n/de_DE.json
+++ b/assets/i18n/de_DE.json
@@ -82,7 +82,9 @@
"time": {
"prep": "Vorbereitungsdauer:",
"cook": "Kochdauer:",
- "total": "Gesamtzeit:"
+ "total": "Gesamtzeit:",
+ "hours": "Stunden",
+ "minutes": "Minuten"
},
"nutrition": {
"title": "Nährwertangaben",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Rezept bearbeiten",
- "button": "Bearbeiten",
+ "button": "Speichern",
"errors": {
"update_failed": "Aktualisierung fehlgeschlagen {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "Ihre Timer",
"started": "Timer gestartet.",
"finished": "ist abgeschlossen.",
- "done": "Timer ist fertig."
+ "done": "Timer ist fertig.",
+ "missing": "Um einen Timer zu verwenden, müssen Sie die Kochzeit angeben."
},
"settings": {
"title": "App-Einstellungen",
diff --git a/assets/i18n/en.json b/assets/i18n/en.json
index b0cea45f..c3ab051f 100644
--- a/assets/i18n/en.json
+++ b/assets/i18n/en.json
@@ -82,7 +82,9 @@
"time": {
"prep": "Preparation time:",
"cook": "Cooking time:",
- "total": "Total time:"
+ "total": "Total time:",
+ "hours": "Hours",
+ "minutes": "Minutes"
},
"nutrition": {
"title": "Nutrition Information",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Edit Recipe",
- "button": "Edit",
+ "button": "Save",
"errors": {
"update_failed": "Update Failed {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "Your timers",
"started": "Timer started.",
"finished": "is finished.",
- "done": "Timer is done."
+ "done": "Timer is done.",
+ "missing": "You need to set the cooking time to use a timer."
},
"settings": {
"title": "App Settings",
diff --git a/assets/i18n/es.json b/assets/i18n/es.json
index a8b9db40..07226662 100644
--- a/assets/i18n/es.json
+++ b/assets/i18n/es.json
@@ -82,7 +82,9 @@
"time": {
"prep": "Tiempo de preparación:",
"cook": "Tiempo de cocción:",
- "total": "Tiempo total:"
+ "total": "Tiempo total:",
+ "hours": "Horas",
+ "minutes": "Minutos"
},
"nutrition": {
"title": "Información nutricional",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Editar receta",
- "button": "Editar",
+ "button": "Guardar",
"errors": {
"update_failed": "La actualización falló {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "Tus temporizadores",
"started": "Temporizador iniciado.",
"finished": "ha terminado.",
- "done": "El temporizador ha terminado."
+ "done": "El temporizador ha terminado.",
+ "missing": "Necesitas configurar el tiempo de cocinado para usar un temporizador."
},
"settings": {
"title": "Ajustes de la Aplicación",
diff --git a/assets/i18n/eu.json b/assets/i18n/eu.json
index 7572bda4..de904397 100644
--- a/assets/i18n/eu.json
+++ b/assets/i18n/eu.json
@@ -26,8 +26,8 @@
"self_signed_certificate": "Ez ikusi egin ziurtagiri baliogabeari.\nAuto-sinatutako ziurtagirietarako beharrezkoa.\n(Erabili zure ardurapean!)"
},
"button": "Hasi saioa",
- "retry": "Retry Login!",
- "reset": "Reset Credentials!",
+ "retry": "Saiatu berriro saioa hasten!",
+ "reset": "Berrezarri kredentzialak!",
"errors": {
"not_reachable": "Ezin da honekin harremanetan jarri:{server_url}\n{error_msg}",
"certificate_failed": "Ezin izan da zerbitzariaren ziurtagiria egiaztatu: {server_url}\n{error_msg}",
@@ -39,8 +39,8 @@
"failed_remove_remote": "Ezin izan da urruneko aplikazio-pasahitza kendu!",
"failure": "Saioa hasteko prozesua ezin izan da behar bezala amaitu.\n{status_code}\n{status_message}",
"credentials_invalid": "Gordetako kredentzialak jada ez dira baliozkoak eta saioa amaitu zaizu!",
- "no_internet": "Authentication check was not successful.\nMaybe there is no internet connection?\nError Message: {error_msg}",
- "wrong_status": "Authentication check was not successful.\nMaybe the provided server host is not correct?\nError Message: {error_msg}"
+ "no_internet": "Autentifikazio-egiaztapena ez da arrakastatsua izan.\nAgian ez dago Interneteko konexiorik?\nErrore-mezua: {error_msg}",
+ "wrong_status": "Autentifikazio-egiaztapena ez da arrakastatsua izan.\nAgian emandako zerbitzariaren ostalaria ez da zuzena?\nErrore-mezua: {error_msg}"
}
},
"categories": {
@@ -82,7 +82,9 @@
"time": {
"prep": "Prestatzeko denbora:",
"cook": "Janaria prestatzeko denbora:",
- "total": "Denbora guztira:"
+ "total": "Denbora guztira:",
+ "hours": "Orduak",
+ "minutes": "Minutuak"
},
"nutrition": {
"title": "Nutrizio informazioa",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Editatu errezeta",
- "button": "Editatu",
+ "button": "Gorde",
"errors": {
"update_failed": "Eguneratzeak huts egin du {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "Zure tenporizadoreak",
"started": "Tenporizadorea hasita.",
"finished": "amaituta dago.",
- "done": "Tenporizadorea bukatu da."
+ "done": "Tenporizadorea bukatu da.",
+ "missing": "Sukaldaritza denbora ezarri behar duzu tenporizadore bat erabili ahal izateko."
},
"settings": {
"title": "Aplikazioaren ezarpenak",
diff --git a/assets/i18n/fi_FI.json b/assets/i18n/fi_FI.json
index ce662585..039b6f7c 100644
--- a/assets/i18n/fi_FI.json
+++ b/assets/i18n/fi_FI.json
@@ -26,8 +26,8 @@
"self_signed_certificate": "Ohita virheellinen sertifikaatti.\nTarvitaan itse allekirjoitetuille varmenteille.\n(Käytä omalla vastuulla!) "
},
"button": "Kirjaudu sisään",
- "retry": "Retry Login!",
- "reset": "Reset Credentials!",
+ "retry": "Yritä kirjautumista uudelleen!",
+ "reset": "Nollaa valtuudet!",
"errors": {
"not_reachable": "Ei voitu yhdistää: {server_url} \n {error_msg}",
"certificate_failed": "Palvelimen identiteettiä ei voitu vahvistaa: {server_url} \n {error_msg}",
@@ -39,8 +39,8 @@
"failed_remove_remote": "Sovellussalasanan poisto epäonnistui!",
"failure": "Kirjautuminen ei onnistunut.\n {status_code}\n {status_message}",
"credentials_invalid": "Tallennetut tunnistetiedot eivät ole enää kelvollisia, sinut on kirjattu ulos!",
- "no_internet": "Authentication check was not successful.\nMaybe there is no internet connection?\nError Message: {error_msg}",
- "wrong_status": "Authentication check was not successful.\nMaybe the provided server host is not correct?\nError Message: {error_msg}"
+ "no_internet": "Tunnistautuminen epäonnistui.\nOnhan internetyhteys käytettävissä?\nVirheilmoitus: {error_msg}",
+ "wrong_status": "Tunnistautuminen epäonnistui.\nOnhan palveliuntarjoaja valittu oikein?\nVirheilmoitus: {error_msg}"
}
},
"categories": {
@@ -55,8 +55,8 @@
"load_failed": "Luokan lataaminen epäonnistui: {error_msg}",
"load_no_response": "Luokkien haku palvelimelta ei onnistunut.",
"api_version_check_failed": "Palvelimen rajapintaversion tarkistus epäonnistui:\n{error_msg}",
- "api_version_above_confirmed": "The API version of the server was updated. Some features might not work as expected. Please wait for an update!\n{version}",
- "plugin_missing": "Categories could not be loaded. Make sure that the Cookbook plugin is installed on this Nextcloud instance!"
+ "api_version_above_confirmed": "Palvelimen API-veresio on päivitetty. Jotkin toiminnot eivät välttämättä toimi odotetusti. Odota sovelluksen päivitystä!\n{version}",
+ "plugin_missing": "Kategorioita ei voitu ladata. Varmista, että Cookbook-sovellus on asennettuna Nextcloud-palvelimelle!"
}
},
"recipe_list": {
@@ -82,23 +82,25 @@
"time": {
"prep": "Esivalmistelujen kesto:",
"cook": "Valmistuksen kesto:",
- "total": "Kokonaiskesto:"
+ "total": "Kokonaiskesto:",
+ "hours": "Tunnit",
+ "minutes": "Minuutit"
},
"nutrition": {
- "title": "Nutrition Information",
+ "title": "Ravintosisältö",
"items": {
- "calories": "Energy",
- "carbohydrateContent": "Carbohydrate",
- "cholesterolContent": "Cholesterol",
- "fatContent": "Fat total",
- "fiberContent": "Fiber",
- "proteinContent": "Protein",
- "saturatedFatContent": "Saturated Fat",
- "servingSize": "Serving size",
- "sodiumContent": "Sodium",
- "sugarContent": "Sugar",
- "transFatContent": "Trans-fat content",
- "unsaturatedFatContent": "Unsaturated-fat content"
+ "calories": "Energia",
+ "carbohydrateContent": "Hiilihydraatit",
+ "cholesterolContent": "Kolesteroli",
+ "fatContent": "Kokonaisrasva",
+ "fiberContent": "Kuitu",
+ "proteinContent": "Proteiini",
+ "saturatedFatContent": "Tyydyttynyt rasva",
+ "servingSize": "Annoksia",
+ "sodiumContent": "Suola",
+ "sugarContent": "Sokeri",
+ "transFatContent": "Transrasvat",
+ "unsaturatedFatContent": "Tyydyttymätön rasva"
}
},
"tools": "Työvälineet:",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Muokkaa reseptiä",
- "button": "Muokkaa",
+ "button": "Tallenna",
"errors": {
"update_failed": "Päivitys epäonnistui {error_msg}"
}
@@ -142,8 +144,9 @@
"timer": {
"title": "Ajastimesi",
"started": "Ajastin käynnistyi.",
- "finished": "is finished.",
- "done": "Ajastin valmistui."
+ "finished": "päättynyt.",
+ "done": "Ajastin valmistui.",
+ "missing": "You need to set the cooking time to use a timer."
},
"settings": {
"title": "Sovelluksen asetukset",
@@ -158,15 +161,15 @@
},
"stay_awake": {
"title": "Pysy hereillä",
- "subtitle": "Screen will stay on while on the recipe screen."
+ "subtitle": "Näyttö pysyy päällä reseptinäkymässä."
},
"recipe_font_size": {
"title": "Reseptin fontin koko",
- "subtitle": "Changes the font size of recipe tools, ingredients and instructions for better readability."
+ "subtitle": "Muuttaa fontin kokoa reseptin välineissä, ainesosissa ja ohjeissa luettavuuden parantamiseksi."
},
"category_font_size": {
"title": "Luokan fontin koko",
- "subtitle": "Changes the font size of category title. This can be useful if you have long category names."
+ "subtitle": "Muuttaa kategorian otsikon fontin kokoa. Muutos voi olla käytännöllistä, jos käytät pitkiä kategorioiden nimiä."
}
}
}
diff --git a/assets/i18n/fr.json b/assets/i18n/fr.json
index ca278d03..375feaba 100644
--- a/assets/i18n/fr.json
+++ b/assets/i18n/fr.json
@@ -26,6 +26,8 @@
"self_signed_certificate": "Ignorer les certificats invalides.\nNécessaire pour les certificats autosignés.\n(À utiliser à vos risques et périls !)"
},
"button": "S'identifier",
+ "retry": "Réessayez de vous connecter ! ",
+ "reset": "Réinitialisation de l'authentification",
"errors": {
"not_reachable": "Impossible d'atteindre : {server_url} \n {error_msg}",
"certificate_failed": "Le certificat du serveur ne peut pas être vérifié : {server_url}\n{error_msg}",
@@ -36,7 +38,9 @@
"authentication_not_found": "Aucune authentification trouvée dans l'espace de stockage",
"failed_remove_remote": "Impossible de supprimer le mot de passe d'application distant",
"failure": "L'opération de connexion ne sait pas terminée correctement.\n{status_code}\n{status_message}",
- "credentials_invalid": "Les informations d'identification stockées ne sont plus valables et vous avez été déconnecté !"
+ "credentials_invalid": "Les informations d'identification stockées ne sont plus valables et vous avez été déconnecté !",
+ "no_internet": "L'authentification a échoué.\nPeut-être n'y-a-t-il pas de connexion internet ?\nMessage d'erreur : {error_msg}",
+ "wrong_status": "L'authentification a échoué.\nPeut-être le serveur indiqué est-il incorrect ?\nMessage d'erreur : {error_msg}"
}
},
"categories": {
@@ -44,7 +48,7 @@
"all_categories": "Tout",
"drawer": {
"import": "Importer une recette",
- "settings": "Settings"
+ "settings": "Paramètres"
},
"errors": {
"unknown": "Catégories dans un état inconnu",
@@ -52,7 +56,7 @@
"load_no_response": "Impossible de récupérer les catégories depuis le serveur.",
"api_version_check_failed": "Impossible de vérifier la version de l'API du serveur :\n{error_msg}",
"api_version_above_confirmed": "La version de l'API du serveur a été mise à jour. Quelques fonctionnalités pourraient ne pas fonctionner comme prévu. Merci d'attendre une mise à jour !\n{version}",
- "plugin_missing": "Categories could not be loaded. Make sure that the Cookbook plugin is installed on this Nextcloud instance!"
+ "plugin_missing": "Impossible de charger les catégories. Assurez-vous que le greffon Cookbook est installé sur l'instance Nextcloud !"
}
},
"recipe_list": {
@@ -63,8 +67,8 @@
},
"recipe": {
"title": "Recette :",
- "prep": "Preparation time",
- "cook": "Cooking time",
+ "prep": "Durée de préparation",
+ "cook": "Durée de cuisson",
"total": "Temps total",
"fields": {
"name": "Titre de la recette : ",
@@ -76,9 +80,28 @@
"source_button": "Source",
"image": "Image : ",
"time": {
- "prep": "Temps de préparation :",
- "cook": "Temps de cuisson :",
- "total": "Temps total : "
+ "prep": "Durée de préparation :",
+ "cook": "Durée de cuisson :",
+ "total": "Durée totale : ",
+ "hours": "Heures",
+ "minutes": "Minutes"
+ },
+ "nutrition": {
+ "title": "Information nutritionnelle",
+ "items": {
+ "calories": "Énergie",
+ "carbohydrateContent": "Glucides",
+ "cholesterolContent": "Cholestérol",
+ "fatContent": "Total graisses",
+ "fiberContent": "Fibres",
+ "proteinContent": "Protéines",
+ "saturatedFatContent": "Graisses saturées",
+ "servingSize": "Taille de la portion",
+ "sodiumContent": "Sodium",
+ "sugarContent": "Sucre",
+ "transFatContent": "Teneur en graisses trans",
+ "unsaturatedFatContent": "Teneur en graisses insaturées"
+ }
},
"tools": "Ustensiles :",
"ingredients": "Ingrédients :",
@@ -90,7 +113,7 @@
},
"recipe_edit": {
"title": "Editer la recette",
- "button": "Modifier",
+ "button": "Enregistrer",
"errors": {
"update_failed": "Échec de mise à jour {error_msg}"
}
@@ -119,16 +142,17 @@
}
},
"timer": {
- "title": "Your timers",
- "started": "Timer started.",
+ "title": "Vos minuteurs",
+ "started": "Minuteur démarré.",
"finished": "est terminé.",
- "done": "Timer is done."
+ "done": "Minutage terminé.",
+ "missing": "Vous devez renseigner la durée de cuisson avant d'utiliser un minuteur."
},
"settings": {
- "title": "App Settings",
+ "title": "Paramètres de l'application",
"dark_mode": {
"title": "Thème sombre",
- "system": "System Default",
+ "system": "Paramètres système",
"dark": "Toujours",
"light": "Jamais"
},
@@ -136,16 +160,16 @@
"title": "Langue"
},
"stay_awake": {
- "title": "Stay Awake",
- "subtitle": "Screen will stay on while on the recipe screen."
+ "title": "Rester allumé",
+ "subtitle": "L'écran restera allumé tant que la recette est affichée."
},
"recipe_font_size": {
- "title": "Recipe Font Size",
- "subtitle": "Changes the font size of recipe tools, ingredients and instructions for better readability."
+ "title": "Taille de police des recettes",
+ "subtitle": "Change la taille de police des ustensiles, ingrédients et instructions, pour une meilleure lisibilité."
},
"category_font_size": {
- "title": "Category Font Size",
- "subtitle": "Changes the font size of category title. This can be useful if you have long category names."
+ "title": "Taille de police des catégorie",
+ "subtitle": "Change la taille de police des titres de catégories. Cela peut être utile en cas de noms de catégories longs."
}
}
}
diff --git a/assets/i18n/hr.json b/assets/i18n/hr.json
index eb2974a2..99a6bb7d 100644
--- a/assets/i18n/hr.json
+++ b/assets/i18n/hr.json
@@ -82,23 +82,25 @@
"time": {
"prep": "Vrijeme pripreme:",
"cook": "Vrijeme kuhanja:",
- "total": "Ukupno vrijeme:"
+ "total": "Ukupno vrijeme:",
+ "hours": "Sati",
+ "minutes": "Minute"
},
"nutrition": {
- "title": "Nutrition Information",
+ "title": "Nutritivne informacije",
"items": {
- "calories": "Energy",
- "carbohydrateContent": "Carbohydrate",
- "cholesterolContent": "Cholesterol",
- "fatContent": "Fat total",
- "fiberContent": "Fiber",
+ "calories": "Energija",
+ "carbohydrateContent": "Ugljikohidrati",
+ "cholesterolContent": "Kolesterol",
+ "fatContent": "Ukupno masti",
+ "fiberContent": "Vlakna",
"proteinContent": "Protein",
- "saturatedFatContent": "Saturated Fat",
- "servingSize": "Serving size",
- "sodiumContent": "Sodium",
- "sugarContent": "Sugar",
- "transFatContent": "Trans-fat content",
- "unsaturatedFatContent": "Unsaturated-fat content"
+ "saturatedFatContent": "Zasićene masti",
+ "servingSize": "Količina za posluživanje",
+ "sodiumContent": "Natrij",
+ "sugarContent": "Šećer",
+ "transFatContent": "Udio transmasnih kiselina",
+ "unsaturatedFatContent": "Udio nezasićenih masnih kiselina"
}
},
"tools": "Alati:",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Uredi recept",
- "button": "Uredi",
+ "button": "Spremi",
"errors": {
"update_failed": "Ažuriranje nije uspjelo {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "Vaši brojači vremena",
"started": "Brojač vremena je pokrenut.",
"finished": "is finished.",
- "done": "Brojač vremena je završio."
+ "done": "Brojač vremena je završio.",
+ "missing": "You need to set the cooking time to use a timer."
},
"settings": {
"title": "Postavke aplikacije",
diff --git a/assets/i18n/hu_HU.json b/assets/i18n/hu_HU.json
index 0df47d7a..00a42d15 100644
--- a/assets/i18n/hu_HU.json
+++ b/assets/i18n/hu_HU.json
@@ -8,10 +8,10 @@
"login": {
"title": "Bejelentkezés",
"server_url": {
- "field": "Kiszolgáló URL",
+ "field": "Kiszolgáló webcíme",
"validator": {
- "empty": "Adja meg a Nextcloud példány URL-jét.",
- "pattern": "Érvényes URL-t adjon meg"
+ "empty": "Adja meg a Nextcloud-példány webcímét.",
+ "pattern": "Érvényes webcímet adjon meg"
}
},
"username": {
@@ -32,13 +32,13 @@
"not_reachable": "Nem érhető el: {server_url}\n{error_msg}",
"certificate_failed": "A kiszolgáló tanúsítványát nem sikerült ellenőrizni: {server_url}\n{error_msg}",
"request_failed": "Az alkalmazásjelszó kérése nem sikerült:\n{error_msg}",
- "parse_failed": "Az alkalmazásjelszó válasz nem értelmezhető!\n{error_msg}",
- "parse_missing": "A válaszban nem található az alkalmazásjelszó!\n{error_msg}",
- "auth_failed": "A felhasználónév vagy jelszó helytelen!",
+ "parse_failed": "Az alkalmazásjelszó válasz nem értelmezhető.\n{error_msg}",
+ "parse_missing": "A válaszban nem található az alkalmazásjelszó.\n{error_msg}",
+ "auth_failed": "A felhasználónév vagy jelszó helytelen.",
"authentication_not_found": "Nem található hitelesítési adat a tárolóban",
- "failed_remove_remote": "Nem sikerült eltávolítani a távoli alkalmazásjelszót!",
+ "failed_remove_remote": "Nem sikerült eltávolítani a távoli alkalmazásjelszót.",
"failure": "A bejelentkezési folyamat nem fejeződött be megfelelően.\n{status_code}\n{status_message}",
- "credentials_invalid": "A tárolt hitelesítő adatok már nem érvényesek, így ki lett jelentkeztetve!",
+ "credentials_invalid": "A tárolt hitelesítő adatok már nem érvényesek, így ki lett jelentkeztetve.",
"no_internet": "A hitelesítési ellenőrzés sikertelen volt.\nTalán nincs internetkapcsolat?\nHibaüzenet: {error_msg}",
"wrong_status": "A hitelesítési ellenőrzés sikertelen volt.\nTalán a megadott kiszolgáló helytelen?\nHibaüzenet: {error_msg}"
}
@@ -54,7 +54,7 @@
"unknown": "Ismeretlen állapotú kategóriák",
"load_failed": "Kategória betöltése sikertelen: {error_msg}",
"load_no_response": "A kategóriákat nem sikerült lekérni a kiszolgálóról.",
- "api_version_check_failed": "Nem sikerült ellenőrizni a kiszolgáló API verzióját:\n{error_msg}",
+ "api_version_check_failed": "Nem sikerült ellenőrizni a kiszolgáló API-verzióját:\n{error_msg}",
"api_version_above_confirmed": "A kiszolgáló API-verziója frissült. Lehet, hogy egyes funkciók nem a várt módon működnek. Várjon a frissítésre!\n{version}",
"plugin_missing": "A kategóriák nem tölthetők be. Győződjön meg róla, hogy a receptkönyv bővítmény telepítve van-e a Nextcloud példányra!"
}
@@ -82,7 +82,9 @@
"time": {
"prep": "Elkészítési idő:",
"cook": "Főzési idő:",
- "total": "Teljes idő:"
+ "total": "Teljes idő:",
+ "hours": "Óra",
+ "minutes": "Perc"
},
"nutrition": {
"title": "Táplálkozási információk",
@@ -106,12 +108,12 @@
"instructions": "Leírások:"
},
"errors": {
- "load_failed": "Nem sikerült betölteni a receptet!"
+ "load_failed": "Nem sikerült betölteni a receptet."
}
},
"recipe_edit": {
"title": "Recept szerkesztése",
- "button": "Szerkesztés",
+ "button": "Mentés",
"errors": {
"update_failed": "Sikertelen frissítés {error_msg}"
}
@@ -126,7 +128,7 @@
"recipe_import": {
"title": "Recept importálása",
"button": "Importálás",
- "field": "Recept URL-je",
+ "field": "Recept webcíme",
"clipboard": "Vágólap beillesztése",
"errors": {
"import_failed": "Sikertelen importálás {error_msg}"
@@ -143,7 +145,8 @@
"title": "Saját időzítők",
"started": "Az időzítő elindult.",
"finished": " befejeződött.",
- "done": "Az időzítő kész."
+ "done": "Az időzítő kész.",
+ "missing": "Az időzítő használatához be kell állítania a főzési időt."
},
"settings": {
"title": "Alkalmazásbeállítások",
diff --git a/assets/i18n/is.json b/assets/i18n/is.json
new file mode 100644
index 00000000..7431fbd5
--- /dev/null
+++ b/assets/i18n/is.json
@@ -0,0 +1,175 @@
+{
+ "app_bar": {
+ "search": "Search",
+ "refresh": "Endurnýja",
+ "logout": "Útskráning",
+ "clear_all": "Clear all"
+ },
+ "login": {
+ "title": "Innskráning",
+ "server_url": {
+ "field": "URL-slóð vefþjóns",
+ "validator": {
+ "empty": "Please enter the URL to your Nextcloud instance.",
+ "pattern": "Please enter a valid URL"
+ }
+ },
+ "username": {
+ "field": "Notandanafn"
+ },
+ "password": {
+ "field": "Lykilorð"
+ },
+ "settings": {
+ "title": "Ítarlegar stillingar",
+ "app_password": "Use self generated App Password.\nNeeded for accounts with 2FA.",
+ "self_signed_certificate": "Ignore invalid certificate.\nNeeded for self signed certificates.\n(Use at your own risk!)"
+ },
+ "button": "Innskráning",
+ "retry": "Retry Login!",
+ "reset": "Reset Credentials!",
+ "errors": {
+ "not_reachable": "Cannot reach: {server_url}\n{error_msg}",
+ "certificate_failed": "The Certificate of the server could not be verified: {server_url}\n{error_msg}",
+ "request_failed": "App Password request failed:\n{error_msg}",
+ "parse_failed": "Cannot parse the App Password response!\n{error_msg}",
+ "parse_missing": "Cannot find App Password in response!\n{error_msg}",
+ "auth_failed": "Username and / or Password is incorrect!",
+ "authentication_not_found": "No authentication found in Storage",
+ "failed_remove_remote": "Failed to remove remote App Password!",
+ "failure": "Login Process could not finish properly.\n{status_code}\n{status_message}",
+ "credentials_invalid": "The stored credentials where no longer valid an you have been logged out!",
+ "no_internet": "Authentication check was not successful.\nMaybe there is no internet connection?\nError Message: {error_msg}",
+ "wrong_status": "Authentication check was not successful.\nMaybe the provided server host is not correct?\nError Message: {error_msg}"
+ }
+ },
+ "categories": {
+ "title": "Uppskriftabók",
+ "all_categories": "Allt",
+ "drawer": {
+ "import": "Import Recipe",
+ "settings": "Stillingar"
+ },
+ "errors": {
+ "unknown": "Categories in unknown state",
+ "load_failed": "Category load failed: {error_msg}",
+ "load_no_response": "Could not retrieve the Categories from the server.",
+ "api_version_check_failed": "Failed to check the API version of the server:\n{error_msg}",
+ "api_version_above_confirmed": "The API version of the server was updated. Some features might not work as expected. Please wait for an update!\n{version}",
+ "plugin_missing": "Categories could not be loaded. Make sure that the Cookbook plugin is installed on this Nextcloud instance!"
+ }
+ },
+ "recipe_list": {
+ "title_category": "Category: {category}",
+ "errors": {
+ "load_failed": "Failed to load Recipes Short!"
+ }
+ },
+ "recipe": {
+ "title": "Recipe:",
+ "prep": "Undirbúningstími",
+ "cook": "Eldunartími",
+ "total": "Heildartími",
+ "fields": {
+ "name": "Recipe Name:",
+ "description": "Recipe Description:",
+ "keywords": "Keywords:",
+ "category": "Category:",
+ "servings": "Servings:",
+ "source": "Source:",
+ "source_button": "Heimild",
+ "image": "Image:",
+ "time": {
+ "prep": "Preparation time:",
+ "cook": "Cooking time:",
+ "total": "Total time:",
+ "hours": "klukkustundir",
+ "minutes": "mínútur"
+ },
+ "nutrition": {
+ "title": "Nutrition Information",
+ "items": {
+ "calories": "Energy",
+ "carbohydrateContent": "Carbohydrate",
+ "cholesterolContent": "Cholesterol",
+ "fatContent": "Fat total",
+ "fiberContent": "Fiber",
+ "proteinContent": "Protein",
+ "saturatedFatContent": "Saturated Fat",
+ "servingSize": "Serving size",
+ "sodiumContent": "Sodium",
+ "sugarContent": "Sugar",
+ "transFatContent": "Trans-fat content",
+ "unsaturatedFatContent": "Unsaturated-fat content"
+ }
+ },
+ "tools": "Tools:",
+ "ingredients": "Ingredients:",
+ "instructions": "Instructions:"
+ },
+ "errors": {
+ "load_failed": "Failed to load Recipe!"
+ }
+ },
+ "recipe_edit": {
+ "title": "Edit Recipe",
+ "button": "Vista",
+ "errors": {
+ "update_failed": "Update Failed {error_msg}"
+ }
+ },
+ "recipe_create": {
+ "title": "Create Recipe",
+ "button": "Búa til",
+ "errors": {
+ "update_failed": "Create Failed {error_msg}"
+ }
+ },
+ "recipe_import": {
+ "title": "Import Recipe",
+ "button": "Flytja inn",
+ "field": "URL to Recipe",
+ "clipboard": "Paste Clipboard",
+ "errors": {
+ "import_failed": "Import Failed {error_msg}"
+ }
+ },
+ "search": {
+ "title": "Search Recipe",
+ "nothing_found": "No recipe found!",
+ "errors": {
+ "search_failed": "Unable to load all Recipes!\n{error_msg}"
+ }
+ },
+ "timer": {
+ "title": "Your timers",
+ "started": "Timer started.",
+ "finished": "is finished.",
+ "done": "Timer is done.",
+ "missing": "You need to set the cooking time to use a timer."
+ },
+ "settings": {
+ "title": "App Settings",
+ "dark_mode": {
+ "title": "Dark Mode",
+ "system": "Sjálfgefið kerfi",
+ "dark": "Alltaf",
+ "light": "Aldrei"
+ },
+ "language": {
+ "title": "Tungumál"
+ },
+ "stay_awake": {
+ "title": "Stay Awake",
+ "subtitle": "Screen will stay on while on the recipe screen."
+ },
+ "recipe_font_size": {
+ "title": "Recipe Font Size",
+ "subtitle": "Changes the font size of recipe tools, ingredients and instructions for better readability."
+ },
+ "category_font_size": {
+ "title": "Category Font Size",
+ "subtitle": "Changes the font size of category title. This can be useful if you have long category names."
+ }
+ }
+}
diff --git a/assets/i18n/it.json b/assets/i18n/it.json
index d004718c..6d57973d 100644
--- a/assets/i18n/it.json
+++ b/assets/i18n/it.json
@@ -82,7 +82,9 @@
"time": {
"prep": "Tempo di preparazione:",
"cook": "Tempo di cottura:",
- "total": "Tempo totale:"
+ "total": "Tempo totale:",
+ "hours": "Ore",
+ "minutes": "Minuti"
},
"nutrition": {
"title": "Informazioni nutrizionali",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Modifica ricetta",
- "button": "Modifica",
+ "button": "Salva",
"errors": {
"update_failed": "Aggiornamento non riuscito {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "I tuoi timer",
"started": "Il timer è partito.",
"finished": "è terminato.",
- "done": "Il timer è terminato."
+ "done": "Il timer è terminato.",
+ "missing": "You need to set the cooking time to use a timer."
},
"settings": {
"title": "Impostazioni dell'applicazione",
diff --git a/assets/i18n/nl.json b/assets/i18n/nl.json
index 88cba1c1..bc140f12 100644
--- a/assets/i18n/nl.json
+++ b/assets/i18n/nl.json
@@ -82,23 +82,25 @@
"time": {
"prep": "Voorbereidingstijd:",
"cook": "Kooktijd:",
- "total": "Totale tijd:"
+ "total": "Totale tijd:",
+ "hours": "Uur",
+ "minutes": "Minuten"
},
"nutrition": {
- "title": "Nutrition Information",
+ "title": "Voedingswaarde Informatie",
"items": {
- "calories": "Energy",
- "carbohydrateContent": "Carbohydrate",
+ "calories": "Energie",
+ "carbohydrateContent": "Koolhydraten",
"cholesterolContent": "Cholesterol",
- "fatContent": "Fat total",
- "fiberContent": "Fiber",
- "proteinContent": "Protein",
- "saturatedFatContent": "Saturated Fat",
- "servingSize": "Serving size",
- "sodiumContent": "Sodium",
- "sugarContent": "Sugar",
- "transFatContent": "Trans-fat content",
- "unsaturatedFatContent": "Unsaturated-fat content"
+ "fatContent": "Vet totaal",
+ "fiberContent": "Vezels",
+ "proteinContent": "Eiwit",
+ "saturatedFatContent": "Verzadigd vet",
+ "servingSize": "Portiegrootte",
+ "sodiumContent": "Natrium",
+ "sugarContent": "Suiker",
+ "transFatContent": "Transvetgehalte",
+ "unsaturatedFatContent": "Onverzadigd vetgehalte"
}
},
"tools": "Hulpmiddelen",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Bewerk recept",
- "button": "Bewerken",
+ "button": "Opslaan",
"errors": {
"update_failed": "Bijwerken mislukt {error_msg}"
}
@@ -142,8 +144,9 @@
"timer": {
"title": "Jouw timers",
"started": "Timer gestart.",
- "finished": "is finished.",
- "done": "Timer is klaar."
+ "finished": "is klaar.",
+ "done": "Timer is klaar.",
+ "missing": "You need to set the cooking time to use a timer."
},
"settings": {
"title": "App Instellingen",
diff --git a/assets/i18n/pl.json b/assets/i18n/pl.json
index 8646e0fc..351e707d 100644
--- a/assets/i18n/pl.json
+++ b/assets/i18n/pl.json
@@ -82,7 +82,9 @@
"time": {
"prep": "Czas przygotowania:",
"cook": "Czas gotowania:",
- "total": "Czas całkowity:"
+ "total": "Czas całkowity:",
+ "hours": "Godziny",
+ "minutes": "Minuty"
},
"nutrition": {
"title": "Informacje o wartości odżywczej",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Edytuj przepis",
- "button": "Edytuj",
+ "button": "Zapisz",
"errors": {
"update_failed": "Aktualizacja nie powiodła się {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "Twój czas",
"started": "Uruchomiony minutnik.",
"finished": "zakończone.",
- "done": "Minutnik jest gotowy."
+ "done": "Minutnik jest gotowy.",
+ "missing": "Aby korzystać z minutnika, musisz ustawić czas gotowania."
},
"settings": {
"title": "Ustawienia aplikacji",
diff --git a/assets/i18n/pt_BR.json b/assets/i18n/pt_BR.json
index 59c3c498..67505a74 100644
--- a/assets/i18n/pt_BR.json
+++ b/assets/i18n/pt_BR.json
@@ -82,7 +82,9 @@
"time": {
"prep": "Tempo de preparo:",
"cook": "Tempo de cozimento:",
- "total": "Tempo total:"
+ "total": "Tempo total:",
+ "hours": "Horas",
+ "minutes": "Minutos"
},
"nutrition": {
"title": "Informação nutricional",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Editar receita",
- "button": "Editar",
+ "button": "Salvar",
"errors": {
"update_failed": "Erro na atualização {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "Seus temporizadores",
"started": "Cronômetro inicializado.",
"finished": "está finalizado.",
- "done": "Temporizador finalizou.."
+ "done": "Temporizador finalizou..",
+ "missing": "Você precisa definir o tempo de cozimento para usar um cronômetro."
},
"settings": {
"title": "Configurações do Aplicativo",
diff --git a/assets/i18n/ru.json b/assets/i18n/ru.json
index c77db3cd..252de395 100644
--- a/assets/i18n/ru.json
+++ b/assets/i18n/ru.json
@@ -82,7 +82,9 @@
"time": {
"prep": "Время на подготовку:",
"cook": "Время готовки:",
- "total": "Общее время:"
+ "total": "Общее время:",
+ "hours": "Часов",
+ "minutes": "Минуты"
},
"nutrition": {
"title": "Сведения о питательных веществах",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Изменить рецепт",
- "button": "Редактировать",
+ "button": "Сохранить",
"errors": {
"update_failed": "Ошибка обновления {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "Ваши таймеры",
"started": "Таймер запущен.",
"finished": "закончен.",
- "done": "Таймер завершён."
+ "done": "Таймер завершён.",
+ "missing": "Для использования таймера необходимо установить время приготовления."
},
"settings": {
"title": "Настройки приложения",
diff --git a/assets/i18n/sc.json b/assets/i18n/sc.json
index 7a3da844..3810b7da 100644
--- a/assets/i18n/sc.json
+++ b/assets/i18n/sc.json
@@ -2,7 +2,8 @@
"app_bar": {
"search": "Chirca",
"refresh": "Agiorna",
- "logout": "Essi·nche"
+ "logout": "Essi·nche",
+ "clear_all": "Clear all"
},
"login": {
"title": "Intra",
@@ -25,6 +26,8 @@
"self_signed_certificate": "Non cunsideres su tzertificadu non vàlidu.\nSerbit pro tzertificados auto-firmados.\n(Sa responsabilidade de s'impreu est sa tua!)"
},
"button": "Intra",
+ "retry": "Retry Login!",
+ "reset": "Reset Credentials!",
"errors": {
"not_reachable": "Impossìbile lòmpere a: {server_url}\n{error_msg}",
"certificate_failed": "No at fatu a averguare su Tzertificadu de su serbidore: {server_url}\n{error_msg}",
@@ -35,22 +38,25 @@
"authentication_not_found": "Peruna autenticatzione agatada in Archiviatzione",
"failed_remove_remote": "No at fatu a nche bogare sa crae de s'aplicatzione remota!",
"failure": "Su atzessu no est agabbadu bene.\n{status_code}\n{status_message}",
- "credentials_invalid": "Is credentziales sarvadas non fiant prus vàlidas e t'ant fatu essire!"
+ "credentials_invalid": "Is credentziales sarvadas non fiant prus vàlidas e t'ant fatu essire!",
+ "no_internet": "Authentication check was not successful.\nMaybe there is no internet connection?\nError Message: {error_msg}",
+ "wrong_status": "Authentication check was not successful.\nMaybe the provided server host is not correct?\nError Message: {error_msg}"
}
},
"categories": {
"title": "Libru de retzetas",
"all_categories": "Totu",
"drawer": {
- "import": "Importa retzeta"
+ "import": "Importa retzeta",
+ "settings": "Impostatziones"
},
"errors": {
"unknown": "Categorias in istadu non connotu",
- "load_failed": "Carrigamentu de categoria faddidu: {error_msg}",
+ "load_failed": "Category load failed: {error_msg}",
"load_no_response": "No at fatu a recuperare is Categorias dae su serbidore.",
- "api_version_check_failed": "No at fatu a controllare sa versione API in su serbidore:\n{error_msg}",
- "api_version_above_confirmed": "Sa versione API de su serbidore s'est agiornada. Carchi funtzionalidade diat podet funtzionare comente prevìdidu. Abeta pro un'agiornamentu!\n{version}",
- "plugin_missing": "No at fatu a carrigare is categorias. Segura·ti chi s'estensione de su libru de retzetas siat installadu in custa istàntzia de Nextcloud!"
+ "api_version_check_failed": "Failed to check the API version of the server:\n{error_msg}",
+ "api_version_above_confirmed": "The API version of the server was updated. Some features might not work as expected. Please wait for an update!\n{version}",
+ "plugin_missing": "Categories could not be loaded. Make sure that the Cookbook plugin is installed on this Nextcloud instance!"
}
},
"recipe_list": {
@@ -61,6 +67,9 @@
},
"recipe": {
"title": "Retzeta:",
+ "prep": "Tempus de preparatzione",
+ "cook": "Tempus de cotura",
+ "total": "Tempus totale",
"fields": {
"name": "Nùmene de sa retzeta:",
"description": "Descritzione de sa retzeta:",
@@ -73,7 +82,26 @@
"time": {
"prep": "Tempus de preparatzione:",
"cook": "Tempus de cotura:",
- "total": "Tempus totale:"
+ "total": "Tempus totale:",
+ "hours": "Oras",
+ "minutes": "Minutos"
+ },
+ "nutrition": {
+ "title": "Informatziones de nutritzione",
+ "items": {
+ "calories": "Energia",
+ "carbohydrateContent": "Carboidratos",
+ "cholesterolContent": "Colesterolu",
+ "fatContent": "Grassos in totale",
+ "fiberContent": "Fibra",
+ "proteinContent": "Proteina",
+ "saturatedFatContent": "Grassos sàturos",
+ "servingSize": "Mannària de sa portzione",
+ "sodiumContent": "Sòdiu",
+ "sugarContent": "Tzùcuru",
+ "transFatContent": "Cuntenutu de grassos trans",
+ "unsaturatedFatContent": "Cuntenutu de grassos non sàturos"
+ }
},
"tools": "Ainas:",
"ingredients": "Ingredientes:",
@@ -85,14 +113,14 @@
},
"recipe_edit": {
"title": "Modìfica retzeta",
- "button": "Agiorna retzeta",
+ "button": "Sarva",
"errors": {
"update_failed": "Agiornamentu faddidu {error_msg}"
}
},
"recipe_create": {
"title": "Crea una retzeta",
- "button": "Crea una retzeta",
+ "button": "Crea",
"errors": {
"update_failed": "Creatzione faddida {error_msg}"
}
@@ -112,5 +140,36 @@
"errors": {
"search_failed": "No at fatu a carrigare tout is retzetas!\n{error_msg}"
}
+ },
+ "timer": {
+ "title": "Your timers",
+ "started": "Timer started.",
+ "finished": "is finished.",
+ "done": "Timer is done.",
+ "missing": "You need to set the cooking time to use a timer."
+ },
+ "settings": {
+ "title": "App Settings",
+ "dark_mode": {
+ "title": "Dark Mode",
+ "system": "Predefinidu de sistema",
+ "dark": "Semper",
+ "light": "Mai"
+ },
+ "language": {
+ "title": "Limba"
+ },
+ "stay_awake": {
+ "title": "Stay Awake",
+ "subtitle": "Screen will stay on while on the recipe screen."
+ },
+ "recipe_font_size": {
+ "title": "Recipe Font Size",
+ "subtitle": "Changes the font size of recipe tools, ingredients and instructions for better readability."
+ },
+ "category_font_size": {
+ "title": "Category Font Size",
+ "subtitle": "Changes the font size of category title. This can be useful if you have long category names."
+ }
}
}
diff --git a/assets/i18n/sk_SK.json b/assets/i18n/sk_SK.json
index b5da9f8e..b460bfa3 100644
--- a/assets/i18n/sk_SK.json
+++ b/assets/i18n/sk_SK.json
@@ -82,7 +82,9 @@
"time": {
"prep": "Doba prípravy:",
"cook": "Doba varenia:",
- "total": "Celkový čas:"
+ "total": "Celkový čas:",
+ "hours": "Hodín",
+ "minutes": "Minúty"
},
"nutrition": {
"title": "Informácie o výžive",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Upraviť recept",
- "button": "Upraviť",
+ "button": "Uložiť",
"errors": {
"update_failed": "Aktualizácia zlyhala {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "Vaše budíky",
"started": "Budík spustený.",
"finished": "skončilo.",
- "done": "Budík skončil."
+ "done": "Budík skončil.",
+ "missing": "Ak chcete použiť časovač, musíte nastaviť dobu varenia."
},
"settings": {
"title": "Nastavenia Aplikácie",
diff --git a/assets/i18n/sl.json b/assets/i18n/sl.json
index 23156ee8..b67d08b2 100644
--- a/assets/i18n/sl.json
+++ b/assets/i18n/sl.json
@@ -26,8 +26,8 @@
"self_signed_certificate": "Prezri neveljavna potrdila.\nZahtevano za samo-podpisana potrdila.\n(Uporaba na lastno odgovornost!)"
},
"button": "Prijava",
- "retry": "Retry Login!",
- "reset": "Reset Credentials!",
+ "retry": "Ponovi poskus prijave!",
+ "reset": "Ponastavi poverila!",
"errors": {
"not_reachable": "Povezava s strežnikom ni mogoča: {server_url} \n {error_msg}",
"certificate_failed": "Potrdila strežnika ni mogoče preveriti {server_url} \n{error_msg}",
@@ -39,8 +39,8 @@
"failed_remove_remote": "Odstranjevanje oddaljenega gesla programa je spodletelo!",
"failure": "Prijave ni mogoče pravilno dokončati.\n {status_code}\n {status_message}",
"credentials_invalid": "Shranjena poverila niso več veljavna ali pa ni več vzpostavljene prijave!",
- "no_internet": "Authentication check was not successful.\nMaybe there is no internet connection?\nError Message: {error_msg}",
- "wrong_status": "Authentication check was not successful.\nMaybe the provided server host is not correct?\nError Message: {error_msg}"
+ "no_internet": "Overjanje je spodletelo!\nMorda ni vzpostavljene omrežne povezave?\nSporočilo napake: {error_msg}",
+ "wrong_status": "Overjanje je spodletelo!\nAli so podatki gostiteljskega strežnika pravi?\nSporočilo napake: {error_msg}"
}
},
"categories": {
@@ -56,7 +56,7 @@
"load_no_response": "Ni mogoče pridobiti kategorij s strežnika.",
"api_version_check_failed": "Preverjanje različice API strežnika je spodletelo:\n {error_msg}",
"api_version_above_confirmed": "Različica vmesnika API strežnika je posodobljena. Nekatere zmožnosti morda ne bodo delovale pravilno. Počakajte na posodobitev!\n{version}",
- "plugin_missing": "Categories could not be loaded. Make sure that the Cookbook plugin is installed on this Nextcloud instance!"
+ "plugin_missing": "Kategorij ni mogoče naložiti. Prepričajte se, da je vstavek Kuhar'ce nameščen v okolju Nextcloud."
}
},
"recipe_list": {
@@ -82,23 +82,25 @@
"time": {
"prep": "Čas priprave:",
"cook": "Čas kuhanja ali pečenja:",
- "total": "Skupni čas"
+ "total": "Skupni čas",
+ "hours": "Ure",
+ "minutes": "Minute"
},
"nutrition": {
- "title": "Nutrition Information",
+ "title": "Podrobnosti o hranilnosti",
"items": {
- "calories": "Energy",
- "carbohydrateContent": "Carbohydrate",
- "cholesterolContent": "Cholesterol",
- "fatContent": "Fat total",
- "fiberContent": "Fiber",
- "proteinContent": "Protein",
- "saturatedFatContent": "Saturated Fat",
- "servingSize": "Serving size",
- "sodiumContent": "Sodium",
- "sugarContent": "Sugar",
- "transFatContent": "Trans-fat content",
- "unsaturatedFatContent": "Unsaturated-fat content"
+ "calories": "Energijska vrednost",
+ "carbohydrateContent": "Ogljikovi hidrati",
+ "cholesterolContent": "Holesterol",
+ "fatContent": "Skupno maščobe",
+ "fiberContent": "Vlaknine",
+ "proteinContent": "Beljakovine",
+ "saturatedFatContent": "Nasičene maščobe",
+ "servingSize": "Velikost porcije",
+ "sodiumContent": "Natrij",
+ "sugarContent": "Sladkor",
+ "transFatContent": "Vsebnost trans-maščob",
+ "unsaturatedFatContent": "Vsebnost nenasičenih maščob"
}
},
"tools": "Pripomočki:",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Uredi recept",
- "button": "Uredi",
+ "button": "Shrani",
"errors": {
"update_failed": "Posodobitev je spodletela {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "Your timers",
"started": "Časomer je zagnan.",
"finished": "is finished.",
- "done": "Časomer je ustavljen."
+ "done": "Časomer je ustavljen.",
+ "missing": "You need to set the cooking time to use a timer."
},
"settings": {
"title": "Nastavitve programa",
@@ -158,7 +161,7 @@
},
"stay_awake": {
"title": "Ostanite budni",
- "subtitle": "Screen will stay on while on the recipe screen."
+ "subtitle": "Zaslon bo ostal prižgan, ko bo na zaslonu prikazan recept."
},
"recipe_font_size": {
"title": "Velikost pisave receptov",
diff --git a/assets/i18n/tr.json b/assets/i18n/tr.json
index 634356a0..3aba89e6 100644
--- a/assets/i18n/tr.json
+++ b/assets/i18n/tr.json
@@ -82,7 +82,9 @@
"time": {
"prep": "Hazırlama süresi:",
"cook": "Pişirme süresi:",
- "total": "Toplam süre:"
+ "total": "Toplam süre:",
+ "hours": "Saat",
+ "minutes": "Dakika"
},
"nutrition": {
"title": "Beslenme bilgileri",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "Tarifi düzenle",
- "button": "Düzenle",
+ "button": "Kaydet",
"errors": {
"update_failed": "Güncellenemedi {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "Zamanlayıcılarınız",
"started": "Zamanlayıcı başlatıldı.",
"finished": "tamamlandı.",
- "done": "Zamanlayıcı tamamlandı."
+ "done": "Zamanlayıcı tamamlandı.",
+ "missing": "Bir zamanlayıcı kullanmak için pişirme süresini ayarlamanız gerekir."
},
"settings": {
"title": "Uygulama ayarları",
diff --git a/assets/i18n/vi.json b/assets/i18n/vi.json
new file mode 100644
index 00000000..6d8f3e73
--- /dev/null
+++ b/assets/i18n/vi.json
@@ -0,0 +1,175 @@
+{
+ "app_bar": {
+ "search": "Tìm kiếm",
+ "refresh": "Tải mới",
+ "logout": "Đăng xuất",
+ "clear_all": "Xóa tât cả"
+ },
+ "login": {
+ "title": "Đăng nhập",
+ "server_url": {
+ "field": "URL máy chủ",
+ "validator": {
+ "empty": "Vui lòng nhập URL vào phiên bản Nextcloud của bạn.",
+ "pattern": "Vui lòng nhập một URL hợp lệ"
+ }
+ },
+ "username": {
+ "field": "Tên đăng nhập"
+ },
+ "password": {
+ "field": "Mật khẩu"
+ },
+ "settings": {
+ "title": "Cài đặt nâng cao",
+ "app_password": "Sử dụng mật khẩu ứng dụng tự tạo.\nCần thiết cho các tài khoản có 2FA.",
+ "self_signed_certificate": "Bỏ qua văn thư không hợp lệ.\nCần thiết cho các văn thư tự ký.\n(Bạn sử dụng tự chịu trách nhiệm!)"
+ },
+ "button": "Đăng nhập",
+ "retry": "Thử đăng nhập lại!",
+ "reset": "Chứng thực sử dụng",
+ "errors": {
+ "not_reachable": "Không thể truy cập: {url máy chủ}\n{thông báo lỗi}",
+ "certificate_failed": "Không thể xác minh văn thư của máy chủ: {url của văn thư}\n{error_msg}",
+ "request_failed": "Mật khẩu bạn yêu cầu không thành công: {lỗi thông tin}",
+ "parse_failed": "Không thể phân tích cách giải quyết mật khẩu ứng dụng!\n{error_msg}",
+ "parse_missing": "Không thể tìm thấy mật khẩu ứng dụng để phản hồi!\n{error_msg}",
+ "auth_failed": "Tên người dùng và / hoặc mật khẩu sai!",
+ "authentication_not_found": "Không tìm thấy xác thực trong Bộ nhớ",
+ "failed_remove_remote": "Không xóa được mật khẩu ứng dụng từ xa!",
+ "failure": "Quá trình đăng nhập không thể kết thúc đúng cách.\n{status_code}\n{status_message}",
+ "credentials_invalid": "Các thông tin xác thực được lưu trữ không còn hợp lệ, và bạn đã đăng xuất!",
+ "no_internet": "Kiểm tra xác thực không thành công.\nCó thể không có kết nối internet?\nThông báo lỗi: {error_msg}",
+ "wrong_status": "Kiểm tra xác thực không thành công.\nCó thể máy chủ lưu trữ được cung cấp không đúng?\nThông báo lỗi: {error_msg}"
+ }
+ },
+ "categories": {
+ "title": "Sách dạy nấu ăn",
+ "all_categories": "Tất cả",
+ "drawer": {
+ "import": "Nhập công thức",
+ "settings": "Cài đặt"
+ },
+ "errors": {
+ "unknown": "Danh mục ở trạng thái không xác định",
+ "load_failed": "Tải danh mục không thành công: {error_msg}",
+ "load_no_response": "Không thể truy xuất Danh mục từ máy chủ.",
+ "api_version_check_failed": "Không thể kiểm tra phiên bản API của máy chủ:\n{error_msg}",
+ "api_version_above_confirmed": "Phiên bản API của máy chủ đã được cập nhật. Một số tính năng có thể không hoạt động như mong đợi. Vui lòng đợi bản cập nhật!\n{phiên bản}",
+ "plugin_missing": "Không thể tải các danh mục. Đảm bảo rằng plugin Cookbook được cài đặt trên phiên bản Nextcloud này!"
+ }
+ },
+ "recipe_list": {
+ "title_category": "Thể loại: {danh mục}",
+ "errors": {
+ "load_failed": "Không thể tải \"Công thức ngắn gọn\"!"
+ }
+ },
+ "recipe": {
+ "title": "Công thức",
+ "prep": "Thời gian chuẩn sự bị",
+ "cook": "Thời gian nấu",
+ "total": "Tổng thời gian",
+ "fields": {
+ "name": "Tên công thức",
+ "description": "Mô tả công thức ",
+ "keywords": "Từ khóa:",
+ "category": "Danh mục:",
+ "servings": "Khẩu phần ăn:",
+ "source": "Nguồn:",
+ "source_button": "Nguồn",
+ "image": "Hình",
+ "time": {
+ "prep": "Thời gian chuẩn bị:",
+ "cook": "Thời gian nấu ăn:",
+ "total": "Tổng thời gian:",
+ "hours": "Giờ",
+ "minutes": "Phút"
+ },
+ "nutrition": {
+ "title": "Thông tin dinh dưỡng",
+ "items": {
+ "calories": "Năng lượng",
+ "carbohydrateContent": "Hóa chất cac bon",
+ "cholesterolContent": "Cholesterol",
+ "fatContent": "Tổng chất béo",
+ "fiberContent": "Chất xơ",
+ "proteinContent": "Chất đạm",
+ "saturatedFatContent": "Chất béo bão hòa",
+ "servingSize": "Khẩu phần ăn",
+ "sodiumContent": "Natri",
+ "sugarContent": "Đường ",
+ "transFatContent": "Hàm lượng chất béo chuyển hóa",
+ "unsaturatedFatContent": "Hàm lượng chất béo không bão hòa"
+ }
+ },
+ "tools": "Công cụ:",
+ "ingredients": "Thành phần:",
+ "instructions": "Hướng dẫn:"
+ },
+ "errors": {
+ "load_failed": "Không thể tải công thức!"
+ }
+ },
+ "recipe_edit": {
+ "title": "Chỉnh sửa công thức",
+ "button": "Lưu",
+ "errors": {
+ "update_failed": "Cập nhật không thành công {error_msg}"
+ }
+ },
+ "recipe_create": {
+ "title": "Tạo công thức",
+ "button": "Tạo",
+ "errors": {
+ "update_failed": "Tạo không thành công {error_msg}"
+ }
+ },
+ "recipe_import": {
+ "title": "Nhập công thức",
+ "button": "Nhập vào",
+ "field": "URL của công thức",
+ "clipboard": "Dán khay nhớ tạm",
+ "errors": {
+ "import_failed": "Nhập không thành công {error_msg}"
+ }
+ },
+ "search": {
+ "title": "Tìm kiếm công thức",
+ "nothing_found": "Không tìm thấy công thức!",
+ "errors": {
+ "search_failed": "Không thể tải tất cả các Công thức!\n{error_msg}"
+ }
+ },
+ "timer": {
+ "title": "Hẹn giờ của bạn",
+ "started": "Đã bắt đầu hẹn giờ.",
+ "finished": "đã hoàn thành",
+ "done": "Hẹn giờ đã xong.",
+ "missing": "You need to set the cooking time to use a timer."
+ },
+ "settings": {
+ "title": "Cài đặt ứng dụng",
+ "dark_mode": {
+ "title": "Chế độ ban đêm",
+ "system": "Mặc định hệ thống",
+ "dark": "Luôn luôn",
+ "light": "Không bao giờ"
+ },
+ "language": {
+ "title": "Ngôn ngữ"
+ },
+ "stay_awake": {
+ "title": "Vui lòng tỉnh táo",
+ "subtitle": "Màn hình sẽ vẫn sáng khi ở trên màn hình công thức."
+ },
+ "recipe_font_size": {
+ "title": "Độ lớn phông chữ của công thức",
+ "subtitle": "Chỉnh phông chữ của các công cụ, thành phần và hướng dẫn để dễ đọc hơn."
+ },
+ "category_font_size": {
+ "title": "Cỡ chữ của danh mục",
+ "subtitle": "Thay đổi kích cỏ phông chữ của tiêu đề danh mục. Điều này có thể hữu ích nếu bạn có tên danh mục dài."
+ }
+ }
+}
diff --git a/assets/i18n/zh_CN.json b/assets/i18n/zh_CN.json
index 05cd83ad..b42751e4 100644
--- a/assets/i18n/zh_CN.json
+++ b/assets/i18n/zh_CN.json
@@ -82,23 +82,25 @@
"time": {
"prep": "准备时间:",
"cook": "烹饪时间",
- "total": "总时间:"
+ "total": "总时间:",
+ "hours": "小时",
+ "minutes": "分钟"
},
"nutrition": {
- "title": "Nutrition Information",
+ "title": "营养信息",
"items": {
- "calories": "Energy",
- "carbohydrateContent": "Carbohydrate",
- "cholesterolContent": "Cholesterol",
- "fatContent": "Fat total",
- "fiberContent": "Fiber",
- "proteinContent": "Protein",
- "saturatedFatContent": "Saturated Fat",
- "servingSize": "Serving size",
- "sodiumContent": "Sodium",
- "sugarContent": "Sugar",
- "transFatContent": "Trans-fat content",
- "unsaturatedFatContent": "Unsaturated-fat content"
+ "calories": "能量",
+ "carbohydrateContent": "碳水化合物 ",
+ "cholesterolContent": "胆固醇 ",
+ "fatContent": "总脂肪",
+ "fiberContent": "纤维",
+ "proteinContent": "蛋白质",
+ "saturatedFatContent": "饱和脂肪 ",
+ "servingSize": "食用份量",
+ "sodiumContent": "钠 ",
+ "sugarContent": "糖",
+ "transFatContent": "反式脂肪含量",
+ "unsaturatedFatContent": "不饱和脂肪含量"
}
},
"tools": "工具:",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "编辑菜谱",
- "button": "编辑",
+ "button": "保存",
"errors": {
"update_failed": "更新失败 {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "你的计时器",
"started": "计时开始",
"finished": "is finished.",
- "done": "计时结束"
+ "done": "计时结束",
+ "missing": "You need to set the cooking time to use a timer."
},
"settings": {
"title": "应用设置",
diff --git a/assets/i18n/zh_HK.json b/assets/i18n/zh_HK.json
index 2552cc05..8f26af60 100644
--- a/assets/i18n/zh_HK.json
+++ b/assets/i18n/zh_HK.json
@@ -82,7 +82,9 @@
"time": {
"prep": "準備時間:",
"cook": "烹調時間:",
- "total": "總時間:"
+ "total": "總時間:",
+ "hours": "小時",
+ "minutes": "分鐘"
},
"nutrition": {
"title": "營養資訊",
@@ -111,7 +113,7 @@
},
"recipe_edit": {
"title": "編輯食譜",
- "button": "編輯",
+ "button": "保存",
"errors": {
"update_failed": "更新失敗 {error_msg}"
}
@@ -143,7 +145,8 @@
"title": "你的計時器",
"started": "計時器已啟動。",
"finished": "已完成。",
- "done": "計時结束。"
+ "done": "計時结束。",
+ "missing": "您需要設置烹飪時間才能使用計時器。"
},
"settings": {
"title": "應用程式設定",
diff --git a/docker/data/Recipes/problem/recipe.json b/docker/data/Recipes/problem/recipe.json
index 7334fcd4..dc5ca971 100644
--- a/docker/data/Recipes/problem/recipe.json
+++ b/docker/data/Recipes/problem/recipe.json
@@ -27,5 +27,5 @@
"dateModified": "2021-10-30T16:02:47+0000",
"dateCreated": "2021-10-30T16:02:22+0000",
"printImage": false,
- "imageUrl": "\/index.php\/apps\/cookbook\/recipes\/128051\/image?size=full"
+ "imageUrl": "\/apps\/cookbook\/recipes\/128051\/image?size=full"
}
diff --git a/fastlane/metadata/android/en-US/changelogs/22.txt b/fastlane/metadata/android/en-US/changelogs/22.txt
new file mode 100644
index 00000000..902bb864
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/22.txt
@@ -0,0 +1,3 @@
+- Bugfixes
+- Support for API 1.0
+- Added Languages
\ No newline at end of file
diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist
index 6b4c0f78..f2872cf4 100644
--- a/ios/Flutter/AppFrameworkInfo.plist
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -21,6 +21,6 @@
CFBundleVersion
1.0
MinimumOSVersion
- 8.0
+ 9.0
diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
index 592ceee8..ec97fc6f 100644
--- a/ios/Flutter/Debug.xcconfig
+++ b/ios/Flutter/Debug.xcconfig
@@ -1 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"
diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig
index 592ceee8..c4855bfe 100644
--- a/ios/Flutter/Release.xcconfig
+++ b/ios/Flutter/Release.xcconfig
@@ -1 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 6f0c84ed..d42e8da2 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -3,16 +3,13 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 46;
+ objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 1F641A9C6630AF30CF591B32 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 51EFF44B0BEA130F1D49980C /* libPods-Runner.a */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
- 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };
- 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };
- 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
@@ -27,8 +24,6 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
- 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */,
- 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@@ -36,22 +31,24 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
+ 0DF216FF5D89C2F98F7DC9A7 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
- 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; };
+ 51EFF44B0BEA130F1D49980C /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 532D0C59868F66003C59E0F5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
- 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ DC0AC41F663488B2F7AB4297 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -59,20 +56,35 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,
- 3B80C3941E831B6300D905FE /* App.framework in Frameworks */,
+ 1F641A9C6630AF30CF591B32 /* libPods-Runner.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
+ 2C3515C2EDDC1AA56FFCF240 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 51EFF44B0BEA130F1D49980C /* libPods-Runner.a */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 55A5DADABB10D00B42753230 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 532D0C59868F66003C59E0F5 /* Pods-Runner.debug.xcconfig */,
+ DC0AC41F663488B2F7AB4297 /* Pods-Runner.release.xcconfig */,
+ 0DF216FF5D89C2F98F7DC9A7 /* Pods-Runner.profile.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
- 3B80C3931E831B6300D905FE /* App.framework */,
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
- 9740EEBA1CF902C7004384FC /* Flutter.framework */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
@@ -86,7 +98,8 @@
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
- CF3B75C9A7D2FA2A4C99F110 /* Frameworks */,
+ 55A5DADABB10D00B42753230 /* Pods */,
+ 2C3515C2EDDC1AA56FFCF240 /* Frameworks */,
);
sourceTree = "";
};
@@ -129,6 +142,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
+ F809953BBB7B4AAB85A42F16 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
@@ -151,11 +165,12 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 1020;
+ LastUpgradeCheck = 1300;
ORGANIZATIONNAME = "The Chromium Authors";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
+ ProvisioningStyle = Automatic;
};
};
};
@@ -204,7 +219,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin";
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
@@ -220,6 +235,28 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
+ F809953BBB7B4AAB85A42F16 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -257,7 +294,6 @@
/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
@@ -297,7 +333,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -311,7 +347,10 @@
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = "";
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@@ -325,13 +364,13 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.nextcloudCookbookFlutter;
PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
@@ -377,7 +416,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -387,7 +426,6 @@
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
@@ -427,7 +465,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -441,7 +479,10 @@
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = "";
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@@ -455,6 +496,7 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.nextcloudCookbookFlutter;
PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
@@ -464,7 +506,10 @@
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = "";
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@@ -478,6 +523,7 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.nextcloudCookbookFlutter;
PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a16..919434a6 100644
--- a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
+ location = "self:">
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index a28140cf..3db53b6e 100644
--- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,6 +1,6 @@
+
+
diff --git a/ios/Runner/AppDelegate.m b/ios/Runner/AppDelegate.m
index 70e83933..9243710a 100644
--- a/ios/Runner/AppDelegate.m
+++ b/ios/Runner/AppDelegate.m
@@ -7,6 +7,9 @@ - (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
// Override point for customization after application launch.
+ if (@available(iOS 10.0, *)) {
+ [UNUserNotificationCenter currentNotificationCenter].delegate = (id) self;
+ }
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
index dc9ada47..6da96660 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
index 28c6bf03..713d8537 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
index 2ccbfd96..47bd6fb9 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
index f091b6b0..a8b34f66 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
index 4cde1211..e9a5bd41 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
index d0ef06e7..c5450e6c 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
index dcdc2306..d3caaf3a 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
index 2ccbfd96..47bd6fb9 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
index c8f9ed8f..bb6ed50f 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
index a6d6b860..9c66327f 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
index a6d6b860..9c66327f 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
index 75b2d164..85268c64 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
index c4df70d3..98962751 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
index 6a84f41e..fca796d6 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
index d0e1f585..df59f355 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 7dda7bc2..cf7f1aad 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -4,6 +4,8 @@
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Nextcloud Cookbook
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIdentifier
diff --git a/lib/main.dart b/lib/main.dart
index 2c79e43d..70926c36 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,5 +1,6 @@
import 'package:bloc/bloc.dart';
import 'package:flutter/cupertino.dart';
+import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -11,6 +12,7 @@ import 'package:nextcloud_cookbook_flutter/src/screens/category/category_screen.
import 'package:nextcloud_cookbook_flutter/src/screens/loading_screen.dart';
import 'package:nextcloud_cookbook_flutter/src/services/intent_repository.dart';
import 'package:nextcloud_cookbook_flutter/src/util/lifecycle_event_handler.dart';
+import 'package:nextcloud_cookbook_flutter/src/util/setting_keys.dart';
import 'package:nextcloud_cookbook_flutter/src/util/supported_locales.dart';
import 'package:nextcloud_cookbook_flutter/src/util/theme_mode_manager.dart';
import 'package:nextcloud_cookbook_flutter/src/util/translate_preferences.dart';
@@ -80,6 +82,15 @@ class _AppState extends State {
}),
),
);
+
+ // Update Localization if Settings are set!
+ String savedLocalization = Settings.getValue(
+ describeEnum(SettingKeys.language),
+ 'default',
+ );
+ if (savedLocalization != 'default') {
+ changeLocale(context, savedLocalization);
+ }
}
@override
diff --git a/lib/src/models/recipe.dart b/lib/src/models/recipe.dart
index b476733e..301b0bc8 100644
--- a/lib/src/models/recipe.dart
+++ b/lib/src/models/recipe.dart
@@ -90,7 +90,7 @@ class Recipe extends Equatable {
if (data["recipeIngredient"] is Map) {
data["recipeIngredient"]
.forEach((k, v) => recipeIngredient.add(v as String));
- } else {
+ } else if (data["recipeIngredient"] != null) {
recipeIngredient = data["recipeIngredient"].cast().toList();
}
@@ -98,14 +98,14 @@ class Recipe extends Equatable {
if (data["recipeInstructions"] is Map) {
data["recipeInstructions"]
.forEach((k, v) => recipeInstructions.add(v as String));
- } else {
+ } else if (data["recipeInstructions"] != null) {
recipeInstructions = data["recipeInstructions"].cast().toList();
}
List tool = [];
if (data["tool"] is Map) {
data["tool"].forEach((k, v) => tool.add(v as String));
- } else {
+ } else if (data["tool"] != null) {
tool = data["tool"].cast().toList();
}
diff --git a/lib/src/models/timer.dart b/lib/src/models/timer.dart
index 11f62aa8..8042873d 100644
--- a/lib/src/models/timer.dart
+++ b/lib/src/models/timer.dart
@@ -86,13 +86,18 @@ class Timer {
}
Duration remaining() {
- return this.done.difference(tz.TZDateTime.now(tz.local));
+ if(this.done.difference(tz.TZDateTime.now(tz.local)).isNegative){
+ return Duration.zero;
+ }
+ else{
+ return this.done.difference(tz.TZDateTime.now(tz.local));
+ }
}
double progress() {
Duration remainingTime = remaining();
return remainingTime.inSeconds > 0
? 1 - (remainingTime.inSeconds / this.duration.inSeconds)
- : 0.0;
+ : 1.0;
}
}
diff --git a/lib/src/screens/category/category_screen.dart b/lib/src/screens/category/category_screen.dart
index 2a3db111..167337fa 100644
--- a/lib/src/screens/category/category_screen.dart
+++ b/lib/src/screens/category/category_screen.dart
@@ -53,15 +53,13 @@ class _CategoryScreenState extends State {
padding: EdgeInsets.zero,
children: [
DrawerHeader(
- child: Column(
- children: [
- ClipOval(
- child: AuthenticationCachedNetworkImage(
- url: DataRepository().getUserAvatarUrl(),
- boxFit: BoxFit.fill,
- ),
+ child: Center(
+ child: ClipOval(
+ child: AuthenticationCachedNetworkImage(
+ url: DataRepository().getUserAvatarUrl(),
+ boxFit: BoxFit.fill,
),
- ],
+ ),
),
decoration: BoxDecoration(
color: Theme.of(context).primaryColor,
diff --git a/lib/src/screens/form/login_form.dart b/lib/src/screens/form/login_form.dart
index 40eae55b..a97da7a5 100644
--- a/lib/src/screens/form/login_form.dart
+++ b/lib/src/screens/form/login_form.dart
@@ -84,7 +84,7 @@ class _LoginFormState extends State with WidgetsBindingObserver {
return BlocListener(
listener: (context, state) {
if (state is LoginFailure) {
- Scaffold.of(context).showSnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('${state.error}'),
backgroundColor: Colors.red,
@@ -206,7 +206,7 @@ class _LoginFormState extends State with WidgetsBindingObserver {
],
),
),
- RaisedButton(
+ ElevatedButton(
onPressed: state is! LoginLoading
? _onLoginButtonPressed
: null,
diff --git a/lib/src/screens/login_screen.dart b/lib/src/screens/login_screen.dart
index 4d0d166d..3d9616aa 100644
--- a/lib/src/screens/login_screen.dart
+++ b/lib/src/screens/login_screen.dart
@@ -32,7 +32,7 @@ class LoginScreen extends StatelessWidget {
void notifyIfInvalidCredentials(context) {
if (invalidCredentials) {
- Scaffold.of(context).showSnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(translate('login.errors.credentials_invalid')),
backgroundColor: Colors.red,
diff --git a/lib/src/screens/recipe/recipe_screen.dart b/lib/src/screens/recipe/recipe_screen.dart
index d54e2ec0..2e756d34 100644
--- a/lib/src/screens/recipe/recipe_screen.dart
+++ b/lib/src/screens/recipe/recipe_screen.dart
@@ -1,6 +1,5 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
-import 'package:flutter/rendering.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
@@ -9,6 +8,7 @@ import 'package:flutter_translate/flutter_translate.dart';
import 'package:nextcloud_cookbook_flutter/src/blocs/recipe/recipe.dart';
import 'package:nextcloud_cookbook_flutter/src/models/recipe.dart';
import 'package:nextcloud_cookbook_flutter/src/models/timer.dart';
+import 'package:nextcloud_cookbook_flutter/src/screens/recipe/widget/ingredient_list.dart';
import 'package:nextcloud_cookbook_flutter/src/screens/recipe/widget/instruction_list.dart';
import 'package:nextcloud_cookbook_flutter/src/screens/recipe/widget/nutrition_list.dart';
import 'package:nextcloud_cookbook_flutter/src/screens/recipe_edit_screen.dart';
@@ -148,9 +148,8 @@ class RecipeScreenState extends State {
SnackBar(content: Text(translate('timer.started')));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
} else {
- final snackBar = SnackBar(
- content:
- Text("You need to set the cooking time to use a timer."));
+ final snackBar =
+ SnackBar(content: Text(translate('timer.missing')));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
}
@@ -305,7 +304,7 @@ class RecipeScreenState extends State {
),
Expanded(
flex: 5,
- child: this._buildRecipeIngredient(
+ child: IngredientList(
recipe, settingsBasedTextStyle),
),
Expanded(
@@ -321,8 +320,7 @@ class RecipeScreenState extends State {
if (recipe.nutrition.isNotEmpty)
NutritionList(recipe.nutrition),
if (recipe.recipeIngredient.isNotEmpty)
- this._buildRecipeIngredient(
- recipe, settingsBasedTextStyle),
+ IngredientList(recipe, settingsBasedTextStyle),
InstructionList(recipe, settingsBasedTextStyle)
]))
],
@@ -334,32 +332,6 @@ class RecipeScreenState extends State {
);
}
- Widget _buildRecipeIngredient(
- Recipe recipe, TextStyle settingsBasedTextStyle) {
- return Padding(
- padding: const EdgeInsets.only(bottom: 10.0),
- child: Theme(
- data: Theme.of(context).copyWith(dividerColor: Colors.transparent),
- child: ExpansionTile(
- title: Text(translate('recipe.fields.ingredients')),
- initiallyExpanded: true,
- children: [
- Align(
- alignment: Alignment.centerLeft,
- child: Padding(
- padding: const EdgeInsets.only(left: 15.0),
- child: Text(
- recipe.recipeIngredient
- .fold("", (p, e) => p + "- " + e.trim() + "\n"),
- style: settingsBasedTextStyle,
- ),
- ),
- ),
- ],
- ),
- ));
- }
-
Widget _showTimers(Recipe recipe) {
List l = TimerList().get(recipe.id);
if (l.length > 0) {
diff --git a/lib/src/screens/recipe/widget/ingredient_list.dart b/lib/src/screens/recipe/widget/ingredient_list.dart
new file mode 100644
index 00000000..d7f4f9fd
--- /dev/null
+++ b/lib/src/screens/recipe/widget/ingredient_list.dart
@@ -0,0 +1,95 @@
+import 'dart:ui';
+import 'package:flutter/material.dart';
+import 'package:flutter_translate/flutter_translate.dart';
+import 'package:nextcloud_cookbook_flutter/src/models/recipe.dart';
+
+class IngredientList extends StatefulWidget {
+ final Recipe _recipe;
+ final TextStyle _textStyle;
+
+ const IngredientList(this._recipe, this._textStyle);
+
+ @override
+ _IngredientListState createState() => _IngredientListState();
+}
+
+class _IngredientListState extends State {
+ List _ingredientsDone;
+
+ @override
+ void initState() {
+ _ingredientsDone =
+ List.filled(widget._recipe.recipeIngredient.length, false);
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: const EdgeInsets.only(bottom: 10.0),
+ child: Theme(
+ data: Theme.of(context).copyWith(dividerColor: Colors.transparent),
+ child: ExpansionTile(
+ title: Text(translate('recipe.fields.ingredients')),
+ initiallyExpanded: true,
+ children: [
+ Padding(
+ padding: const EdgeInsets.symmetric(vertical: 8.0),
+ child: ListView.separated(
+ shrinkWrap: true,
+ physics: ClampingScrollPhysics(),
+ itemBuilder: (context, index) {
+ return widget._recipe.recipeIngredient[index].startsWith('##')
+ ? Text(
+ widget._recipe.recipeIngredient[index].replaceFirst(
+ RegExp(r'##\s*'),
+ '',
+ ),
+ style: widget._textStyle.copyWith(
+ fontFeatures:[FontFeature.enable('smcp')],
+ ),
+ )
+ : Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Container(
+ width: widget._textStyle.fontSize * 1.5,
+ height: widget._textStyle.fontSize,
+ alignment: Alignment.center,
+ child: _ingredientsDone[index]
+ ? Icon(
+ Icons.check_circle,
+ size: widget._textStyle.fontSize,
+ color: Colors.green,
+ )
+ : Icon(
+ Icons.circle,
+ size: widget._textStyle.fontSize * 0.5,
+ ),
+ ),
+ Expanded(
+ child: GestureDetector(
+ onTap: () {
+ setState(() {
+ _ingredientsDone[index] = !_ingredientsDone[index];
+ });
+ },
+ child: Text(
+ widget._recipe.recipeIngredient[index],
+ style: widget._textStyle,
+ ),
+ ),
+ ),
+ ],
+ );
+ },
+ separatorBuilder: (c, i) => SizedBox(height: 5),
+ itemCount: widget._recipe.recipeIngredient.length,
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/src/services/authentication_provider.dart b/lib/src/services/authentication_provider.dart
index 0b25fed6..41f0c750 100644
--- a/lib/src/services/authentication_provider.dart
+++ b/lib/src/services/authentication_provider.dart
@@ -168,7 +168,7 @@ class AuthenticationProvider {
String basicAuth,
bool isSelfSignedCertificate,
) async {
- String urlAuthCheck = serverUrl + '/index.php/apps/cookbook/categories';
+ String urlAuthCheck = serverUrl + '/apps/cookbook/categories';
dio.Response response;
try {
diff --git a/lib/src/services/categories_provider.dart b/lib/src/services/categories_provider.dart
index cf389dbd..40d560bf 100644
--- a/lib/src/services/categories_provider.dart
+++ b/lib/src/services/categories_provider.dart
@@ -11,7 +11,7 @@ class CategoriesProvider {
UserRepository().getCurrentAppAuthentication();
final String url =
- "${appAuthentication.server}/index.php/apps/cookbook/categories";
+ "${appAuthentication.server}/apps/cookbook/categories";
// Parse categories
try {
diff --git a/lib/src/services/category_recipes_short_provider.dart b/lib/src/services/category_recipes_short_provider.dart
index 49bb7639..7576b244 100644
--- a/lib/src/services/category_recipes_short_provider.dart
+++ b/lib/src/services/category_recipes_short_provider.dart
@@ -19,7 +19,7 @@ class CategoryRecipesShortProvider {
? "_"
: category; // Mapping from * to _ for recipes without a category!
url =
- "${appAuthentication.server}/index.php/apps/cookbook/api/category/$category";
+ "${appAuthentication.server}/apps/cookbook/api/v1/category/$category";
}
// Parse categories
diff --git a/lib/src/services/category_search_provider.dart b/lib/src/services/category_search_provider.dart
index 8ff3464c..49692ae5 100644
--- a/lib/src/services/category_search_provider.dart
+++ b/lib/src/services/category_search_provider.dart
@@ -1,11 +1,13 @@
+import 'package:flutter_translate/flutter_translate.dart';
import 'package:nextcloud_cookbook_flutter/src/models/category.dart';
class CategorySearchProvider {
List categoryNames = [];
bool categoriesLoaded = false;
+ static String categoryAll = translate('categories.all_categories');
void updateCategoryNames(List categories) {
- categoryNames = categories.map((e) => e.name).toList();
+ categoryNames = categories.map((e) => e.name).where((element) => element != categoryAll && element != '*').toList();
categoriesLoaded = true;
}
diff --git a/lib/src/services/network.dart b/lib/src/services/network.dart
index a4cd00d7..3d0d26ad 100644
--- a/lib/src/services/network.dart
+++ b/lib/src/services/network.dart
@@ -22,7 +22,7 @@ class Network {
// Download, if not available
file = await CustomCacheManager.getInstance()
.downloadFile(url, authHeaders: {
- "authorization": appAuthentication.basicAuth,
+ "Authorization": appAuthentication.basicAuth,
});
if (file == null) {
throw Exception("could not download " + url);
diff --git a/lib/src/services/notification_provider.dart b/lib/src/services/notification_provider.dart
index 7343a3ef..0d33b913 100644
--- a/lib/src/services/notification_provider.dart
+++ b/lib/src/services/notification_provider.dart
@@ -1,5 +1,7 @@
import 'dart:convert';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_native_timezone/flutter_native_timezone.dart';
import 'package:timezone/data/latest_10y.dart' as tz;
@@ -43,9 +45,33 @@ class NotificationService {
final AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('notification_icon');
+ Future onDidReceiveLocalNotification(
+ int id, String title, String body, String payload) async {
+ // display a dialog with the notification details, tap ok to go to another page
+ showDialog(
+ //context: context,
+ builder: (BuildContext context) => CupertinoAlertDialog(
+ title: Text(title),
+ content: Text(body),
+ actions: [
+ CupertinoDialogAction(
+ isDefaultAction: true,
+ child: Text('Ok'),
+ onPressed: () async {
+ Navigator.of(context, rootNavigator: true).pop();
+ },
+ )
+ ],
+ ),
+ );
+ }
+
+ final IOSInitializationSettings initializationSettingsIOS =
+ IOSInitializationSettings(onDidReceiveLocalNotification: onDidReceiveLocalNotification);
+
final InitializationSettings initializationSettings =
InitializationSettings(
- android: initializationSettingsAndroid, iOS: null, macOS: null);
+ android: initializationSettingsAndroid, iOS: initializationSettingsIOS, macOS: null);
// Notification was triggered and the user clicked on it
Future selectNotification(String payload) async {
@@ -72,7 +98,7 @@ class NotificationService {
timer.body, timer.done, platformChannelSpecifics,
payload: jsonEncode(timer.toJson()),
androidAllowWhileIdle: true,
- uiLocalNotificationDateInterpretation: null);
+ uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.wallClockTime);
return this.curId;
}
diff --git a/lib/src/services/recipe_provider.dart b/lib/src/services/recipe_provider.dart
index 286c3be3..fd8d116f 100644
--- a/lib/src/services/recipe_provider.dart
+++ b/lib/src/services/recipe_provider.dart
@@ -12,7 +12,7 @@ class RecipeProvider {
UserRepository().getCurrentAppAuthentication();
final String url =
- "${appAuthentication.server}/index.php/apps/cookbook/api/recipes/$id";
+ "${appAuthentication.server}/apps/cookbook/api/v1/recipes/$id";
// Parse categories
try {
String contents = await Network().get(url);
@@ -29,7 +29,7 @@ class RecipeProvider {
try {
final String url =
- "${appAuthentication.server}/index.php/apps/cookbook/api/recipes/${recipe.id}";
+ "${appAuthentication.server}/apps/cookbook/api/v1/recipes/${recipe.id}";
var response = await client.put(url,
data: recipe.toJson(),
options: new Options(
@@ -50,7 +50,7 @@ class RecipeProvider {
try {
var response = await client.post(
- "${appAuthentication.server}/index.php/apps/cookbook/api/recipes",
+ "${appAuthentication.server}/apps/cookbook/api/v1/recipes",
data: recipe.toJson(),
options: new Options(
contentType: "application/json;charset=UTF-8",
@@ -68,7 +68,7 @@ class RecipeProvider {
try {
var response = await client.post(
- "${appAuthentication.server}/index.php/apps/cookbook/import",
+ "${appAuthentication.server}/apps/cookbook/import",
data: {"url": url},
options: new Options(
contentType: "application/json;charset=UTF-8",
diff --git a/lib/src/services/recipes_short_provider.dart b/lib/src/services/recipes_short_provider.dart
index e55eaf9a..d21c0492 100644
--- a/lib/src/services/recipes_short_provider.dart
+++ b/lib/src/services/recipes_short_provider.dart
@@ -10,7 +10,7 @@ class RecipesShortProvider {
AppAuthentication appAuthentication =
UserRepository().getCurrentAppAuthentication();
- final String url = "${appAuthentication.server}/index.php/apps/cookbook/api/recipes";
+ final String url = "${appAuthentication.server}/apps/cookbook/api/v1/recipes";
try {
String contents = await Network().get(url);
return RecipeShort.parseRecipesShort(contents);
diff --git a/lib/src/services/version_provider.dart b/lib/src/services/version_provider.dart
index 12522dfc..549f0e26 100644
--- a/lib/src/services/version_provider.dart
+++ b/lib/src/services/version_provider.dart
@@ -14,7 +14,7 @@ class VersionProvider {
UserRepository().getCurrentAppAuthentication();
var response = await appAuthentication.authenticatedClient
- .get("${appAuthentication.server}/index.php/apps/cookbook/api/version");
+ .get("${appAuthentication.server}/apps/cookbook/api/version");
if (response.statusCode == 200 &&
!response.data.toString().startsWith("")) {
@@ -37,8 +37,8 @@ class VersionProvider {
}
class ApiVersion {
- static const int CONFIRMED_MAJOR_API_VERSION = 0;
- static const int CONFIRMED_MINOR_API_VERSION = 2;
+ static const int CONFIRMED_MAJOR_API_VERSION = 1;
+ static const int CONFIRMED_MINOR_API_VERSION = 0;
final int majorApiVersion;
final int minorApiVersion;
diff --git a/lib/src/util/supported_locales.dart b/lib/src/util/supported_locales.dart
index fac9f45a..9fa7e5f9 100644
--- a/lib/src/util/supported_locales.dart
+++ b/lib/src/util/supported_locales.dart
@@ -1,8 +1,9 @@
class SupportedLocales {
static final locales = {
+ 'bg_BG': 'Български език (Bulgaria)',
'cs_CZ': 'čeština (Czechia)',
- 'de': 'Deutsch',
'de_DE': 'Deutsch (Deutschland)',
+ 'de': 'Deutsch',
'en': 'English',
'es': 'Español',
'eu': 'euskara',
@@ -12,15 +13,17 @@ class SupportedLocales {
'he': 'עברית',
'hr': 'hrvatski jezik',
'hu_HU': 'magyar (Hungary)',
+ 'is': 'Íslenska',
'it': 'Italiano',
'nl': 'Nederlands',
'pl': 'język polski',
'pt_BR': 'Português (Brazil)',
'ru': 'Runa Simi',
- 'sk_SK': 'Slovenčina (Slovakia)',
'sc': 'sardu',
+ 'sk_SK': 'Slovenčina (Slovakia)',
'sl': 'Slovenski jezik',
'tr': 'Türkçe',
+ 'vi': 'Tiếng Việt',
'zh_CN': '中文 (China)',
'zh_HK': '中文 (Hong Kong)',
};
diff --git a/lib/src/widget/animated_time_progress_bar.dart b/lib/src/widget/animated_time_progress_bar.dart
index 95986251..1c8ce976 100644
--- a/lib/src/widget/animated_time_progress_bar.dart
+++ b/lib/src/widget/animated_time_progress_bar.dart
@@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_translate/flutter_translate.dart';
import 'package:nextcloud_cookbook_flutter/src/models/timer.dart';
-import 'package:timer_builder/timer_builder.dart';
class AnimatedTimeProgressBar extends StatefulWidget {
final Timer timer;
@@ -35,7 +34,10 @@ class _AnimatedTimeProgressBarState extends State
duration: _timer.remaining(),
vsync: this,
);
- this._controller.forward();
+
+ this._controller.forward().whenCompleteOrCancel(() {
+ });
+
}
@override
@@ -46,35 +48,32 @@ class _AnimatedTimeProgressBarState extends State
@override
Widget build(BuildContext context) {
- if (_timer.progress() > 0) {
- return Container(
- child: Column(children: [
- TimerBuilder.periodic(Duration(seconds: 1), builder: (context) {
- return Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Text(
- "${_timer.remaining().inHours}:${(_timer.remaining().inMinutes + 1 % 60).toString().padLeft(2, "0")}"),
- Text(
- "${_timer.done.hour.toString()}:${_timer.done.minute.toString().padLeft(2, "0")}"),
- ],
- );
- }),
- AnimatedBuilder(
- animation: this._controller,
- builder: (context, child) {
- return LinearProgressIndicator(
- value: this._timerTween.evaluate(this._controller),
- semanticsLabel: _timer.title,
- );
- },
- ),
- ]),
- );
- } else {
- return Container(
- child: Text(translate('timer.done')),
- );
- }
+ return AnimatedBuilder(
+ animation: this._controller,
+ child: Container(),
+ builder: (context, child){
+ if(_controller.isCompleted){
+ return Container(child: Text(translate('timer.done')));
+ }
+
+ return Column(
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text("${_timer.remaining().inHours.toString().padLeft(2, '0')}:${_timer.remaining().inMinutes.remainder(60).toString().padLeft(2, '0')}:${(_timer.remaining().inSeconds.remainder(60)).toString().padLeft(2, '0')}"),
+ Text("${_timer.duration.inHours.toString().padLeft(2, '0')}:${_timer.duration.inMinutes.remainder(60).toString().padLeft(2, '0')}:${(_timer.duration.inSeconds.remainder(60)).toString().padLeft(2, '0')}"),
+ ],
+ ),
+
+ LinearProgressIndicator(
+ value: this._timerTween.evaluate(this._controller),
+ semanticsLabel: _timer.title,
+ )
+ ],
+ );
+ }
+
+ );
}
}
diff --git a/lib/src/widget/api_version_warning.dart b/lib/src/widget/api_version_warning.dart
index 063849df..cfa167e6 100644
--- a/lib/src/widget/api_version_warning.dart
+++ b/lib/src/widget/api_version_warning.dart
@@ -13,7 +13,7 @@ class ApiVersionWarning extends StatelessWidget {
versionProvider.warningWasShown = true;
Future.delayed(const Duration(milliseconds: 100), () {
if (apiVersion.loadFailureMessage.isNotEmpty) {
- Scaffold.of(context).showSnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
translate(
@@ -25,7 +25,7 @@ class ApiVersionWarning extends StatelessWidget {
),
);
} else if (apiVersion.isVersionAboveConfirmed()) {
- Scaffold.of(context).showSnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
translate(
diff --git a/lib/src/widget/authentication_cached_network_image.dart b/lib/src/widget/authentication_cached_network_image.dart
index 0e931c76..2a2cd0e8 100644
--- a/lib/src/widget/authentication_cached_network_image.dart
+++ b/lib/src/widget/authentication_cached_network_image.dart
@@ -29,10 +29,11 @@ class AuthenticationCachedNetworkImage extends StatelessWidget {
width: width,
height: height,
httpHeaders: {
- "authorization": appAuthentication.basicAuth,
+ "Authorization": appAuthentication.basicAuth,
+ "Accept": "image/jpeg"
},
imageUrl: url,
- placeholder: (context, url) => CircularProgressIndicator(),
+ placeholder: (context, url) => Container(child: Center(child: CircularProgressIndicator(),),),
errorWidget: (context, url, error) => Container(
width: width,
height: height,
diff --git a/lib/src/widget/authentication_cached_network_recipe_image.dart b/lib/src/widget/authentication_cached_network_recipe_image.dart
index 9261d7c5..465cac60 100644
--- a/lib/src/widget/authentication_cached_network_recipe_image.dart
+++ b/lib/src/widget/authentication_cached_network_recipe_image.dart
@@ -28,7 +28,7 @@ class AuthenticationCachedNetworkRecipeImage extends StatelessWidget {
return AuthenticationCachedNetworkImage(
url:
- '${appAuthentication.server}/index.php/apps/cookbook/recipes/$recipeId/image?size=$settings',
+ '${appAuthentication.server}/apps/cookbook/api/v1/recipes/$recipeId/image?size=$settings',
width: width,
height: height,
boxFit: boxFit,
diff --git a/lib/src/widget/input/duration_form_field.dart b/lib/src/widget/input/duration_form_field.dart
index 9c601794..795bc190 100644
--- a/lib/src/widget/input/duration_form_field.dart
+++ b/lib/src/widget/input/duration_form_field.dart
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
+import 'package:flutter_translate/flutter_translate.dart';
import 'package:nextcloud_cookbook_flutter/src/blocs/recipe/recipe.dart';
import 'package:nextcloud_cookbook_flutter/src/widget/input/integer_text_form_field.dart';
@@ -47,7 +48,7 @@ class _DurationFormFieldState extends State {
children: [
Padding(
padding: const EdgeInsets.only(right: 12.0),
- child: Text("Hours: "),
+ child: Text(translate('recipe.fields.time.hours')),
),
Container(
width: 70,
@@ -55,7 +56,8 @@ class _DurationFormFieldState extends State {
enabled: !(widget.state is RecipeUpdateInProgress),
initialValue:
widget.duration != null ? widget.duration.inHours : 0,
- decoration: InputDecoration(hintText: "Hours"),
+ decoration: InputDecoration(
+ hintText: translate('recipe.fields.time.hours')),
onChanged: (value) {
currentDuration = _updateDuration(
currentDuration: currentDuration, hours: value);
@@ -65,7 +67,7 @@ class _DurationFormFieldState extends State {
),
Padding(
padding: const EdgeInsets.only(right: 12.0, left: 12.0),
- child: Text("Minutes"),
+ child: Text(translate('recipe.fields.time.minutes')),
),
Container(
width: 50,
@@ -75,7 +77,8 @@ class _DurationFormFieldState extends State {
? widget.duration.inMinutes % 60
: 0,
maxValue: 60,
- decoration: InputDecoration(hintText: "Minutes"),
+ decoration: InputDecoration(
+ hintText: translate('recipe.fields.time.minutes')),
onChanged: (value) {
currentDuration = _updateDuration(
currentDuration: currentDuration, minutes: value);
diff --git a/pubspec.yaml b/pubspec.yaml
index 125e2ab4..217b9f12 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -11,11 +11,11 @@ description: A new Flutter application.
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
-version: 0.7.6+21
+version: 0.7.7+22
environment:
- sdk: ">=2.7.0 <3.0.0"
- flutter: 2.10.4
+ sdk: ">=2.10.0 <3.0.0"
+ flutter: 3.3.0
dependencies:
flutter:
@@ -77,12 +77,11 @@ dependencies:
# Timer for cooking time
flutter_local_notifications: ^9.4.0
- timer_builder: 2.0.0
flutter_native_timezone: 2.0.0
cached_network_image: ^3.0.0
- flutter_typeahead: 3.2.4
+ flutter_typeahead: 4.1.0
dev_dependencies:
flutter_launcher_icons: ^0.9.0
@@ -93,7 +92,7 @@ dev_dependencies:
flutter_icons:
android: "launcher_icon"
- ios: false
+ ios: true
image_path: "assets/icon.png"
adaptive_icon_background: "#0082c9"
adaptive_icon_foreground: "assets/adaptive_foreground.png"