Skip to content

Commit 8125283

Browse files
koniz-devclaude
andcommitted
i18n(arb): Backfill 79 missing ar/es translations and re-enable sync test
app_ar.arb and app_es.arb were ~79 keys behind app_en.arb — the Vietnamese auth-i18n work + the recent profile-page localization both shipped new keys without parallel ar/es entries, and the arb_key_synchronization tests had been skipped to accommodate the gap. Backfilled with native translations (not English fallback) for every missing key: auth flow chrome (welcomeBack, signInToContinue, createAccount, verifyYourEmail, ...), profile chrome (profileTitle, editProfile, signOutConfirmMessage, ...), and the new profile keys (daysAgo / weeksAgo / monthsAgo / yearsAgo / joinedAt with proper placeholders, displayNameTooShort, editProfileTip*). All 4 ARB files now carry 255 keys each. Removed the file-level skip on arb_key_synchronization_test.dart so the 12 synchronization assertions run on every CI run, preventing future drift. Includes the two one-shot scripts used (tool/arb_missing.dart prints what's missing, tool/arb_backfill.dart writes translations back with metadata copied from English) so the next batch of keys can follow the same workflow. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 9a97d63 commit 8125283

7 files changed

Lines changed: 1121 additions & 170 deletions

File tree

lib/l10n/app_ar.arb

Lines changed: 361 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,11 @@
617617
"resetEmailSent": "تم إرسال بريد إعادة التعيين",
618618
"pleaseCheckEmailAt": "يرجى التحقق من بريدك الإلكتروني {email}",
619619
"@pleaseCheckEmailAt": {
620-
"placeholders": {"email": {"type": "String"}}
620+
"placeholders": {
621+
"email": {
622+
"type": "String"
623+
}
624+
}
621625
},
622626
"resend": "إعادة الإرسال",
623627
"emailNotInSystem": "البريد الإلكتروني غير موجود في النظام",
@@ -638,5 +642,361 @@
638642
"repeatedAuthFailureMessage": "فشلت المصادقة عدة مرات. يرجى المحاولة باستخدام البريد الإلكتروني أو الاتصال بالدعم.",
639643
"@repeatedAuthFailureMessage": {
640644
"description": "Message shown after repeated authentication failures"
645+
},
646+
"accountCreatedAt": "تم إنشاء الحساب",
647+
"@accountCreatedAt": {
648+
"description": "Info card title for profile creation date"
649+
},
650+
"accountCreatedSuccessfully": "تم إنشاء حسابك بنجاح",
651+
"@accountCreatedSuccessfully": {
652+
"description": "Account creation success message"
653+
},
654+
"alreadyHaveAccountSignIn": "هل لديك حساب بالفعل؟ سجل الدخول",
655+
"@alreadyHaveAccountSignIn": {
656+
"description": "Link to login from register"
657+
},
658+
"back": "رجوع",
659+
"@back": {
660+
"description": "Back button"
661+
},
662+
"backToSignIn": "العودة إلى تسجيل الدخول",
663+
"@backToSignIn": {
664+
"description": "Link back to login"
665+
},
666+
"cancelChangesTitle": "تجاهل التغييرات؟",
667+
"@cancelChangesTitle": {
668+
"description": "Confirm-cancel dialog title"
669+
},
670+
"checkInboxAndClick": "تحقق من بريدك الوارد وانقر على رابط التحقق للمتابعة.",
671+
"@checkInboxAndClick": {
672+
"description": "Email verification instructions continued"
673+
},
674+
"checkSpamFolder": "• تحقق من مجلد الرسائل غير المرغوب فيها",
675+
"@checkSpamFolder": {
676+
"description": "Help tip 1"
677+
},
678+
"completeSetup": "إكمال الإعداد",
679+
"@completeSetup": {
680+
"description": "Complete setup button"
681+
},
682+
"confirmPassword": "تأكيد كلمة المرور",
683+
"@confirmPassword": {
684+
"description": "Confirm password field label"
685+
},
686+
"confirmYourPassword": "أكد كلمة المرور",
687+
"@confirmYourPassword": {
688+
"description": "Confirm password field hint"
689+
},
690+
"continueButton": "متابعة",
691+
"@continueButton": {
692+
"description": "Continue button"
693+
},
694+
"continueEditing": "متابعة التحرير",
695+
"@continueEditing": {
696+
"description": "Confirm-cancel: keep editing button"
697+
},
698+
"createAccount": "إنشاء حساب",
699+
"@createAccount": {
700+
"description": "Register screen title"
701+
},
702+
"daysAgo": "منذ {count} يوم",
703+
"@daysAgo": {
704+
"description": "Relative time: N days ago",
705+
"placeholders": {
706+
"count": {
707+
"type": "int"
708+
}
709+
}
710+
},
711+
"didntReceiveEmail": "لم تستلم البريد؟",
712+
"@didntReceiveEmail": {
713+
"description": "Help section title"
714+
},
715+
"discardChanges": "تجاهل",
716+
"@discardChanges": {
717+
"description": "Confirm-cancel: discard button"
718+
},
719+
"displayName": "الاسم المعروض",
720+
"@displayName": {
721+
"description": "Display name field label"
722+
},
723+
"displayNameHint": "أدخل اسمك المعروض",
724+
"@displayNameHint": {
725+
"description": "Hint for display name text field"
726+
},
727+
"displayNameInvalidChars": "الاسم يحتوي على أحرف غير صالحة",
728+
"@displayNameInvalidChars": {
729+
"description": "Display name forbidden-character error"
730+
},
731+
"displayNameTooShort": "يجب أن يكون الاسم على الأقل {min} حرفًا",
732+
"@displayNameTooShort": {
733+
"description": "Display name minimum length error",
734+
"placeholders": {
735+
"min": {
736+
"type": "int"
737+
}
738+
}
739+
},
740+
"editProfile": "تعديل الملف الشخصي",
741+
"@editProfile": {
742+
"description": "Edit profile button + page title"
743+
},
744+
"editProfileNoteTitle": "ملاحظة",
745+
"@editProfileNoteTitle": {
746+
"description": "Section title for tips on edit profile"
747+
},
748+
"editProfileTipCurrency": "• العملة المفضلة تُستخدم كافتراضية",
749+
"@editProfileTipCurrency": {
750+
"description": "Edit-profile tip about default currency"
751+
},
752+
"editProfileTipDisplayName": "• اسمك المعروض يظهر للأعضاء الآخرين",
753+
"@editProfileTipDisplayName": {
754+
"description": "Edit-profile tip about display name visibility"
755+
},
756+
"editProfileTipLanguage": "• تغييرات اللغة تنطبق على التطبيق بالكامل",
757+
"@editProfileTipLanguage": {
758+
"description": "Edit-profile tip about language scope"
759+
},
760+
"emailSentCheckInbox": "تم إرسال البريد! تحقق من بريدك الوارد.",
761+
"@emailSentCheckInbox": {
762+
"description": "Success message after resending email"
763+
},
764+
"emailVerifiedSuccessfully": "تم التحقق من بريدك بنجاح",
765+
"@emailVerifiedSuccessfully": {
766+
"description": "Email verification success message"
767+
},
768+
"enterEmailForReset": "أدخل بريدك الإلكتروني وسنرسل لك رابطًا لإعادة تعيين كلمة المرور",
769+
"@enterEmailForReset": {
770+
"description": "Forgot password instructions"
771+
},
772+
"enterNewPassword": "أدخل كلمة المرور الجديدة أدناه",
773+
"@enterNewPassword": {
774+
"description": "Reset password instructions"
775+
},
776+
"enterYourEmail": "أدخل بريدك الإلكتروني",
777+
"@enterYourEmail": {
778+
"description": "Email field hint"
779+
},
780+
"enterYourName": "أدخل اسمك",
781+
"@enterYourName": {
782+
"description": "Display name field hint"
783+
},
784+
"enterYourPassword": "أدخل كلمة المرور",
785+
"@enterYourPassword": {
786+
"description": "Password field hint"
787+
},
788+
"errorWithMessage": "خطأ: {message}",
789+
"@errorWithMessage": {
790+
"description": "Inline error banner with detail message",
791+
"placeholders": {
792+
"message": {
793+
"type": "String"
794+
}
795+
}
796+
},
797+
"forgotPassword": "نسيت كلمة المرور؟",
798+
"@forgotPassword": {
799+
"description": "Forgot password link"
800+
},
801+
"forgotPasswordQuestion": "نسيت كلمة المرور؟",
802+
"@forgotPasswordQuestion": {
803+
"description": "Forgot password screen title"
804+
},
805+
"getStarted": "ابدأ",
806+
"@getStarted": {
807+
"description": "Get started button"
808+
},
809+
"joinGrexToday": "انضم إلى Grex اليوم",
810+
"@joinGrexToday": {
811+
"description": "Register screen subtitle"
812+
},
813+
"joinedAt": "انضم في {date}",
814+
"@joinedAt": {
815+
"description": "Profile creation summary line",
816+
"placeholders": {
817+
"date": {
818+
"type": "String"
819+
}
820+
}
821+
},
822+
"lastUpdatedAt": "آخر تحديث",
823+
"@lastUpdatedAt": {
824+
"description": "Info card title for last profile update"
825+
},
826+
"monthsAgo": "منذ {count} شهر",
827+
"@monthsAgo": {
828+
"description": "Relative time: N months ago",
829+
"placeholders": {
830+
"count": {
831+
"type": "int"
832+
}
833+
}
834+
},
835+
"newPassword": "كلمة المرور الجديدة",
836+
"@newPassword": {
837+
"description": "New password field label"
838+
},
839+
"noProfileData": "لا توجد بيانات للملف الشخصي",
840+
"@noProfileData": {
841+
"description": "Shown when profile state has no profile attached"
842+
},
843+
"openEmailApp": "فتح تطبيق البريد",
844+
"@openEmailApp": {
845+
"description": "Open email app button"
846+
},
847+
"orContinueWith": "أو",
848+
"@orContinueWith": {
849+
"description": "Divider text for social login"
850+
},
851+
"passwordRequirements": "على الأقل 8 أحرف مع أحرف كبيرة وصغيرة وأرقام",
852+
"@passwordRequirements": {
853+
"description": "Password requirements hint"
854+
},
855+
"passwordResetSuccessfully": "تمت إعادة تعيين كلمة المرور بنجاح",
856+
"@passwordResetSuccessfully": {
857+
"description": "Password reset success message"
858+
},
859+
"passwordsDoNotMatch": "كلمتا المرور غير متطابقتين",
860+
"@passwordsDoNotMatch": {
861+
"description": "Password mismatch error"
862+
},
863+
"pleaseWaitSeconds": "يرجى الانتظار {seconds} ثانية",
864+
"@pleaseWaitSeconds": {
865+
"description": "Cooldown message for resend button",
866+
"placeholders": {
867+
"seconds": {
868+
"type": "int"
869+
}
870+
}
871+
},
872+
"profileFullTitle": "ملفك الشخصي",
873+
"@profileFullTitle": {
874+
"description": "Profile page large heading / hero title"
875+
},
876+
"profileLoadFailed": "تعذر تحميل ملفك الشخصي",
877+
"@profileLoadFailed": {
878+
"description": "Profile page error title when load fails"
879+
},
880+
"profileTitle": "الملف الشخصي",
881+
"@profileTitle": {
882+
"description": "Profile page app bar title"
883+
},
884+
"profileUpdatedSuccess": "تم تحديث الملف الشخصي بنجاح",
885+
"@profileUpdatedSuccess": {
886+
"description": "Snackbar after profile saves successfully"
887+
},
888+
"refreshTooltip": "تحديث",
889+
"@refreshTooltip": {
890+
"description": "Tooltip for refresh action button"
891+
},
892+
"resendEmail": "إعادة إرسال البريد",
893+
"@resendEmail": {
894+
"description": "Resend verification email button"
895+
},
896+
"resetLinkSent": "تم إرسال رابط إعادة التعيين! تحقق من بريدك.",
897+
"@resetLinkSent": {
898+
"description": "Success message after sending reset link"
899+
},
900+
"resetPassword": "إعادة تعيين كلمة المرور",
901+
"@resetPassword": {
902+
"description": "Reset password screen title"
903+
},
904+
"saveChanges": "حفظ التغييرات",
905+
"@saveChanges": {
906+
"description": "Save button on edit profile"
907+
},
908+
"saving": "جارٍ الحفظ...",
909+
"@saving": {
910+
"description": "Save button loading label"
911+
},
912+
"selectCurrency": "اختر العملة",
913+
"@selectCurrency": {
914+
"description": "Currency selector label"
915+
},
916+
"sendResetLink": "إرسال رابط إعادة التعيين",
917+
"@sendResetLink": {
918+
"description": "Send reset link button"
919+
},
920+
"signInToContinue": "سجل الدخول للمتابعة",
921+
"@signInToContinue": {
922+
"description": "Login screen subtitle"
923+
},
924+
"signOut": "تسجيل الخروج",
925+
"@signOut": {
926+
"description": "Sign out button"
927+
},
928+
"signOutConfirmMessage": "هل أنت متأكد من تسجيل الخروج؟",
929+
"@signOutConfirmMessage": {
930+
"description": "Sign-out confirmation dialog body"
931+
},
932+
"signOutConfirmTitle": "تسجيل الخروج",
933+
"@signOutConfirmTitle": {
934+
"description": "Sign-out confirmation dialog title"
935+
},
936+
"skipForNow": "تخطي الآن",
937+
"@skipForNow": {
938+
"description": "Skip setup button"
939+
},
940+
"stepOfTwo": "الخطوة 1 من 2",
941+
"@stepOfTwo": {
942+
"description": "Progress indicator"
943+
},
944+
"success": "نجاح!",
945+
"@success": {
946+
"description": "Success screen title"
947+
},
948+
"today": "اليوم",
949+
"@today": {
950+
"description": "Relative time: today"
951+
},
952+
"unsavedChangesMessage": "لديك تغييرات غير محفوظة. هل أنت متأكد من الإلغاء؟",
953+
"@unsavedChangesMessage": {
954+
"description": "Confirm-cancel dialog body"
955+
},
956+
"uploadPhoto": "رفع صورة",
957+
"@uploadPhoto": {
958+
"description": "Avatar upload button"
959+
},
960+
"verificationEmailSent": "أرسلنا رسالة تحقق إلى:",
961+
"@verificationEmailSent": {
962+
"description": "Email verification instructions"
963+
},
964+
"verifyEmailAddress": "• تأكد من صحة عنوان البريد",
965+
"@verifyEmailAddress": {
966+
"description": "Help tip 2"
967+
},
968+
"verifyYourEmail": "تحقق من بريدك",
969+
"@verifyYourEmail": {
970+
"description": "Email verification screen title"
971+
},
972+
"waitFewMinutes": "• انتظر بضع دقائق وحاول مرة أخرى",
973+
"@waitFewMinutes": {
974+
"description": "Help tip 3"
975+
},
976+
"weeksAgo": "منذ {count} أسبوع",
977+
"@weeksAgo": {
978+
"description": "Relative time: N weeks ago",
979+
"placeholders": {
980+
"count": {
981+
"type": "int"
982+
}
983+
}
984+
},
985+
"welcomeBack": "مرحبًا بعودتك",
986+
"@welcomeBack": {
987+
"description": "Login screen title"
988+
},
989+
"yearsAgo": "منذ {count} سنة",
990+
"@yearsAgo": {
991+
"description": "Relative time: N years ago",
992+
"placeholders": {
993+
"count": {
994+
"type": "int"
995+
}
996+
}
997+
},
998+
"yesterday": "أمس",
999+
"@yesterday": {
1000+
"description": "Relative time: yesterday"
6411001
}
6421002
}

0 commit comments

Comments
 (0)