wbspool 1 rok pred
rodič
commit
7402496af7
31 zmenil súbory, kde vykonal 1371 pridanie a 43 odobranie
  1. 186 0
      BusinessAirFryer/src/main/assets/lang_config_030.json
  2. 26 11
      BusinessAuth/src/main/java/com/develop/auth/ui/MemberProfileFragment.kt
  3. 14 3
      BusinessCommon/src/main/java/com/develop/common/dialog/GenderSelectDialog.kt
  4. 15 2
      BusinessCommon/src/main/res/layout/dialog_gender_select.xml
  5. 213 0
      BusinessCommon/src/main/res/values-cz/strings.xml
  6. 1 0
      BusinessCommon/src/main/res/values-en/strings.xml
  7. 1 0
      BusinessCommon/src/main/res/values-fr/strings.xml
  8. 214 0
      BusinessCommon/src/main/res/values-hu/strings.xml
  9. 1 0
      BusinessCommon/src/main/res/values-ja/strings.xml
  10. 214 0
      BusinessCommon/src/main/res/values-sk/strings.xml
  11. 1 0
      BusinessCommon/src/main/res/values-zh-rCN/strings.xml
  12. 1 0
      BusinessCommon/src/main/res/values/strings.xml
  13. 13 13
      BusinessMain/src/main/java/com/develop/main/viewmodel/HomeViewModel.kt
  14. 18 14
      BusinessStep/src/main/java/com/develop/step/ui/ModesDetailActivity.kt
  15. 1 0
      LocalTools/.gitignore
  16. 15 0
      LocalTools/build.gradle
  17. BIN
      LocalTools/libs/gson-2.10.1.jar
  18. BIN
      LocalTools/libs/okhttp-4.9.0.jar
  19. BIN
      LocalTools/libs/okio-2.10.0.jar
  20. 23 0
      LocalTools/src/main/java/com/twm/tools/local/AndroidLanguage.kt
  21. 19 0
      LocalTools/src/main/java/com/twm/tools/local/BaiduLanguage.kt
  22. 12 0
      LocalTools/src/main/java/com/twm/tools/local/BaiduTranslateResponse.kt
  23. 49 0
      LocalTools/src/main/java/com/twm/tools/local/BaiduTranslateService.kt
  24. 239 0
      LocalTools/src/main/java/com/twm/tools/local/MainClass.kt
  25. 16 0
      LocalTools/src/main/java/com/twm/tools/local/QPSTaskWrapper.kt
  26. 7 0
      LocalTools/src/main/java/com/twm/tools/local/TranslateApi.kt
  27. 17 0
      LocalTools/src/main/java/com/twm/tools/local/TranslateCallable.kt
  28. 6 0
      LocalTools/src/main/java/com/twm/tools/local/Translation.kt
  29. 6 0
      LocalTools/src/main/java/com/twm/tools/local/ValuesData.kt
  30. 42 0
      LocalTools/src/main/java/com/twm/tools/local/ValuesStringSaxHandler.kt
  31. 1 0
      settings.gradle

+ 186 - 0
BusinessAirFryer/src/main/assets/lang_config_030.json

@@ -0,0 +1,186 @@
+{
+  "langs": [
+    {
+      "name": "Polish(波兰语)",
+      "value": "PL",
+      "icon": "icon_lang_pl",
+      "showName": "Polski",
+      "show": false
+    },
+    {
+      "name": "German(德语)",
+      "value": "DE",
+      "icon": "icon_lang_de",
+      "showName": "Deutsch",
+      "show": false
+    },
+    {
+      "name": "French(法语)",
+      "value": "FR",
+      "icon": "icon_lang_fr",
+      "showName": "Français",
+      "show": true
+    },
+    {
+      "name": "Dutch(荷兰语)",
+      "value": "NL",
+      "icon": "icon_lang_nl",
+      "showName": "Nederlands",
+      "show": false
+    },
+    {
+      "name": "Portuguese(葡萄牙语)",
+      "value": "PT",
+      "icon": "icon_lang_pt",
+      "showName": "Português",
+      "show": false
+    },
+    {
+      "name": "Spanish(西班牙语)",
+      "value": "ES",
+      "icon": "icon_lang_es",
+      "showName": "Español",
+      "show": false
+    },
+    {
+      "name": "Italiano(意大利语)",
+      "value": "IT",
+      "icon": "icon_lang_it",
+      "showName": "Italiano",
+      "show": false
+    },
+    {
+      "name": "English(英语)",
+      "value": "EN",
+      "icon": "icon_lang_en",
+      "showName": "English",
+      "show": false
+    },
+    {
+      "name": "Greek(希腊语)",
+      "value": "GR",
+      "icon": "icon_lang_gr",
+      "showName": "Ελληνικά",
+      "show": false
+    },
+    {
+      "name": "Russian(俄语)",
+      "value": "RU",
+      "icon": "icon_lang_ru",
+      "showName": "Русский",
+      "show": false
+    },
+    {
+      "name": "Romanian(罗马尼亚语)",
+      "value": "RO",
+      "icon": "icon_lang_ro",
+      "showName": "Română",
+      "show": false
+    },
+    {
+      "name": "Finnish(芬兰语)",
+      "value": "FI",
+      "icon": "icon_lang_fi",
+      "showName": "Suomi",
+      "show": false
+    },
+    {
+      "name": "Norsk(挪威语)",
+      "value": "NO",
+      "icon": "icon_lang_no",
+      "showName": "Norsk",
+      "show": false
+    },
+    {
+      "name": "Swedish(瑞典语)",
+      "value": "SE",
+      "icon": "icon_lang_se",
+      "showName": "Svenska",
+      "show": false
+    },
+    {
+      "name": "Danish(丹麦语)",
+      "value": "DK",
+      "icon": "icon_lang_dk",
+      "showName": "Dansk",
+      "show": false
+    },
+    {
+      "name": "Czech(捷克语)",
+      "value": "CZ",
+      "icon": "icon_lang_cz",
+      "showName": "Čeština",
+      "show": true
+    },
+    {
+      "name": "Estonki(爱沙尼亚语)",
+      "value": "EE",
+      "icon": "icon_lang_ee",
+      "showName": "Eesti keel",
+      "show": false
+    },
+    {
+      "name": "Slovak(斯洛伐克语)",
+      "value": "SK",
+      "icon": "icon_lang_sk",
+      "showName": "Slovenčina",
+      "show": true
+    },
+    {
+      "name": "Ukrainian(乌克兰语)",
+      "value": "UK",
+      "icon": "icon_lang_uk",
+      "showName": "Українська",
+      "show": false
+    },
+    {
+      "name": "Arabic(阿拉伯语)",
+      "value": "AR",
+      "icon": "icon_lang_ar",
+      "showName": "العربية",
+      "show": false
+    },
+    {
+      "name": "Lithuanian(立陶宛语)",
+      "value": "LT",
+      "icon": "icon_lang_lt",
+      "showName": "Lietuvių kalba",
+      "show": false
+    },
+    {
+      "name": "Farsi(波斯语)",
+      "value": "IR",
+      "icon": "icon_lang_ir",
+      "showName": "فارسی",
+      "show": false
+    },
+    {
+      "name": "Kazakh(哈萨克语)",
+      "value": "KZ",
+      "icon": "icon_lang_kz",
+      "showName": "Қазақша",
+      "show": false
+    },
+    {
+      "name": "Chinese(中文)",
+      "value": "ZH",
+      "icon": "icon_lang_zh",
+      "showName": "中文",
+      "show": false
+    },
+    {
+      "name": "Japanese(日语)",
+      "value": "JA",
+      "icon": "icon_lang_ja",
+      "showName": "日本語",
+      "show": false
+    },
+    {
+      "name": "Hungarian(匈牙利语)",
+      "value": "HU",
+      "icon": "icon_lang_hu",
+      "showName": "magyar nyelv",
+      "show": true
+    }
+  ]
+}

+ 26 - 11
BusinessAuth/src/main/java/com/develop/auth/ui/MemberProfileFragment.kt

