diff --git a/app/src/main/java/com/example/updateapp/UpdateApplication.java b/app/src/main/java/com/example/updateapp/UpdateApplication.java index 71de640..42bab78 100644 --- a/app/src/main/java/com/example/updateapp/UpdateApplication.java +++ b/app/src/main/java/com/example/updateapp/UpdateApplication.java @@ -11,4 +11,10 @@ public class UpdateApplication extends Application { protected void attachBaseContext(Context base) { super.attachBaseContext(LocaleHelper.onAttach(base, "en")); } -} \ No newline at end of file + + @Override + public void onCreate() { + super.onCreate(); + LocaleHelper.applyPersistedLocales(this); + } +} diff --git a/app/src/main/java/com/example/updateapp/adapters/LanguageAdapter.java b/app/src/main/java/com/example/updateapp/adapters/LanguageAdapter.java index f58709e..9f2417b 100644 --- a/app/src/main/java/com/example/updateapp/adapters/LanguageAdapter.java +++ b/app/src/main/java/com/example/updateapp/adapters/LanguageAdapter.java @@ -8,6 +8,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; import com.example.updateapp.R; @@ -17,9 +18,9 @@ public class LanguageAdapter extends RecyclerView.Adapter { - private Context context; - private List languageList; - private OnLanguageSelectedListener listener; + private final Context context; + private final List languageList; + private final OnLanguageSelectedListener listener; public interface OnLanguageSelectedListener { void onLanguageSelected(LanguageModel language, int position); @@ -41,18 +42,24 @@ public LanguageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int view @Override public void onBindViewHolder(@NonNull LanguageViewHolder holder, int position) { LanguageModel language = languageList.get(position); - holder.txtLanguageName.setText(language.getLanguageName()); - - if (language.isSelected()) { - holder.imgSelected.setVisibility(View.VISIBLE); - } else { - holder.imgSelected.setVisibility(View.GONE); - } + + boolean selected = language.isSelected(); + holder.itemView.setBackgroundResource( + selected ? R.drawable.bg_language_item_selected : R.drawable.bg_language_item + ); + holder.imgSelected.setVisibility(selected ? View.VISIBLE : View.INVISIBLE); + holder.imgSelected.setContentDescription( + selected ? context.getString(R.string.selected_language) : null + ); + holder.txtLanguageName.setTextColor( + ContextCompat.getColor(context, selected ? R.color.themeColor : R.color.black) + ); + holder.itemView.setSelected(selected); holder.itemView.setOnClickListener(v -> { if (listener != null) { - listener.onLanguageSelected(language, position); + listener.onLanguageSelected(language, holder.getBindingAdapterPosition()); } }); } @@ -79,4 +86,4 @@ public LanguageViewHolder(@NonNull View itemView) { imgSelected = itemView.findViewById(R.id.img_selected); } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/updateapp/adapters/OnboardingAdapter.java b/app/src/main/java/com/example/updateapp/adapters/OnboardingAdapter.java index 065c59d..06bf04d 100644 --- a/app/src/main/java/com/example/updateapp/adapters/OnboardingAdapter.java +++ b/app/src/main/java/com/example/updateapp/adapters/OnboardingAdapter.java @@ -8,38 +8,36 @@ import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.constraintlayout.widget.ConstraintLayout; import androidx.viewpager.widget.PagerAdapter; import com.example.updateapp.R; public class OnboardingAdapter extends PagerAdapter { - Context context; - LayoutInflater layoutInflater; + private final Context context; - public OnboardingAdapter(Context context) { - this.context = context; - } - - String titles[] = { - "Welcome to FinTrack", - "Track • Analyze • Improve", - "Build Better Money Habits" + private final int[] titles = { + R.string.onboarding_title_1, + R.string.onboarding_title_2, + R.string.onboarding_title_3 }; - String subtitles[] ={ - "Your all-in-one AI companion for smarter spending,\nbetter savings, and complete financial clarity." , - "Understand your expenses with clean visuals, smart insights, and real-time spending patterns\nthat keep you in control.", - "Set budgets, stay organized, and make confident \nfinancial decisions with powerful AI-Chatbot tools." + private final int[] subtitles = { + R.string.onboarding_subtitle_1, + R.string.onboarding_subtitle_2, + R.string.onboarding_subtitle_3 }; - int images[] = { + private final int[] images = { R.drawable.bg_1, R.drawable.bg_2, R.drawable.bg_3 }; + public OnboardingAdapter(Context context) { + this.context = context; + } + @Override public int getCount() { return titles.length; @@ -47,31 +45,28 @@ public int getCount() { @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { - return view == (ConstraintLayout) object; + return view == object; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { - layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); - View v = layoutInflater.inflate(R.layout.slide, container, false); + View v = LayoutInflater.from(context).inflate(R.layout.slide, container, false); ImageView image = v.findViewById(R.id.slideImg); TextView title = v.findViewById(R.id.sliderTitle); TextView subtitle = v.findViewById(R.id.sliderSubTitle); image.setImageResource(images[position]); - title.setText(titles[position]); - subtitle.setText(subtitles[position]); + title.setText(context.getString(titles[position])); + subtitle.setText(context.getString(subtitles[position])); container.addView(v); - return v; - } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { - container.removeView((ConstraintLayout) object); + container.removeView((View) object); } } diff --git a/app/src/main/java/com/example/updateapp/models/LanguageModel.java b/app/src/main/java/com/example/updateapp/models/LanguageModel.java index 9133124..56ac767 100644 --- a/app/src/main/java/com/example/updateapp/models/LanguageModel.java +++ b/app/src/main/java/com/example/updateapp/models/LanguageModel.java @@ -44,4 +44,4 @@ public boolean isSelected() { public void setSelected(boolean selected) { isSelected = selected; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/updateapp/utils/LocaleHelper.java b/app/src/main/java/com/example/updateapp/utils/LocaleHelper.java index fab2da9..522c7aa 100644 --- a/app/src/main/java/com/example/updateapp/utils/LocaleHelper.java +++ b/app/src/main/java/com/example/updateapp/utils/LocaleHelper.java @@ -4,7 +4,9 @@ import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; -import android.os.Build; + +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.os.LocaleListCompat; import java.util.Locale; @@ -14,29 +16,44 @@ public class LocaleHelper { private static final String PREFS_NAME = "app_prefs"; public static Context onAttach(Context context) { - String lang = getPersistedData(context, "en"); - String country = getPersistedCountry(context, ""); - return setLocale(context, lang, country); + return onAttach(context, "en"); } public static Context onAttach(Context context, String defaultLanguage) { String lang = getPersistedData(context, defaultLanguage); String country = getPersistedCountry(context, ""); - return setLocale(context, lang, country); + return wrap(context, lang, country); } public static String getLanguage(Context context) { return getPersistedData(context, "en"); } - public static Context setLocale(Context context, String language, String country) { - persist(context, language, country); + public static String getCountry(Context context) { + return getPersistedCountry(context, ""); + } + + public static void applyPersistedLocales(Context context) { + applyAppLocales(getLanguage(context), getCountry(context)); + } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - return updateResources(context, language, country); + public static Context setLocale(Context context, String language, String country) { + if (language == null || language.isEmpty()) { + language = "en"; } + if (country == null || "en".equals(language)) { + country = ""; + } + persist(context, language, country); + applyAppLocales(language, country); + return wrap(context, language, country); + } - return updateResourcesLegacy(context, language, country); + private static void applyAppLocales(String language, String country) { + String tag = (country == null || country.isEmpty()) + ? language + : language + "-" + country; + AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(tag)); } private static String getPersistedData(Context context, String defaultLanguage) { @@ -53,11 +70,11 @@ private static void persist(Context context, String language, String country) { SharedPreferences preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString(SELECTED_LANGUAGE, language); - editor.putString(SELECTED_COUNTRY, country); + editor.putString(SELECTED_COUNTRY, country == null ? "" : country); editor.apply(); } - private static Context updateResources(Context context, String language, String country) { + private static Context wrap(Context context, String language, String country) { Locale locale; if (country != null && !country.isEmpty()) { locale = new Locale(language, country); @@ -66,38 +83,10 @@ private static Context updateResources(Context context, String language, String } Locale.setDefault(locale); - Configuration configuration = context.getResources().getConfiguration(); + Resources resources = context.getResources(); + Configuration configuration = new Configuration(resources.getConfiguration()); configuration.setLocale(locale); configuration.setLayoutDirection(locale); - return context.createConfigurationContext(configuration); } - - private static Context updateResourcesLegacy(Context context, String language, String country) { - Locale locale; - if (country != null && !country.isEmpty()) { - locale = new Locale(language, country); - } else { - locale = new Locale(language); - } - Locale.setDefault(locale); - - Resources resources = context.getResources(); - Configuration configuration = resources.getConfiguration(); - configuration.locale = locale; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - configuration.setLayoutDirection(locale); - } - - resources.updateConfiguration(configuration, resources.getDisplayMetrics()); - return context; - } - - public static void clearLanguagePreference(Context context) { - SharedPreferences preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.remove(SELECTED_LANGUAGE); - editor.remove(SELECTED_COUNTRY); - editor.apply(); - } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/updateapp/views/activites/LanguageActivity.java b/app/src/main/java/com/example/updateapp/views/activites/LanguageActivity.java index 67fe6a6..cc6d30d 100644 --- a/app/src/main/java/com/example/updateapp/views/activites/LanguageActivity.java +++ b/app/src/main/java/com/example/updateapp/views/activites/LanguageActivity.java @@ -66,7 +66,7 @@ private void setupLanguageList() { languageList = new ArrayList<>(); // Add all 10 supported languages - languageList.add(new LanguageModel(getString(R.string.lang_english), "en", "US")); + languageList.add(new LanguageModel(getString(R.string.lang_english), "en", "")); languageList.add(new LanguageModel(getString(R.string.lang_chinese), "zh", "CN")); languageList.add(new LanguageModel(getString(R.string.lang_hindi), "hi", "IN")); languageList.add(new LanguageModel(getString(R.string.lang_spanish), "es", "ES")); @@ -77,18 +77,17 @@ private void setupLanguageList() { languageList.add(new LanguageModel(getString(R.string.lang_russian), "ru", "RU")); languageList.add(new LanguageModel(getString(R.string.lang_urdu), "ur", "PK")); - // Set current language as selected String currentLanguage = LocaleHelper.getLanguage(this); + boolean found = false; for (int i = 0; i < languageList.size(); i++) { if (languageList.get(i).getLanguageCode().equals(currentLanguage)) { languageList.get(i).setSelected(true); selectedPosition = i; + found = true; break; } } - - // If no match found, default to English (position 0) - if (selectedPosition == 0 && !currentLanguage.equals("en")) { + if (!found) { languageList.get(0).setSelected(true); selectedPosition = 0; } diff --git a/app/src/main/java/com/example/updateapp/views/activites/LoginActivity.java b/app/src/main/java/com/example/updateapp/views/activites/LoginActivity.java index 8700ad9..e289845 100644 --- a/app/src/main/java/com/example/updateapp/views/activites/LoginActivity.java +++ b/app/src/main/java/com/example/updateapp/views/activites/LoginActivity.java @@ -222,7 +222,7 @@ public void onComplete(@NonNull Task task) { this, getString(R.string.google_signin_error, e.getStatusCode(), e.getMessage()), Toast.LENGTH_LONG - ).show(); + ) .show(); } } } diff --git a/app/src/main/java/com/example/updateapp/views/activites/OTPActivity.java b/app/src/main/java/com/example/updateapp/views/activites/OTPActivity.java index 918ed05..e2db30b 100644 --- a/app/src/main/java/com/example/updateapp/views/activites/OTPActivity.java +++ b/app/src/main/java/com/example/updateapp/views/activites/OTPActivity.java @@ -183,15 +183,15 @@ private void verifyCredential(PhoneAuthCredential credential) { dialog.dismiss(); Exception e = linkTask.getException(); - String msg = e != null ? e.getMessage() : "Unknown linking error"; + String msg = e != null ? e.getMessage() : getString(R.string.unknown_linking_error); if (e instanceof FirebaseAuthUserCollisionException) { Toast.makeText(OTPActivity.this, - "This email is already registered with a different account. Please login with that email or use another email.", + getString(R.string.email_already_registered_different), Toast.LENGTH_LONG).show(); } else { Toast.makeText(OTPActivity.this, - "Failed to link email: " + msg, + getString(R.string.failed_to_link_email, msg), Toast.LENGTH_LONG).show(); } } @@ -224,7 +224,7 @@ private void saveUserToFirestoreAndContinue(String uid, String name, String emai }) .addOnFailureListener(e -> { if (dialog.isShowing()) dialog.dismiss(); - Toast.makeText(OTPActivity.this, "Failed to save user data: " + e.getMessage(), Toast.LENGTH_LONG).show(); + Toast.makeText(OTPActivity.this, getString(R.string.failed_to_save_user, e.getMessage()), Toast.LENGTH_LONG).show(); }); } diff --git a/app/src/main/java/com/example/updateapp/views/activites/SplashScreenActivity.java b/app/src/main/java/com/example/updateapp/views/activites/SplashScreenActivity.java index b2534dd..565a348 100644 --- a/app/src/main/java/com/example/updateapp/views/activites/SplashScreenActivity.java +++ b/app/src/main/java/com/example/updateapp/views/activites/SplashScreenActivity.java @@ -5,12 +5,9 @@ import android.os.Bundle; import android.view.WindowManager; -import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; +import com.example.updateapp.Helpers.SaveState; import com.example.updateapp.R; import com.example.updateapp.utils.LocaleHelper; @@ -19,6 +16,11 @@ public class SplashScreenActivity extends AppCompatActivity { + @Override + protected void attachBaseContext(Context newBase) { + super.attachBaseContext(LocaleHelper.onAttach(newBase)); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -28,25 +30,24 @@ protected void onCreate(Bundle savedInstanceState) { ); setContentView(R.layout.activity_splash_screen); + SaveState languageState = new SaveState(this, "LANGUAGE_SELECTED"); + boolean languageSelected = languageState.getState() == 1; new Timer().schedule(new TimerTask() { @Override public void run() { - runOnUiThread(new Runnable() { - @Override - public void run() { - Intent intent = new Intent(); - intent.setClass(SplashScreenActivity.this, OnboardingActivity.class); - startActivity(intent); - finish(); + runOnUiThread(() -> { + Intent intent; + if (!languageSelected) { + intent = new Intent(SplashScreenActivity.this, LanguageActivity.class); + intent.putExtra("isFirstLaunch", true); + } else { + intent = new Intent(SplashScreenActivity.this, OnboardingActivity.class); } + startActivity(intent); + finish(); }); } - },500); - } - - @Override - protected void attachBaseContext(Context newBase) { - super.attachBaseContext(LocaleHelper.onAttach(newBase)); + }, 500); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/updateapp/views/fragments/ChatbotFragment.java b/app/src/main/java/com/example/updateapp/views/fragments/ChatbotFragment.java index 6ba8cb1..f4ef31e 100644 --- a/app/src/main/java/com/example/updateapp/views/fragments/ChatbotFragment.java +++ b/app/src/main/java/com/example/updateapp/views/fragments/ChatbotFragment.java @@ -60,21 +60,21 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c binding.mic.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Toast.makeText(getContext(), "coming soon", Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), getString(com.example.updateapp.R.string.coming_soon), Toast.LENGTH_SHORT).show(); } }); binding.btnHistory.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Toast.makeText(getContext(), "coming soon", Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), getString(com.example.updateapp.R.string.coming_soon), Toast.LENGTH_SHORT).show(); } }); binding.file.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Toast.makeText(getContext(), "coming soon", Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), getString(com.example.updateapp.R.string.coming_soon), Toast.LENGTH_SHORT).show(); } }); @@ -99,14 +99,14 @@ public void onResponse(String response) { public void onError(Throwable throwable) { if (getActivity() != null) { getActivity().runOnUiThread(() -> { - addToChat("Error: " + throwable.getMessage(), MessageModel.SENT_BY_BOT); + addToChat(getString(com.example.updateapp.R.string.error_message, throwable.getMessage()), MessageModel.SENT_BY_BOT); }); } } }); } else { - Toast.makeText(getContext(), "write something", Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), getString(com.example.updateapp.R.string.write_something), Toast.LENGTH_SHORT).show(); } }); diff --git a/app/src/main/res/drawable/bg_language_item.xml b/app/src/main/res/drawable/bg_language_item.xml new file mode 100644 index 0000000..620a5e1 --- /dev/null +++ b/app/src/main/res/drawable/bg_language_item.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/bg_language_item_selected.xml b/app/src/main/res/drawable/bg_language_item_selected.xml new file mode 100644 index 0000000..1aaea5b --- /dev/null +++ b/app/src/main/res/drawable/bg_language_item_selected.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_forget.xml b/app/src/main/res/layout/activity_forget.xml index 0a9947b..cb35f94 100644 --- a/app/src/main/res/layout/activity_forget.xml +++ b/app/src/main/res/layout/activity_forget.xml @@ -68,7 +68,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" - android:text="login" + android:text="@string/log_in" android:textColor="#FF5722" android:textStyle="bold" app:layout_constraintStart_toEndOf="@+id/textView6" diff --git a/app/src/main/res/layout/activity_language.xml b/app/src/main/res/layout/activity_language.xml index 7d11fac..72f8eca 100644 --- a/app/src/main/res/layout/activity_language.xml +++ b/app/src/main/res/layout/activity_language.xml @@ -57,6 +57,7 @@ android:padding="4dp" android:layout_marginEnd="15dp" android:src="@drawable/ic_done_24" + android:contentDescription="@string/done" android:foreground="@drawable/ripple_effect_rect" android:background="@drawable/bg_lang_done"> @@ -115,7 +116,7 @@ android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" - android:text="Advertisement Space" + android:text="@string/advertisement_space" android:textColor="@color/black" android:textSize="14sp" android:visibility="gone" /> @@ -154,7 +155,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" - android:text="Advertisement Space" + android:text="@string/advertisement_space" android:textColor="@color/black" android:textSize="14sp" android:visibility="gone" /> diff --git a/app/src/main/res/layout/activity_new_update.xml b/app/src/main/res/layout/activity_new_update.xml index 42b6bd7..76ebadc 100644 --- a/app/src/main/res/layout/activity_new_update.xml +++ b/app/src/main/res/layout/activity_new_update.xml @@ -31,7 +31,7 @@ android:gravity="center_vertical" android:paddingTop="5dp" android:textStyle="bold" - android:text="Check what a new" + android:text="@string/check_whats_new" android:textColor="@color/black" android:textSize="17sp"> @@ -93,7 +93,7 @@ android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" - android:text="Advertisement Space" + android:text="@string/advertisement_space" android:textColor="@color/black" android:textSize="14sp" /> diff --git a/app/src/main/res/layout/activity_splash_screen.xml b/app/src/main/res/layout/activity_splash_screen.xml index a6f35b6..f9f90f6 100644 --- a/app/src/main/res/layout/activity_splash_screen.xml +++ b/app/src/main/res/layout/activity_splash_screen.xml @@ -88,7 +88,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="24dp" - android:text="AI-Powered Expense\nManager App" + android:text="@string/splash_title" android:textStyle="bold" android:textColor="@color/black" android:textSize="32dp" @@ -100,7 +100,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="2dp" - android:text="Track, manage, and analyze your finances\neffortlessly with AI-driven insights" + android:text="@string/splash_subtitle" android:textSize="16sp" app:layout_constraintStart_toStartOf="@+id/textView3" app:layout_constraintTop_toBottomOf="@+id/textView3" /> diff --git a/app/src/main/res/layout/fragment_chatbot.xml b/app/src/main/res/layout/fragment_chatbot.xml index 2d04a79..c2b357d 100644 --- a/app/src/main/res/layout/fragment_chatbot.xml +++ b/app/src/main/res/layout/fragment_chatbot.xml @@ -36,7 +36,7 @@ android:layout_marginEnd="100dp" android:layout_toStartOf="@+id/mic" android:layout_toEndOf="@+id/btnHistory" - android:text="Chatbot" + android:text="@string/chatbot" android:layout_centerVertical="true" android:singleLine="true" android:textSize="20sp" @@ -90,7 +90,7 @@ android:layout_height="wrap_content" android:minHeight="35dp" android:maxHeight="100dp" - android:hint="Message ..." + android:hint="@string/message_hint" android:padding="10dp"/> @@ -28,6 +28,7 @@ android:layout_height="24dp" android:layout_alignParentEnd="true" android:layout_centerVertical="true" + android:contentDescription="@string/selected_language" android:src="@drawable/ic_done_24" android:tint="#4CAF50" android:visibility="gone" /> diff --git a/app/src/main/res/layout/item_message.xml b/app/src/main/res/layout/item_message.xml index 6855283..bf8830a 100644 --- a/app/src/main/res/layout/item_message.xml +++ b/app/src/main/res/layout/item_message.xml @@ -29,7 +29,7 @@ android:layout_height="wrap_content" android:background="@drawable/send_message_back" android:padding="10dp" - android:text="How can I assist you today?" /> + android:text="@string/how_can_i_assist" /> + android:text="@string/how_can_i_assist" /> + android:title="@string/chatbot"/> + android:title="@string/profile"/> \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index b77608a..bea769d 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -106,4 +106,25 @@ العودة إلى نسيت كلمة المرور يرجى التحقق من بريدك الإلكتروني + + الدردشة + رسالة ... + اكتب شيئاً + تطبيق إدارة مصروفات\nمدعوم بالذكاء الاصطناعي + تتبع أموالك وأدرها وحلّلها بسهولة\nبمساعدة الذكاء الاصطناعي + مرحباً بك في FinTrack + تتبع • حلّل • حسّن + ابنِ عادات مالية أفضل + رفيقك بالذكاء الاصطناعي لإنفاق أذكى\nوتوفير أوضح. + افهم مصروفاتك برسوم واضحة ورؤى ذكية. + حدد الميزانيات ونظّم قراراتك مع روبوت الدردشة. + مساحة إعلانية + اطلع على الجديد + كيف يمكنني مساعدتك اليوم؟ + هذا البريد مسجّل بحساب آخر. سجّل الدخول به أو استخدم بريداً آخر. + تعذر ربط البريد: %1$s + تعذر حفظ بيانات المستخدم: %1$s + خطأ ربط غير معروف + اللغة المحددة + \ No newline at end of file diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index bd9a7c5..68f90ae 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -106,4 +106,25 @@ ফিরে যান পাসওয়ার্ড ভুলে গেছেন অনুগ্রহ করে আপনার ইমেইল চেক করুন + + চ্যাটবট + বার্তা ... + কিছু লিখুন + এআই-চালিত খরচ\nম্যানেজার অ্যাপ + এআই অন্তর্দৃষ্টি দিয়ে আপনার অর্থ ট্র্যাক,\nপরিচালনা ও বিশ্লেষণ করুন + FinTrack-এ স্বাগতম + ট্র্যাক • বিশ্লেষণ • উন্নতি + ভালো অর্থ অভ্যাস গড়ুন + স্মার্ট খরচ, ভালো সঞ্চয় ও স্পষ্ট আর্থিক ধারণার\nজন্য আপনার এআই সঙ্গী। + পরিষ্কার ভিজ্যুয়াল ও স্মার্ট ইনসাইট দিয়ে খরচ বুঝুন। + বাজেট ঠিক করুন এবং এআই চ্যাটবট দিয়ে সিদ্ধান্ত নিন। + বিজ্ঞাপনের স্থান + নতুন কী দেখুন + আজ আমি কীভাবে সাহায্য করতে পারি? + এই ইমেইল অন্য অ্যাকাউন্টে নিবন্ধিত। সেই ইমেইল দিয়ে লগইন করুন বা অন্য ইমেইল ব্যবহার করুন। + ইমেইল লিঙ্ক করা যায়নি: %1$s + ব্যবহারকারীর তথ্য সংরক্ষণ যায়নি: %1$s + অজানা লিঙ্ক ত্রুটি + নির্বাচিত ভাষা + \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d402f79..6582af9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -106,4 +106,25 @@ Volver a OLVIDÉ MI CONTRASEÑA Por Favor Revisa Tu Email + + Chatbot + Mensaje ... + Escribe algo + App de gastos\ncon IA + Controla, gestiona y analiza tus finanzas\ncon información impulsada por IA + Bienvenido a FinTrack + Controla • Analiza • Mejora + Mejores hábitos con el dinero + Tu compañero de IA para gastar mejor,\nahorrar más y ver tus finanzas con claridad. + Entiende tus gastos con gráficos claros,\ninsights y patrones en tiempo real. + Define presupuestos, organízate y decide\ncon el chatbot de IA. + Espacio publicitario + Ver novedades + ¿Cómo puedo ayudarte hoy? + Este correo ya está registrado en otra cuenta. Inicia sesión con ese correo o usa otro. + No se pudo vincular el correo: %1$s + No se pudieron guardar los datos: %1$s + Error de vinculación desconocido + Idioma seleccionado + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 76ceeb4..bd05f49 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -106,4 +106,25 @@ Retour à MOT DE PASSE OUBLIÉ Veuillez Vérifier Votre Email + + Chatbot + Message ... + Écrivez quelque chose + Application de dépenses\npropulsée par l\'IA + Suivez, gérez et analysez vos finances\navec des insights IA + Bienvenue sur FinTrack + Suivre • Analyser • Améliorer + De meilleures habitudes d\'argent + Votre compagnon IA pour dépenser plus malin\net voir vos finances clairement. + Comprenez vos dépenses avec des visuels clairs\net des insights en temps réel. + Fixez des budgets et décidez sereinement\navec le chatbot IA. + Espace publicitaire + Voir les nouveautés + Comment puis-je vous aider aujourd\'hui ? + Cet e-mail est déjà lié à un autre compte. Connectez-vous avec cet e-mail ou utilisez-en un autre. + Impossible de lier l\'e-mail : %1$s + Impossible d\'enregistrer les données : %1$s + Erreur de liaison inconnue + Langue sélectionnée + \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 780dcaf..a7217e5 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -106,4 +106,25 @@ वापस जाएं पासवर्ड भूल गए कृपया अपना ईमेल जांचें + + चैटबॉट + संदेश ... + कुछ लिखें + एआई-संचालित खर्च\nप्रबंधक ऐप + एआई अंतर्दृष्टि के साथ अपने वित्त को ट्रैक, प्रबंधित\nऔर विश्लेषण करें + FinTrack में आपका स्वागत है + ट्रैक • विश्लेषण • सुधार + बेहतर पैसे की आदतें बनाएं + स्मार्ट खर्च, बेहतर बचत और स्पष्ट वित्तीय समझ\nके लिए आपका एआई साथी। + साफ विज़ुअल, स्मार्ट अंतर्दृष्टि और खर्च पैटर्न से\nअपने खर्च को समझें। + बजट तय करें, व्यवस्थित रहें और एआई चैटबॉट से\nआत्मविश्वास से फैसले लें। + विज्ञापन स्थान + नया क्या है देखें + आज मैं आपकी कैसे मदद कर सकता हूँ? + यह ईमेल किसी दूसरे खाते से जुड़ा है। कृपया उसी ईमेल से लॉगिन करें या दूसरा ईमेल उपयोग करें। + ईमेल लिंक नहीं हो सका: %1$s + उपयोगकर्ता डेटा सहेजा नहीं जा सका: %1$s + अज्ञात लिंक त्रुटि + चयनित भाषा + \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index bc906cc..135a9d7 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -106,4 +106,25 @@ Voltar para ESQUECI A SENHA Por Favor Verifique Seu Email + + Chatbot + Mensagem ... + Escreva algo + App de despesas\ncom IA + Acompanhe, gerencie e analise suas finanças\ncom insights de IA + Bem-vindo ao FinTrack + Acompanhe • Analise • Melhore + Melhores hábitos com dinheiro + Seu companheiro de IA para gastar melhor\ne ver as finanças com clareza. + Entenda seus gastos com visuais claros\ne insights em tempo real. + Defina orçamentos e decida com confiança\ncom o chatbot de IA. + Espaço publicitário + Veja as novidades + Como posso ajudar hoje? + Este e-mail já está em outra conta. Entre com esse e-mail ou use outro. + Falha ao vincular o e-mail: %1$s + Falha ao salvar os dados: %1$s + Erro de vinculação desconhecido + Idioma selecionado + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 61cd9fd..d6e4ee6 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -106,4 +106,25 @@ Вернуться к ЗАБЫЛИ ПАРОЛЬ Пожалуйста, Проверьте Ваш Email + + Чат-бот + Сообщение ... + Напишите что-нибудь + Приложение для расходов\nна базе ИИ + Отслеживайте, управляйте и анализируйте финансы\nс помощью ИИ + Добро пожаловать в FinTrack + Учёт • Анализ • Улучшение + Лучшие денежные привычки + ИИ-помощник для разумных трат,\nнакоплений и ясности в финансах. + Понимайте расходы через графики\nи актуальные инсайты. + Задавайте бюджеты и принимайте решения\nс ИИ-чатботом. + Рекламное место + Что нового + Чем я могу помочь сегодня? + Эта почта уже привязана к другому аккаунту. Войдите с ней или используйте другую. + Не удалось привязать почту: %1$s + Не удалось сохранить данные: %1$s + Неизвестная ошибка привязки + Выбранный язык + \ No newline at end of file diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 8417a1e..38a0358 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -106,4 +106,25 @@ واپس جائیں پاس ورڈ بھول گئے براہ کرم اپنا ای میل چیک کریں + + چیٹ بوٹ + پیغام ... + کچھ لکھیں + اے آئی سے چلنے والی\nخرچ ایپ + اے آئی کی مدد سے اپنے مالیات کو ٹریک،\nمنظم اور جانچیں + FinTrack میں خوش آمدید + ٹریک • تجزیہ • بہتری + بہتر مالی عادات بنائیں + سمارٹ خرچ، بہتر بچت اور واضح مالیات کے لیے\nآپ کا اے آئی ساتھی۔ + صاف بصری اور سمارٹ بصیرت سے اپنے اخراجات سمجھیں۔ + بجٹ طے کریں اور اے آئی چیٹ بوٹ سے فیصلے کریں۔ + اشتہاری جگہ + نیا کیا ہے دیکھیں + آج میں آپ کی کیسے مدد کر سکتا ہوں؟ + یہ ای میل دوسرے اکاؤنٹ سے منسلک ہے۔ اسی ای میل سے لاگ ان کریں یا دوسری استعمال کریں۔ + ای میل منسلک نہیں ہو سکی: %1$s + یوزر ڈیٹا محفوظ نہیں ہو سکا: %1$s + نامعلوم لنک خرابی + منتخب زبان + \ No newline at end of file diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index a9234f9..967b167 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -106,4 +106,25 @@ 验证码验证失败 验证码错误: %1$s 身份验证错误:登录后未找到用户 + + 聊天机器人 + 消息 ... + 请输入内容 + AI 驱动的支出\n管理应用 + 借助 AI 洞察轻松跟踪、管理和分析你的财务 + 欢迎使用 FinTrack + 跟踪 • 分析 • 改善 + 养成更好的理财习惯 + 智能支出、更好储蓄和清晰财务的一站式 AI 助手。 + 用清晰图表、智能洞察和实时支出模式掌控财务。 + 设定预算、保持条理,并用 AI 聊天工具自信决策。 + 广告位 + 查看新内容 + 今天我能为你做什么? + 该邮箱已注册到其他账户。请用该邮箱登录或换一个邮箱。 + 无法关联邮箱:%1$s + 无法保存用户数据:%1$s + 未知关联错误 + 已选语言 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 472e9d5..63b7d66 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -105,4 +105,23 @@ Back to FORGET PASSWORD Please Check Your Email + Chatbot + Message ... + Write something + AI-Powered Expense\nManager App + Track, manage, and analyze your finances\neffortlessly with AI-driven insights + Welcome to FinTrack + Track • Analyze • Improve + Build Better Money Habits + Your all-in-one AI companion for smarter spending,\nbetter savings, and complete financial clarity. + Understand your expenses with clean visuals, smart insights, and real-time spending patterns\nthat keep you in control. + Set budgets, stay organized, and make confident \nfinancial decisions with powerful AI-Chatbot tools. + Advertisement Space + Check what\'s new + How can I assist you today? + This email is already registered with a different account. Please login with that email or use another email. + Failed to link email: %1$s + Failed to save user data: %1$s + Unknown linking error + Selected language \ No newline at end of file