#!/usr/bin/env python3 """ Fix Japanese translation file: replace English/Chinese placeholders with proper Japanese. Brand names (Voitrans, Lily, WeChat, Alipay, PayPal, Apple, Google, Bluetooth, BLE, OTA, AI, ASR, TTS, VOITRANS, AIPEN, VoiTrans, DeepSound) are kept as-is. """ import re filepath = 'lib/core/translations/language/ja_jp.dart' with open(filepath, 'r', encoding='utf-8') as f: content = f.read() # Each tuple: (old_string, new_string) # We use exact string replacement to be safe. replacements = [ # ---- English-only entries that need translation ---- # viewAll (" 'viewAll': 'View All',", " 'viewAll': 'すべて表示',"), # proMonthly – price tag, keep currency but translate label (" 'proMonthly': 'Pro ¥60/month',", " 'proMonthly': 'Pro ¥60/月',"), # proMonthlyDesc – multiline (" 'proMonthlyDesc':\n '7-day free trial, then ¥800/year. Cancel anytime before trial ends.',", " 'proMonthlyDesc':\n '7日間無料トライアル、その後¥800/年。トライアル終了前にいつでもキャンセル可能。',"), # proMonthlyPrice (" 'proMonthlyPrice': '¥120/month',", " 'proMonthlyPrice': '¥120/月',"), # unlimitedMonthlyPrice (" 'unlimitedMonthlyPrice': '¥198/month',", " 'unlimitedMonthlyPrice': '¥198/月',"), # currentQuality (' "currentQuality": "Current quality: @value%",', ' "currentQuality": "現在の品質: @value%",'), # currentMaxSize (' "currentMaxSize": "Current: @pxpx",', ' "currentMaxSize": "現在: @pxpx",'), # allStepsCompleted (' "allStepsCompleted": "All steps completed",', ' "allStepsCompleted": "すべてのステップが完了しました",'), # clean / Clear Cache (" 'clean': 'Clear Cache',", " 'clean': 'キャッシュをクリア',"), # cleanTips (" 'cleanTips': 'Are you sure you want to clear personal cache?',", " 'cleanTips': '個人キャッシュをクリアしてもよろしいですか?',"), # permissionUtilNeed (" 'permissionUtilNeed': 'Need ',", " 'permissionUtilNeed': '必要:',"), # iapCustomerServiceQQLabel (" 'iapCustomerServiceQQLabel': 'IAP customer service QQ: @qq',", " 'iapCustomerServiceQQLabel': 'IAP カスタマーサービス QQ: @qq',"), # tsransit (transit / 公交) (' "tsransit": "Transit",', ' "tsransit": "乗り換え",'), # sixThousandMinutes / threeThousandMinutes / sixHundredMinutes / oneHundredTwentyMinutes (" 'sixThousandMinutes': '6,000 minutes',", " 'sixThousandMinutes': '6,000分',"), (" 'threeThousandMinutes': '3,000 minutes',", " 'threeThousandMinutes': '3,000分',"), (" 'sixHundredMinutes': '600 minutes',", " 'sixHundredMinutes': '600分',"), (" 'oneHundredTwentyMinutes': '120 minutes',", " 'oneHundredTwentyMinutes': '120分',"), ] original = content for old, new in replacements: if old in content: content = content.replace(old, new) print(f'REPLACED: {repr(old[:60])}') else: print(f'NOT FOUND: {repr(old[:60])}') if content != original: with open(filepath, 'w', encoding='utf-8') as f: f.write(content) print('\nFile updated successfully.') else: print('\nNo changes made.')