@@ -52,11 +52,19 @@ class MemberProfileFragment : CommonBVMFragment<FragmentMemberProfileBinding, Me
         }
         binding.tvChooseSex.setOnClickListener {
             GenderSelectDialog {
-                selectGender = if (it) 2 else 1
-                if (selectGender == 2) {
-                    binding.tvChooseSex.text = "Male"
-                } else {
-                    binding.tvChooseSex.text = "Female"
+                selectGender = it
+                when (selectGender) {
+                    2 -> {
+                        binding.tvChooseSex.text = "Male"
+                    }
+
+                    1 -> {
+                        binding.tvChooseSex.text = "Female"
+                    }
+
+                    else -> {
+                        binding.tvChooseSex.text = "None"
+                    }
                 }
                 binding.tvChooseSex.setTextColor(Color.BLACK)
             }.showDialog(parentFragmentManager, "gender")
@@ -94,12 +102,19 @@ class MemberProfileFragment : CommonBVMFragment<FragmentMemberProfileBinding, Me
                     selectGender = userGender?.toInt() ?: 2
                     binding.etNickname.setText(userName ?: "")
                     viewModel.chooseAvatar.value = userAvatar?.toInt()
-                    if (selectGender == 2) {
-                        binding.tvChooseSex.text = "Male"
-                        binding.tvChooseAge.setTextColor(Color.BLACK)
-                    } else if (selectGender == 1) {
-                        binding.tvChooseSex.text = "Female"
-                        binding.tvChooseAge.setTextColor(Color.BLACK)
+                    when (selectGender) {
+                        2 -> {
+                            binding.tvChooseSex.text = "Male"
+                            binding.tvChooseAge.setTextColor(Color.BLACK)
+                        }
+                        1 -> {
+                            binding.tvChooseSex.text = "Female"
+                            binding.tvChooseAge.setTextColor(Color.BLACK)
+                        }
+                        0 -> {
+                            binding.tvChooseSex.text = "None"
+                            binding.tvChooseAge.setTextColor(Color.BLACK)
+                        }
                     }
                     if (selectAge > 0) {
                         binding.tvChooseAge.text = selectAge.toString()

+ 14 - 3
BusinessCommon/src/main/java/com/develop/common/dialog/GenderSelectDialog.kt

@@ -9,7 +9,7 @@ import com.develop.common.databinding.DialogGenderSelectBinding
 
 
 class GenderSelectDialog(
-    private val onSelect: (male: Boolean) -> Unit
+    private val onSelect: (male: Int) -> Unit
 ) : FullScreenTransparentDialog() {
 
     private lateinit var binding: DialogGenderSelectBinding
@@ -28,16 +28,27 @@ class GenderSelectDialog(
         binding.ivCancel.setOnClickListener {
             removeSelf()
         }
+
+        binding.tvSelectNo.setOnClickListener {
+            binding.tvSelectFemale.isSelected = false
+            binding.tvSelectMale.isSelected = false
+            binding.tvSelectNo.isSelected  =true
+            onSelect(0)
+            removeSelf()
+        }
+
         binding.tvSelectMale.setOnClickListener {
             binding.tvSelectFemale.isSelected = false
             binding.tvSelectMale.isSelected = true
-            onSelect(true)
+            binding.tvSelectNo.isSelected  =false
+            onSelect(2)
             removeSelf()
         }
         binding.tvSelectFemale.setOnClickListener {
             binding.tvSelectFemale.isSelected = true
             binding.tvSelectMale.isSelected = false
-            onSelect(false)
+            binding.tvSelectNo.isSelected  =false
+            onSelect(1)
             removeSelf()
         }
         binding.tvSelectMale.isSelected = true

+ 15 - 2
BusinessCommon/src/main/res/layout/dialog_gender_select.xml

@@ -10,7 +10,7 @@
     <LinearLayout
         android:id="@+id/ll_dialog"
         android:layout_width="@dimen/convert_430px"
-        android:layout_height="@dimen/convert_361px"
+        android:layout_height="@dimen/convert_460px"
         android:orientation="vertical"
         android:gravity="center_horizontal"
         android:background="@drawable/shape_10pxffffff_stoke"
@@ -21,6 +21,19 @@
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintBottom_toBottomOf="parent">
 
+        <TextView
+            android:id="@+id/tv_select_no"
+            android:layout_width="@dimen/convert_326px"
+            android:layout_height="@dimen/convert_88px"
+            android:text="@string/none"
+            android:textSize="@dimen/convert_30px"
+            android:gravity="center"
+            android:background="@drawable/bg_amount_item"
+            android:textColor="@color/color_amount_text"
+            android:layout_marginTop="@dimen/convert_69px"/>
+
+
+
         <TextView
             android:id="@+id/tv_select_male"
             android:layout_width="@dimen/convert_326px"
@@ -30,7 +43,7 @@
             android:gravity="center"
             android:background="@drawable/bg_amount_item"
             android:textColor="@color/color_amount_text"
-            android:layout_marginTop="@dimen/convert_69px"/>
+            android:layout_marginTop="@dimen/convert_24px"/>
 
         <TextView
             android:id="@+id/tv_select_female"

+ 213 - 0
BusinessCommon/src/main/res/values-cz/strings.xml

@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources><string name="not_a_member_yet">Ještě nemáte účet?</string>
+    <string name="member">Členství</string>
+    <string name="select_language">Zvolte jazyk</string>
+    <string name="next">DALŠÍ</string>
+    <string name="english">English</string>
+    <string name="chinese">简体中文</string>
+    <string name="france">Français</string>
+    <string name="japan">日本語</string>
+    <string name="czech">čeština</string>
+    <string name="slovak">日本語</string>
+    <string name="hungarian">Magyar</string>
+    <string name="polish">Polski</string>
+    <string name="skip">PŘESKOČIT</string>
+    <string name="recipes">RECEPTY</string>
+    <string name="mode">REŽIM</string>
+    <string name="sunday">Neděle</string>
+    <string name="monday">Pondělí</string>
+    <string name="tuesday">Úterý</string>
+    <string name="wednesday">Středa</string>
+    <string name="thursday">Čtvrtek</string>
+    <string name="friday">Pátek</string>
+    <string name="saturday">Sobota</string>
+    <string name="resume">OBNOVIT</string>
+    <string name="privacy_policy">Zásady ochrany osobních údajů</string>
+    <string name="privacy_policy_content"> Zásady ochrany osobních údajů:
+neshromažďujeme žádné vaše osobní údaje.</string>
+    <string name="i_agree">Souhlasím</string>
+    <string name="i_have_read_the_privacy_policy">Přečetl/a jsem si zásady ochrany osobních údajů</string>
+    <string name="second">Zadruhé</string>
+    <string name="wifi">WI-FI</string>
+    <string name="off_line">OFF-LINE</string>
+    <string name="ok">OK</string>
+    <string name="on_line">ON-LINE</string>
+    <string name="pwd_can_not_be_empty">Vyplňte prosím heslo.</string>
+    <string name="skin_for_now">Aktuální vzhled</string>
+    <string name="login">Přihlášení</string>
+    <string name="online_recipes">Online recepty</string>
+    <string name="cook_history">Historie vaření</string>
+    <string name="favourite_recipes">Oblíbené recepty</string>
+    <string name="settings">Nastavení</string>
+    <string name="grid_view">Zobrazení v mřížce</string>
+    <string name="list_view">Zobrazení seznamu</string>
+    <string name="adapted_cooking">UPRAVENÉ RECEPTY</string>
+    <string name="scales">VÁHA</string>
+    <string name="boil_water">VAŘENÍ VODY</string>
+    <string name="chop">nakrájejte</string>
+    <string name="slow_cook">POMALÉ VAŘENÍ</string>
+    <string name="knead_dough">HNĚTENÍ TĚSTA</string>
+    <string name="steam">PÁRA</string>
+    <string name="food_processor">ZPRACOVÁNÍ POTRAVIN</string>
+    <string name="turbo">TURBO</string>
+    <string name="language">JAZYK</string>
+    <string name="sound">ZVUK</string>
+    <string name="brightness">JAS</string>
+    <string name="user_account">UŽIVATELSKÝ ÚČET</string>
+    <string name="storage">ÚLOŽIŠTĚ</string>
+    <string name="reset">ÚLOŽIŠTĚ</string>
+    <string name="about">O</string>
+    <string name="weight">HMOTNOST</string>
+    <string name="local_recipes">Místní recepty</string>
+    <string name="download">Ke stažení</string>
+    <string name="downloading">Stahování</string>
+    <string name="enter_search">Vyhledejte</string>
+    <string name="search">Vyhledávání</string>
+    <string name="most_popular">Nejoblíbenější</string>
+    <string name="newest">Nejnovější</string>
+    <string name="the_most_commonly_searched">Nejčastěji vyhledávané</string>
+    <string name="notice">Oznámení</string>
+    <string name="all">VŠECHNY</string>
+    <string name="Recipes">Recepty</string>
+    <string name="ingredients">Ingredience</string>
+    <string name="Brightness">Jas</string>
+    <string name="screen_lock_time">Doba uzamčení obrazovky</string>
+    <string name="time_3min">3 minuty</string>
+    <string name="time_10min">10Min</string>
+    <string name="time_30min">30Min</string>
+    <string name="Sound">Zvuk</string>
+    <string name="text_to_speech">Převod textu na řeč</string>
+    <string name="Language">Jazyk</string>
+    <string name="Continue">POKRAČOVAT</string>
+    <string name="start_cooking">ZAČÍNÁME VAŘIT</string>
+    <string name="off">VYPNOUT</string>
+    <string name="on">ZAPNOUT</string>
+    <string name="update_the_recipes">Aktualizace receptů</string>
+    <string name="apk">APK</string>
+    <string name="mcu">MCU</string>
+    <string name="tp">TP</string>
+    <string name="serial_number">Sériové číslo</string>
+    <string name="standby_time">Doba pohotovostního režimu</string>
+    <string name="update">Aktualizace</string>
+    <string name="About">O stránkách</string>
+    <string name="are_you_sure_to_restore_factory_settings">Určitě chcete obnovit tovární nastavení?</string>
+    <string name="yes">ANO</string>
+    <string name="restore_factory_settings">Obnovení továrního nastavení</string>
+    <string name="network_wifi_status_connected_no_internet">Připojeno, ale nelze přistupovat k Internetu</string>
+    <string name="network_wifi_status_saved">Uloženo</string>
+    <string name="network_wifi_status_idle">Stav sítě</string>
+    <string name="network_wifi_status_disabled">"Zastaveno"</string>
+    <string name="network_wifi_status_network_failure">Selhání konfigurace IP adresy</string>
+    <string name="network_wifi_status_wifi_failure">"Selhání připojení k síti WLAN"</string>
+    <string name="network_wifi_status_password_failure">"Nastal problém s ověřováním"</string>
+    <string name="network_wifi_status_scanning">Skenování...</string>
+    <string name="network_wifi_status_connecting">Připojování...</string>
+    <string name="network_wifi_status_authenticating">Probíhá ověřování...</string>
+    <string name="network_wifi_status_obtaining_ip_address">Získání IP adresy...</string>
+    <string name="network_wifi_status_connected">Připojeno</string>
+    <string name="network_wifi_status_suspended">Pozastaveno</string>
+    <string name="network_wifi_status_disconnecting">Odpojování...</string>
+    <string name="network_wifi_status_disconnected">Odpojeno</string>
+    <string name="network_wifi_status_failed">Neúspěšně</string>
+    <string name="network_wifi_status_blocked">Zablokováno</string>
+    <string name="network_wifi_status_verifying_poor_link">Dočasně vypnuto (špatný stav sítě)</string>
+    <string name="start">START</string>
+    <string name="pause">PAUZA</string>
+    <string name="cancel">ZRUŠIT</string>
+    <string name="confirm">POTVRDIT</string>
+    <string name="stop">STOP</string>
+    <string name="turn_right">Otočte\ndoprava</string>
+    <string name="turn_left">Otočit\nvlevo</string>
+    <string name="temperature">TEPLOTA</string>
+    <string name="time">ČAS</string>
+    <string name="speed">RYCHLOST</string>
+    <string name="direction">SMĚR</string>
+    <string name="bad">Špatný</string>
+    <string name="imperfect">Nedokonalý</string>
+    <string name="ordinary">Obyčejný</string>
+    <string name="good">Dobrý</string>
+    <string name="perfect">Perfektní</string>
+    <string name="are_you_sure_to_delete">Určitě chcete smazat?</string>
+    <string name="no">NE</string>
+    <string name="unset_param_tips">Nastavte prosím parametry operace</string>
+    <string name="pmpt_confirm">Potvrďte</string>
+    <string name="pmpt_cancel">Zrušit</string>
+    <string name="pmpt_msg">Tipy</string>
+    <string name="dev_end_of_run_tips">Hotovo</string>
+    <string name="hight_temp_warning_tips">Aktuální teplota je vyšší než 60 °C a otáčky motoru překračují třetí rychlostní stupeň. Určitě chcete pokračovat?</string>
+    <string name="hight_temp_turbo_tips">Aktuální teplota přesahuje 60 °C, funkci turbo nelze provozovat.</string>
+    <string name="update_msg">Probíhá aktualizace systému, vyčkejte prosím</string>
+    <string name="update_title">Jedná se o nejnovější verzi?</string>
+    <string name="finish_download">Staženo</string>
+    <string name="download_fail">Stahování se nezdařilo</string>
+    <string name="start_download">Zahájit stahování</string>
+    <string name="weight_overload_tips">Váha přetížena</string>
+    <string name="forgot_password">Zapomenuté heslo</string>
+    <string name="enter_email_id">Zadejte E-mail</string>
+    <string name="enter_password">Zadejte heslo</string>
+    <string name="register">Zaregistrujte se</string>
+    <string name="launch_detail">Připojte se k nám ještě dnes a užijte si dokonalý zážitek z vaření</string>
+    <string name="login_sign_up">Přihlášení / registrace</string>
+    <string name="skip_for_now">Prozatím přeskočit</string>
+    <string name="reset_password">Obnovit heslo</string>
+    <string name="enter_captcha">Vyplňte Captcha</string>
+    <string name="send_email">Odeslat e-mail</string>
+    <string name="enter_password_again">Zadejte heslo znovu</string>
+    <string name="enter_the_captcha_obtained_from_the_mail">Zadejte Captcha kód získaný z E-mailu</string>
+    <string name="nickname">Uživatelské jméno</string>
+    <string name="enter_nickname">Zadejte jméno</string>
+    <string name="Gender">Pohlaví</string>
+    <string name="male">Muž</string>
+    <string name="age">Věk</string>
+    <string name="save">Uložit</string>
+    <string name="cancellation_of_account">Zrušení účtu</string>
+    <string name="sign_up_it_s_free">Zaregistrujte se, je to ZDARMA</string>
+    <string name="pwd_requirement">Skládá se z písmen a číslic, přičemž počet číslic nesmí být menší než 8.</string>
+    <string name="please_select_age">Vyberte prosím věk</string>
+    <string name="cancel_lower">Zrušit</string>
+    <string name="female">Žena</string>
+    <string name="tare">TARE</string>
+    <string name="keep_cooking_in_the_background">Pokračovat ve vaření na pozadí?</string>
+    <string name="reset_button">RESET</string>
+    <string name="finish">Dokončit!</string>
+    <string name="error">Chyba</string>
+    <string name="download_failed">Stažení se nezdařilo</string>
+    <string name="warning">Varování!</string>
+    <string name="lid_unlock">Odemknutí víka</string>
+    <string name="share_with_more_people">Sdílet s více lidmi</string>
+    <string name="scan_qr_code_with_camera">Naskenujte QR kód pomocí fotoaparátu</string>
+    <string name="enter_what_you_want_to_say">Zadejte svůj komentář</string>
+    <string name="note_title">NADPIS POZNÁMKY</string>
+    <string name="type_your_notes_here">Zde zadejte svou poznámku</string>
+    <string name="make_1_jar">1 sklenice</string>
+    <string name="make_n_jars">%1 sklenic</string>
+    <string name="per_serving">Na jednu porci</string>
+    <string name="preparation">Příprava:</string>
+    <string name="hours">h</string>
+    <string name="min">min</string>
+    <string name="ready_in">Hotova za:</string>
+    <string name="jar">Sklenice</string>
+    <string name="serving_sizes">Velikost porce</string>
+    <string name="score">Skóre</string>
+    <string name="share">Sdílet</string>
+    <string name="delete">Smazat</string>
+    <string name="recipe_update_tips">Bylo nalezeno celkem {{num}} receptů. Chcete si je stáhnout?</string>
+    <string name="no_recipe_update_tips">Není k dispozici žádný nový balíček receptů \n Aktuálně nejnovější verze</string>
+    <string name="recipe_update_process_tips">(({{progress}})Stahování dat receptů...</string>
+    <string name="recipe_update_finish">Aktualizace receptů dokončena</string>
+    <string name="update_recipe_title">Aktualizace receptů</string>
+    <string name="restore_confirm_tips">Určitě chcete obnovit tovární nastavení?</string>
+    <string name="change_lang_tips">Program je spuštěn, ukončete prosím program a spusťte novou operaci!</string>
+    <string name="exit_weight_align">Ukončit kalibrace</string>
+    <string name="weight_aligning">Kalibrace…</string>
+    <string name="weight_one_kg_tips">Vložte hmotnost 1 kg</string>
+    <string name="weight_two_kg_tips">Vložte hmotnost 2 kg</string>
+    <string name="weight_align_success">Kalibrace proběhla úspěšně!</string>
+    <string name="change_lang_tips2">Po přepnutí jazyka se současně změní i jazyky receptů a zařízení se znovu spustí. Určitě chcete změnit jazyk? </string>
+    <string name="pot_clover_not_clost_tips">Víko je odemčené. Prosím, neprve zamkněte víko, pak spusťte.</string>
+    <string name="screen_saver_title">Chcete přejít do "breath-holding" režimu?</string>
+    <string name="sex">Pohlaví</string>
+    <string name="wight">HMOTNOST</string>
+    <string name="running_block_tips">Zastavte běžící program a spusťte nový.</string>
+    <string name="unset_target_time">Čas nebyl nastaven.</string>
+</resources>

+ 1 - 0
BusinessCommon/src/main/res/values-en/strings.xml

@@ -233,4 +233,5 @@ Nanfang plus client is an online information platform developed and operated by
     <string name="no_login">Please enter the fields above to login</string>
     <string name="enjoy_your_meal_desc">enjoy your meal</string>
     <string name="wrong_captcha">Wrong captcha</string>
+    <string name="none">None</string>
 </resources>

+ 1 - 0
BusinessCommon/src/main/res/values-fr/strings.xml

@@ -287,4 +287,5 @@ Nanfang plus client is an online information platform developed and operated by
     <string name="login_expire_tips">Veuillez saisir les champs ci-dessus pour vous connecter</string>
     <string name="wrong_captcha">Wrong captcha</string>
     <string name="frement_010d_stage_first_finish">Ajoutez un film étirable dans le fond du panier vapeur puis disposez vos pots de yaourt. Fermez le couvercle et couvrez avec un linge ou un torchon.</string>
+    <string name="none">None</string>
 </resources>

+ 214 - 0
BusinessCommon/src/main/res/values-hu/strings.xml

@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <string name="not_a_member_yet">Még nincs fiókod?</string>
+    <string name="member">Tagság</string>
+    <string name="select_language">Válasszon nyelvet</string>
+    <string name="next">TOVÁBB</string>
+    <string name="english">English</string>
+    <string name="chinese">简体中文</string>
+    <string name="france">Français</string>
+    <string name="japan">日本語</string>
+    <string name="czech">čeština</string>
+    <string name="slovak">日本語</string>
+    <string name="hungarian">Magyar</string>
+    <string name="polish">Polski</string>
+    <string name="skip">SKIP</string>
+    <string name="recipes">RECORDS</string>
+    <string name="mode">MODE</string>
+    <string name="sunday">Vasárnap</string>
+    <string name="monday">Hétfő</string>
+    <string name="tuesday">Kedd</string>
+    <string name="wednesday">Szerda</string>
+    <string name="thursday">Csütörtök</string>
+    <string name="friday">Péntek</string>
+    <string name="saturday">Szombat</string>
+    <string name="resume">RENEW</string>
+    <string name="privacy_policy">Adatvédelem</string>
+    <string name="privacy_policy_content"> Adatvédelmi szabályzat: nem gyűjtünk semmilyen személyes adatot.</string>
+    <string name="i_agree">Egyetértek</string>
+    <string name="i_have_read_the_privacy_policy">Elolvastam az adatvédelmi szabályzatot</string>
+    <string name="second">Második</string>
+    <string name="wifi">WI-FI</string>
+    <string name="off_line">OFF-LINE</string>
+    <string name="ok">OK</string>
+    <string name="on_line">ON-LINE</string>
+    <string name="pwd_can_not_be_empty">Kérjük, adja meg a jelszót.</string>
+    <string name="skin_for_now">Jelenlegi megjelenés</string>
+    <string name="login">Bejelentkezés</string>
+    <string name="online_recipes">Online receptek</string>
+    <string name="cook_history">Főzés története</string>
+    <string name="favourite_recipes">Kedvenc receptek</string>
+    <string name="settings">Beállítások</string>
+    <string name="grid_view">Rácsnézet</string>
+    <string name="list_view">Lista nézet</string>
+    <string name="adapted_cooking">MÓDOSÍTOTT RECEPTEK</string>
+    <string name="scales">SÚLY</string>
+    <string name="boil_water">FORRÓ VÍZ</string>
+    <string name="chop">vágott</string>
+    <string name="slow_cook">LASSÚ FŐZÉS</string>
+    <string name="knead_dough">A TÉSZTA GYÚRÁSA</string>
+    <string name="steam">GŐZ</string>
+    <string name="food_processor">ÉLELMISZER-FELDOLGOZÁS</string>
+    <string name="turbo">TURBO</string>
+    <string name="language">NYELV</string>
+    <string name="sound">HANG</string>
+    <string name="brightness">JAS</string>
+    <string name="user_account">FELHASZNÁLÓI FELSZÁLLÍTÁS</string>
+    <string name="storage">HÁTTÉR</string>
+    <string name="reset">HÁTTÉR</string>
+    <string name="about">O</string>
+    <string name="weight">MASS</string>
+    <string name="local_recipes">Helyi receptek</string>
+    <string name="download">Letöltések</string>
+    <string name="downloading">Letöltés</string>
+    <string name="enter_search">Visszakeresve a</string>
+    <string name="search">Keresés</string>
+    <string name="most_popular">Legnépszerűbb</string>
+    <string name="newest">Legújabb</string>
+    <string name="the_most_commonly_searched">Legtöbbet keresett</string>
+    <string name="notice">Közlemények</string>
+    <string name="all">ALL</string>
+    <string name="Recipes">Receptek</string>
+    <string name="ingredients">Hozzávalók</string>
+    <string name="Brightness">Jas</string>
+    <string name="screen_lock_time">Képernyőzár idő</string>
+    <string name="time_3min">3 perc</string>
+    <string name="time_10min">10 perc</string>
+    <string name="time_30min">30 perc</string>
+    <string name="Sound">Hang</string>
+    <string name="text_to_speech">Szövegről beszédre</string>
+    <string name="Language">Nyelv</string>
+    <string name="Continue">TOVÁBB</string>
+    <string name="start_cooking">A FŐZÉS MEGKEZDÉSE</string>
+    <string name="off">FORRÁS</string>
+    <string name="on">BEÁLLÍTÁS</string>
+    <string name="update_the_recipes">Receptfrissítések</string>
+    <string name="apk">APK</string>
+    <string name="mcu">MCU</string>
+    <string name="tp">TP</string>
+    <string name="serial_number">Sorozatszám</string>
+    <string name="standby_time">Készenléti idő</string>
+    <string name="update">Frissítés</string>
+    <string name="About">A webhelyről</string>
+    <string name="are_you_sure_to_restore_factory_settings">Biztos, hogy vissza szeretné állítani a gyári beállításokat?</string>
+    <string name="yes">IGEN</string>
+    <string name="restore_factory_settings">Gyári beállítások visszaállítása</string>
+    <string name="network_wifi_status_connected_no_internet">Csatlakoztatva van, de nem tud hozzáférni az internethez</string>
+    <string name="network_wifi_status_saved">Mentette</string>
+    <string name="network_wifi_status_idle">Hálózat állapota</string>
+    <string name="network_wifi_status_disabled">"Leállt"</string>
+    <string name="network_wifi_status_network_failure">IP-cím konfigurációs hiba</string>
+    <string name="network_wifi_status_wifi_failure">"WLAN-kapcsolat meghibásodása"</string>
+    <string name="network_wifi_status_password_failure">"Hitelesítési probléma lépett fel"</string>
+    <string name="network_wifi_status_scanning">Szkennelés...</string>
+    <string name="network_wifi_status_connecting">Csatlakozás</string>
+    <string name="network_wifi_status_authenticating">Hitelesítés folyamatban...</string>
+    <string name="network_wifi_status_obtaining_ip_address">IP-cím megszerzése...</string>
+    <string name="network_wifi_status_connected">Csatlakozás</string>
+    <string name="network_wifi_status_suspended">Felfüggesztve</string>
+    <string name="network_wifi_status_disconnecting">Kapcsolat megszakad...</string>
+    <string name="network_wifi_status_disconnected">Lekapcsolva</string>
+    <string name="network_wifi_status_failed">Sikertelen</string>
+    <string name="network_wifi_status_blocked">Blokkolt</string>
+    <string name="network_wifi_status_verifying_poor_link">Átmenetileg letiltva (rossz hálózati állapot)</string>
+    <string name="start">START</string>
+    <string name="pause">PAUSE</string>
+    <string name="cancel">CANCEL</string>
+    <string name="confirm">MEGERŐSÍTÉS</string>
+    <string name="stop">STOP</string>
+    <string name="turn_right">Forgassa\ésjobbra</string>
+    <string name="turn_left">Forduljon balra</string>
+    <string name="temperature">TEMPERATURE</string>
+    <string name="time">IDŐ</string>
+    <string name="speed">SPEED</string>
+    <string name="direction">IRÁNY</string>
+    <string name="bad">Bad</string>
+    <string name="imperfect">Tökéletlen</string>
+    <string name="ordinary">Normális</string>
+    <string name="good">Jó</string>
+    <string name="perfect">Tökéletes</string>
+    <string name="are_you_sure_to_delete">Biztos, hogy törölni akarja?</string>
+    <string name="no">NEM</string>
+    <string name="unset_param_tips">Kérjük, állítsa be a műveleti paramétereket</string>
+    <string name="pmpt_confirm">Megerősítés</string>
+    <string name="pmpt_cancel">Cancel</string>
+    <string name="pmpt_msg">Tippek</string>
+    <string name="dev_end_of_run_tips">Kész</string>
+    <string name="hight_temp_warning_tips">Az aktuális hőmérséklet 60 °C felett van, és a motor fordulatszáma a harmadik fokozat felett van. Biztos, hogy folytatni szeretné?</string>
+    <string name="hight_temp_turbo_tips">Az aktuális hőmérséklet meghaladja a 60 °C-ot, a turbó funkció nem működtethető.</string>
+    <string name="update_msg">Rendszerfrissítés folyamatban, kérjük, várjon</string>
+    <string name="update_title">Ez a legújabb verzió?</string>
+    <string name="finish_download">Letöltve a</string>
+    <string name="download_fail">A letöltés sikertelen</string>
+    <string name="start_download">Kezdeményezze a letöltést</string>
+    <string name="weight_overload_tips">Túlterhelt súly</string>
+    <string name="forgot_password">Elfelejtett jelszó</string>
+    <string name="enter_email_id">Adja meg az e-mail címét</string>
+    <string name="enter_password">Jelszó megadása</string>
+    <string name="register">Regisztrálj</string>
+    <string name="launch_detail">Csatlakozzon hozzánk még ma és élvezze a végső főzési élményt</string>
+    <string name="login_sign_up">Bejelentkezés / Regisztráció</string>
+    <string name="skip_for_now">Egyelőre kihagyni</string>
+    <string name="reset_password">Jelszó visszaállítása</string>
+    <string name="enter_captcha">Töltse ki a Captcha-t</string>
+    <string name="send_email">E-mail küldése</string>
+    <string name="enter_password_again">Adja meg újra a jelszót</string>
+    <string name="enter_the_captcha_obtained_from_the_mail">Írja be az e-mailben kapott Captcha kódot</string>
+    <string name="nickname">Felhasználónév</string>
+    <string name="enter_nickname">Adja meg a nevet</string>
+    <string name="Gender">Nem</string>
+    <string name="male">Férfi</string>
+    <string name="age">Életkor</string>
+    <string name="save">Mentés</string>
+    <string name="cancellation_of_account">Számla törlése</string>
+    <string name="sign_up_it_s_free">Regisztrálj, ez INGYENES</string>
+    <string name="pwd_requirement">Betűkből és számokból áll, legalább 8 számjegyből.</string>
+    <string name="please_select_age">Kérjük, válassza ki az életkorát</string>
+    <string name="cancel_lower">Törlés</string>
+    <string name="female">Női</string>
+    <string name="tare">TARE</string>
+    <string name="keep_cooking_in_the_background">Folytassa a főzést a háttérben?</string>
+    <string name="reset_button">RESET</string>
+    <string name="finish">Befejezni!</string>
+    <string name="error">Hiba</string>
+    <string name="download_failed">A letöltés sikertelen</string>
+    <string name="warning">Figyelmeztetés!</string>
+    <string name="lid_unlock">A fedél feloldása</string>
+    <string name="share_with_more_people">Megosztás több emberrel</string>
+    <string name="scan_qr_code_with_camera">Szkennelje be a QR-kódot a kamerával</string>
+    <string name="enter_what_you_want_to_say">Írja be a megjegyzését</string>
+    <string name="note_title">A MEGJEGYZÉS CÍME</string>
+    <string name="type_your_notes_here">Írja be a megjegyzést ide</string>
+    <string name="make_1_jar">1 pohár</string>
+    <string name="make_n_jars">%1 pohár</string>
+    <string name="per_serving">Adagonként</string>
+    <string name="preparation">Elkészítés</string>
+    <string name="hours">óra</string>
+    <string name="min">perc</string>
+    <string name="ready_in">Kész:</string>
+    <string name="jar">poharak</string>
+    <string name="serving_sizes">Adagolási méret</string>
+    <string name="score">Pontozás</string>
+    <string name="share">Ossza meg ezt</string>
+    <string name="delete">Törölje</string>
+    <string name="recipe_update_tips">Összesen {{num}} receptet találtunk. Szeretné letölteni őket?</string>
+    <string name="no_recipe_update_tips">Nincs új receptcsomag elérhető \n Jelenleg a legújabb verzió</string>
+    <string name="recipe_update_process_tips">({{progress}})A receptadatok letöltése...</string>
+    <string name="recipe_update_finish">A receptek frissítése befejeződött</string>
+    <string name="update_recipe_title">Recept frissítések</string>
+    <string name="restore_confirm_tips">Biztos, hogy vissza szeretné állítani a gyári beállításokat?</string>
+    <string name="change_lang_tips">A program fut, kérjük, lépjen ki a programból és indítson új műveletet!</string>
+    <string name="exit_weight_align">Kilépés a kalibrálásból</string>
+    <string name="weight_aligning">Kalibrálás...</string>
+    <string name="weight_one_kg_tips">Kérjük, adjon meg 1 kg súlyt</string>
+    <string name="weight_two_kg_tips">Kérjük, adjon meg 2 kg súlyt</string>
+    <string name="weight_align_success">A kalibrálás sikeres volt!</string>
+    <string name="change_lang_tips2">A nyelvváltás után a receptnyelvek egyszerre változnak, és a készülék újraindul. Biztos, hogy meg akarja változtatni a nyelvet?</string>
+    <string name="pot_clover_not_clost_tips">A fedél fel van oldva. Kérjük, ne zárja le a fedelet, majd indítsa el.</string>
+    <string name="screen_saver_title">Szeretne "breath-holding"  üzemmódba lépni?</string>
+    <string name="sex">Gender</string>
+    <string name="wight">SÚLY</string>
+    <string name="running_block_tips">Állítsa le a futó programot, és indítson el egy újat.</string>
+    <string name="unset_target_time">Az idő nem lett beállítva.</string>
+</resources>

+ 1 - 0
BusinessCommon/src/main/res/values-ja/strings.xml

@@ -158,4 +158,5 @@
     <string name="Min20">20Min</string>
     <string name="enjoy_your_meal">ENJOY YOUR MEAL</string>
     <string name="wrong_captcha">Wrong captcha</string>
+    <string name="none">None</string>
 </resources>

+ 214 - 0
BusinessCommon/src/main/res/values-sk/strings.xml

@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <string name="not_a_member_yet">Ešte nemáte účet?</string>
+    <string name="member">Členstvo</string>
+    <string name="select_language">Vyberte si svoj jazyk</string>
+    <string name="next">VIAC</string>
+    <string name="english">English</string>
+    <string name="chinese">简体中文</string>
+    <string name="france">Français</string>
+    <string name="japan">日本語</string>
+    <string name="czech">čeština</string>
+    <string name="slovak">日本語</string>
+    <string name="hungarian">Magyar</string>
+    <string name="polish">Polski</string>
+    <string name="skip">SKIP</string>
+    <string name="recipes">RECORDY</string>
+    <string name="mode">REŽIM</string>
+    <string name="sunday">Nedeľa</string>
+    <string name="monday">Pondelok</string>
+    <string name="tuesday">Utorok</string>
+    <string name="wednesday">Streda</string>
+    <string name="thursday">Štvrtok</string>
+    <string name="friday">Piatok</string>
+    <string name="saturday">Sobota</string>
+    <string name="resume">RENEW</string>
+    <string name="privacy_policy">Zásady ochrany osobných údajov</string>
+    <string name="privacy_policy_content">Zásady ochrany osobných údajov: Nezhromažďujeme žiadne vaše osobné údaje.</string>
+    <string name="i_agree">Súhlasím</string>
+    <string name="i_have_read_the_privacy_policy">Prečítal som si zásady ochrany osobných údajov</string>
+    <string name="second">Druhá stránka</string>
+    <string name="wifi">WI-FI</string>
+    <string name="off_line">OFF-LINE</string>
+    <string name="ok">OK</string>
+    <string name="on_line">ON-LINE</string>
+    <string name="pwd_can_not_be_empty">Vyplňte heslo.</string>
+    <string name="skin_for_now">Aktuálny vzhľad</string>
+    <string name="login">Prihlásenie</string>
+    <string name="online_recipes">Online recepty</string>
+    <string name="cook_history">História varenia</string>
+    <string name="favourite_recipes">Obľúbené recepty</string>
+    <string name="settings">Nastavenia</string>
+    <string name="grid_view">Zobrazenie mriežky</string>
+    <string name="list_view">Zobrazenie zoznamu</string>
+    <string name="adapted_cooking">UPRAVENÉ RECEPTY</string>
+    <string name="scales">WEIGHT</string>
+    <string name="boil_water">VARNÁ VODA</string>
+    <string name="chop">nakrájané na</string>
+    <string name="slow_cook">POMALÉ VARENIE</string>
+    <string name="knead_dough">MIESENIE CESTA</string>
+    <string name="steam">PÁRA</string>
+    <string name="food_processor">SPRACOVANIE POTRAVÍN</string>
+    <string name="turbo">TURBO</string>
+    <string name="language">JAZYČNICA</string>
+    <string name="sound">ZVUK</string>
+    <string name="brightness">JAS</string>
+    <string name="user_account">UŽÍVATEĽSKÝ ÚČET</string>
+    <string name="storage">BACKGROUND</string>
+    <string name="reset">BACKGROUND</string>
+    <string name="about">O</string>
+    <string name="weight">MASS</string>
+    <string name="local_recipes">Miestne recepty</string>
+    <string name="download">Na stiahnutie</string>
+    <string name="downloading">Na stiahnutie</string>
+    <string name="enter_search">Získané z</string>
+    <string name="search">Vyhľadávanie</string>
+    <string name="most_popular">Najobľúbenejšie</string>
+    <string name="newest">Najnovšie</string>
+    <string name="the_most_commonly_searched">Najvyhľadávanejšie</string>
+    <string name="notice">Oznámenia</string>
+    <string name="all">VŠETKY</string>
+    <string name="Recipes">Recepty</string>
+    <string name="ingredients">Ingrediencie</string>
+    <string name="Brightness">Jas</string>
+    <string name="screen_lock_time">Čas uzamknutia obrazovky</string>
+    <string name="time_3min">3 minúty</string>
+    <string name="time_10min">10 minút</string>
+    <string name="time_30min">30 minút</string>
+    <string name="Sound">Zvuk</string>
+    <string name="text_to_speech">Prevod textu na reč</string>
+    <string name="Language">Jazyk</string>
+    <string name="Continue">POKRAČOVAŤ</string>
+    <string name="start_cooking">ZAČÍNAME VARIŤ</string>
+    <string name="off">ZDROJ</string>
+    <string name="on">ZAPNUTIE</string>
+    <string name="update_the_recipes">Aktualizácie receptov</string>
+    <string name="apk">APK</string>
+    <string name="mcu">MCU</string>
+    <string name="tp">TP</string>
+    <string name="serial_number">Sériové číslo</string>
+    <string name="standby_time">Čas pohotovostného režimu</string>
+    <string name="update">Aktualizácia</string>
+    <string name="About">O stránke</string>
+    <string name="are_you_sure_to_restore_factory_settings">Ste si istí, že chcete obnoviť výrobné nastavenia?</string>
+    <string name="yes">ÁNO</string>
+    <string name="restore_factory_settings">Obnovenie továrenských nastavení</string>
+    <string name="network_wifi_status_connected_no_internet">Pripojený, ale bez prístupu na internet</string>
+    <string name="network_wifi_status_saved">Uložené</string>
+    <string name="network_wifi_status_idle">Stav siete</string>
+    <string name="network_wifi_status_disabled">"Zastavené"</string>
+    <string name="network_wifi_status_network_failure">Zlyhanie konfigurácie adresy IP</string>
+    <string name="network_wifi_status_wifi_failure">"Zlyhanie pripojenia k sieti WLAN"</string>
+    <string name="network_wifi_status_password_failure">"Vyskytol sa problém s overovaním"</string>
+    <string name="network_wifi_status_scanning">Skenovanie...</string>
+    <string name="network_wifi_status_connecting">Pripojenie</string>
+    <string name="network_wifi_status_authenticating">Prebieha overovanie...</string>
+    <string name="network_wifi_status_obtaining_ip_address">Získavanie IP adresy...</string>
+    <string name="network_wifi_status_connected">Pripojené</string>
+    <string name="network_wifi_status_suspended">Pozastavené</string>
+    <string name="network_wifi_status_disconnecting">Odpojenie...</string>
+    <string name="network_wifi_status_disconnected">Odpojené</string>
+    <string name="network_wifi_status_failed">Neúspešné</string>
+    <string name="network_wifi_status_blocked">Zablokované</string>
+    <string name="network_wifi_status_verifying_poor_link">Dočasne vypnuté (zlý stav siete)</string>
+    <string name="start">START</string>
+    <string name="pause">PAUZA</string>
+    <string name="cancel">CANCEL</string>
+    <string name="confirm">CONFIRM</string>
+    <string name="stop">STOP</string>
+    <string name="turn_right">Otáčajte\a doprava</string>
+    <string name="turn_left">Otočiť doľava</string>
+    <string name="temperature">TEPLOTA</string>
+    <string name="time">ČAS</string>
+    <string name="speed">RÝCHLOSŤ</string>
+    <string name="direction">SMER</string>
+    <string name="bad">Zlé</string>
+    <string name="imperfect">Nedokonalé</string>
+    <string name="ordinary">Obyčajný</string>
+    <string name="good">Dobrý</string>
+    <string name="perfect">Perfektný</string>
+    <string name="are_you_sure_to_delete">Ste si istí, že ho chcete vymazať?</string>
+    <string name="no">NIE</string>
+    <string name="unset_param_tips">Nastavte parametre operácie</string>
+    <string name="pmpt_confirm">Potvrďte</string>
+    <string name="pmpt_cancel">Zrušiť</string>
+    <string name="pmpt_msg">Tipy</string>
+    <string name="dev_end_of_run_tips">Hotovo</string>
+    <string name="hight_temp_warning_tips">Aktuálna teplota je vyššia ako 60 °C a otáčky motora sú vyššie ako tretí prevodový stupeň. Ste si istí, že chcete pokračovať?</string>
+    <string name="hight_temp_turbo_tips">Aktuálna teplota je vyššia ako 60 °C, funkciu turbo nemožno spustiť.</string>
+    <string name="update_msg">Prebieha aktualizácia systému, počkajte, prosím</string>
+    <string name="update_title">Je toto najnovšia verzia?</string>
+    <string name="finish_download">Stiahnutá z</string>
+    <string name="download_fail">Stiahnutie sa nepodarilo</string>
+    <string name="start_download">Spustite sťahovanie</string>
+    <string name="weight_overload_tips">Hmotnosť preťažená</string>
+    <string name="forgot_password">Zabudli ste heslo</string>
+    <string name="enter_email_id">Zadajte e-mail</string>
+    <string name="enter_password">Zadajte heslo</string>
+    <string name="register">Zaregistrujte sa</string>
+    <string name="launch_detail">Pridajte sa k nám ešte dnes a užite si dokonalý zážitok z varenia</string>
+    <string name="login_sign_up">Prihlásenie / registrácia</string>
+    <string name="skip_for_now">Preskočiť pre teraz</string>
+    <string name="reset_password">Obnoviť heslo</string>
+    <string name="enter_captcha">Vyplňte Captcha</string>
+    <string name="send_email">Odoslať e-mail</string>
+    <string name="enter_password_again">Znovu zadajte heslo</string>
+    <string name="enter_the_captcha_obtained_from_the_mail">Zadajte kód Captcha získaný z e-mailu</string>
+    <string name="nickname">Používateľské meno</string>
+    <string name="enter_nickname">Zadajte meno</string>
+    <string name="Gender">Pohlavie</string>
+    <string name="male">Muž</string>
+    <string name="age">Vek</string>
+    <string name="save">Uložiť</string>
+    <string name="cancellation_of_account">Zrušenie účtu</string>
+    <string name="sign_up_it_s_free">Zaregistrujte sa, je to ZADARMO</string>
+    <string name="pwd_requirement">Pozostáva z písmen a číslic, pričom nesmie obsahovať menej ako 8 číslic.</string>
+    <string name="please_select_age">Vyberte svoj vek</string>
+    <string name="cancel_lower">Zrušiť</string>
+    <string name="female">Žena</string>
+    <string name="tare">TARE</string>
+    <string name="keep_cooking_in_the_background">Pokračovať vo varení na pozadí?</string>
+    <string name="reset_button">RESETOVAŤ</string>
+    <string name="finish">Dokončiť!</string>
+    <string name="error">Chyba</string>
+    <string name="download_failed">Stiahnutie sa nepodarilo</string>
+    <string name="warning">Upozornenie!</string>
+    <string name="lid_unlock">Odomknutie veka</string>
+    <string name="share_with_more_people">Zdieľanie s ďalšími ľuďmi</string>
+    <string name="scan_qr_code_with_camera">Naskenujte kód QR pomocou fotoaparátu</string>
+    <string name="enter_what_you_want_to_say">Zadajte svoj komentár</string>
+    <string name="note_title">NÁZOV POZNÁMKY</string>
+    <string name="type_your_notes_here">Tu zadajte svoj komentár</string>
+    <string name="make_1_jar">1 sklo</string>
+    <string name="make_n_jars">%1 pohárov</string>
+    <string name="per_serving">Na jednu porciu</string>
+    <string name="preparation">Príprava:</string>
+    <string name="hours">h</string>
+    <string name="min">min</string>
+    <string name="ready_in">Hotové za:</string>
+    <string name="jar">Skleničky</string>
+    <string name="serving_sizes">Veľkosť porcie</string>
+    <string name="score">Skóre</string>
+    <string name="share">Zdieľať</string>
+    <string name="delete">Vymazať</string>
+    <string name="recipe_update_tips">Celkovo bolo nájdených {{num}} receptov. Chcete si ich stiahnuť?</string>
+    <string name="no_recipe_update_tips">Žiadny nový balík receptov nie je k dispozícii \n V súčasnosti je k dispozícii najnovšia verzia</string>
+    <string name="recipe_update_process_tips">({{progress}})Sťahovanie údajov o receptoch...</string>
+    <string name="recipe_update_finish">Aktualizácia receptov dokončená</string>
+    <string name="update_recipe_title">Aktualizácia receptov</string>
+    <string name="restore_confirm_tips">Ste si istí, že chcete obnoviť výrobné nastavenia?</string>
+    <string name="change_lang_tips">Program je spustený, ukončite ho a spustite novú operáciu!</string>
+    <string name="exit_weight_align">Ukončenie kalibrácie</string>
+    <string name="weight_aligning">Kalibrácia...</string>
+    <string name="weight_one_kg_tips">Vložte hmotnosť 1 kg</string>
+    <string name="weight_two_kg_tips">Vložte hmotnosť 2 kg</string>
+    <string name="weight_align_success">Kalibrácia prebehla úspešne!</string>
+    <string name="change_lang_tips2">Po prepnutí jazyka sa súčasne zmenia aj jazyky receptov a zariadenie sa reštartuje. Ste si istí, že chcete zmeniť jazyk?</string>
+    <string name="pot_clover_not_clost_tips">Veko je odomknuté. Prosím, nezamykajte veko, potom spustite.</string>
+    <string name="screen_saver_title">Chcete prejsť do režimu "breath-holding"?</string>
+    <string name="sex">Pohlavie</string>
+    <string name="wight">HMOTNOSŤ</string>
+    <string name="running_block_tips">Zastavte spustený program a spustite nový program.</string>
+    <string name="unset_target_time">Čas nebol nastavený.</string>
+</resources>

+ 1 - 0
BusinessCommon/src/main/res/values-zh-rCN/strings.xml

@@ -296,4 +296,5 @@ Nanfang plus client is an online information platform developed and operated by
     <string name="no_net_error">Please connect to Wifi</string>
     <string name="no_login">Veuillez saisir les champs ci-dessus pour vous connecter</string>
     <string name="wrong_captcha">Wrong captcha</string>
+    <string name="none">None</string>
 </resources>

+ 1 - 0
BusinessCommon/src/main/res/values/strings.xml

@@ -297,4 +297,5 @@ Nanfang plus client is an online information platform developed and operated by
     <string name="no_login">Veuillez saisir les champs ci-dessus pour vous connecter</string>
     <string name="wrong_captcha">Wrong captcha</string>
     <string name="frement_010d_stage_first_finish">Place a sheet of plastic wrap at the bottom of the steaming basket, then arrange your yogurt pots. Close the lid and cover with a cloth or a towel.</string>
+    <string name="none">None</string>
 </resources>

+ 13 - 13
BusinessMain/src/main/java/com/develop/main/viewmodel/HomeViewModel.kt

@@ -322,7 +322,7 @@ class HomeViewModel : BaseViewModel() {
                             FoodContentModel(
                                 it.photoPath ?: "",
                                 it.name ?: "",
-                                3,
+                                it.score?.toInt() ?: 0,
                                 getTime(it.makeHours ?: 0, it.makeMinutes ?: 0),
                                 it.difficultyLevel ?: "",
                                 foodId = it.number ?: "",
@@ -338,7 +338,7 @@ class HomeViewModel : BaseViewModel() {
                             FoodContentModel(
                                 it.photoPath ?: "",
                                 it.name ?: "",
-                                3,
+                                it.score?.toInt() ?: 0,
                                 getTime(it.makeHours ?: 0, it.makeMinutes ?: 0),
                                 it.difficultyLevel ?: "",
                                 foodId = it.number ?: "",
@@ -354,7 +354,7 @@ class HomeViewModel : BaseViewModel() {
                             FoodContentModel(
                                 it.photoPath ?: "",
                                 it.name ?: "",
-                                3,
+                                it.score?.toInt() ?: 0,
                                 getTime(it.makeHours ?: 0, it.makeMinutes ?: 0),
                                 it.difficultyLevel ?: "",
                                 foodId = it.number ?: "",
@@ -415,7 +415,7 @@ class HomeViewModel : BaseViewModel() {
                             FoodContentModel(
                                 it.photoPath ?: "",
                                 it.name ?: "",
-                                3,
+                                it.score?.toInt() ?: 0,
                                 getTime(it.makeHours ?: 0, it.makeMinutes ?: 0),
                                 it.difficultyLevel ?: "",
                                 foodId = it.number ?: ""
@@ -430,7 +430,7 @@ class HomeViewModel : BaseViewModel() {
                             FoodContentModel(
                                 it.photoPath ?: "",
                                 it.name ?: "",
-                                3,
+                                it.score?.toInt() ?: 0,
                                 getTime(it.makeHours ?: 0, it.makeMinutes ?: 0),
                                 it.difficultyLevel ?: "",
                                 foodId = it.number ?: ""
@@ -445,7 +445,7 @@ class HomeViewModel : BaseViewModel() {
                             FoodContentModel(
                                 it.photoPath ?: "",
                                 it.name ?: "",
-                                3,
+                                it.score?.toInt() ?: 0,
                                 getTime(it.makeHours ?: 0, it.makeMinutes ?: 0),
                                 it.difficultyLevel ?: "",
                                 foodId = it.number ?: ""
@@ -532,7 +532,7 @@ class HomeViewModel : BaseViewModel() {
             onlineCategoryLiveData.postValue(result)
 
         }.catch {
-            errorCallback.postValue(it.message?:"")
+            errorCallback.postValue(it.message ?: "")
         }
     }
 
@@ -544,7 +544,7 @@ class HomeViewModel : BaseViewModel() {
                 addQuery("lang", MMkvUtils.getString(CURRENT_LANGUAGE) ?: "EN")
             }.await().hotTags.toMutableList()
         }.catch {
-            errorCallback.postValue(it.message?:"")
+            errorCallback.postValue(it.message ?: "")
         }
     }
 
@@ -588,7 +588,7 @@ class HomeViewModel : BaseViewModel() {
                 )
             }
         }.catch {
-            errorCallback.postValue(it.message?:"")
+            errorCallback.postValue(it.message ?: "")
         }
     }
 
@@ -650,7 +650,7 @@ class HomeViewModel : BaseViewModel() {
                     moreLocalRecipeLiveData.postValue(foodList)
                 }
             }.catch {
-                errorCallback.postValue(it.message?:"")
+                errorCallback.postValue(it.message ?: "")
             }
         } else {
             return false
@@ -714,7 +714,7 @@ class HomeViewModel : BaseViewModel() {
             onlineHotWordSearchRecipesLiveData.postValue(result)
 
         }.catch {
-            errorCallback.postValue(it.message?:"")
+            errorCallback.postValue(it.message ?: "")
         }
     }
 
@@ -765,7 +765,7 @@ class HomeViewModel : BaseViewModel() {
                 }
                 moreSearchOnlineRecipeLiveData.postValue(foodContentList)
             }.catch {
-                errorCallback.postValue(it.message?:"")
+                errorCallback.postValue(it.message ?: "")
             }
         } else {
             return false
@@ -782,7 +782,7 @@ class HomeViewModel : BaseViewModel() {
                 addQuery("lang", MMkvUtils.getString(CURRENT_LANGUAGE) ?: "EN")
             }.await().informs.toMutableList()
         }.catch {
-            errorCallback.postValue(it.message?:"")
+            errorCallback.postValue(it.message ?: "")
         }
     }
 

+ 18 - 14
BusinessStep/src/main/java/com/develop/step/ui/ModesDetailActivity.kt

@@ -87,6 +87,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
     private var isTempChange = false
     private var isTimeChange = false
     private var isMotorGearChange = false
+    private var isMotorDirectionGearChange = false
     private var isWaterGearChange = false
     private var initModeData = false
     private var pressStartTime = -1L
@@ -657,7 +658,8 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
                             isMotorGearChange,
                             focusUpdate = true
                         )
-
+                        this@ModesDetailActivity.isMotorDirectionGearChange =
+                            isMotorDirectionGearChange
                         updateMotorDirectionUI(motorDirection.toInt(), isMotorDirectionChange)
 
                         updateWeightUI(currDevInfo.weight.toFloat())
@@ -1695,24 +1697,26 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
      * 点击电机方向事件
      */
     private fun motorGearDirectionClick(direction: DirectionView.Direction) {
-        userChanging = true
-        binding.clCookDirection.updateChangeValue(
-            viewModel.getDirectionStr(
-                direction == DirectionView.Direction.LEFT, resources
+        if (isMotorDirectionGearChange) {
+            userChanging = true
+            binding.clCookDirection.updateChangeValue(
+                viewModel.getDirectionStr(
+                    direction == DirectionView.Direction.LEFT, resources
+                )
             )
-        )
-        if (direction != DirectionView.Direction.RIGHT) {
-            CofarSDK.cfgMotorDirection(MotorDirections.REVERSE);
-            updateMotorDirectionUI(MotorDirections.REVERSE.toInt(), true);
+            if (direction != DirectionView.Direction.RIGHT) {
+                CofarSDK.cfgMotorDirection(MotorDirections.REVERSE);
+                updateMotorDirectionUI(MotorDirections.REVERSE.toInt(), true);
 
 
-        } else {
-            CofarSDK.cfgMotorDirection(MotorDirections.FORWARD);
-            updateMotorDirectionUI(MotorDirections.FORWARD.toInt(), true);
+            } else {
+                CofarSDK.cfgMotorDirection(MotorDirections.FORWARD);
+                updateMotorDirectionUI(MotorDirections.FORWARD.toInt(), true);
 
-        }
+            }
 
-        showConfirmAndCancelBtn()
+            showConfirmAndCancelBtn()
+        }
     }
 
     /**

+ 1 - 0
LocalTools/.gitignore

@@ -0,0 +1 @@
+/build

+ 15 - 0
LocalTools/build.gradle

@@ -0,0 +1,15 @@
+plugins {
+    id 'java-library'
+    id 'org.jetbrains.kotlin.jvm'
+}
+
+java {
+    sourceCompatibility = JavaVersion.VERSION_17
+    targetCompatibility = JavaVersion.VERSION_17
+}
+
+dependencies {
+    implementation files('libs/okhttp-4.9.0.jar')
+    implementation files('libs/okio-2.10.0.jar')
+    implementation files('libs/gson-2.10.1.jar')
+}

BIN
LocalTools/libs/gson-2.10.1.jar


BIN
LocalTools/libs/okhttp-4.9.0.jar


BIN
LocalTools/libs/okio-2.10.0.jar


+ 23 - 0
LocalTools/src/main/java/com/twm/tools/local/AndroidLanguage.kt

@@ -0,0 +1,23 @@
+package com.twm.tools.local
+
+enum class AndroidLanguage(
+    val valuesLang: String,
+    val baiduLang: String
+) {
+    TW("zh-rTW", BaiduLanguage.TW),
+    HK("zh-rHK", BaiduLanguage.TW),
+    EN("en", BaiduLanguage.EN),
+    JP("ja", BaiduLanguage.JP),
+    KO("ko", BaiduLanguage.KO),
+    FR("fr", BaiduLanguage.FR),
+    SP("es", BaiduLanguage.SP),
+    RU("ru", BaiduLanguage.RU),
+    PT("pt", BaiduLanguage.PT),
+    DE("de", BaiduLanguage.DE),
+    IT("it", BaiduLanguage.IT),
+    NL("nl", BaiduLanguage.NL),
+    PL("pl", BaiduLanguage.PL),
+    SW("sw", BaiduLanguage.SW),
+    VI("vi", BaiduLanguage.VI),
+    TH("th", BaiduLanguage.TH),
+}

+ 19 - 0
LocalTools/src/main/java/com/twm/tools/local/BaiduLanguage.kt

@@ -0,0 +1,19 @@
+package com.twm.tools.local
+
+object BaiduLanguage {
+    const val TW = "cht" // 繁中
+    const val EN = "en" // 英语
+    const val JP = "jp" // 日语
+    const val KO = "kor" // 韩语
+    const val FR = "fra" // 法语
+    const val SP = "spa" // 西班牙
+    const val RU = "ru" // 俄语
+    const val PT = "pt" // 葡萄牙语
+    const val DE = "de" // 德语
+    const val IT = "it" // 意大利语
+    const val NL = "nl" // 荷兰语
+    const val PL = "pl" // 波兰语
+    const val SW = "swe" // 瑞典语
+    const val VI = "vie" // 越南语
+    const val TH = "th" // 泰语
+}

+ 12 - 0
LocalTools/src/main/java/com/twm/tools/local/BaiduTranslateResponse.kt

@@ -0,0 +1,12 @@
+package com.twm.tools.local
+
+class BaiduTranslateResponse(
+    val from: String,
+    val to: String,
+    val trans_result: List<BaiduTranslateResult>?
+)
+
+class BaiduTranslateResult(
+    val src: String,
+    val dst: String?
+)

+ 49 - 0
LocalTools/src/main/java/com/twm/tools/local/BaiduTranslateService.kt

@@ -0,0 +1,49 @@
+package com.twm.tools.local
+
+import com.google.gson.Gson
+import okhttp3.FormBody
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import java.math.BigInteger
+import java.security.MessageDigest
+
+object BaiduTranslateService: TranslateApi {
+    private const val TRANSLATE_URL = "https://fanyi-api.baidu.com/api/trans/vip/translate"
+    private const val BAIDU_APPID = "20230809001774667"
+    private const val BAIDU_SECRET = ""
+    private val client = OkHttpClient.Builder().build()
+
+    override fun translate(source: String, lang: String): String? {
+        val salt = System.nanoTime().toString()
+        val sign = (BAIDU_APPID + source + salt + BAIDU_SECRET).getMd5()
+        val body = FormBody.Builder()
+            .add("q", source)
+            .add("from", "auto")
+            .add("to", lang)
+            .add("appid", BAIDU_APPID)
+            .add("salt", salt)
+            .add("sign", sign)
+            .build()
+        val request = Request.Builder()
+            .post(body)
+            .url(TRANSLATE_URL)
+            .header("Content-Type", "application/x-www-form-urlencoded")
+            .build()
+        val response = runCatching {
+            client.newCall(request).execute()
+        }
+        if (response.isFailure) {
+            return null
+        }
+        val result = response.getOrThrow().body?.string() ?: return null
+        val translate = Gson().fromJson(
+            result, BaiduTranslateResponse::class.java
+        )
+        return translate.trans_result?.firstOrNull()?.dst
+    }
+
+    private fun String.getMd5(): String {
+        val md = MessageDigest.getInstance("MD5")
+        return BigInteger(1, md.digest(this.toByteArray())).toString(16).padStart(32, '0')
+    }
+}

+ 239 - 0
LocalTools/src/main/java/com/twm/tools/local/MainClass.kt

@@ -0,0 +1,239 @@
+package com.twm.tools.local
+
+import java.io.File
+import java.io.RandomAccessFile
+import java.util.Scanner
+import java.util.concurrent.ExecutorService
+import java.util.concurrent.Executors
+import java.util.concurrent.Future
+import java.util.concurrent.Semaphore
+import java.util.concurrent.TimeUnit
+import javax.xml.parsers.SAXParserFactory
+import javax.xml.transform.OutputKeys
+import javax.xml.transform.sax.SAXTransformerFactory
+import javax.xml.transform.stream.StreamResult
+import kotlin.system.exitProcess
+
+
+object MainClass {
+    private const val TARGET_LIB = "BusinessCommon"
+    private const val STRING_FILE = "strings.xml"
+    private const val LIMITED_QPS = 6
+    private val translateApi = BaiduTranslateService
+    private val semaphore = Semaphore(LIMITED_QPS)
+    private lateinit var taskExecutor: ExecutorService
+
+    /**
+     * 每次新增多语言, 在默认strings.xml处新增完毕后,点此处开始即可同步所有多语言
+     */
+    @JvmStatic
+    fun main(args: Array<String>) {
+        prepareHttpExecutors()
+        syncTranslations(listOf(
+            AndroidLanguage.EN,
+            AndroidLanguage.DE,
+            AndroidLanguage.JP,
+            AndroidLanguage.KO,
+            AndroidLanguage.HK,
+            AndroidLanguage.RU,
+            AndroidLanguage.FR,
+            AndroidLanguage.TH,
+        ))
+        exitProcess(0)
+    }
+
+    private fun prepareHttpExecutors() {
+        semaphore.acquire(LIMITED_QPS)
+        val executor = Executors.newScheduledThreadPool(1)
+        val qpsRelease = {
+            semaphore.release(1)
+        }
+        executor.scheduleAtFixedRate(
+            qpsRelease, 0, (1000f / LIMITED_QPS).toLong(), TimeUnit.MILLISECONDS
+        )
+        taskExecutor = Executors.newFixedThreadPool(LIMITED_QPS)
+    }
+
+    private fun syncTranslations(languages: List<AndroidLanguage>) {
+        val parentDir = File("${TARGET_LIB}/src/main/res")
+        val templateDir = File(parentDir, "values")
+        if (!templateDir.exists()) {
+            throw IllegalStateException("没有找到${TARGET_LIB}下的values文件夹")
+        }
+        val templateFile = File(templateDir, STRING_FILE)
+        if (!templateFile.exists()) {
+            throw IllegalStateException("模板values中无strings.xml文件")
+        }
+        for (language in languages) {
+            val langDir = File(parentDir, "values-${language.valuesLang}")
+            if (!langDir.exists() && !langDir.mkdirs()) {
+                throw IllegalStateException("创建文件夹失败:${langDir}")
+            }
+            val langFile = File(langDir, STRING_FILE)
+            if (!langFile.exists() && !langFile.createNewFile()) {
+                throw IllegalStateException("创建文件失败:${langFile}")
+            }
+        }
+
+        // parse languages
+        val saxFactory = SAXParserFactory.newInstance()
+        val saxParser = saxFactory.newSAXParser()
+        val saxHandler = ValuesStringSaxHandler()
+        val saxResult = runCatching {
+            saxParser.parse(templateFile, saxHandler)
+        }
+        if (saxResult.isFailure) {
+            println("模板strings文件解析失败:${saxResult.exceptionOrNull()}")
+            return
+        }
+        val templateValues = saxHandler.getCollectValues()
+        val holdingValues = mutableMapOf<AndroidLanguage, Set<String>>()
+        for (language in languages) {
+            val stringFile = getStringValuesDir(language)
+            val valueHandler = ValuesStringSaxHandler()
+            val parseResult = runCatching {
+                saxParser.parse(stringFile, valueHandler)
+            }
+            if (parseResult.isFailure) {
+                println("${language}中的文件内容解析失败或内容为空")
+            }
+            holdingValues[language] = valueHandler
+                .getCollectValues()
+                .map { it.key }
+                .toHashSet()
+        }
+        val pendingValues = mutableMapOf<AndroidLanguage, MutableList<Translation>>()
+        for (value in templateValues) {
+            for (entry in holdingValues.entries) {
+                if (entry.value.contains(value.key)) {
+                    continue
+                }
+                val valueList = pendingValues.getOrPut(entry.key) {
+                    mutableListOf()
+                }
+                valueList.add(Translation(ValuesData(value.key), value.value))
+                println("${entry.key.valuesLang} 待翻译key => ${value.key}")
+            }
+        }
+        if (pendingValues.isEmpty()) {
+            println("所有翻译均与默认strings.xml同步, 无新增翻译")
+            return
+        }
+        println("<==========================================>")
+        for (entry in pendingValues.entries) {
+            if (entry.value.isEmpty()) {
+                println("${entry.key.valuesLang} 无新增翻译内容")
+                continue
+            }
+            inflateTranslations(entry.key, entry.value, taskExecutor)
+            writeResultToFile(entry.key, entry.value)
+            println("写入文件完成:${entry.key.valuesLang}, 翻译数量:${entry.value.size}")
+            println("<==========================================>")
+        }
+    }
+
+    private fun inflateTranslations(
+        language: AndroidLanguage,
+        translations: List<Translation>,
+        executor: ExecutorService
+    ) {
+        val records = mutableMapOf<ValuesData, Future<String?>>()
+        for (translation in translations) {
+            val callable = TranslateCallable(
+                translateApi, translation.template, language.baiduLang
+            )
+            val qpsTask = QPSTaskWrapper(semaphore, callable)
+            records[translation.valueData] = executor.submit(qpsTask)
+        }
+        for (record in records) {
+            try {
+                val translation = record.value.get()
+                if (translation == null) {
+                    println("翻译失败 => ${language.valuesLang} => ${record.key.key}")
+                } else {
+                    record.key.value = processForTranslation(language, translation)
+                    println("翻译完成 => ${language.valuesLang} => ${record.key}")
+                }
+            } catch (ex: Exception) {
+                ex.printStackTrace()
+            }
+        }
+    }
+
+    private fun writeResultToFile(
+        language: AndroidLanguage,
+        translations: List<Translation>
+    ) {
+        val targetFile = getStringValuesDir(language)
+        ensureValidXmlFile(targetFile)
+        val accessFile = RandomAccessFile(targetFile, "rw")
+        val fileLength = accessFile.length()
+        val endTag = "</resources>"
+        if (fileLength <= endTag.length * 2) {
+            throw RuntimeException("strings.xml is invalid!")
+        }
+        var seekPosition = endTag.length
+        var resourceEnd = -1
+        while (seekPosition <= fileLength) {
+            accessFile.seek(fileLength - seekPosition)
+            val currentLine = accessFile.readLine()
+            if (currentLine.contains("</resources>")) {
+                resourceEnd = seekPosition
+                break
+            }
+            seekPosition++
+        }
+        val current = resourceEnd
+        if (current < 0) {
+            throw IllegalStateException("strings.xml文件格式有误")
+        }
+        accessFile.seek(fileLength - current)
+        for (translation in translations) {
+            val insertString = "    <string name=\"${translation.valueData.key}\">${translation.valueData.value}</string>"
+            accessFile.write(insertString.toByteArray())
+            accessFile.writeBytes("\n")
+        }
+        accessFile.writeBytes(endTag)
+        accessFile.close()
+    }
+
+    private fun ensureValidXmlFile(file: File) {
+        var validFile = false
+        val scanner = Scanner(file)
+        while (scanner.hasNextLine()) {
+            val nextLine = scanner.nextLine()
+            if (nextLine.contains("<resources>")) {
+                validFile = true
+            }
+        }
+        if (validFile) {
+            return
+        }
+        val target = SAXTransformerFactory.newInstance() as SAXTransformerFactory
+        val handler = target.newTransformerHandler()
+        handler.transformer.apply {
+            setOutputProperty(OutputKeys.ENCODING, "UTF-8")
+            setOutputProperty(OutputKeys.INDENT, "yes")
+        }
+        val result = StreamResult(file)
+        handler.setResult(result)
+        handler.startDocument()
+        val indent = "\n".toCharArray()
+        handler.characters(indent, 0, indent.size)
+        handler.startElement("", "", "resources", null)
+        handler.characters(indent, 0, indent.size)
+        handler.endElement("", "", "resources")
+        handler.endDocument()
+    }
+
+    private fun processForTranslation(language: AndroidLanguage, source: String): String {
+        if (language != AndroidLanguage.FR) {
+            return source
+        }
+        return source.replace("'", "\\'")
+    }
+
+    private fun getStringValuesDir(language: AndroidLanguage): File {
+        return File("${TARGET_LIB}/src/main/res/values-${language.valuesLang}/${STRING_FILE}")
+    }
+}

+ 16 - 0
LocalTools/src/main/java/com/twm/tools/local/QPSTaskWrapper.kt

@@ -0,0 +1,16 @@
+package com.twm.tools.local
+
+import java.util.concurrent.Callable
+import java.util.concurrent.Semaphore
+
+class QPSTaskWrapper<V>(
+    private val semaphore: Semaphore,
+    private val delegate: Callable<V>
+): Callable<V> {
+
+    override fun call(): V {
+        semaphore.acquireUninterruptibly(1)
+        return delegate.call()
+    }
+
+}

+ 7 - 0
LocalTools/src/main/java/com/twm/tools/local/TranslateApi.kt

@@ -0,0 +1,7 @@
+package com.twm.tools.local
+
+interface TranslateApi {
+
+    fun translate(source: String, lang: String): String?
+
+}

+ 17 - 0
LocalTools/src/main/java/com/twm/tools/local/TranslateCallable.kt

@@ -0,0 +1,17 @@
+package com.twm.tools.local
+
+import java.util.concurrent.Callable
+
+class TranslateCallable(
+    private val translateApi: TranslateApi,
+    private val source: String,
+    private val language: String
+): Callable<String?> {
+
+    override fun call(): String? {
+        if (source.isEmpty()) {
+            return null
+        }
+        return translateApi.translate(source, language)
+    }
+}

+ 6 - 0
LocalTools/src/main/java/com/twm/tools/local/Translation.kt

@@ -0,0 +1,6 @@
+package com.twm.tools.local
+
+class Translation(
+    val valueData: ValuesData,
+    val template: String
+)

+ 6 - 0
LocalTools/src/main/java/com/twm/tools/local/ValuesData.kt

@@ -0,0 +1,6 @@
+package com.twm.tools.local
+
+data class ValuesData(
+    val key: String,
+    var value: String = ""
+)

+ 42 - 0
LocalTools/src/main/java/com/twm/tools/local/ValuesStringSaxHandler.kt

@@ -0,0 +1,42 @@
+package com.twm.tools.local
+
+import org.xml.sax.Attributes
+import org.xml.sax.helpers.DefaultHandler
+
+class ValuesStringSaxHandler: DefaultHandler() {
+
+    private val values = mutableListOf<ValuesData>()
+    private var pending: ValuesData? = null
+
+    override fun startElement(uri: String?, localName: String?, qName: String?, attrs: Attributes?) {
+        if (qName != "string") {
+            pending = null
+            return
+        }
+        val key = attrs?.getValue("name")
+        if (key == null) {
+            pending = null
+        } else {
+            pending = ValuesData(key)
+        }
+    }
+
+    override fun endElement(uri: String?, localName: String?, qName: String?) {
+        if (qName != "string") {
+            pending = null
+            return
+        }
+        if (pending != null) {
+            values.add(pending!!)
+            pending = null
+        }
+    }
+
+    override fun characters(p0: CharArray, p1: Int, p2: Int) {
+        if (pending != null) {
+            pending?.value = String(p0, p1, p2)
+        }
+    }
+
+    fun getCollectValues() = values as List<ValuesData>
+}

+ 1 - 0
settings.gradle

@@ -30,3 +30,4 @@ include ':BusinessMain'
 include ':BusinessStep'
 include ':BusinessAirFryer'
 include ':skin-support'
+include ':LocalTools'