Files
food-ai/client/lib/l10n/app_ar.arb
dbastrikin 78f1c8bf76 feat: food search sheet with FTS+trgm, dish/recent endpoints, multilingual aliases
Backend:
- GET /dishes/search — hybrid FTS (english + simple) + trgm + ILIKE search
- GET /diary/recent — recently used dishes and products for the current user
- product search upgraded: FTS on canonical_name and product_aliases, ranked by GREATEST(ts_rank, similarity)
- importoff: collect product_name_ru/de/fr/... as product_aliases for multilingual search (e.g. "сникерс" → "Snickers")
- migrations: FTS + trgm indexes merged into 001_initial_schema.sql (002 removed)

Flutter:
- FoodSearchSheet: debounced search field, recently-used section, product/dish results, scan-photo and barcode chips
- DishPortionSheet: quick ½/1/1½/2 buttons + custom input
- + button in meal card now opens FoodSearchSheet instead of going directly to AI scan
- 7 new l10n keys across all 12 languages

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 15:28:29 +02:00

128 lines
5.0 KiB
Plaintext

{
"@@locale": "ar",
"appTitle": "FoodAI",
"greetingMorning": "صباح الخير",
"greetingAfternoon": "مساء الخير",
"greetingEvening": "مساء النور",
"caloriesUnit": "سعرة",
"gramsUnit": "غ",
"goalLabel": "الهدف:",
"consumed": "المستهلك",
"remaining": "المتبقي",
"exceeded": "تجاوز",
"proteinLabel": "بروتين",
"fatLabel": "دهون",
"carbsLabel": "كربوهيدرات",
"today": "اليوم",
"yesterday": "أمس",
"mealsSection": "الوجبات",
"addDish": "إضافة طبق",
"scanDish": "مسح",
"menu": "القائمة",
"dishHistory": "سجل الأطباق",
"recommendCook": "نوصي بطهي",
"camera": "الكاميرا",
"gallery": "المعرض",
"analyzingPhoto": "تحليل الصورة...",
"inQueue": "أنت في قائمة الانتظار",
"queuePosition": "الموضع {position}",
"@queuePosition": {
"placeholders": {
"position": {
"type": "int"
}
}
},
"processing": "جارٍ المعالجة...",
"upgradePrompt": "تخطي قائمة الانتظار؟ ترقية →",
"recognitionFailed": "فشل التعرف. حاول مرة أخرى.",
"dishRecognition": "التعرف على الأطباق",
"all": "الكل",
"dishRecognized": "تم التعرف على الطبق",
"recognizing": "جارٍ التعرف…",
"recognitionError": "خطأ في التعرف",
"dishResultTitle": "تم التعرف على الطبق",
"selectDish": "اختر طبقًا",
"dishNotRecognized": "لم يتم التعرف على الطبق",
"tryAgain": "حاول مرة أخرى",
"nutritionApproximate": "القيم الغذائية تقريبية — مقدَّرة من الصورة.",
"portion": "الحصة",
"mealType": "نوع الوجبة",
"dateLabel": "التاريخ",
"addToJournal": "إضافة إلى السجل",
"addFailed": "فشل الإضافة. حاول مرة أخرى.",
"historyTitle": "سجل التعرف",
"historyLoadError": "فشل تحميل السجل",
"retry": "إعادة المحاولة",
"noHistory": "لا توجد تعرفات بعد",
"profileTitle": "الملف الشخصي",
"edit": "تعديل",
"bodyParams": "معاملات الجسم",
"goalActivity": "الهدف والنشاط",
"nutrition": "التغذية",
"settings": "الإعدادات",
"height": "الطول",
"weight": "الوزن",
"age": "العمر",
"gender": "الجنس",
"genderMale": "ذكر",
"genderFemale": "أنثى",
"goalLoss": "خسارة الوزن",
"goalMaintain": "الحفاظ على الوزن",
"goalGain": "بناء العضلات",
"activityLow": "منخفض",
"activityMedium": "متوسط",
"activityHigh": "مرتفع",
"calorieGoal": "هدف السعرات",
"mealTypes": "أنواع الوجبات",
"formulaNote": "محسوب بمعادلة ميفلين سانت جيور",
"language": "اللغة",
"notSet": "غير محدد",
"calorieHint": "أدخل معاملات الجسم لحساب هدف السعرات",
"logout": "تسجيل الخروج",
"editProfile": "تعديل الملف الشخصي",
"cancel": "إلغاء",
"save": "حفظ",
"nameLabel": "الاسم",
"heightCm": "الطول (سم)",
"weightKg": "الوزن (كغ)",
"birthDate": "تاريخ الميلاد",
"nameRequired": "أدخل الاسم",
"profileUpdated": "تم تحديث الملف الشخصي",
"profileSaveFailed": "فشل الحفظ",
"mealTypeBreakfast": "الإفطار",
"mealTypeSecondBreakfast": "الإفطار الثاني",
"mealTypeLunch": "الغداء",
"mealTypeAfternoonSnack": "وجبة العصر",
"mealTypeDinner": "العشاء",
"mealTypeSnack": "وجبة خفيفة",
"navHome": "الرئيسية",
"navProducts": "المنتجات",
"navRecipes": "الوصفات",
"addFromReceiptOrPhoto": "إضافة من الإيصال أو الصورة",
"chooseMethod": "اختر الطريقة",
"photoReceipt": "تصوير الإيصال",
"photoReceiptSubtitle": "التعرف على جميع المنتجات من الإيصال",
"photoProducts": "تصوير المنتجات",
"photoProductsSubtitle": "الثلاجة، الطاولة، الرف — حتى 3 صور",
"addPackagedFood": "إضافة منتج معبأ",
"scanBarcode": "مسح الباركود",
"portionWeightG": "وزن الحصة (جم)",
"productNotFound": "المنتج غير موجود",
"enterManually": "أدخل يدوياً",
"perHundredG": "لكل 100 جم",
"searchFoodHint": "البحث عن المنتجات والأطباق...",
"recentlyUsedLabel": "المستخدمة مؤخراً",
"productsSection": "المنتجات",
"dishesSection": "الأطباق",
"noResultsForQuery": "لم يتم العثور على نتائج لـ \"{query}\"",
"@noResultsForQuery": {
"placeholders": {
"query": { "type": "String" }
}
},
"servingsLabel": "حصص",
"addToDiary": "إضافة إلى اليومية",
"scanDishPhoto": "مسح الصورة"
}