Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added support for Arabic language #455

Merged
merged 2 commits into from
Mar 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ class Languages {

static const languages = [
LanguageEntity(code: 'en', value: 'English'),
LanguageEntity(code: 'ar', value: 'العربية'),
LanguageEntity(code: 'es', value: 'Spanish'),
LanguageEntity(code: 'pl', value: 'Polish'),
LanguageEntity(code: 'ne', value: 'Nepali'),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ class TransactionBloc extends Bloc<TransactionEvent, TransactionState> {
) {
selectedCategoryId = event.category.superId;
selectedCategory = event.category;
emit(TransactionState.changecCategory(event.category));
emit(TransactionState.changeCategory(event.category));
}

FutureOr<void> _changeAccount(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class TransactionState with _$TransactionState {
const factory TransactionState.changeTransactionType(
TransactionType transactionType) = ChangeTransactionTypeState;

const factory TransactionState.changecCategory(CategoryEntity category) =
const factory TransactionState.changeCategory(CategoryEntity category) =
ChangeCategoryState;

const factory TransactionState.initial() = ExpenseInitial;
Expand Down
222 changes: 222 additions & 0 deletions lib/localization/app_ar.arb
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
{
"appTitle": "Paisa",
"home": "الرئيسية",
"transactions": "المعاملات",
"welcomeMessage": "سعداء برؤيتك مرة أخرى!",
"categories": "الفئات",
"accounts": "الحسابات",
"budget": "الميزانية",
"overview": "نظرة عامة",
"defaultAccount": "الحساب الافتراضي",
"recurring": "المتكررة",
"debts": "الديون",
"addTransactionTooltip": "إضافة معاملة",
"addAccountTooltip": "إضافة حساب",
"addCategoryTooltip": "إضافة فئة",
"addDebtTooltip": "إضافة دين",
"addRecurringTooltip": "إضافة متكررة",
"selectDateRangeTooltip": "نطاق التاريخ",
"transactionSubTittleText": "{bankName} • {dateString}",
"addCategory": "إضافة فئة",
"addCategoryEmptyTitle": "لا توجد فئات",
"addCategoryEmptySubTitle": "إضافة فئة للاختيار منها",
"addAccountEmptyTitle": "لا توجد حسابات",
"addAccountEmptySubTitle": "إضافة حساب للاختيار منه",
"addTransaction": "إضافة معاملة",
"updateTransaction": "تحديث المعاملات",
"addedTransaction": "تمت إضافة المعاملة",
"updatedTransaction": "تم تحديث المعاملة",
"deletedTransaction": "تم حذف المعاملة",
"expenseName": "اسم المصروف",
"description": "الوصف",
"selectAccount": "اختيار حساب",
"selectCategory": "اختيار فئة",
"settings": "الإعدادات",
"localApp": "فتح باستخدام بصمة الأصبع",
"expense": "المصاريف",
"transfer": "التحويل",
"daily": "يومياً",
"weekly": "أسبوعياً",
"monthly": "شهرياً",
"yearly": "سنوياً",
"all": "الكل",
"updateAccount": "تحديث الحساب",
"addAccount": "إضافة حساب",
"transactionHistory": "سجل المعاملات",
"cash": "نقداً",
"bank": "بنك",
"wallet": "محفظة",
"cardHolder": "اسم صاحب البطاقة",
"accountName": "اسم الحساب",
"lastFourDigit": "آخر أربعة أرقام",
"addedAccount": "تمت إضافة الحساب",
"updatedAccount": "تم تحديث الحساب",
"deletedAccount": "تم حذف الحساب",
"successAddCategory": "تمت إضافة الفئة",
"validName": "الرجاء إدخال اسم صالح",
"profile": "الملف الشخصي",
"chooseTheme": "السمة",
"selectCurrency": "اختيار العملة",
"errorAuth": "خطأ في المصادقة",
"emptyAccountMessageTitle": "لا توجد حسابات متاحة",
"emptyAccountMessageSubTitle": "أضف حسابًا وسيظهر هنا",
"emptyCategoriesMessageTitle": "لا توجد فئات متاحة",
"emptyCategoriesMessageSubTitle": "أضف فئة وستظهر هنا",
"emptyOverviewMessageTitle": "لا توجد بيانات لنظرة عامة",
"emptyOverviewMessageSubtitle": "لعرض نظرة عامة على مصاريفك، قم بإضافة مصاريف",
"amount": "المبلغ",
"initialAmount": "المبلغ الأولي",
"validAmount": "يرجى إدخال مبلغ صالح",
"dueDate": "تاريخ الانتهاء",
"deletedCategory": "تم حذف الفئة",
"startDate": "تاريخ البدء",
"socialLinks": "روابط التواصل الاجتماعي",
"telegram": "تيليجرام",
"telegramGroup": "مجموعة تيليجرام",
"privacyPolicy": "سياسة الخصوصية",
"github": "جيتهوب",
"githubText": "افتح المشروع على جيتهوب",
"version": "الإصدار",
"versionNumber": "v{version}",
"deleteAccount": "تم حذف الحساب",
"deleteCategory": "تم حذف الفئة",
"deleteExpense": "تم حذف المصروف",
"dialogDeleteTitle": "حذف نهائيً؟",
"updatedCategory": "تم تحديث الفئة",
"update": "تحديث",
"add": "إضافة",
"done": "تم",
"cancel": "إلغاء",
"custom": "مخصص",
"accentColor": "اللون الأساسي",
"dynamicColor": "ديناميكي",
"pickColor": "اختيار اللون",
"pickColorDesc": "اختر هذا اللون لهاته الفئة",
"pickColorAccountDesc": "اختر هذا اللون لهذا الحساب",
"colors": "الألوان",
"others": "أخرى",
"madeWithLoveInIndia": "صُنع بحب في الهند",
"updateCategory": "تحديث الفئة",
"accountInformationTitle": "معلومات الحساب",
"accountInformationSubTitle": "التفاصيل التي قدمتها حول الحساب لا يتم مشاركتها مع أحد، بما في ذلك نحن. تُستخدم فقط لتمثيل بصري لتفاصيل الحساب؛ يمكنك أيضًا تقديم معلومات خاطئة",
"next": "التالي",
"image": "صورة",
"welcome": "مرحبًا، أهلاً",
"welcomeDesc": "كيف يجب أن نناديك؟",
"nameHint": "الاسم",
"enterNameHint": "أدخل اسمًا",
"imageDesc": "دعنا نضيف صورة لك",
"setBudget": "تعيين ميزانية لفئة",
"income": "الدخل",
"thisMonth": "هذا الشهر",
"totalBalance": "الرصيد الإجمالي",
"ok": "موافق",
"searchMessage": "ابدأ بالبحث عن شيء!",
"emptySearchMessage": "يبدو أنه لم يتم العثور على شيء!",
"emptyExpensesMessageTitle": "لا توجد مصاريف بعد؟",
"emptyExpensesMessageSubTitle": "لا توجد أي مصروفات، قم بإضافة مصاريف ليتم عرضها",
"selectIconTitle": "اختيار أيقونة",
"selectIconSubTitle": "انقر لتحديد أيقونة",
"incomeName": "اسم الدخل",
"currencySign": "رمز العملة",
"calendarFormat": "تنسيق التقويم",
"expenseByCategory": "المصروفات حسب الفئة",
"transactionsByCategory": "المعاملات حسب الفئة",
"backupAndRestoreTitle": "النسخ الاحتياطي والاستعادة",
"backupAndRestoreSubTitle": "نسخ احتياطي واستعادة المصروفات والحسابات والفئات الخاصة بك.",
"exportData": "تصدير",
"importData": "استيراد",
"creatingBackup": "جارٍ إنشاء نسخة احتياطية",
"creatingBackupSuccess": "تم إنشاء النسخة الاحتياطية بنجاح",
"restoringBackup": "جارٍ استعادة النسخة الاحتياطية",
"restoringBackupSuccess": "تمت استعادة النسخة الاحتياطية بنجاح",
"saveAsCSV": "حفظ كملف CSV",
"saveAsCSVDesc": "تصدير البيانات إلى ملف بتنسيق CSV",
"appRate": "تقييم التطبيق",
"appRateDesc": "هل تحب هذا التطبيق؟ أخبرنا كيف يمكننا تحسينه على متجر Google Play!",
"raiseABugOrRequest": "رفع خطأ أو طلب ميزة",
"raiseABugOrRequestDesc": "هل وجدت خطأً أو تحتاج إلى إضافة ميزة؟ اطلب!",
"transferName": "اسم التحويل",
"debt": "دين",
"credit": "ائتمان",
"enterCategory": "أدخل فئة",
"addDebt": "إضافة دين",
"addCredit": "إضافة ائتمان",
"enterBudget": "أدخل ميزانية",
"enterDescription": "أدخل وصفاً",
"validDescription": "أدخل وصفاً صالحاً",
"payDebt": "دفع الدين",
"payCredit": "دفع الائتمان",
"enterAmount": "أدخل المبلغ",
"emptyDebts": "لا يوجد لديك أي ديون حتى الآن",
"emptyDebtsDesc": "أضف ديونك وستظهر هنا",
"emptyCredit": "لا يوجد لديك أي ائتمان حتى الآن",
"emptyCreditDesc": "أضف ائتمانك وستظهر هنا",
"enterInitialAmount": "أدخل المبلغ الأولي",
"enterNumberOptional": "أدخل الأرقام الأربعة الأخيرة (اختياري)",
"enterAccountName": "أدخل اسم الحساب",
"enterCardHolderName": "أدخل اسم حامل البطاقة",
"search": "بحث",
"addNew": "إضافة جديد",
"delete": "حذف",
"appBarSearch": "البحث عن مصروفات، حسابات، فئات",
"noTransaction": "لا توجد معاملات",
"enterSymbol": "أدخل رمزًا",
"leftSymbol": "الرمز على اليسار",
"rightSymbol": "الرمز على اليمين",
"customSymbol": "رمز مخصص",
"intoTitle": "طريقة بسيطة للتحكم في مدخراتك",
"intoSummary1": "إدارة أموالك مع تطبيقنا",
"intoSummary2": "تتبع سهل للمصروفات لإدارة ميزانية متقنة",
"intoSummary3": "ابق على علم بمصروفاتك في أي وقت وأي مكان",
"introCTA": "ابدأ",
"deleteDebtOrCredit": "حذف الدين أو الائتمان سيحذف جميع السجلات المرتبطة",
"backupAndRestoreJSONTitle": "تصدير البيانات إلى ملف JSON",
"backupAndRestoreJSONDesc": "سيكون الملف ملف JSON عادي يتم إنشاؤه وتصديره للحفظ. يرجى ملاحظة أنه إذا حدث شيء في المستقبل لـ Paisa، فستكون هذه الملفات غير صالحة للاستيراد",
"emptyBudgetMessageTitle": "لم يتم تحديد ميزانية لأي فئة",
"emptyBudgetMessageSubTitle": "أنشئ ميزانية لفئة وستظهر هنا",
"recurringEmptyMessageTitle": "لا توجد متكررات؟",
"recurringEmptyMessageSubTitle": "أضف متكرراتك وستظهر هنا",
"recurringAction": "إضافة متكررة",
"sortList": "فرز القائمة",
"smallSizeFab": "زر الإضافة الصغير",
"smallSizeFabMessage": "عرض جميع أزرار الإجراءات بحجم صغير.",
"selectDateErrorMessage": "حدد تاريخًا",
"edit": "تحرير",
"fromAccount": "تحويل من الحساب",
"toAccount": "تحويل إلى الحساب",
"paisaLocked": "Paisa مقفل",
"authenticate": "المصادقة",
"biometricMessage": "المس جهاز البصمة",
"addedCategories": "الفئات المضافة",
"back": "رجوع",
"recommendedCategories": "الفئات الموصى بها",
"addedAccounts": "الحسابات المضافة",
"recommendedAccounts": "الحسابات الموصى بها",
"total": "الإجمالي",
"colorsUI": "الألوان وواجهة المستخدم",
"more": "المزيد",
"chooseIcon": "اختيار أيقونة",
"transferCategory": "تحويل فئة",
"accountStyle": "نمط الحساب",
"accountStyleDescription": "حدد نمط تخطيط الحساب المفضل لديك: عمودي أو أفقي.",
"supportMe": "استمدادي",
"supportMeDescription": "إذا كنت تعتقد أنني أستحق هدية صغيرة لجهدي الشاق، يمكنك دفع بيرة افتراضية لي.",
"lockAppDescription": "عند التمكين، ستحتاج إلى استخدام بصمة الأصبع لفتح Paisa.",
"fontStyle": "نمط الخط",
"fontStyleDescription": "قم بتغيير الخط لتخصيص مظهر تطبيقك. اختر من بين العديد",
"chooseFont": "اختيار الخط",
"chooseAppLanguage": "اختيار لغة التطبيق",
"appLanguage": "لغة التطبيق",
"excludeAccount": "استبعاد الحساب",
"accountNotFound": "الحساب غير موجود",
"bankNameError": "خطأ في اسم البنك",
"holderNameError": "خطأ في اسم المالك",
"accountColorError": "خطأ في لون الحساب",
"emptySelectedAccountsInfo": "لا توجد معلومات حساب محددة",
"emptyRecommendedAccountsInfo": "لا توجد معلومات حساب موصى بها",
"transferCategorySubtitle": "نقل فئة الحساب",
"currencySelectorError": "خطأ في محدد العملة",
"justBlackText": "نص أسود فقط",
"dateAndTime": "التاريخ والوقت"
}
50 changes: 50 additions & 0 deletions test/localization_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:paisa/core/extensions/build_context_extension.dart';

Widget buildTestableWidget(Widget widget, Locale locale) {
return MaterialApp(
locale: locale,
supportedLocales: [locale],
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
home: widget,
);
}

class MyWidget extends StatelessWidget {
const MyWidget({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text(
context.loc.home,
style: const TextStyle(
fontSize: 36.0,
),
),
),
);
}
}

void main() {
testWidgets('Test Arabic localization', (WidgetTester tester) async {
await tester
.pumpWidget(buildTestableWidget(const MyWidget(), const Locale('ar')));
await tester.pumpAndSettle();

var findByText = find.byType(Text);

expect(findByText.evaluate().isEmpty, false);
expect(find.text('الرئيسية'), findsOneWidget);
});
}