feat: Flutter client localisation (12 languages)

Add flutter_localizations + intl, 12 ARB files (en/ru/es/de/fr/it/pt/zh/ja/ko/ar/hi),
replace all hardcoded Russian UI strings with AppLocalizations, detect system locale
on first launch, localise bottom nav bar labels, document rule in CLAUDE.md.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
dbastrikin
2026-03-19 22:22:52 +02:00
parent 9357c194eb
commit 54b10d51e2
40 changed files with 5919 additions and 267 deletions

View File

@@ -0,0 +1,288 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Japanese (`ja`).
class AppLocalizationsJa extends AppLocalizations {
AppLocalizationsJa([String locale = 'ja']) : super(locale);
@override
String get appTitle => 'FoodAI';
@override
String get greetingMorning => 'おはようございます';
@override
String get greetingAfternoon => 'こんにちは';
@override
String get greetingEvening => 'こんばんは';
@override
String get caloriesUnit => 'kcal';
@override
String get gramsUnit => 'g';
@override
String get goalLabel => '目標:';
@override
String get consumed => '摂取済み';
@override
String get remaining => '残り';
@override
String get exceeded => '超過';
@override
String get proteinLabel => 'タンパク質';
@override
String get fatLabel => '脂質';
@override
String get carbsLabel => '炭水化物';
@override
String get today => '今日';
@override
String get yesterday => '昨日';
@override
String get mealsSection => '食事';
@override
String get addDish => '料理を追加';
@override
String get scanDish => 'スキャン';
@override
String get menu => 'メニュー';
@override
String get dishHistory => '料理履歴';
@override
String get recommendCook => 'おすすめレシピ';
@override
String get camera => 'カメラ';
@override
String get gallery => 'ギャラリー';
@override
String get analyzingPhoto => '写真を分析中...';
@override
String get inQueue => '順番待ち中';
@override
String queuePosition(int position) {
return '$position番目';
}
@override
String get processing => '処理中...';
@override
String get upgradePrompt => '順番をスキップ?アップグレード →';
@override
String get recognitionFailed => '認識に失敗しました。もう一度お試しください。';
@override
String get dishRecognition => '料理認識';
@override
String get all => 'すべて';
@override
String get dishRecognized => '料理を認識しました';
@override
String get recognizing => '認識中…';
@override
String get recognitionError => '認識エラー';
@override
String get dishResultTitle => '料理を認識しました';
@override
String get selectDish => '料理を選択';
@override
String get dishNotRecognized => '料理を認識できませんでした';
@override
String get tryAgain => 'もう一度試す';
@override
String get nutritionApproximate => '栄養値は概算です — 写真から推定されました。';
@override
String get portion => '';
@override
String get mealType => '食事タイプ';
@override
String get dateLabel => '日付';
@override
String get addToJournal => '日記に追加';
@override
String get addFailed => '追加に失敗しました。もう一度お試しください。';
@override
String get historyTitle => '認識履歴';
@override
String get historyLoadError => '履歴の読み込みに失敗しました';
@override
String get retry => '再試行';
@override
String get noHistory => '認識履歴がありません';
@override
String get profileTitle => 'プロフィール';
@override
String get edit => '編集';
@override
String get bodyParams => '身体パラメータ';
@override
String get goalActivity => '目標 & 活動';
@override
String get nutrition => '栄養';
@override
String get settings => '設定';
@override
String get height => '身長';
@override
String get weight => '体重';
@override
String get age => '年齢';
@override
String get gender => '性別';
@override
String get genderMale => '男性';
@override
String get genderFemale => '女性';
@override
String get goalLoss => '体重減少';
@override
String get goalMaintain => '維持';
@override
String get goalGain => '筋肉増量';
@override
String get activityLow => '低い';
@override
String get activityMedium => '普通';
@override
String get activityHigh => '高い';
@override
String get calorieGoal => 'カロリー目標';
@override
String get mealTypes => '食事タイプ';
@override
String get formulaNote => 'ミフリン・セントジョー式で計算';
@override
String get language => '言語';
@override
String get notSet => '未設定';
@override
String get calorieHint => 'カロリー目標を計算するために身体パラメータを入力してください';
@override
String get logout => 'ログアウト';
@override
String get editProfile => 'プロフィールを編集';
@override
String get cancel => 'キャンセル';
@override
String get save => '保存';
@override
String get nameLabel => '名前';
@override
String get heightCm => '身長cm';
@override
String get weightKg => '体重kg';
@override
String get birthDate => '生年月日';
@override
String get nameRequired => '名前を入力してください';
@override
String get profileUpdated => 'プロフィールを更新しました';
@override
String get profileSaveFailed => '保存に失敗しました';
@override
String get mealTypeBreakfast => '朝食';
@override
String get mealTypeSecondBreakfast => '第二朝食';
@override
String get mealTypeLunch => '昼食';
@override
String get mealTypeAfternoonSnack => 'おやつ';
@override
String get mealTypeDinner => '夕食';
@override
String get mealTypeSnack => '間食';
@override
String get navHome => 'ホーム';
@override
String get navProducts => '食品';
@override
String get navRecipes => 'レシピ';
}