Files
food-ai/client/lib/l10n/app_ar.arb
dbastrikin 205edbdade feat: rename ingredients→products, products→user_products; add barcode/OFF import
- Rename catalog: ingredient/* → product/* (canonical_name, barcode, nutrition per 100g)
- Rename pantry: product/* → userproduct/* (user-owned items with expiry)
- Squash migrations into single 001_initial_schema.sql (clean-db baseline)
- product_categories: add English canonical name column; fix COALESCE in queries
- Remove product_translations: product names are stored in their original language
- Add default_unit_name to product API responses via unit_translations JOIN
- Add cmd/importoff: bulk import from OpenFoodFacts JSONL dump (COPY + ON CONFLICT)
- Diary: support product_id entries alongside dish_id (CHECK num_nonnulls = 1)
- Home: getLoggedCalories joins both recipes and catalog products
- Flutter: rename models/providers/services to match backend rename
- Flutter: add barcode scan flow for diary (mobile_scanner, product_portion_sheet)
- Flutter: localise 6 new keys across 12 languages (barcode scan, portion weight)
- Routes: GET /products/search, GET /products/barcode/{barcode}, /user-products

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 12:45:48 +02:00

115 lines
4.5 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 جم"
}