From 3fc6c78b24830a232b18a8c9cb88b21fd8b326b3 Mon Sep 17 00:00:00 2001 From: meichthys <10717998+meichthys@users.noreply.github.com> Date: Sun, 10 Apr 2022 23:16:28 -0400 Subject: [PATCH 01/38] Rename Edit button to Save --- assets/i18n/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/i18n/en.json b/assets/i18n/en.json index b0cea45f..ce182934 100644 --- a/assets/i18n/en.json +++ b/assets/i18n/en.json @@ -111,7 +111,7 @@ }, "recipe_edit": { "title": "Edit Recipe", - "button": "Edit", + "button": "Save", "errors": { "update_failed": "Update Failed {error_msg}" } From 4785d44d771eae78ea180cda513331fa420e1b00 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Apr 2022 11:01:40 +0000 Subject: [PATCH 02/38] Bump actions/setup-java from 2 to 3 Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2 to 3. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 46230230..243e1ae8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,7 +7,7 @@ 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' From 3709c0179f3263fed12ac1118aaf1901113f8c6a Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Mon, 18 Apr 2022 04:10:43 +0000 Subject: [PATCH 03/38] [tx-robot] updated from transifex Signed-off-by: Nextcloud bot --- assets/i18n/bg_BG.json | 36 ++++++++++++++++----------------- assets/i18n/de.json | 4 ++-- assets/i18n/fi_FI.json | 46 +++++++++++++++++++++--------------------- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/assets/i18n/bg_BG.json b/assets/i18n/bg_BG.json index bb9d1896..30f29fe9 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": { @@ -85,20 +85,20 @@ "total": "Общо време:" }, "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": "Инструменти:", @@ -142,7 +142,7 @@ "timer": { "title": "Вашите таймери", "started": "Таймерът стартира.", - "finished": "is finished.", + "finished": " е завършен.", "done": "Таймерът е готов." }, "settings": { diff --git a/assets/i18n/de.json b/assets/i18n/de.json index 31db2a82..b7d66d61 100644 --- a/assets/i18n/de.json +++ b/assets/i18n/de.json @@ -140,7 +140,7 @@ } }, "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." @@ -166,7 +166,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/fi_FI.json b/assets/i18n/fi_FI.json index ce662585..8d8b586e 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": { @@ -85,20 +85,20 @@ "total": "Kokonaiskesto:" }, "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:", @@ -142,7 +142,7 @@ "timer": { "title": "Ajastimesi", "started": "Ajastin käynnistyi.", - "finished": "is finished.", + "finished": "päättynyt.", "done": "Ajastin valmistui." }, "settings": { @@ -158,15 +158,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ä." } } } From 0bcc30ec3b06b961a5bfd2058ecec9b6b421419b Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Mon, 18 Apr 2022 12:30:52 +0200 Subject: [PATCH 04/38] Hours and Minutes are translatable --- assets/i18n/en.json | 4 +++- lib/src/widget/input/duration_form_field.dart | 11 +++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/assets/i18n/en.json b/assets/i18n/en.json index b0cea45f..eccbac27 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", 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); From 8a59ff1f6c6640373db8d8276c762eabd7d6036b Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Mon, 18 Apr 2022 12:54:27 +0200 Subject: [PATCH 05/38] Adds Queries to indicate to API30+ that the app wants to open HTTP URl's #112 --- android/app/src/main/AndroidManifest.xml | 8 ++++++++ 1 file changed, 8 insertions(+) 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 From be78f8aa8f63356019ee77e9c4eb8f17188112ed Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Mon, 18 Apr 2022 13:56:07 +0200 Subject: [PATCH 06/38] Loads Localization Setting if present at startup #124 --- lib/main.dart | 11 +++++++++++ 1 file changed, 11 insertions(+) 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 From 4114dd9bfaca8e5a04817eac0db2dfd2b1944ed6 Mon Sep 17 00:00:00 2001 From: Joel Koreth Date: Tue, 19 Apr 2022 01:19:31 -0500 Subject: [PATCH 07/38] Adding iOS icons --- .../Icon-App-1024x1024@1x.png | Bin 10932 -> 56577 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 557 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 1054 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 1893 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 752 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 1759 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 2855 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 1054 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 2622 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 3994 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 3994 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 6762 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 2493 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 5466 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 6241 bytes 15 files changed, 0 insertions(+), 0 deletions(-) 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 dc9ada4725e9b0ddb1deab583e5b5102493aa332..6da9666074f58daa244d20b767cc46136043be2a 100644 GIT binary patch literal 56577 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 Eg1MaQtN;K2 delta 1264 zcmV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~ahS(%I#+V>J-vjIic7FmrfXn)08SZW zzL?HZgo}SSNcu|m&n`&XRLWEe_q?Rh_`)DQ!Ucc|OZ-XFn511rB_$bP9dH@wh-Ggo zqynVM3)3?_gVf#>E5u8iY)EMfQ#c-AONh%-O{IL)jaDpDp>fGZ;* z&NNa1u7PwxJb%(=S<`N2yPs}=Qd>tT)H6o27G=V5iPc4VS!_#@l|b>qnm9t zrveTdNw3GcyxNRs+YhS;I5HWpo!3ygInT3 zP$EweZn5FmW{(G2OmSWnlaVUrTdi!)jr#2-s*s1Y*W_xKW$+MV)+W zCJONO)jWe^^@a6LPGuFcfUl@%=t@<;i?RwP48wWx&VbMLbZu~j*zqUV3tSiqXmuv* zLdA3PVSjYZn;Sj4Qq`Z+ib)a*a^cJc%E9^JB;4s+K@rARbcBLT5P=@r;IVnBMKvT* z)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$KvMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y z6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nhet(}(@b2R=TnMg(!~JoOB@~U_c{58&x0vLE`&u6Jl1aUEMx=WS<^6F&44hq+zu3- z_YL@*xZ%^Cib8GTu|*xK0`9Mn-Pm>9AUJNoFl&j-KxEN_kAlACY{ z$$uG-fx8)AdpOV5PKzI?;TLyZ)r=v66R`IomuI>x!+GH*&chH~4;$pUapo+qzkiN9 z<5@h%5QL2t?hTdv#T`vf9JrKYa7=W%A%T-Zg*<e+2=O{vx$^4} zFC06^KjT>(Tk|t13k)ZJ8iKTjKw?FACl`;u#Kx8F_~|Syo`Y)*u46%BQD+-het*Bi z?&DuFlF8#(Lxtca1NV%iv%qemMnJ6c{JImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$pt}{a=*RiD2Ikv6o=IM1kgc7zq zpaZ;OB)P!1zz*i3{U()Dq#jG)erW`rGV!8YiTcE;xq_^g1lF2L%K5-fW6V#bE#SS9 zvT+;sezt(~lJ><+Gy2p|Ncw&Opk}j6l6FjiD+x;i=}0=DsM|lR`BgEDeVmu{s-k?D a0{1_&;gnn2jcRKE0000T 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 f091b6b0bca859a3f474b03065bef75ba58a9e4c..a8b34f6609d12277eb8f4db2d9bedcf2bf684cca 100644 GIT binary patch delta 1879 zcmV-d2dMb84CM}xBYy`hNkliw@I4Z+9oD7rlg6n3R^g#?F(VFD88r!64{>k56 zclO?$ou6}NW;ZvX^@HT@&d-_ioilUh%-rj@y?HhO4 zPw&U;TxCL~O+dFvh9&#sI_WZfsban1d7`D(3?e^20C7MMVw-7JLIjxVToqVv_=ytH z|MClF`NS3o^vXb-hd>*s+OUn`YxTk!z?C&IH(I6o5FF!bOkaAF$cl>|j6BxDb0(v& zW;{Q#QY=Iwi+>F+49ZIoYY0VRq*Rwl))=6}eP;Rk0E(9ZHv*=hNm-{QVT#%*R|}abZcuJ%r2FnII$pU+0|SNe$IozOA8t~Rkt$r&~sA(jy}I5BE0{|IXFHrfqI~K=N5S7fmXP;qY-j4*Kk;Q z=DqvfD7^Mn(MV1s1zOOG*K$&%_Gk6?bTmW?6l!y@^M-mD8ZUe8!R|sNmU(9P_C`*4 zPxmIshkp!MpPsJ9h_HwaVfzpJx*~&7Bvk|5-`ObXL_w{S6Az7?@*XRqtn)-cd{Cm8 z<0D4)&gPT>%O(|vuNNU?)a}YaupSYx2oJFTu4d>{Jgc@>r?a~jI*dV!ziI0kU-wC( z<|$1ARB1m4@W$SDX?&a<80rlBG_t0NpoI&Tw|^FqP9TxxrzNy+0v4Rwuge?PDpuwR zYsYP$Puk0gN77R1Sf(W~B;mRaSv$7%hyL` zmw(!?q;c$Pmr}vpR~{SPmdL@B#6+E!;z&+zG7cTIJYldvt`J{e-+N>9-qlnKkL=jQm3p~n zD_ovifx3JSp1ZqQP$ZC)w5?ODJ}Og;VSgkc5*Ewktx4~WB^@oH_ulL6&}1}h$icxU zx1mZndylB+PQbj2j3~mmEny0}AoZF9cjAItslChK5VVveL~X4oXeGl-csS|Ig)4)zn~tm~PAn3`*_VMW`G0Wn zv`;o9G7i@E%U>qKDBOw)G%3DZ3gFnl6)p?wQQ5F1kbRJ$k zUW9M|m;%Xw9&PL_TbB#$9wr9?_kS#LAC@mvKb)Cpwd)1}6q5le)@ykB5=}&@qNSn5@d?)j-;%X^f z&?3K6qW8`ym?aI-wXD`r(SJXFUJZz#MV&SA>1ghmM)1-=I8IbcZR}Y7{y(rVs zwmroHw6nD#0#}nPgTuC@D57z}X9J#X$pW-Uv5M`+6}}p?$Sg@iOvo+UvQ1$V*=l*0 zA;Y#5L&z7!QsQJK^)gLiQF0ZD#>l)a(WS_AR=+OB#zB&nwLt1zT7UP5IgP{=w?*)^ zgdViiuRx7yX4C-{EUjfp1VYw9UbWzB1EyTlODiS01_@g1@-7Y0$t8I4i@)IgXFH)jpVR734$Z*96MtK%;cyFD zhP$r$r4sahG8p~fth>36w_`sGJbQi)2L7El{1k%5r>Do@>%l2_sJj3)!q4(9OfH5; z%BjpT&PU0pFi4O4{BUkM`s3wf5BH#SK0G=e=^uA)?}C)4rBE`Amw9OE+D6_q$bN|@ zq6(L5>xE1n)(Bdn?$rdROFV|G3CPt3J@HUsIon=quzQ%}+9QVnJuUs8@gHUz;fQ+z RsXG7w002ovPDHLkV1jgKnZ*DA delta 1572 zcmV+<2HW}N4zvuABYy?^Nklc)UfJ<2uenUn3ARN>mf|M z+(eagCX~wv_9N9Br6dE4W@{R1X8yU75JVAXqB_2?1W&7xoYHg zkR5NEVWsUG^?wLzRHH9Aa#eCDK9NvdPE(De9-HaQc(6~^lpTe2pm3&x9G1K5Xawdi z4F*DRWI%>vgEBPFqaRR51|&E>B!fiay027YsK+Vrn=1PqDKdi{m<&P1nQ3_Gw<%cH zHU+slT8moWCbIKH=(W3t1j5BNfsIKQ#Mzi(J59kx zT!xVJ&SKqb4XjdxWQV7$IrZ-{l-x3`7M}qzHsPzP1S_$c=96h(q%b9ZXPvcV z;D5oPsau6Q(U`-YLD*G41z_cgz)a99av0W_U=aHAj?mj@2KZI50efIA zO8^kn_?FjaZ_hfbhSh@3^GzxJx*P{Jc7Hi*OHPZ!wvEV2a9XKq###zPPeRs75i0(W zU?doBGb9yqT58~qn?wQ4oCi3oWdc^W%JAgTVR)*l33@Ky3ip4Rqz14Wx_gwsGYGq) zMY~B;*z8j>WF8xV`^#!USYHDVZf}I{OZGzBnutHA1D(}!4{};5>;)mO27l7F zHh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG;P%vktHcXwTj~+IE(~px)3*MY z77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC(zYC$g|@+I+kY;dg_dE>scBf& zbP1Nc@Hz<3R)V`=AGkc;8CXqdi+`PV3Vc;#lxQO~AoO*}pfE+=*r3ffZ_YMC zflq>i%a-`Xw)YRuK;MUtq{SGa7vtY^gg0bKSp&F>y|A>h5qhqSvgdtV{(lh0c$xz5 z;*U?KQl%W)htLmD=yhL!@aldLHW(=H00^&qu7J0mA5v0IaX@pn_bKobsC(e>(nAjI zzjyto3Dmc!oOxjlw&JZqeL%+vsN0Zy8@1@rs~rRNAqO?umG&QV WYK#ibz}*4>0000b2gEzs5R7E`qf(I+26|}jvDYd2qEtbT@uCue5-P!rr z-B9r@o1K08_WjsJh_#Me_i6AGI3hvn9IjHtDc3qo7#uetqOrJ^$9AtnzONIP9#7-c-fry7c3^aT z250tfK#!fmjTf`b)^2aZNPZ&@_ova3TID;w^JX6R-<7p+B4@zYar(CK3L92G9tYMGseJS?&nUaUzaEEDcnM#~rx^ zGd9$RqqLwhYY1+g*v6{#%X~Gqad02H=Ao@#F|O0OZh!xNc(6wdII+lBA_u~6>wnC- z)EfHM87)DiME9=i@ZrY_{phnuwW(=6c)#G=nS>ROqwix%rtAfJPR#tm(7h=X&JBc~ zjgFUa_wDx&6G!4EY}qMRJj`4i+vvkJrN=D3&wyF)h-uxd58#;U76OKUvJZ< z{<8R!-G5&=kVWs>)v-Vis&N=eMbO>~lNCJrv`Yf?peD!kLAAcD=xdE-4bVch5%%;u zqKz6eb!Bd`jw{bfIJsv%+tNPFF5&stAJQy%*-~Ajc3t%UlDo%NmKqp){Vf7&X0nW~ zJ}t46-D_Z6UKJOSyEz%*O@N93Em+a4XczaOQ61@Dg2K@M0FmV{d24(Yx??hb00000 LNkvXXu0mjfaMEEH delta 1004 zcmVU6E9hRDZsKRZ8`ICh6f+zh_Ab z(jRY2a{B+|os<)hT5u?RkVuNN!js0QT$N5qdKbV*dH@&&Vjutv8ARzpRqqL`fs%v3 z_*Hd00YYHFNIC{Q1h^F1P!f5C!xIU|E+^yzaDu?XOc`!nZ+PjJh~`vV%1!_aj2TH& zKwB1AHSp7kgnyx5V{+EJ5gM3@MPI>kpg&?m&MZY^mCPDRTDzYO*c$nehN*{r1;b!} zL~B$N2&udO8tBp-PM4v#VA!7mo$41xCTJ~SU|=SOZ3V-D{)qMzXd9GbL+F1E1Yg28 z1RU&-XuA$zU1(Mh+ag0OA2L@}lJyL@X7yGouP$&$M1OlzM%Nm7TCsNcLSx`u3}=gu zz_8*kvf$vZc1ylSt62f92V^XU?#Y zz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#YwqkoqZx^jlHgV2aMo8z}1PBGB7;Ej|r zUB(UDU}Sw|KG_{Ict^w^3nDNEn{Q#}yRSHTWQ?6}jPTd&B7rp|u4dqtoymH&RdRgj zT#2{N3mqTk(vPPJH*F&>&U5!|8yVTRi>^YB#EGCzC1t+ajDgsRm$x_ZV)O4@I&qfh zrhh)<9J$s!Kq@Bk2*~DAzd+ItgnGi{)g+zGbzBzZYX#nnI#*DSOq^;G=#=I-Jg>aXP1F zlEh^jkE`b1p$afa*ZWyv)#99=s8_FR$dIH^l3o73@CH04X-v{g?RT@=lj`|W(&I~U amdro30R>( zV*nE$P-DPGj89%L;n4sOMxRWKF%f;@$rm*-Ms0jhlP1R76B^X;sHsR0V`9MYV4z3} z_Ja0mTDva4|NQ%3=5o%=`M0|*`X#&j@64Gq=Qd}~%&x!b_5on(_hM6S+fFNHL zqlWM^0it(?FcvK=sJnuW2=Vnk`71WgTu-Y5PNd23hSzdklOsYj!}*oL7@^uGKM(Y^!~Sh; z@c!9J7@IAn0zAIE6L$5qz`Li%VP^4WD%9b<8=$+*hr#bAV6jAJ^*g&;;Gvxzuw`u{ z6ufv|S()&4W@H{tT$sx3eIHvZ(VCRksPx?4T!c@KY=4Kwq6huAHN(-5FGoW5bv41z zlYNoO>sov`cJgXOzb`b(;GsKGK5u+8W*GIZO|9_y!QRMtEg(MpLvofpRdTEU=Mv%*DUtPjsJtGWh@ z5Ko%J>gM)>5ZN56C$5CXW##*~wn4Fgho;R_qJNFzY^&PPf+bM?9^l0&Nbr z5WS6pZSC5{%Oo*8nh=;1$89L*jA0}c(yj|t^z7!ag>*F_3I??XloM3o1%`$3XU`gz znAKEy+?Mh&qJ;Lo#iL-;R7Nbb-uz|qO#G^-c*3EpXo=Y%Mw+dkk&zsRZmHptm&>q z&go7D%Pr3^KHOx)^)R`;WK8JLbqON(sefzBO-R!Q8W*e#-@u9pG?U_W%Sol8BSfCjA$8Luw_H?4-lkZ|LeevW~`2747C>h+t>1kOI zsdDV44v&JmRwdeNGfOaddOTH>!uMC^OeJ%ID*w3N6i}0qhj`bvF{jJKrG$R>WF{0F zxK)!4>Uos8Ritf5k#9RYM$a|>F@MADO#ym)0gKfVWzb|zjj7GK(qPJjdyS?%@wLhU zc2B$6K1=pId!b02{P~flt*s{$_~<5KbuykP zD6dBBxJqhD)k;YL$M%9L<$un$a$A;S?DTR%s-=Pnh&v-?dJ{=jHJTBxB3x|As$Osx z4A`E=-9r&$=%K2w<$A%F*9GtHC=&?l!uC*%x4y5|Q%M2-_JZ6WiCc!W7g12O{XSdD z<;Bq%`%R%3J29XCHjz;RraeZ>NO%JI@W(&k$lfkAY$xVQ@b>Un(tj8i`F1Z3{V*B* z#b)dJCRB={b2q|ym(V^Na(EQb_4@Q@BQSh<77py}fClN8Ghu|chR5N$@Th2DhUwHo z8SZ=Y7kJ^p9@rKt>&3L?aQwHI=HR_E6MT6kpm#AjmTSv6Z8MT z%U_PNXt`kD8R>9evs0{GqTzsX9%U5yb%707*qoM6N<$f_Eu;s{jB1 literal 1716 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 delta 1906 zcmV-&2aWir7Jv_sBYy`+Nkl^fDmF(5(5$|?Cx}D zKEJa&XZP%OyE`*GvvYQ4PV&!g2|L^Q?YG}tx;sY@GzV#^0C$Z`m}blr)&(OPMHT6T@%AxHOWYGG zm>@=0?<)?0r0XK9>leRXyD^j4O4bXT!@LESVI<~>`yB+S2b_f__vvyMHkwGyyXedq3usx&X*}E{O;}+nJ#G_xm zJbQX5 zuFrVK*|x9RQeZ1J@1v9MX;>n34(i>=YE@Iur`0Vah(inE3VUFZNqf~ ztSz{1fz3Fsn_x4F>o(Yo;kpqvBe-sbwH(*Yuz!}~S^-;|MX;9Py1im8!}VY-!u4P+ z!nLEvx?+Rogo+Kw9OBXy&lGIvJ51_7Hl6Q>*MAJa!lMDGGML530`Te&0ciU({DC7` z;RKg{uC>($*mdXnVQQBjiVyqYC7mf!Z%e-Q!?Oo{ufu`G3CAC=UjiTpU<94UTFz2KEDuNS@KKkg)K8!v1L8RUP$_! z({LG$Dy&JLEVpiNVe^G(HCbA*SpsX?292)#=JVQDUMp-cOJPl`+yTHTD!AOit-zAD zptXYa!q%OVLa^mo25b7^Z>kE`3rqgr-G4i;Lw<+P(8khESW8aaBmxfY`WS#6j<92Q z-++&Y z$gbH4#2sT0cU0SdFs=*W*4hKGpuR1QGacHFy;`# zR&NJkbTNp}Ee5f08HmLzK%D(q3@lH;Tzx$?VT;&xJq-KyHV__o3dD)?KrE<6*iXV0 z8;6<{IKw@dyDwJ90H5^3h;|9?twz{UGr|>1Pzhdn6W(r0ifeZd=JI+AAz<~yL(QJk zAWW))+=`8mGj|J!70oF@d4B;WxB=jBM1bWWRBb&1!ie3BUzOdm}yC-xA%SY``k$rbfk;CHqifhU*jfGM@DkYCec zD9&E@F9*za0?~OQZiDE|Cf;;0 z`uZ%H=IeGyG^H0ruev{yIVARgwZUG)j7>F#3~dh+8DOtPByR=(VDhz2enf#EjcXCI z=NUPYr4@S)GhX!?s(0Eh(nGe!y$#$r1B$||I~`wPhUuCQEo;#Xb$EXk=6HgBBRd#c ziK|jN$e~{zV~|;*E@Ij-Z(+tI^B8RW51ptE!nMnPyZ`_I07*qoM6N<$f^^M{6#xJL 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 2ccbfd967d9697cd4b83225558af2911e9571c9b..47bd6fb9498952ab803a473facedb3a064334d74 100644 GIT binary patch delta 1034 zcmV+l1oiua3Z4j%BYy+sNklYel`G4Y=%JTdJw=9fBe||e# z3}OlzMR}F5-GC~A(wvoUr#H04IZQ1q=vpUJCQFyo8N8QP*W% zRUGD)vapcJaoMIy8S@grE))`Z+o+>?axXy^2 z&sy2REc{G1?rx0V|+3RkgJfkc3YJHbj^W?SKrIf!JZjyXYW4d_ZM zerLUBBBc5%2fV!(7v-;(mB#xWgG}cehmgS3m7TH zhZ$&;^_MsBjpTs%CK1Me(mA70sdN@{5xWAu219JL=OA~$CdX45c=<5}$98QDbo6*| zx?mF(y6ka+Dj^J=Pd>w)6HU-@Ac@Z3?Vp6}Pk+BfCued{>zs<>>G>77+Bb$0%rV6) zy<1B<}+D#Un$CRh%Ldo42)pV z9)AeCl1jRW-6}3~1q2c-1`pmQ*!7?&^V^wbj}z1r!b#|`9^@QoyBS~52y0LzC*3k4 zl5+{J!9u}^sq#|DIneHXmAA=z;N(heUtJiVgWkVA)I_A0bK0zVk5VtqS00000NkvXXt^-0~ Eg1MaQtN;K2 delta 1264 zcmV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~ahS(%I#+V>J-vjIic7FmrfXn)08SZW zzL?HZgo}SSNcu|m&n`&XRLWEe_q?Rh_`)DQ!Ucc|OZ-XFn511rB_$bP9dH@wh-Ggo zqynVM3)3?_gVf#>E5u8iY)EMfQ#c-AONh%-O{IL)jaDpDp>fGZ;* z&NNa1u7PwxJb%(=S<`N2yPs}=Qd>tT)H6o27G=V5iPc4VS!_#@l|b>qnm9t zrveTdNw3GcyxNRs+YhS;I5HWpo!3ygInT3 zP$EweZn5FmW{(G2OmSWnlaVUrTdi!)jr#2-s*s1Y*W_xKW$+MV)+W zCJONO)jWe^^@a6LPGuFcfUl@%=t@<;i?RwP48wWx&VbMLbZu~j*zqUV3tSiqXmuv* zLdA3PVSjYZn;Sj4Qq`Z+ib)a*a^cJc%E9^JB;4s+K@rARbcBLT5P=@r;IVnBMKvT* z)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$KvMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y z6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nhet(}(@b2R=TnMg(!~JoOB@~U_c{58&x0vLE`&u6Jl1aUEMx=WS<^6F&44hq+zu3- z_YL@*xZ%^Cib8GTu|*xK0`9Mn-Pm>9AUJNoFl&j-KxEN_kAlACY{ z$$uG-fx8)AdpOV5PKzI?;TLyZ)r=v66R`IomuI>x!+GH*&chH~4;$pUapo+qzkiN9 z<5@h%5QL2t?hTdv#T`vf9JrKYa7=W%A%T-Zg*<e+2=O{vx$^4} zFC06^KjT>(Tk|t13k)ZJ8iKTjKw?FACl`;u#Kx8F_~|Syo`Y)*u46%BQD+-het*Bi z?&DuFlF8#(Lxtca1NV%iv%qemMnJ6c{JImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$pt}{a=*RiD2Ikv6o=IM1kgc7zq zpaZ;OB)P!1zz*i3{U()Dq#jG)erW`rGV!8YiTcE;xq_^g1lF2L%K5-fW6V#bE#SS9 zvT+;sezt(~lJ><+Gy2p|Ncw&Opk}j6l6FjiD+x;i=}0=DsM|lR`BgEDeVmu{s-k?D a0{1_&;gnn2jcRKE0000T 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 c8f9ed8f5cee1c98386d13b17e89f719e83555b2..bb6ed50f54a85bd0f0d2412147a577e1cea91eb0 100644 GIT binary patch delta 2614 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 Y1Lwo7NIjR&j{pDw07*qoM6N<$f?-i6ivR!s delta 1881 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 A82|tP delta 2657 zcmV-n3ZC_vAL$g3BYz4oNkloFh3q0M zFesq&64WThn3$;G69TfjsAv=f2G9}pgSx99+!YO}2Uveik)GA5ewEg1Va|1@=x;Pyj3t}zC)T-c zzoz+u9TyK|)jteh(` z;D6}gLagCR0hn*76kN#wCv*`b8GyswI1s7kNaT!{fEXv;5ofK|nu3vU_1cRKLBd@TQ@Ei6F6QJ?HM!O!+{x(L<6rNAv)=55QOzlPWhqI{ zjSR5c$#aW1xy}c;$06La(Y*xlX>0w3EDGGn02k}7*%ZplRLFsw%E3MJO@BuPkU#Ja zcbp(_BL!RxGHHe;wff^+2G>u>ah(dq7O)#K0ekx={yBF*$P%aJSOMmjHHmAxvW0cp zt8@K;ETVH`1(=8Ie(Z;Hy+9V#xv>Mxz*+%0w;aeKJ2#eqVJL7nrpksp7|5bKS2)0a zId?FSYb0>4P=MLsl6(J^Q-5;@54jg=+fq2sO~Hz-hVXEO0L<$0j+BKdGX;Npqt{os zJmk~Y_Q1L83|RfW)5G^!;(u>i7{EI*HIqAp9`Cbzna*hHhI2Lm9I{{?%y{Hgdzxli z7Fd?00Ed;L$qk&zI`y$@{Dn;5j(iW`=!aXNV*G=kjb8%Qi`UtJMSq7ZT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah-w13P)xT`>~eFoJC!>{2X zL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw>F+gN+i+VD?gMXwcIhn8 zrz`>e>J^TI3E-MW>VM=sWZual)ns9B%8_$25BcpOz+KP;+J(1(UiAp*Q=dc!FQL}*R43bTaVm7wy#IrC-VD&k-4FWYMd;wg6!1z8a3SP;O>P#-$->_l zEAM2>hI~v3$Y(TlIdJE^0@|6AK_7#uc{~E1^f2gGJ^}i)rGJ>FDPRt4F~}m-WGQZK zw?8N6;NJH#XeW;Webf!0kG=!+v2#G5xX^L14Y#o*Tz9&z7NjOib92f(6aq==Ntoo74a!u6w~r!$mq|FDi7h6+6fTa4$$0Y>@Y*O}J#< z8ic&ucAQ^e_cw)#3uFTLcly|p7IMmPAXha6205mSA%EQja0eR?DV=N%;eS$2zHI*MpiObUuA|j7`m5?j`@^G6SO!-;(G1aCOu{sGli$ zGck~Eqx{gt?U$`9P3JRJO>}Ku- zRew#6AKb$jGi@lro`A;#P%m@cnyJP&(r%f}Zq^V3mIc=hnLfVXHRn=pj;2#4v8WiM zav|%So5|ksmkM-bV7H;F_%f>b72G`eFJ!d@wTC-#ALO^GRCtHl=K|Y}dX%fTm0A$N zzc4;N3AGsYM~OOND&T_#%8wZzWYfL@by`|620=mAU7(LZ-At!cdlWCvu@AK#bt~#< z9;~k^d5}}7VXmK@h?&@_rUHYJ9zD=M%4AFQ`}k8OC$9ssPq=LnkwKG P00000NkvXXu0mjf`QjR3 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 a6d6b8609df07bf62e5100a53a01510388bd2b22..9c66327f4910d60f81c5366676d2ba62ff0388ab 100644 GIT binary patch literal 3994 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 A82|tP delta 2657 zcmV-n3ZC_vAL$g3BYz4oNkloFh3q0M zFesq&64WThn3$;G69TfjsAv=f2G9}pgSx99+!YO}2Uveik)GA5ewEg1Va|1@=x;Pyj3t}zC)T-c zzoz+u9TyK|)jteh(` z;D6}gLagCR0hn*76kN#wCv*`b8GyswI1s7kNaT!{fEXv;5ofK|nu3vU_1cRKLBd@TQ@Ei6F6QJ?HM!O!+{x(L<6rNAv)=55QOzlPWhqI{ zjSR5c$#aW1xy}c;$06La(Y*xlX>0w3EDGGn02k}7*%ZplRLFsw%E3MJO@BuPkU#Ja zcbp(_BL!RxGHHe;wff^+2G>u>ah(dq7O)#K0ekx={yBF*$P%aJSOMmjHHmAxvW0cp zt8@K;ETVH`1(=8Ie(Z;Hy+9V#xv>Mxz*+%0w;aeKJ2#eqVJL7nrpksp7|5bKS2)0a zId?FSYb0>4P=MLsl6(J^Q-5;@54jg=+fq2sO~Hz-hVXEO0L<$0j+BKdGX;Npqt{os zJmk~Y_Q1L83|RfW)5G^!;(u>i7{EI*HIqAp9`Cbzna*hHhI2Lm9I{{?%y{Hgdzxli z7Fd?00Ed;L$qk&zI`y$@{Dn;5j(iW`=!aXNV*G=kjb8%Qi`UtJMSq7ZT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah-w13P)xT`>~eFoJC!>{2X zL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw>F+gN+i+VD?gMXwcIhn8 zrz`>e>J^TI3E-MW>VM=sWZual)ns9B%8_$25BcpOz+KP;+J(1(UiAp*Q=dc!FQL}*R43bTaVm7wy#IrC-VD&k-4FWYMd;wg6!1z8a3SP;O>P#-$->_l zEAM2>hI~v3$Y(TlIdJE^0@|6AK_7#uc{~E1^f2gGJ^}i)rGJ>FDPRt4F~}m-WGQZK zw?8N6;NJH#XeW;Webf!0kG=!+v2#G5xX^L14Y#o*Tz9&z7NjOib92f(6aq==Ntoo74a!u6w~r!$mq|FDi7h6+6fTa4$$0Y>@Y*O}J#< z8ic&ucAQ^e_cw)#3uFTLcly|p7IMmPAXha6205mSA%EQja0eR?DV=N%;eS$2zHI*MpiObUuA|j7`m5?j`@^G6SO!-;(G1aCOu{sGli$ zGck~Eqx{gt?U$`9P3JRJO>}Ku- zRew#6AKb$jGi@lro`A;#P%m@cnyJP&(r%f}Zq^V3mIc=hnLfVXHRn=pj;2#4v8WiM zav|%So5|ksmkM-bV7H;F_%f>b72G`eFJ!d@wTC-#ALO^GRCtHl=K|Y}dX%fTm0A$N zzc4;N3AGsYM~OOND&T_#%8wZzWYfL@by`|620=mAU7(LZ-At!cdlWCvu@AK#bt~#< z9;~k^d5}}7VXmK@h?&@_rUHYJ9zD=M%4AFQ`}k8OC$9ssPq=LnkwKG P00000NkvXXu0mjf`QjR3 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 75b2d164a5a98e212cca15ea7bf2ab5de5108680..85268c648019033b2e9f334e61ed3dacc0476f96 100644 GIT binary patch literal 6762 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 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 c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..989627516efd05b8437ae317558fe17ee5f3211a 100644 GIT binary patch delta 2484 zcmV;l2}}0i4!skQBYz2mNklLjCpTW$UcUB( zYap&YAlj+%VtYE5lq;)@1Rr(0pDaR>V3GN|0D&4m6S#K^zg;t#uGo)iHRu{v}+t!q>#X99|ZVXOJZ3pf#i6{$&m8g zlqX7aSfM0is(&y~amg}*a?v5oLBX{&$~uRo`+NF={nR6Mfz>8?QF09fr;;M7fbNnp z63qs3lT;v5iVz3NlTHWa5m{1Mn5SEpvm&G^L{%+bGb`^}?k2FcnX_cVSSf5JA|bPT zub2Rj&zlUt{oMmg*6x7ahkGmI3Uwa5a@$n6X=V$o+kbut?tW`03<%SwjB9}R?mQ39 zZmEYyKivZ_Z{DxVp_?XZkLs| z4Y*5|JyN$EU0LHs72wJFXN8IZm>mkg?3y-s@Pof9Ll(|zfrS^2i|5@O{{3L)A^2$f z;Y$DV>wnr{`h=13^-~L`z&qOx!l4sIRIIv?-~Csf36EUc2F)W2l449KgzI@AocHF| zF4(f`xOKb<>0VL*E`+YE=sprWQdT1T8KZq^?1VA$Gnv>lLUM&kP4%fTA)VGnA63|> z5q0qT;%Tv^y2L_pY(yJtcgftyUQ$J}cwJdgZhuvuw5(WOjH}S_K#M6+5`OLWbK%Ad zno(Mwkp9){yb}$PC1ZB+{~AL?2(D1^Vk$8g$;1R6x@saU2rWyEO)i$|#W16?z-=2f|NIt2G`fVK+_BpFD}j&gm*~wmwcn)gH7bVv zsOHikrnNR?3f@%(d?J2D;JGA~02E@_g0*={5iHJCi{yyh_|dWxa07p>z|4}AOQs9N zo~T)Vq+EgY#YNN?6{;Ta6v1`VYL)7iC4Ui13p`nFLiBqg8CfE-;C z^o_X?!(xJU^3k(+AB~YM-i!C4I3IkwliX*DQ5B=k{;q&oxC%TibNJ z2jy;W|vgcI)6gA^JpLR z^#?GbpiXtSw3EdE_8jR=c|!J#Y3j2jGZWC`9XsKacz53beD(WLm?zX*>ReNsc)#KI zBcaj;P~mOXWExvpkG2GU>`LI~lEijt^@a|(uDu!j0&Z35oU~27?+q2T>WjTHyMP{V z+77Aw2PsQpK@w;7!>$u>-+%jm!t;yH30>3t)&^@k++Bn_*8Wj>XISbEP~*2LkL$v& zu`7X;C1nB@VoCy7yQK>@?>q)i%%2Rm%pT890B>*Wf)(p`S7Mha0=AWLDNRfvKr3OG z$dn~@h9&GgcoN>)+69X)8mCO7E$xl(50sTfd;nviL-pYqGp)NgRewDO<4X_`RF;(b zLAFcGs>JqmJhIhNUeQ$(x72l26UThXwPa~n1YFWQu0TW)<)iOJ5!J>mF%xEW#RQI7 z5)(q?Z{KgKZCb1pngV1VCu4H@vcj^LOu^YEVPmkeLZT^z66qe{>#96c(9dFB5qy;} z8^|`Pbe{@ni(jP%NPm?jk2Js8#6766LWKu6Zddg0EYwiwT=w_S#%ho2MzuGmfF^G?iDL7*v-` z`lMP3Jfe<6k1FIb#IvQgOnHF)dr7NHGGF%E%Zd^)t&KVqRFso4qYVZ@xuXP2aLHCoPIBD`-ALrK|{<4-jKuN^m%(;D4WB0O_iO4TmggSB^ZKuDirO zwU^_9}Tw^;lLlG>S@4ol7EHrM>~PMXBf?z}q=i)sOHpLAPgj zHpf_YzPkvdPqSzn6PkXzq<7{AMN&C@G z8R2609e*prvtM_@!&grvhNRZ^^o9=D|4(0KZpurVL9#n=ya;PHbi#_cldPgWv#|p@ z5?)mx-z-_CwS4_9IC!EM|IRTwMpo;xqdonw>dU>b=Bv(3iW0H%lil&R87o7jHILFA zCgQa^xe!9kT-GKG;2@eWfMkc$k1 z0ml>961ZEK%Ggs}Ng`MZV_PBXMenJps0201lE}d9Jcb$U7Dl}VFI|`>W)x|7!x~L`~4d z)Rspd&<9kFh{hn*KP1LP0~$;u(LfAup%fx&qLBcRHx$G|3q(bv@+b;o0*D|jwD-Q9 zuQR(l*ST}s+uPgQ-MeFwZ#GS?b332?&Tk$&_miXn3IGq)Ab;WSyQ!vAt)@Ccb&;xv z%AX@*_j-xyC{+_x1Jy90eS@gHl9`eOYAn?ns>{f~a)oLg)i}Mj8-?Z5uJ>q_5#bAD zs+e{qIS7a(wLvT!sO}RPqyuZB*5&w@L~|675r8qFZOn01hM)stdt z(}AUD*+MA1yMMAWR~H%&a`aj*kR~YHLIk%}CkzB^7}YeC>Z%YF3%$siy4gUWO|iV9 zyS{R3%u=2p$xI}(n6@d|Wn+c7k}2 z((AD!&VxpxR^A?&MN{;FY6cOn>|#gvx^pnz;el1jsvqQz}pGSF<`mq zEXRQ5sC4#BbwnB_4`c5bFE-Gb#JV3tox9fp-vVEN{(tOCpR zse`S+@)?%pz+zVJXSooTrNCUg`R6`hxwb{)D1R`!oJBH}D}dSIti0)xc5KlQ;k&Me z2>uPHr)yMQ5rWI~9($t>0^<$2oJD8x2jY(b@BSK5-ZeHH4q-;SalJr4Uv)5qxyQl^ zKr6bZWCj+~xn6>qN5aY*W~-eg!g}X;SotjbKlUcusA}8P7rC$h7*?ESRri+6cEyu7 zWPjzUS7|qw9as^i(e+yWM&5Yy?_fs@8h;Aox&})oF6feHdx&y#6|KggrRyvPD_!^2 zWf4|JL7&g++36T|jv*B^GqCDS!kUvMSQ$?%`k)a7T4g`bQq8k?qe61#uo|-n%aVy} zDyOB|R_2Xj$C20|!eLEyAuP+5M#)a&(0}Su>}T;t_0TyI3)n+9`|(su5H)S?gk|aC zJK1S$^ei(3izu+}-QvfnodFEr7Qo|sf`$eWJ7ShC+dG|f^kiM?ecBBp2AsuUJ+dQ! zhqedsFjcVuXm&d*>l=s{{6rb?j5v$K;z|Y0DOg$CqV8|;Jdm@J6^FLB5870RVSi=y zB?##U+(6Fi7nno`C<|#PVA%$Y z{}N-?(Gc$1%tr z4Pc}}hm~yY#fTOe!@v9s-ik$dX@ALH?I94Q-n;}RcAsCmWQ^Wv3|h(79tw+~Xv3fI zRWE{f+Db?hm*K^w`_(#S`=Qx-+$ov{v_4qp;j35(scH$l^-UN&qX|;^Qpcd#exS|> zw36>AtbIVy=YPOgHV@LIPvEUx1yAi~@YJorZ8O%Y(3aT`&5r3f6-*VjG1;+h4Tq418njAdPz!-tq zpPUVE>3kJZeKXbCeqnLh*?&D5Fvowz7S-k)Z70s-4mJwbt%Hw3@YJqO3G07OOBg*# zR)F2qStmOO?d(4o(m;x0Wlqr5?09S>x#%Qkt>?(&XjFRY}*L6BeQ3<6XEBh^S7>AbwGm@XP{R zkeEKj6@_o%oV?hDuUpUJ+r#JZO?!IUc;r0R?>mi)*ZpQ)#((dn=A#i+|E(0h@Z5l}YZL#eq00sELYLBA#NZ01}gr6>{OJDZ*4ElXLIz zghey84@Yi6Qy8!^TQ@Hv`Vy{v#0RPZg+>Hei&JH(<4#+s(~k?Gh~a3lkgC*^G94+s zzNW=AUQs^BwwPcH7PH1^@s67{VYS000#sNklV8^ z^pHM|UjNAP78w(9tdJP2JFc8a12J&dtCrWXrSb{2UbN#4q=7wG>#7ySa0O)yhA)P$5KG~a9HZY`mDTQq(WV4GLGDEsLD*oYR4!VX zgDcaN*T`XR0>M=BS}19Ff;z~rfao%amdo^8v+c~d=o&QXKjnR|3q*K=DqHrXz(ii@?q$TAbz=MYTg zqPL$^^KxnNYM|y+qsIjdvq+FCR$7yJ%5~0Bli;?q4}n<|Tj9Ok`{7s5e+Uo0wu_{A zlg2f}ub0k)GZuD&pnm$zJ#gL1P0+V*2pto}6-&C|#?xlP)Cn!Hb?+eD_{8Rb$6oC? z6LgJhfu)PP;KX?yuxREum^Zl%+L{Z{8vIv49yr}`aqOdkgK)cv_)8{jD#|tdRQmi^R*smZYnO?q1|Hxg_#>J`tp}|NT*Wf**Ufup1OJ=965bl z<=h2FcfsLP$HM8qeGB#-KrC=+4p*Hp6>dLwcIEKg;D+D-jYDDSz3bqg@AOM$n_%(G z@o>YbGvNGSZmr@%WpgrwShERjO>py|uIUY)PTUgRap9bpa+T+FRB-I76Q{wiU-%G}EtFHpNJ1#~ zeam`a(d}=PtRRqglO%EG!ijKGU>!d{r=2{;23Maj4PM;X4-c*G%|xCGxQi5PISfkg zqEjw8-}LzFI?ZThqMQlqz`2&ZXkwJ7j!BW?4)@UU}E61WY;pey#>D5 z(*aNZcaP*U^ciYagMn@|=d(A?a9{kH=&$Ck02eR5tcYYRG0cEckkeb-4BB)YH zv^6*cQJ&y#p@l1d_?rtt<>Ikt?^BcW7R`)ufT2xbdXLpxtcdP@@}Rd-G0N&;ge(>1N50S$tcUm^Wxz zMff>&m7fwoQmh*dy0Mk>vLu5c7Lzl+wF!Q+bRL~if*-efPnnZWrV$MKoBEeNB0%FT zg>XvaTlW;l&T8T=PGFDSV6L^eU{M#$=^BIbcMTs_&PN6*z|JD6%0-=kR=Hf=Bm>2x z&f}~jMhd;Q@s}Ss3h)hJkwpT-YE=frXmmG&n>E@7>C|{A3XwUUt>`4^c)3!@yvAs} zEK>8<5#B!0*TK|oYS@`;v@OIYadu$6WYvCKE9K7J=^r|uH8DjmQUt)mTBTC`U1G$d zp|+ReQ>7&;s(8@EdWkWoAJ)klgUQH3@wlKVq5E6 z?HC)yGv(v6PS4qj?kaQ zK;Py}m6LT3la!1Y6j;k(_9FF6sfrb~lJRTdE0|-1+B=c&b-u_89i$xUDvRECg@G^kmGDvDlqA_H8U{y7WkG+de&eutZuKv%uzMQ z)=I_VX=fIX#>a6MsTR&@AH|+>2~WNSqFFChhr!gN4Y2w=&&C9v*5(rZJG~UTfvEJu_PlAv|S~ zz_VJK%x&Vh$cwcJx{kIcInNSWk~?Wq0!i#W~lCht9!M*MJI^iwr?j;^@V2l`BS7TA=02df<-dx52Y- z_l4F-yq15>Nz>rC+39brN%C2`s0(IxE`;B$+79b?4uoH{A}rUpzc5{Y9mPqY=Uuot zFIgpnrBB66E0|$yM~lypI1BXIWOHDNt`Dr$^(Bji(P4Z}n%5EjN2#@8VAa?Za2Ue7F1AZbu@P8?cFA4E+(=Jn7QLsg5|gC$Uv|3k9;nm3q>hDnpi>3c}j0Hntfy7 zw7sl@dm?B_p1I-~w2ClTwvZCEGWThsTsrq9w9l%Q`N(OlsOxf_?5q%pB<>2q>R zv&n@w^oo6S0z1pTVHShtZfbeSHr$Px@P6KYWFicWdH zSZOsL@8eu{u%82aM=J@M#YxrA0JkJEdW=p+%Z+c+bHizh?MQkMZh9^X+buy7hA2N5 zu1;GbhFo`fx}Ea4WUABD%j_t|*dbpNY6;rpkk8`&zkJ}Uex zUfTr+nQk$QTA1t1(Uf4 z&6unVGgS7DRvKuvou~}qj{f+so#9u3+XVa=EjQr5Yt?qx+82)vRh4{`-ez>IF&JC6 zg5q3;aFj)w1^vmG;K$Ewfpb4Q3A)=`mE(%!W@QQrjYv9v`rOu}L^Y!^Kd3;M^h+VBrN3&+j$FS^A z@4&{uT}P-;9>YXA*tyL6m#jv<8&tg)DdY9`b$xL3?f-#W&YT5T9zQkq^TRsXSP@o5 zw}0p$-1XvixHWLm`vwn2skHJ`b26>ETeY?baM@?o!NZ0_35bdnMStL`Zg_li_-nN* zE?oeNXN^~mp%!72w5#6jhs#%Ngw4ALAP$XkMa1dm!);Hg&XJWir9;)}ZB`V_SzoKz zpwp6KmL&;M==`8>Fil_3t;plIWl~d zDZ=D~D_4{LbCt_?2OxPrvMyH`ycg*qi`0yl{b(pPla$fQT_-_NQzX1Q&J-mSNl~5^!y9 zb?(zNkXQ56({SCQjoWnBqpYrLEW^)+Lk4Iv(yz6t#>rffai*up7G*ZrD23!fBI466qQu*UI6mf0?y%33yR3au&&`nWcx? zmnqVO6#4ebl}&Rz#Tk|96WM2x7D`ndPA^l)=v^vTx*wzG;j1~Gr?@K$WveKQUZhO6 zgn`yF7`v$gX#0vIgh@Jj9V|)Xy40bTT|MRVlSMjtngoydO{9r7cb)h=%w+OqnL*9F zx|Yp-FOmR?#ftx{AJ0)N89g=Lidy!A!}3SKHfUG1kdotZ-uWm!(PA)*r;lE=bsO;W zGD&(cAEg}%K0dK_PxuAJ7%!7Hk7+p~UCFP0T$Y1gBtfwl%A%4drI(TttXqlKl@D)( zTlegTF0uPI8WVk z@BU>IpHIN!!AlOUD41yrNjJ9IK!bd@y-589n<|#Q>n#7xQ!HFIrBh(npR6Uz=BZUg zQz&w5R^VA7o+8F$6U$v1miYy*DfNX8RPZ+g2aXXyC2-gKA; zSpO(I6*8sb6a-Bx{3i6VaU{N`?iJ4{b@QzS>m}g)N8!ybT&-9tmM$_$O0Sex;m7&N zXk0hP^Mnk({6q$QX+jsDIVn-#%n3ZHttg&y`D`Io1G&v2xz&2^9{$SbWFgG3!Y>8W zt<{?HP~dUHp}m!gabq^SWn+}GEGzsfUd9=x;(Vp6y;SbWW0qQ7som8C3mA^_=pLd}NV?DX1F3oIUy2 z7^-5Sw9LjerLiqLUrW|YpgLJ3ag9u}NYyxQ=4oQJ)coS-NuFkkWnu(zcia^(_m{_Q$0trUl^?nYrZ7aPTmw_I4l zdIVX)$_wNy_-81UN}7)fKLz$#XMJ0)GT2$9FAK%tZ(^-$VMf%Ai zi>&!urnO@kbFeRGj4tI8Fpt3uf>WC+zl$x?rt@%9gdKg#CE(@DPh{ZTRDZ1_2_rgf zTnLrWjDMXVA6aAwno_xbolPfCB7iZk(XCtpBn68uoVykhZSjSy@QdCQyB2IR$%6?J zPSG?fBTip^#mY-jg#8tozIIC_`A2VZZ|vudp>kfwLpqbhxW0j*)HvPl2el0PwTiEP z@`b^ngLGS!Sh0GSQ=X>CUoTQ1af1hjhT*nnx5Awl&SlBe#b!Tva&zEH)GZ#3 z1SWkPBL4f))9=H*%X+N%Bysao@58`>d_-Z+vPepXr-bI_iXUx1dHw{r_;XX7>~6jH zZqxheQuK=mZcg6S0xiR(H5-#K|YG#S<<#e9XbUiIgV zxyc{}*g<|)y-1lN4+TEunn&J+$6oJ+pPe%sj`>VGX`bcJtG9dtH$AZ#o_l+*(qhRK z)?X+grgz=S_kwtEH{5>i95`+^eqA!G+4@Q7?nTm&H@GddT0DJ}V`cp9e|^D!Yhgim z8%*zLg_b5vS&IK22o&>!zWuOa*8sZzOWk(LCQcQZ-;!Uhg`O#GFeA9G)@HR_@xX2C zAB6Qg2QrzT3DgSaxQ*m`Pn1~LbvyRy3Cq`!QFdqx@gRf`Lmj|*FEWdbb+)ly9+j$I z;XI41I*g04IhcDLBBfxuovTi=NG3>pt*ZPDvhGFF`8Jd) zkMN&G8Y&ZgXGTM@@(g7cmE>qRycs+N%1Yij~N-#BU@pU7zz*-)r@ffEIb#!Y5u zC{(?oI$2~xp+*fnW|0jgYM@F#=hwjKL1wS5H847ni`^6r)Grze)__<1ANRa+C()@c QCjbBd07*qoM6N<$f*$IX6#xJL delta 3291 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 LNkvXXu0mjf6mC?w literal 3612 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 iW8 Date: Tue, 19 Apr 2022 01:20:33 -0500 Subject: [PATCH 08/38] iOS project updates --- ios/Flutter/AppFrameworkInfo.plist | 2 +- ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Runner.xcodeproj/project.pbxproj | 90 ++++++++++++++----- .../contents.xcworkspacedata | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../contents.xcworkspacedata | 3 + 7 files changed, 76 insertions(+), 25 deletions(-) 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 @@ + + From 4eb65b4fb28a9b3aa3972c70dc1b03d6f1401cbd Mon Sep 17 00:00:00 2001 From: Joel Koreth Date: Tue, 19 Apr 2022 01:20:55 -0500 Subject: [PATCH 09/38] upgrade gradle version --- android/build.gradle | 2 +- android/gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 From 4d99c14a07e0e2c38a04b28d72b8b036ad22ba5a Mon Sep 17 00:00:00 2001 From: Joel Koreth Date: Tue, 19 Apr 2022 01:21:35 -0500 Subject: [PATCH 10/38] Enable iOS local notifications --- ios/Runner/AppDelegate.m | 3 +++ 1 file changed, 3 insertions(+) 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]; } From 4164d3feafd9222625df3da8ed70c9898c2402eb Mon Sep 17 00:00:00 2001 From: Joel Koreth Date: Tue, 19 Apr 2022 01:22:37 -0500 Subject: [PATCH 11/38] Enable ios icon creation --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 125e2ab4..521a4e75 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -93,7 +93,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" From 882d3f0b8e7e491cf3b9e206fa8c1ce056637e69 Mon Sep 17 00:00:00 2001 From: Joel Koreth Date: Tue, 19 Apr 2022 01:25:44 -0500 Subject: [PATCH 12/38] iOS notification handling --- lib/src/services/notification_provider.dart | 30 +++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) 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; } From bf8a7c9a006ffeaf742f1de2c82984967627a009 Mon Sep 17 00:00:00 2001 From: Joel Koreth Date: Tue, 19 Apr 2022 01:26:18 -0500 Subject: [PATCH 13/38] Updated timer code --- lib/src/models/timer.dart | 12 +++- .../widget/animated_time_progress_bar.dart | 63 ++++++++++--------- 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/lib/src/models/timer.dart b/lib/src/models/timer.dart index 11f62aa8..283180e5 100644 --- a/lib/src/models/timer.dart +++ b/lib/src/models/timer.dart @@ -41,7 +41,10 @@ class Timer { this.duration, [ tz.TZDateTime done, ]) { + print(tz.local); + print(this.duration); this.done = tz.TZDateTime.now(tz.local).add(this.duration); + print(this.done); } // Restore Timer fom pending notification @@ -86,13 +89,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/widget/animated_time_progress_bar.dart b/lib/src/widget/animated_time_progress_bar.dart index 95986251..f70cefac 100644 --- a/lib/src/widget/animated_time_progress_bar.dart +++ b/lib/src/widget/animated_time_progress_bar.dart @@ -35,7 +35,11 @@ class _AnimatedTimeProgressBarState extends State duration: _timer.remaining(), vsync: this, ); - this._controller.forward(); + + this._controller.forward().whenCompleteOrCancel(() { + print("Completed Animation Controller???"); + }); + } @override @@ -46,35 +50,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, + ) + ], + ); + } + + ); } } From 1c87d1bbabc8343908d38249d39c1fafde124637 Mon Sep 17 00:00:00 2001 From: Joel Koreth Date: Tue, 19 Apr 2022 01:58:34 -0500 Subject: [PATCH 14/38] updated name --- ios/Runner/Info.plist | 2 ++ 1 file changed, 2 insertions(+) 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 From 7473b490fa1a065e044249f6e73ce8702ab84910 Mon Sep 17 00:00:00 2001 From: Joel Koreth Date: Tue, 19 Apr 2022 16:15:24 -0500 Subject: [PATCH 15/38] Removed debugging statements --- lib/src/models/timer.dart | 3 --- lib/src/widget/animated_time_progress_bar.dart | 2 -- 2 files changed, 5 deletions(-) diff --git a/lib/src/models/timer.dart b/lib/src/models/timer.dart index 283180e5..8042873d 100644 --- a/lib/src/models/timer.dart +++ b/lib/src/models/timer.dart @@ -41,10 +41,7 @@ class Timer { this.duration, [ tz.TZDateTime done, ]) { - print(tz.local); - print(this.duration); this.done = tz.TZDateTime.now(tz.local).add(this.duration); - print(this.done); } // Restore Timer fom pending notification diff --git a/lib/src/widget/animated_time_progress_bar.dart b/lib/src/widget/animated_time_progress_bar.dart index f70cefac..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; @@ -37,7 +36,6 @@ class _AnimatedTimeProgressBarState extends State ); this._controller.forward().whenCompleteOrCancel(() { - print("Completed Animation Controller???"); }); } From 5a5d1bb1af1d47a41fcc76108cb040e41485e709 Mon Sep 17 00:00:00 2001 From: Joel Koreth Date: Sun, 24 Apr 2022 19:07:39 -0500 Subject: [PATCH 16/38] Removed timer builder --- lib/src/widget/animated_time_progress_bar.dart | 1 + pubspec.yaml | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/widget/animated_time_progress_bar.dart b/lib/src/widget/animated_time_progress_bar.dart index 1c8ce976..bb85cdd3 100644 --- a/lib/src/widget/animated_time_progress_bar.dart +++ b/lib/src/widget/animated_time_progress_bar.dart @@ -1,6 +1,7 @@ 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; diff --git a/pubspec.yaml b/pubspec.yaml index 521a4e75..e87ddca1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -77,7 +77,6 @@ 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 From 2f8e60adda0f29c5ad060f8f4d95da7d9cbcee02 Mon Sep 17 00:00:00 2001 From: Joel Koreth Date: Sun, 24 Apr 2022 19:13:22 -0500 Subject: [PATCH 17/38] oops forgot one --- lib/src/widget/animated_time_progress_bar.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/src/widget/animated_time_progress_bar.dart b/lib/src/widget/animated_time_progress_bar.dart index bb85cdd3..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; From 556094356a10f982ce81b84b471801ed2847c1e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 11:01:30 +0000 Subject: [PATCH 18/38] Bump subosito/flutter-action from 2.3.0 to 2.4.0 Bumps [subosito/flutter-action](https://github.com/subosito/flutter-action) from 2.3.0 to 2.4.0. - [Release notes](https://github.com/subosito/flutter-action/releases) - [Commits](https://github.com/subosito/flutter-action/compare/v2.3.0...v2.4.0) --- updated-dependencies: - dependency-name: subosito/flutter-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 243e1ae8..8b511def 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,7 @@ jobs: with: java-version: '12.x' distribution: 'adopt' - - uses: subosito/flutter-action@v2.3.0 + - uses: subosito/flutter-action@v2.4.0 with: flutter-version: '2.10.4' - run: flutter pub get From 3912ffdc9b053481a28577a16a0979fa4ed1792b Mon Sep 17 00:00:00 2001 From: Jason Arroyo Date: Sat, 11 Jun 2022 19:02:52 -0400 Subject: [PATCH 19/38] Use ListView for ingredients and render items with ## prefix as headings --- lib/src/screens/recipe/recipe_screen.dart | 32 +-------- .../recipe/widget/ingredient_list.dart | 68 +++++++++++++++++++ 2 files changed, 71 insertions(+), 29 deletions(-) create mode 100644 lib/src/screens/recipe/widget/ingredient_list.dart diff --git a/lib/src/screens/recipe/recipe_screen.dart b/lib/src/screens/recipe/recipe_screen.dart index d54e2ec0..47668648 100644 --- a/lib/src/screens/recipe/recipe_screen.dart +++ b/lib/src/screens/recipe/recipe_screen.dart @@ -9,6 +9,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'; @@ -305,7 +306,7 @@ class RecipeScreenState extends State { ), Expanded( flex: 5, - child: this._buildRecipeIngredient( + child: IngredientList( recipe, settingsBasedTextStyle), ), Expanded( @@ -321,8 +322,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 +334,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..00d6477f --- /dev/null +++ b/lib/src/screens/recipe/widget/ingredient_list.dart @@ -0,0 +1,68 @@ +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 StatelessWidget { + final Recipe _recipe; + final TextStyle _textStyle; + + const IngredientList(this._recipe, this._textStyle); + + @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 this._recipe.recipeIngredient[index].startsWith('##') + ? Text( + this._recipe.recipeIngredient[index].replaceFirst( + RegExp(r'##\s*'), + '', + ), + style: this._textStyle.copyWith( + fontFeatures:[FontFeature.enable('smcp')], + ), + ) + : Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: this._textStyle.fontSize * 1.5, + height: this._textStyle.fontSize, + alignment: Alignment.center, + child: Icon( + Icons.circle, + size: this._textStyle.fontSize * 0.5, + ), + ), + Expanded( + child: Text( + this._recipe.recipeIngredient[index], + style: this._textStyle, + ), + ), + ], + ); + }, + separatorBuilder: (c, i) => SizedBox(height: 5), + itemCount: this._recipe.recipeIngredient.length, + ), + ), + ], + ), + ), + ); + } +} From 5bd13b36c77ae6b798a2c6a5e2030ccf88cf6a80 Mon Sep 17 00:00:00 2001 From: Jason Arroyo Date: Sun, 12 Jun 2022 09:25:54 -0400 Subject: [PATCH 20/38] Add ability to tap ingredient items to mark as used --- .../recipe/widget/ingredient_list.dart | 55 ++++++++++++++----- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/lib/src/screens/recipe/widget/ingredient_list.dart b/lib/src/screens/recipe/widget/ingredient_list.dart index 00d6477f..d7f4f9fd 100644 --- a/lib/src/screens/recipe/widget/ingredient_list.dart +++ b/lib/src/screens/recipe/widget/ingredient_list.dart @@ -3,12 +3,26 @@ import 'package:flutter/material.dart'; import 'package:flutter_translate/flutter_translate.dart'; import 'package:nextcloud_cookbook_flutter/src/models/recipe.dart'; -class IngredientList extends StatelessWidget { +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( @@ -25,13 +39,13 @@ class IngredientList extends StatelessWidget { shrinkWrap: true, physics: ClampingScrollPhysics(), itemBuilder: (context, index) { - return this._recipe.recipeIngredient[index].startsWith('##') + return widget._recipe.recipeIngredient[index].startsWith('##') ? Text( - this._recipe.recipeIngredient[index].replaceFirst( + widget._recipe.recipeIngredient[index].replaceFirst( RegExp(r'##\s*'), '', ), - style: this._textStyle.copyWith( + style: widget._textStyle.copyWith( fontFeatures:[FontFeature.enable('smcp')], ), ) @@ -39,25 +53,38 @@ class IngredientList extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( - width: this._textStyle.fontSize * 1.5, - height: this._textStyle.fontSize, + width: widget._textStyle.fontSize * 1.5, + height: widget._textStyle.fontSize, alignment: Alignment.center, - child: Icon( - Icons.circle, - size: this._textStyle.fontSize * 0.5, - ), + 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: Text( - this._recipe.recipeIngredient[index], - style: this._textStyle, + child: GestureDetector( + onTap: () { + setState(() { + _ingredientsDone[index] = !_ingredientsDone[index]; + }); + }, + child: Text( + widget._recipe.recipeIngredient[index], + style: widget._textStyle, + ), ), ), ], ); }, separatorBuilder: (c, i) => SizedBox(height: 5), - itemCount: this._recipe.recipeIngredient.length, + itemCount: widget._recipe.recipeIngredient.length, ), ), ], From 8dcb4537001afa5fc36ae1bdaa671ce19301f4e8 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Mon, 13 Jun 2022 04:24:16 +0000 Subject: [PATCH 21/38] [tx-robot] updated from transifex Signed-off-by: Nextcloud bot --- assets/i18n/bg_BG.json | 6 +- assets/i18n/cs_CZ.json | 6 +- assets/i18n/de.json | 6 +- assets/i18n/de_DE.json | 6 +- assets/i18n/es.json | 6 +- assets/i18n/eu.json | 14 ++-- assets/i18n/fi_FI.json | 6 +- assets/i18n/fr.json | 59 +++++++++----- assets/i18n/hr.json | 30 +++---- assets/i18n/hu_HU.json | 6 +- assets/i18n/it.json | 6 +- assets/i18n/nl.json | 32 ++++---- assets/i18n/pl.json | 6 +- assets/i18n/pt_BR.json | 6 +- assets/i18n/ru.json | 6 +- assets/i18n/sc.json | 78 +++++++++++++++--- assets/i18n/sk_SK.json | 6 +- assets/i18n/sl.json | 44 ++++++----- assets/i18n/tr.json | 6 +- assets/i18n/vi.json | 174 +++++++++++++++++++++++++++++++++++++++++ assets/i18n/zh_CN.json | 32 ++++---- assets/i18n/zh_HK.json | 6 +- 22 files changed, 420 insertions(+), 127 deletions(-) create mode 100644 assets/i18n/vi.json diff --git a/assets/i18n/bg_BG.json b/assets/i18n/bg_BG.json index 30f29fe9..6196fb39 100644 --- a/assets/i18n/bg_BG.json +++ b/assets/i18n/bg_BG.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}" } diff --git a/assets/i18n/cs_CZ.json b/assets/i18n/cs_CZ.json index 904bd3ec..2000be4a 100644 --- a/assets/i18n/cs_CZ.json +++ b/assets/i18n/cs_CZ.json @@ -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", @@ -111,7 +113,7 @@ }, "recipe_edit": { "title": "Upravit recept", - "button": "Upravit", + "button": "Uložit", "errors": { "update_failed": "Aktualizace se nezdařila: {error_msg}" } diff --git a/assets/i18n/de.json b/assets/i18n/de.json index b7d66d61..c58b1e92 100644 --- a/assets/i18n/de.json +++ b/assets/i18n/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}" } diff --git a/assets/i18n/de_DE.json b/assets/i18n/de_DE.json index c10ea215..2a41e228 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}" } diff --git a/assets/i18n/es.json b/assets/i18n/es.json index a8b9db40..d8cfe8ba 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}" } diff --git a/assets/i18n/eu.json b/assets/i18n/eu.json index 7572bda4..817c4fdf 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}" } diff --git a/assets/i18n/fi_FI.json b/assets/i18n/fi_FI.json index 8d8b586e..cd5acb7b 100644 --- a/assets/i18n/fi_FI.json +++ b/assets/i18n/fi_FI.json @@ -82,7 +82,9 @@ "time": { "prep": "Esivalmistelujen kesto:", "cook": "Valmistuksen kesto:", - "total": "Kokonaiskesto:" + "total": "Kokonaiskesto:", + "hours": "Tunnit", + "minutes": "Minuutit" }, "nutrition": { "title": "Ravintosisältö", @@ -111,7 +113,7 @@ }, "recipe_edit": { "title": "Muokkaa reseptiä", - "button": "Muokkaa", + "button": "Tallenna", "errors": { "update_failed": "Päivitys epäonnistui {error_msg}" } diff --git a/assets/i18n/fr.json b/assets/i18n/fr.json index ca278d03..ef6e144f 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": "Temps de préparation", + "cook": "Temps de cuisson", "total": "Temps total", "fields": { "name": "Titre de la recette : ", @@ -78,7 +82,26 @@ "time": { "prep": "Temps de préparation :", "cook": "Temps de cuisson :", - "total": "Temps total : " + "total": "Temps total : ", + "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,16 @@ } }, "timer": { - "title": "Your timers", - "started": "Timer started.", + "title": "Vos minuteurs", + "started": "Minuteur démarré.", "finished": "est terminé.", - "done": "Timer is done." + "done": "Minutage terminé." }, "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 +159,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..a962aa47 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}" } diff --git a/assets/i18n/hu_HU.json b/assets/i18n/hu_HU.json index 0df47d7a..d2faaa33 100644 --- a/assets/i18n/hu_HU.json +++ b/assets/i18n/hu_HU.json @@ -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", @@ -111,7 +113,7 @@ }, "recipe_edit": { "title": "Recept szerkesztése", - "button": "Szerkesztés", + "button": "Mentés", "errors": { "update_failed": "Sikertelen frissítés {error_msg}" } diff --git a/assets/i18n/it.json b/assets/i18n/it.json index d004718c..4f6c53c9 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}" } diff --git a/assets/i18n/nl.json b/assets/i18n/nl.json index 88cba1c1..2b261c28 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,7 +144,7 @@ "timer": { "title": "Jouw timers", "started": "Timer gestart.", - "finished": "is finished.", + "finished": "is klaar.", "done": "Timer is klaar." }, "settings": { diff --git a/assets/i18n/pl.json b/assets/i18n/pl.json index 8646e0fc..7e28f418 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}" } diff --git a/assets/i18n/pt_BR.json b/assets/i18n/pt_BR.json index 59c3c498..ba7a9831 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}" } diff --git a/assets/i18n/ru.json b/assets/i18n/ru.json index c77db3cd..45882d75 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}" } diff --git a/assets/i18n/sc.json b/assets/i18n/sc.json index 7a3da844..a31cd17a 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,35 @@ "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." + }, + "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..8c2dfbca 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}" } diff --git a/assets/i18n/sl.json b/assets/i18n/sl.json index 23156ee8..27983f11 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}" } @@ -158,7 +160,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..72014337 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}" } diff --git a/assets/i18n/vi.json b/assets/i18n/vi.json new file mode 100644 index 00000000..5380ec5c --- /dev/null +++ b/assets/i18n/vi.json @@ -0,0 +1,174 @@ +{ + "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." + }, + "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..a8de7f9c 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}" } diff --git a/assets/i18n/zh_HK.json b/assets/i18n/zh_HK.json index 2552cc05..9c42a86b 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}" } From dd49bbd26cd9f9ed00e540fbaccae051406768b2 Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Mon, 13 Jun 2022 22:20:41 +0200 Subject: [PATCH 22/38] Support newly added Language: #139 --- lib/src/util/supported_locales.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/util/supported_locales.dart b/lib/src/util/supported_locales.dart index fac9f45a..ee972829 100644 --- a/lib/src/util/supported_locales.dart +++ b/lib/src/util/supported_locales.dart @@ -21,6 +21,7 @@ class SupportedLocales { 'sc': 'sardu', 'sl': 'Slovenski jezik', 'tr': 'Türkçe', + 'vi': 'Tiếng Việt', 'zh_CN': '中文 (China)', 'zh_HK': '中文 (Hong Kong)', }; From 6e18a7bb6795a606ea5cabbefbeb75253ace78e8 Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Mon, 13 Jun 2022 22:59:21 +0200 Subject: [PATCH 23/38] Missing Timer information can be translated #137 --- lib/src/screens/recipe/recipe_screen.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/src/screens/recipe/recipe_screen.dart b/lib/src/screens/recipe/recipe_screen.dart index 47668648..df3903c2 100644 --- a/lib/src/screens/recipe/recipe_screen.dart +++ b/lib/src/screens/recipe/recipe_screen.dart @@ -149,9 +149,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); } } From 2c362814407eb346d7fd089e040dbea3829d159d Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Mon, 13 Jun 2022 23:01:47 +0200 Subject: [PATCH 24/38] Missing Timer information can be translated #137 --- assets/i18n/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assets/i18n/en.json b/assets/i18n/en.json index 319f43a4..c3ab051f 100644 --- a/assets/i18n/en.json +++ b/assets/i18n/en.json @@ -145,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", From 983b838ba3ea5802400eac418106cc87a09b68a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Aug 2022 11:01:55 +0000 Subject: [PATCH 25/38] Bump subosito/flutter-action from 2.4.0 to 2.6.1 Bumps [subosito/flutter-action](https://github.com/subosito/flutter-action) from 2.4.0 to 2.6.1. - [Release notes](https://github.com/subosito/flutter-action/releases) - [Commits](https://github.com/subosito/flutter-action/compare/v2.4.0...v2.6.1) --- updated-dependencies: - dependency-name: subosito/flutter-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8b511def..20927658 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,7 @@ jobs: with: java-version: '12.x' distribution: 'adopt' - - uses: subosito/flutter-action@v2.4.0 + - uses: subosito/flutter-action@v2.6.1 with: flutter-version: '2.10.4' - run: flutter pub get From bc24f4a85405ca45afaf3d73247d7d82a9075571 Mon Sep 17 00:00:00 2001 From: Tom Duffin Date: Fri, 12 Aug 2022 15:30:16 +0100 Subject: [PATCH 26/38] fixed overflow of nextcloud avatar in drawer --- lib/src/screens/category/category_screen.dart | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) 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, From 9150f1711fcf80b16eeb23d7929e63903ce3922e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Aug 2022 11:01:44 +0000 Subject: [PATCH 27/38] Bump subosito/flutter-action from 2.6.1 to 2.6.2 Bumps [subosito/flutter-action](https://github.com/subosito/flutter-action) from 2.6.1 to 2.6.2. - [Release notes](https://github.com/subosito/flutter-action/releases) - [Commits](https://github.com/subosito/flutter-action/compare/v2.6.1...v2.6.2) --- updated-dependencies: - dependency-name: subosito/flutter-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 20927658..08d2228c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,7 @@ jobs: with: java-version: '12.x' distribution: 'adopt' - - uses: subosito/flutter-action@v2.6.1 + - uses: subosito/flutter-action@v2.6.2 with: flutter-version: '2.10.4' - run: flutter pub get From e48e01810e10ef706a881dce5c56134fce5ac656 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Wed, 7 Sep 2022 04:35:01 +0000 Subject: [PATCH 28/38] [tx-robot] updated from transifex Signed-off-by: Nextcloud bot --- assets/i18n/bg_BG.json | 3 +- assets/i18n/cs_CZ.json | 19 ++--- assets/i18n/de.json | 13 +-- assets/i18n/de_DE.json | 3 +- assets/i18n/es.json | 3 +- assets/i18n/eu.json | 3 +- assets/i18n/fi_FI.json | 3 +- assets/i18n/fr.json | 13 +-- assets/i18n/hr.json | 3 +- assets/i18n/hu_HU.json | 25 +++--- assets/i18n/is.json | 175 +++++++++++++++++++++++++++++++++++++++++ assets/i18n/it.json | 3 +- assets/i18n/nl.json | 3 +- assets/i18n/pl.json | 3 +- assets/i18n/pt_BR.json | 3 +- assets/i18n/ru.json | 3 +- assets/i18n/sc.json | 3 +- assets/i18n/sk_SK.json | 3 +- assets/i18n/sl.json | 3 +- assets/i18n/tr.json | 3 +- assets/i18n/vi.json | 3 +- assets/i18n/zh_CN.json | 3 +- assets/i18n/zh_HK.json | 3 +- 23 files changed, 248 insertions(+), 51 deletions(-) create mode 100644 assets/i18n/is.json diff --git a/assets/i18n/bg_BG.json b/assets/i18n/bg_BG.json index 6196fb39..ea6ae655 100644 --- a/assets/i18n/bg_BG.json +++ b/assets/i18n/bg_BG.json @@ -145,7 +145,8 @@ "title": "Вашите таймери", "started": "Таймерът стартира.", "finished": " е завършен.", - "done": "Таймерът е готов." + "done": "Таймерът е готов.", + "missing": "Трябва да зададете времето за готвене, за да използвате таймер." }, "settings": { "title": "Настройки на приложението", diff --git a/assets/i18n/cs_CZ.json b/assets/i18n/cs_CZ.json index 2000be4a..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!", @@ -103,7 +103,7 @@ "unsaturatedFatContent": "Obsah nenasycených tuků" } }, - "tools": "Nástroje:", + "tools": "Vybavení:", "ingredients": "Přísady:", "instructions": "Postup:" }, @@ -145,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", @@ -159,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 c58b1e92..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}" } @@ -119,10 +119,10 @@ } }, "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": { @@ -145,7 +145,8 @@ "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", @@ -168,7 +169,7 @@ }, "category_font_size": { "title": "Kategorie Schriftgröße", - "subtitle": "Ändert die Schriftgröße des Kategorietitels. Dies kann nützlich sein, wenn Du lange Kategorienamen verwendest." + "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 2a41e228..7aea3e08 100644 --- a/assets/i18n/de_DE.json +++ b/assets/i18n/de_DE.json @@ -145,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/es.json b/assets/i18n/es.json index d8cfe8ba..07226662 100644 --- a/assets/i18n/es.json +++ b/assets/i18n/es.json @@ -145,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 817c4fdf..de904397 100644 --- a/assets/i18n/eu.json +++ b/assets/i18n/eu.json @@ -145,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 cd5acb7b..039b6f7c 100644 --- a/assets/i18n/fi_FI.json +++ b/assets/i18n/fi_FI.json @@ -145,7 +145,8 @@ "title": "Ajastimesi", "started": "Ajastin käynnistyi.", "finished": "päättynyt.", - "done": "Ajastin valmistui." + "done": "Ajastin valmistui.", + "missing": "You need to set the cooking time to use a timer." }, "settings": { "title": "Sovelluksen asetukset", diff --git a/assets/i18n/fr.json b/assets/i18n/fr.json index ef6e144f..375feaba 100644 --- a/assets/i18n/fr.json +++ b/assets/i18n/fr.json @@ -67,8 +67,8 @@ }, "recipe": { "title": "Recette :", - "prep": "Temps de préparation", - "cook": "Temps de cuisson", + "prep": "Durée de préparation", + "cook": "Durée de cuisson", "total": "Temps total", "fields": { "name": "Titre de la recette : ", @@ -80,9 +80,9 @@ "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" }, @@ -145,7 +145,8 @@ "title": "Vos minuteurs", "started": "Minuteur démarré.", "finished": "est terminé.", - "done": "Minutage terminé." + "done": "Minutage terminé.", + "missing": "Vous devez renseigner la durée de cuisson avant d'utiliser un minuteur." }, "settings": { "title": "Paramètres de l'application", diff --git a/assets/i18n/hr.json b/assets/i18n/hr.json index a962aa47..99a6bb7d 100644 --- a/assets/i18n/hr.json +++ b/assets/i18n/hr.json @@ -145,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 d2faaa33..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!" } @@ -108,7 +108,7 @@ "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": { @@ -128,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}" @@ -145,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 4f6c53c9..6d57973d 100644 --- a/assets/i18n/it.json +++ b/assets/i18n/it.json @@ -145,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 2b261c28..bc140f12 100644 --- a/assets/i18n/nl.json +++ b/assets/i18n/nl.json @@ -145,7 +145,8 @@ "title": "Jouw timers", "started": "Timer gestart.", "finished": "is klaar.", - "done": "Timer 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 7e28f418..351e707d 100644 --- a/assets/i18n/pl.json +++ b/assets/i18n/pl.json @@ -145,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 ba7a9831..67505a74 100644 --- a/assets/i18n/pt_BR.json +++ b/assets/i18n/pt_BR.json @@ -145,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 45882d75..252de395 100644 --- a/assets/i18n/ru.json +++ b/assets/i18n/ru.json @@ -145,7 +145,8 @@ "title": "Ваши таймеры", "started": "Таймер запущен.", "finished": "закончен.", - "done": "Таймер завершён." + "done": "Таймер завершён.", + "missing": "Для использования таймера необходимо установить время приготовления." }, "settings": { "title": "Настройки приложения", diff --git a/assets/i18n/sc.json b/assets/i18n/sc.json index a31cd17a..3810b7da 100644 --- a/assets/i18n/sc.json +++ b/assets/i18n/sc.json @@ -145,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/sk_SK.json b/assets/i18n/sk_SK.json index 8c2dfbca..b460bfa3 100644 --- a/assets/i18n/sk_SK.json +++ b/assets/i18n/sk_SK.json @@ -145,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 27983f11..b67d08b2 100644 --- a/assets/i18n/sl.json +++ b/assets/i18n/sl.json @@ -145,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", diff --git a/assets/i18n/tr.json b/assets/i18n/tr.json index 72014337..3aba89e6 100644 --- a/assets/i18n/tr.json +++ b/assets/i18n/tr.json @@ -145,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 index 5380ec5c..6d8f3e73 100644 --- a/assets/i18n/vi.json +++ b/assets/i18n/vi.json @@ -145,7 +145,8 @@ "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." + "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", diff --git a/assets/i18n/zh_CN.json b/assets/i18n/zh_CN.json index a8de7f9c..b42751e4 100644 --- a/assets/i18n/zh_CN.json +++ b/assets/i18n/zh_CN.json @@ -145,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 9c42a86b..8f26af60 100644 --- a/assets/i18n/zh_HK.json +++ b/assets/i18n/zh_HK.json @@ -145,7 +145,8 @@ "title": "你的計時器", "started": "計時器已啟動。", "finished": "已完成。", - "done": "計時结束。" + "done": "計時结束。", + "missing": "您需要設置烹飪時間才能使用計時器。" }, "settings": { "title": "應用程式設定", From a4f921f21cd8e4ef006aabc652257ef5350edceb Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Wed, 7 Sep 2022 17:17:54 +0200 Subject: [PATCH 29/38] #144 Upgrade flutter and SDK --- .github/workflows/build.yml | 2 +- android/app/build.gradle | 2 +- lib/src/screens/form/login_form.dart | 4 ++-- lib/src/screens/login_screen.dart | 2 +- lib/src/widget/api_version_warning.dart | 4 ++-- pubspec.yaml | 6 +++--- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 08d2228c..20acf8c5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,6 +13,6 @@ jobs: distribution: 'adopt' - uses: subosito/flutter-action@v2.6.2 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/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/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/pubspec.yaml b/pubspec.yaml index e87ddca1..876b39ab 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,8 +14,8 @@ description: A new Flutter application. version: 0.7.6+21 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: @@ -81,7 +81,7 @@ dependencies: cached_network_image: ^3.0.0 - flutter_typeahead: 3.2.4 + flutter_typeahead: 4.1.0 dev_dependencies: flutter_launcher_icons: ^0.9.0 From c67b95c64a249cf2c97b08e561762142ddfe6b13 Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Wed, 7 Sep 2022 17:30:14 +0200 Subject: [PATCH 30/38] Added new Languages to settings --- lib/src/util/supported_locales.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/src/util/supported_locales.dart b/lib/src/util/supported_locales.dart index ee972829..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,13 +13,14 @@ 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', From 908f53773bda140d381c1d8234ad5f62d07154cd Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Wed, 7 Sep 2022 17:44:35 +0200 Subject: [PATCH 31/38] #141 Filter all categories and empty categories form category search --- lib/src/services/category_search_provider.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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; } From d45f51c307f870c0877bca7bf282b8d6e1cadea1 Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Wed, 7 Sep 2022 22:21:56 +0200 Subject: [PATCH 32/38] Small Improvements --- lib/src/screens/recipe/recipe_screen.dart | 1 - lib/src/widget/authentication_cached_network_image.dart | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/src/screens/recipe/recipe_screen.dart b/lib/src/screens/recipe/recipe_screen.dart index df3903c2..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'; diff --git a/lib/src/widget/authentication_cached_network_image.dart b/lib/src/widget/authentication_cached_network_image.dart index 0e931c76..da57beaa 100644 --- a/lib/src/widget/authentication_cached_network_image.dart +++ b/lib/src/widget/authentication_cached_network_image.dart @@ -32,7 +32,7 @@ class AuthenticationCachedNetworkImage extends StatelessWidget { "authorization": appAuthentication.basicAuth, }, imageUrl: url, - placeholder: (context, url) => CircularProgressIndicator(), + placeholder: (context, url) => Container(child: Center(child: CircularProgressIndicator(),),), errorWidget: (context, url, error) => Container( width: width, height: height, From 921831960dd802643f1b369d0d958a5278439a4b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Sep 2022 11:01:54 +0000 Subject: [PATCH 33/38] Bump subosito/flutter-action from 2.6.2 to 2.7.0 Bumps [subosito/flutter-action](https://github.com/subosito/flutter-action) from 2.6.2 to 2.7.0. - [Release notes](https://github.com/subosito/flutter-action/releases) - [Commits](https://github.com/subosito/flutter-action/compare/v2.6.2...v2.7.0) --- updated-dependencies: - dependency-name: subosito/flutter-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 20acf8c5..a4700c91 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,7 @@ jobs: with: java-version: '12.x' distribution: 'adopt' - - uses: subosito/flutter-action@v2.6.2 + - uses: subosito/flutter-action@v2.7.0 with: flutter-version: '3.3.0' - run: flutter pub get From 16cfcf2d903a3c9d4d485a273d2cec6d2eb9436b Mon Sep 17 00:00:00 2001 From: Christian Wichmann Date: Sat, 17 Sep 2022 17:08:09 +0200 Subject: [PATCH 34/38] Update code to work with API version 1.0 of the Nextcloud Cookbook App. --- lib/src/services/category_recipes_short_provider.dart | 2 +- lib/src/services/recipe_provider.dart | 6 +++--- lib/src/services/recipes_short_provider.dart | 2 +- lib/src/services/version_provider.dart | 4 ++-- lib/src/widget/authentication_cached_network_image.dart | 3 ++- .../widget/authentication_cached_network_recipe_image.dart | 2 +- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/src/services/category_recipes_short_provider.dart b/lib/src/services/category_recipes_short_provider.dart index 49bb7639..7670f3d4 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}/index.php/apps/cookbook/api/v1/category/$category"; } // Parse categories diff --git a/lib/src/services/recipe_provider.dart b/lib/src/services/recipe_provider.dart index 286c3be3..b7b39cdb 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}/index.php/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}/index.php/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}/index.php/apps/cookbook/api/v1/recipes", data: recipe.toJson(), 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..21e33c6b 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}/index.php/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..e37f77da 100644 --- a/lib/src/services/version_provider.dart +++ b/lib/src/services/version_provider.dart @@ -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/widget/authentication_cached_network_image.dart b/lib/src/widget/authentication_cached_network_image.dart index da57beaa..2a2cd0e8 100644 --- a/lib/src/widget/authentication_cached_network_image.dart +++ b/lib/src/widget/authentication_cached_network_image.dart @@ -29,7 +29,8 @@ class AuthenticationCachedNetworkImage extends StatelessWidget { width: width, height: height, httpHeaders: { - "authorization": appAuthentication.basicAuth, + "Authorization": appAuthentication.basicAuth, + "Accept": "image/jpeg" }, imageUrl: url, placeholder: (context, url) => Container(child: Center(child: CircularProgressIndicator(),),), diff --git a/lib/src/widget/authentication_cached_network_recipe_image.dart b/lib/src/widget/authentication_cached_network_recipe_image.dart index 9261d7c5..51110f87 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}/index.php/apps/cookbook/api/v1/recipes/$recipeId/image?size=$settings', width: width, height: height, boxFit: boxFit, From 597a24329e5d3a5ca5c8bf0448d4ead8312a0596 Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Sun, 18 Sep 2022 17:37:38 +0200 Subject: [PATCH 35/38] Removed unused index.php --- docker/data/Recipes/problem/recipe.json | 2 +- lib/src/services/authentication_provider.dart | 2 +- lib/src/services/categories_provider.dart | 2 +- lib/src/services/category_recipes_short_provider.dart | 2 +- lib/src/services/recipe_provider.dart | 8 ++++---- lib/src/services/recipes_short_provider.dart | 2 +- lib/src/services/version_provider.dart | 2 +- .../authentication_cached_network_recipe_image.dart | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) 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/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 7670f3d4..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/v1/category/$category"; + "${appAuthentication.server}/apps/cookbook/api/v1/category/$category"; } // Parse categories diff --git a/lib/src/services/recipe_provider.dart b/lib/src/services/recipe_provider.dart index b7b39cdb..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/v1/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/v1/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/v1/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 21e33c6b..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/v1/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 e37f77da..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("")) { diff --git a/lib/src/widget/authentication_cached_network_recipe_image.dart b/lib/src/widget/authentication_cached_network_recipe_image.dart index 51110f87..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/api/v1/recipes/$recipeId/image?size=$settings', + '${appAuthentication.server}/apps/cookbook/api/v1/recipes/$recipeId/image?size=$settings', width: width, height: height, boxFit: boxFit, From 40e7d3306cc4d60d4db62e5d26cad10852fccbb7 Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Sun, 18 Sep 2022 17:53:31 +0200 Subject: [PATCH 36/38] Header Parameter --- lib/src/services/network.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); From 056415d509c0eded499da52f8b8a49ad4ac873c3 Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Sun, 18 Sep 2022 18:10:45 +0200 Subject: [PATCH 37/38] Empty ingredients cannot be mapped. #147 --- lib/src/models/recipe.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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(); } From 96dab9d88256512908895a3e3b220c500ab826db Mon Sep 17 00:00:00 2001 From: Linard Schwendener Date: Sun, 18 Sep 2022 18:37:48 +0200 Subject: [PATCH 38/38] Preparing 0.7.7 --- fastlane/metadata/android/en-US/changelogs/22.txt | 3 +++ pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/22.txt 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/pubspec.yaml b/pubspec.yaml index 876b39ab..217b9f12 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ 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.10.0 <3.0.0"