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"