@tduncan / Cortana / commits / 6727843

feat: add Japanese language support

dtrknt15 committed May 28, 2026 at 04:39 UTC 6727843b3eb6682e6b67276040284a674a21e3b5
6 files changed +1613
assets/images/flag_jp.png
Binary files /dev/null and b/assets/images/flag_jp.png differ
lib/app.dart
+1
@@ -224,6 +224,7 @@ class App extends ConsumerWidget {
224 Locale('es'),
225 Locale('hi'),
226 Locale('it'),
227 + Locale('ja'),
228 ],
229 locale: localeCode != null ? Locale(localeCode) : null,
230 localeResolutionCallback: (locale, supportedLocales) {
lib/features/onboarding/screens/onboarding_language_screen.dart
+10
@@ -101,6 +101,16 @@ const _languages = [
101 shortText: 'Hi',
102 gradient: [Color(0xFFEC4899), Color(0xFFDB2777)],
103 ),
104 + _LanguageOption(
105 + code: 'ja',
106 + nativeName: '日本語',
107 + englishName: 'Japanese',
108 + flag: '🇯🇵',
109 + flagAsset: 'assets/images/flag_jp.png',
110 + countryCode: 'JP',
111 + shortText: 'Ja',
112 + gradient: [Color(0xFFF43F5E), Color(0xFFBE123C)],
113 + ),
114 ];
115
116 class OnboardingLanguageScreen extends ConsumerStatefulWidget {
lib/features/settings/views/settings_screen.dart
+1
@@ -316,6 +316,7 @@ class _LanguageSetting extends StatelessWidget {
316
317 static const _localeItems = <(String, String, String, String)>[
318 ('en', 'English', 'assets/images/flag_us.png', '🇺🇸'),
319 + ('ja', '日本語', 'assets/images/flag_jp.png', '🇯🇵'),
320 ('it', 'Italiano', 'assets/images/flag_it.png', '🇮🇹'),
321 ('es', 'Español', 'assets/images/flag_es.png', '🇪🇸'),
322 ('zh', '中文', 'assets/images/flag_cn.png', '🇨🇳'),
lib/l10n/app_localizations.dart
+5
@@ -11,6 +11,7 @@ import 'app_localizations_en.dart';
11 import 'app_localizations_es.dart';
12 import 'app_localizations_hi.dart';
13 import 'app_localizations_it.dart';
14 +import 'app_localizations_ja.dart';
15 import 'app_localizations_zh.dart';
16
17 // ignore_for_file: type=lint
@@ -105,6 +106,7 @@ abstract class AppLocalizations {
106 Locale('es'),
107 Locale('hi'),
108 Locale('it'),
109 + Locale('ja'),
110 Locale('zh'),
111 ];
112
@@ -3114,6 +3116,7 @@ class _AppLocalizationsDelegate
3116 'es',
3117 'hi',
3118 'it',
3119 + 'ja',
3120 'zh',
3121 ].contains(locale.languageCode);
3122
@@ -3136,6 +3139,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) {
3139 return AppLocalizationsHi();
3140 case 'it':
3141 return AppLocalizationsIt();
3142 + case 'ja':
3143 + return AppLocalizationsJa();
3144 case 'zh':
3145 return AppLocalizationsZh();
3146 }
lib/l10n/app_localizations_ja.dart new
+1596
@@ -0,0 +1,1596 @@
1 +// ignore: unused_import
2 +import 'package:intl/intl.dart' as intl;
3 +import 'app_localizations.dart';
4 +
5 +// ignore_for_file: type=lint
6 +
7 +/// The translations for Japanese (`ja`).
8 +class AppLocalizationsJa extends AppLocalizations {
9 + AppLocalizationsJa([String locale = 'ja']) : super(locale);
10 +
11 + @override
12 + String get app_name => 'LocalMind';
13 +
14 + @override
15 + String get app_tagline => 'ローカルAI。プライバシーを保護して、あなたのルールで。';
16 +
17 + @override
18 + String get app_version => '1.0.0';
19 +
20 + @override
21 + String get cancel => 'キャンセル';
22 +
23 + @override
24 + String get confirm => '確認';
25 +
26 + @override
27 + String get delete => '削除';
28 +
29 + @override
30 + String get save => '保存';
31 +
32 + @override
33 + String get retry => '再試行';
34 +
35 + @override
36 + String get close => '閉じる';
37 +
38 + @override
39 + String get done => '完了';
40 +
41 + @override
42 + String get continue_action => '続行';
43 +
44 + @override
45 + String get skip => 'スキップ';
46 +
47 + @override
48 + String get install => 'インストール';
49 +
50 + @override
51 + String get download => 'ダウンロード';
52 +
53 + @override
54 + String get resume => '再開';
55 +
56 + @override
57 + String get pause => '一時停止';
58 +
59 + @override
60 + String get stop => '停止';
61 +
62 + @override
63 + String get edit => '編集';
64 +
65 + @override
66 + String get preview => 'プレビュー';
67 +
68 + @override
69 + String get unload => 'アンロード';
70 +
71 + @override
72 + String get load => 'ロード';
73 +
74 + @override
75 + String get rename => '名前変更';
76 +
77 + @override
78 + String get pin => 'ピン留め';
79 +
80 + @override
81 + String get unpin => 'ピン留め解除';
82 +
83 + @override
84 + String get share => '共有';
85 +
86 + @override
87 + String get copy => 'コピー';
88 +
89 + @override
90 + String get copied => 'コピーしました!';
91 +
92 + @override
93 + String get copied_to_clipboard => 'クリップボードにコピーしました';
94 +
95 + @override
96 + String get select => '選択';
97 +
98 + @override
99 + String get active => 'アクティブ';
100 +
101 + @override
102 + String get all => 'すべて';
103 +
104 + @override
105 + String get none => 'なし';
106 +
107 + @override
108 + String get none_selected => '未選択';
109 +
110 + @override
111 + String get online => 'オンライン';
112 +
113 + @override
114 + String get offline => 'オフライン';
115 +
116 + @override
117 + String get error => 'エラー';
118 +
119 + @override
120 + String get unknown_error => '不明なエラー';
121 +
122 + @override
123 + String get not_now => '後で';
124 +
125 + @override
126 + String get enable => '有効にする';
127 +
128 + @override
129 + String get proceed_anyway => 'このまま続行';
130 +
131 + @override
132 + String get test_connection => '接続テスト';
133 +
134 + @override
135 + String get testing => 'テスト中...';
136 +
137 + @override
138 + String get connection_successful => '接続に成功しました!';
139 +
140 + @override
141 + String get connection_failed => '接続に失敗しました。設定を確認してください。';
142 +
143 + @override
144 + String get save_continue => '保存して続行';
145 +
146 + @override
147 + String get save_changes => '変更を保存';
148 +
149 + @override
150 + String get finish_setup => 'セットアップを完了';
151 +
152 + @override
153 + String get start_new_chat => '新しいチャットを開始';
154 +
155 + @override
156 + String get cannot_undo => 'この操作は取り消せません。';
157 +
158 + @override
159 + String get ram_warning => 'RAM警告';
160 +
161 + @override
162 + String get recommended => '推奨';
163 +
164 + @override
165 + String get may_be_large => 'このデバイスには大きすぎる可能性があります';
166 +
167 + @override
168 + String get calculating => '計算中...';
169 +
170 + @override
171 + String get download_failed => 'ダウンロード失敗';
172 +
173 + @override
174 + String get downloaded => 'ダウンロード済み';
175 +
176 + @override
177 + String get not_downloaded => '未ダウンロード';
178 +
179 + @override
180 + String get installed => 'インストール済み';
181 +
182 + @override
183 + String get not_installed => '未インストール';
184 +
185 + @override
186 + String get loading => '読み込み中...';
187 +
188 + @override
189 + String get thinking => '思考中';
190 +
191 + @override
192 + String get processing => '処理中...';
193 +
194 + @override
195 + String get initializing => '初期化中...';
196 +
197 + @override
198 + String get ready => '準備完了';
199 +
200 + @override
201 + String get preparing_app => 'アプリを準備中...';
202 +
203 + @override
204 + String get initializing_services => 'サービスを初期化中...';
205 +
206 + @override
207 + String get configuring_server => 'サーバーを構成中...';
208 +
209 + @override
210 + String get startup_failed => '起動に失敗しました';
211 +
212 + @override
213 + String get something_went_wrong => '問題が発生しました';
214 +
215 + @override
216 + String get delete_model_title => 'モデルを削除';
217 +
218 + @override
219 + String delete_model_body(String name) {
220 + return '$name を削除してもよろしいですか?';
221 + }
222 +
223 + @override
224 + String delete_model_body_with_size(String name, String size) {
225 + return '$name を削除してもよろしいですか?これにより約 $size の空き容量が増えます。\n\n必要に応じて、このモデルは後で再ダウンロードできます。';
226 + }
227 +
228 + @override
229 + String get delete_voice_title => '音声の削除';
230 +
231 + @override
232 + String delete_voice_body(String name, String size) {
233 + return '$name を削除してもよろしいですか?これにより約 $size の空き容量が増えます。\n\n必要に応じて、この音声は後で再ダウンロードできます。';
234 + }
235 +
236 + @override
237 + String get delete_server_title => 'サーバーの削除';
238 +
239 + @override
240 + String delete_server_body(String name) {
241 + return '本当に「$name」を削除しますか?この操作は取り消せません。';
242 + }
243 +
244 + @override
245 + String get delete_conversation_title => 'チャットを削除しますか?';
246 +
247 + @override
248 + String delete_conversation_body(String title) {
249 + return '本当に「$title」を削除しますか?この操作は取り消せません。';
250 + }
251 +
252 + @override
253 + String get delete_message_title => 'メッセージを削除しますか?';
254 +
255 + @override
256 + String delete_persona_title(String name) {
257 + return '「$name」を削除しますか?';
258 + }
259 +
260 + @override
261 + String get delete_persona_body => 'この操作は取り消せません。';
262 +
263 + @override
264 + String get clear_conversation_title => 'チャット履歴をクリアしますか?';
265 +
266 + @override
267 + String get clear_conversation_body => 'このチャット内のすべてのメッセージが削除されます。';
268 +
269 + @override
270 + String get clear => 'クリア';
271 +
272 + @override
273 + String label_completed(String label) {
274 + return '$label が完了しました';
275 + }
276 +
277 + @override
278 + String error_with_message(String error) {
279 + return 'エラー: $error';
280 + }
281 +
282 + @override
283 + String preview_failed(String error) {
284 + return 'プレビューに失敗しました: $error';
285 + }
286 +
287 + @override
288 + String loading_model(String modelId) {
289 + return '$modelId を読み込み中...';
290 + }
291 +
292 + @override
293 + String model_loaded(String modelId, String backend) {
294 + return 'モデルを読み込みました: $modelId ($backend)';
295 + }
296 +
297 + @override
298 + String get no_model_loaded =>
299 + 'モデルが読み込まれていません。「ローカルモデルの管理」をタップしてモデルをダウンロードし、読み込んでください。';
300 +
301 + @override
302 + String loading_model_error(String error) {
303 + return 'エラー: $error';
304 + }
305 +
306 + @override
307 + String get delete_conversation => 'チャットを削除しますか?';
308 +
309 + @override
310 + String get nav_history => '履歴';
311 +
312 + @override
313 + String get nav_servers => 'サーバー';
314 +
315 + @override
316 + String get nav_local_models => 'ローカルモデル';
317 +
318 + @override
319 + String get nav_tts => '音声合成';
320 +
321 + @override
322 + String get nav_personas => 'ペルソナ';
323 +
324 + @override
325 + String get nav_settings => '設定';
326 +
327 + @override
328 + String get nav_new_chat => '新しいチャット';
329 +
330 + @override
331 + String get search_hint => 'チャットを検索...';
332 +
333 + @override
334 + String get no_server_selected => 'サーバーが選択されていません';
335 +
336 + @override
337 + String get switch_server => 'サーバー切り替え';
338 +
339 + @override
340 + String get switch_server_subtitle => '接続するサーバーを選択してください';
341 +
342 + @override
343 + String get manage_servers => 'サーバーの管理';
344 +
345 + @override
346 + String get open_source => 'オープンソース';
347 +
348 + @override
349 + String get open_source_desc =>
350 + 'LocalMind はオープンソースです。GitHub で開発状況の確認や貢献ができます。';
351 +
352 + @override
353 + String get star_on_github => 'GitHub でスターを付ける';
354 +
355 + @override
356 + String get settings_title => '設定';
357 +
358 + @override
359 + String get settings_appearance => '外観';
360 +
361 + @override
362 + String get settings_language => '言語';
363 +
364 + @override
365 + String get language_system_default => 'システムデフォルト';
366 +
367 + @override
368 + String get settings_tts => '音声合成';
369 +
370 + @override
371 + String get settings_behavior => '動作';
372 +
373 + @override
374 + String get settings_on_device => 'ローカル推論';
375 +
376 + @override
377 + String get settings_default_server => 'デフォルトサーバー';
378 +
379 + @override
380 + String get settings_default_persona => 'デフォルトペルソナ';
381 +
382 + @override
383 + String get settings_privacy => 'プライバシー';
384 +
385 + @override
386 + String get settings_data_management => 'データ管理';
387 +
388 + @override
389 + String get settings_about => 'LocalMind について';
390 +
391 + @override
392 + String get theme => 'テーマ';
393 +
394 + @override
395 + String get theme_system => 'システム';
396 +
397 + @override
398 + String get theme_light => 'ライト';
399 +
400 + @override
401 + String get theme_dark => 'ダーク';
402 +
403 + @override
404 + String get theme_claude => 'Claude';
405 +
406 + @override
407 + String get font_size => 'フォントサイズ';
408 +
409 + @override
410 + String get font_size_desc => 'チャットのテキストサイズを調整します。';
411 +
412 + @override
413 + String get font_preview => 'これはテキストの表示サイズ確認用のプレビューです。';
414 +
415 + @override
416 + String get code_theme_dark => 'コードテーマ (ダーク)';
417 +
418 + @override
419 + String get code_theme_light => 'コードテーマ (ライト)';
420 +
421 + @override
422 + String get code_theme_desc => 'コードブロックのシンタックスハイライトテーマを選択します。';
423 +
424 + @override
425 + String get tts_engine => '音声合成エンジン';
426 +
427 + @override
428 + String get tts_engine_system => 'システム音声合成';
429 +
430 + @override
431 + String get tts_engine_kitten => 'Kitten TTS';
432 +
433 + @override
434 + String get voice => '音声';
435 +
436 + @override
437 + String get voice_female => '女性';
438 +
439 + @override
440 + String get voice_male => '男性';
441 +
442 + @override
443 + String get voice_other => 'その他';
444 +
445 + @override
446 + String get tts_speed => '読み上げ速度';
447 +
448 + @override
449 + String get tts_speed_desc => '再生速度を調整します。';
450 +
451 + @override
452 + String get manage_tts_models => '音声合成モデルの管理';
453 +
454 + @override
455 + String get manage_on_device_models => 'ローカルモデルの管理';
456 +
457 + @override
458 + String get enable_smart_reply => 'スマートリプライ';
459 +
460 + @override
461 + String get streaming_responses => 'ストリーミング応答';
462 +
463 + @override
464 + String get auto_generate_titles => 'タイトルの自動生成';
465 +
466 + @override
467 + String get send_on_enter => 'Enterキーで送信';
468 +
469 + @override
470 + String get show_system_messages => 'システムメッセージを表示';
471 +
472 + @override
473 + String get haptic_feedback => '触覚フィードバック';
474 +
475 + @override
476 + String get enable_mcp => 'MCPを有効化';
477 +
478 + @override
479 + String get new_chat_mcp_default => '新規チャットでMCPをデフォルトにする';
480 +
481 + @override
482 + String get show_data_indicator => 'データインジケーターを表示';
483 +
484 + @override
485 + String get privacy_info => '「LocalMindがあなたのデータを閲覧することはありません」';
486 +
487 + @override
488 + String get delete_all_conversations => 'すべてのチャット履歴を削除';
489 +
490 + @override
491 + String get reset_settings_defaults => '設定をデフォルトに戻す';
492 +
493 + @override
494 + String get chat_title => 'LocalMind';
495 +
496 + @override
497 + String get chat_parameters_tooltip => 'チャットパラメータ';
498 +
499 + @override
500 + String get change_persona => 'ペルソナを変更';
501 +
502 + @override
503 + String get set_persona => 'ペルソナを設定';
504 +
505 + @override
506 + String get remove_persona => 'ペルソナを削除';
507 +
508 + @override
509 + String get clear_conversation => '履歴をクリア';
510 +
511 + @override
512 + String get connection_error => '接続エラー。サーバーを確認してください。';
513 +
514 + @override
515 + String get disconnected => 'サーバーから切断されました。';
516 +
517 + @override
518 + String get configure => '構成';
519 +
520 + @override
521 + String get select_model => 'モデルを選択';
522 +
523 + @override
524 + String get select_persona => 'ペルソナを選択';
525 +
526 + @override
527 + String get start_conversation => 'チャットを開始しましょう';
528 +
529 + @override
530 + String get recent_chats => '最近のチャット';
531 +
532 + @override
533 + String get see_all => 'すべて見る';
534 +
535 + @override
536 + String get quick_write => '関数の作成をサポートして';
537 +
538 + @override
539 + String get quick_explain => 'このコードを説明して';
540 +
541 + @override
542 + String get quick_debug => 'デバッグして';
543 +
544 + @override
545 + String get quick_async => 'async/await はどう使えばいい?';
546 +
547 + @override
548 + String get history_missing_title => '履歴が見つかりません';
549 +
550 + @override
551 + String get history_missing_desc => 'このチャットのメッセージが削除されたか、履歴レコードが破損しています。';
552 +
553 + @override
554 + String get technical_details => '技術的な詳細';
555 +
556 + @override
557 + String get last_error => '最後のエラー:';
558 +
559 + @override
560 + String get copy_info => '情報をコピー';
561 +
562 + @override
563 + String get conversation_id => '会話ID';
564 +
565 + @override
566 + String get created_at => '作成日時';
567 +
568 + @override
569 + String get expected_messages => '期待されるメッセージ数';
570 +
571 + @override
572 + String get debug_dialog_desc => '同期の問題を特定するための診断情報。';
573 +
574 + @override
575 + String get chat_input_hint => '何でも質問してください';
576 +
577 + @override
578 + String get send_message_tooltip => 'メッセージを送信';
579 +
580 + @override
581 + String get stop_generation_tooltip => '生成を停止';
582 +
583 + @override
584 + String get attach_images_tooltip => '画像を添付';
585 +
586 + @override
587 + String tool_label(String toolCallId) {
588 + return 'ツール: $toolCallId';
589 + }
590 +
591 + @override
592 + String get tool_unknown => 'ツール: 不明';
593 +
594 + @override
595 + String get message_options => 'メッセージオプション';
596 +
597 + @override
598 + String get copy_markdown => 'Markdownとしてコピー';
599 +
600 + @override
601 + String get copied_markdown => 'Markdownとしてコピーしました';
602 +
603 + @override
604 + String get read_aloud => '読み上げる';
605 +
606 + @override
607 + String get stop_reading => '読み上げを停止';
608 +
609 + @override
610 + String get more => 'その他';
611 +
612 + @override
613 + String character_count(int length) {
614 + return '$length 文字';
615 + }
616 +
617 + @override
618 + String get edit_message => 'メッセージを編集';
619 +
620 + @override
621 + String get edit_message_desc => '保存すると、以下の応答が削除され、再生成されます。';
622 +
623 + @override
624 + String get save_regenerate => '保存して再生成';
625 +
626 + @override
627 + String get chat_settings_title => 'チャット設定';
628 +
629 + @override
630 + String get reset_defaults => 'デフォルトに戻す';
631 +
632 + @override
633 + String get parameters_tab => 'パラメータ';
634 +
635 + @override
636 + String get mcp_tab => 'MCP';
637 +
638 + @override
639 + String get temperature => '温度';
640 +
641 + @override
642 + String get temperature_desc => 'ランダム性を制御:高い=創造的、低い=集中';
643 +
644 + @override
645 + String get top_p => 'Top P';
646 +
647 + @override
648 + String get top_p_desc => '核サンプリングしきい値';
649 +
650 + @override
651 + String get max_tokens => '最大トークン数';
652 +
653 + @override
654 + String get max_tokens_desc => '応答制限';
655 +
656 + @override
657 + String get context_length => 'コンテキスト長';
658 +
659 + @override
660 + String get context_length_desc => '履歴ウィンドウ';
661 +
662 + @override
663 + String get mcp_disabled_warning => 'MCPはグローバルで無効化されています。設定画面から有効化して使用してください。';
664 +
665 + @override
666 + String get mcp_enable_chat => 'このチャットでMCPを有効化';
667 +
668 + @override
669 + String get auto_execute_tools => 'ツールの自動実行';
670 +
671 + @override
672 + String get beta_label => 'ベータ';
673 +
674 + @override
675 + String get experimental_label => '実験的';
676 +
677 + @override
678 + String get add_ephemeral_mcp => '一時的なMCPサーバーを追加';
679 +
680 + @override
681 + String get mcp_label_placeholder => 'ラベル';
682 +
683 + @override
684 + String get mcp_url_placeholder => 'URL (https://...)';
685 +
686 + @override
687 + String get active_integrations => '有効な統合';
688 +
689 + @override
690 + String get enable_notifications => '通知を有効にする';
691 +
692 + @override
693 + String get enable_notifications_desc => 'モデルのダウンロード完了時に通知を受け取ります。';
694 +
695 + @override
696 + String get chat_history_title => 'チャット履歴';
697 +
698 + @override
699 + String get conversation_just_now => 'たった今';
700 +
701 + @override
702 + String conversation_minutes_ago(int minutes) {
703 + return '$minutes分前';
704 + }
705 +
706 + @override
707 + String conversation_hours_ago(int hours) {
708 + return '$hours時間前';
709 + }
710 +
711 + @override
712 + String get conversation_yesterday => '昨日';
713 +
714 + @override
715 + String conversation_days_ago(int days) {
716 + return '$days日前';
717 + }
718 +
719 + @override
720 + String conversation_date(int month, int day, int year) {
721 + return '$year/$month/$day';
722 + }
723 +
724 + @override
725 + String get options_tooltip => 'オプション';
726 +
727 + @override
728 + String get no_results_found => '結果が見つかりません';
729 +
730 + @override
731 + String get no_conversations_yet => 'チャット履歴がまだありません';
732 +
733 + @override
734 + String get try_different_search => '別の検索ワードを試してください';
735 +
736 + @override
737 + String get start_new_conversation => '新しいチャットを開始する';
738 +
739 + @override
740 + String get rename_conversation => 'チャットの名前を変更';
741 +
742 + @override
743 + String get enter_new_title => '新しいタイトルを入力';
744 +
745 + @override
746 + String get pinned_section => 'ピン留め済み';
747 +
748 + @override
749 + String get today_section => '今日';
750 +
751 + @override
752 + String get yesterday_section => '昨日';
753 +
754 + @override
755 + String get previous_7_days => '過去 7 日間';
756 +
757 + @override
758 + String get previous_30_days => '過去 30 日間';
759 +
760 + @override
761 + String get older_section => '過去';
762 +
763 + @override
764 + String get onboarding_choose_language => '言語の選択';
765 +
766 + @override
767 + String get onboarding_choose_language_desc =>
768 + '優先する言語を選択してください。この設定はいつでも変更できます。';
769 +
770 + @override
771 + String get onboarding_localmind => 'LOCALMIND';
772 +
773 + @override
774 + String get onboarding_connect_server => 'サーバーへの接続';
775 +
776 + @override
777 + String get onboarding_connect_desc =>
778 + 'LM Studio、Ollama、またはOpenRouterに接続して、プライベートAI体験を開始しましょう。';
779 +
780 + @override
781 + String get onboarding_welcome => 'Welcome to LocalMind';
782 +
783 + @override
784 + String get server_type_on_device => 'ローカル';
785 +
786 + @override
787 + String get server_type_on_device_sub => 'サーバー不要';
788 +
789 + @override
790 + String get server_type_lm_studio => 'LM Studio';
791 +
792 + @override
793 + String get server_type_lm_studio_sub => 'ローカルAPI';
794 +
795 + @override
796 + String get server_type_ollama => 'Ollama';
797 +
798 + @override
799 + String get server_type_ollama_sub => 'CLIエンジン';
800 +
801 + @override
802 + String get server_type_openrouter => 'OpenRouter';
803 +
804 + @override
805 + String get server_type_openrouter_sub => '統合クラウド';
806 +
807 + @override
808 + String get ready_continue => '続行可能';
809 +
810 + @override
811 + String get waiting_selection => '選択待ち';
812 +
813 + @override
814 + String get setup_connection => '接続のセットアップ';
815 +
816 + @override
817 + String setup_connection_desc(String server) {
818 + return 'チャットを開始するには、$server サーバーを構成してください。';
819 + }
820 +
821 + @override
822 + String get server_name => 'サーバー名';
823 +
824 + @override
825 + String get name_required => '名前は必須です';
826 +
827 + @override
828 + String get name_max_50 => '最大50文字';
829 +
830 + @override
831 + String get host_label => 'ホスト / IPアドレス';
832 +
833 + @override
834 + String get host_required => 'ホストは必須です';
835 +
836 + @override
837 + String get port_label => 'ポート';
838 +
839 + @override
840 + String get port_required => 'ポートは必須です';
841 +
842 + @override
843 + String get port_invalid => '数値である必要があります';
844 +
845 + @override
846 + String get port_range => '有効なポート番号(1-65535)を入力してください';
847 +
848 + @override
849 + String get api_key_required => 'APIキー *';
850 +
851 + @override
852 + String get api_key_optional => 'APIキー(オプション)';
853 +
854 + @override
855 + String get api_key_required_openrouter => 'OpenRouterにはAPIキーが必要です';
856 +
857 + @override
858 + String get api_key_format => 'OpenRouterのAPIキーは sk- で始まります';
859 +
860 + @override
861 + String get my_server_hint => 'マイサーバー';
862 +
863 + @override
864 + String get name_length_validation => '名前は50文字以内にする必要があります';
865 +
866 + @override
867 + String get host_valid => '有効なホスト名またはIPアドレスを入力してください';
868 +
869 + @override
870 + String get api_key_hint_openrouter => 'sk-...';
871 +
872 + @override
873 + String get api_key_hint_generic => '認証が必要なサーバー用';
874 +
875 + @override
876 + String get update_server => 'サーバーを更新';
877 +
878 + @override
879 + String get save_server => 'サーバーを保存';
880 +
881 + @override
882 + String get server_updated => 'サーバーを更新しました';
883 +
884 + @override
885 + String get server_added => 'サーバーを追加しました';
886 +
887 + @override
888 + String get download_model_title => 'モデルのダウンロード';
889 +
890 + @override
891 + String get download_model_desc =>
892 + 'ダウンロードするモデルを選択してください。\nモデルはデバイス上でローカルに実行されます。';
893 +
894 + @override
895 + String get on_device_android_only => 'ローカル推論は現在Androidのみで利用可能です。';
896 +
897 + @override
898 + String get total_ram => '合計 RAM';
899 +
900 + @override
901 + String get available => '利用可能';
902 +
903 + @override
904 + String ram_min_required(String fileSize) {
905 + return '最低 $fileSize GB RAM';
906 + }
907 +
908 + @override
909 + String download_progress(String percent, String speed) {
910 + return '$percent% • $speed';
911 + }
912 +
913 + @override
914 + String eta_label(String eta) {
915 + return '残り時間: $eta';
916 + }
917 +
918 + @override
919 + String paused_progress(String percent) {
920 + return '一時停止中 - $percent%';
921 + }
922 +
923 + @override
924 + String ram_warning_body_download(String ram, String totalMemory) {
925 + return 'このモデルは少なくとも $ram GB のRAMを必要としますが、お使いのデバイスのRAMは $totalMemory です。正常に動作しないか、アプリがクラッシュする原因になる可能性があります。';
926 + }
927 +
928 + @override
929 + String ram_warning_body_load(String availableRAM, String ram) {
930 + return 'デバイスの利用可能RAMは $availableRAM ですが、このモデルは少なくとも $ram GB を推奨しています。ロードに失敗するか、不安定になる可能性があります。';
931 + }
932 +
933 + @override
934 + String get choose_theme => 'テーマの選択';
935 +
936 + @override
937 + String get choose_theme_desc => 'アプリの外観をパーソナライズします。この設定は後からいつでも変更できます。';
938 +
939 + @override
940 + String get theme_card_system => 'システム';
941 +
942 + @override
943 + String get theme_card_system_sub => 'デバイスの設定に合わせる';
944 +
945 + @override
946 + String get theme_card_light => 'ライト';
947 +
948 + @override
949 + String get theme_card_light_sub => 'クリーンで明るい外観';
950 +
951 + @override
952 + String get theme_card_dark => 'ダーク';
953 +
954 + @override
955 + String get theme_card_dark_sub => '目に優しい外観';
956 +
957 + @override
958 + String get theme_card_claude => 'Claude';
959 +
960 + @override
961 + String get theme_card_claude_sub => '温かみのあるピーチ調のテーマ';
962 +
963 + @override
964 + String get stay_updated => '最新情報を維持';
965 +
966 + @override
967 + String get stay_updated_desc => 'AIモデルのダウンロード完了時や、長時間実行タスクの完了時に通知を受け取ります。';
968 +
969 + @override
970 + String get notification_benefit_downloads => 'モデルのダウンロード進捗';
971 +
972 + @override
973 + String get notification_benefit_completions => '生成の完了';
974 +
975 + @override
976 + String get notification_benefit_background => 'バックグラウンドタスクのステータス';
977 +
978 + @override
979 + String get allow_notifications => '通知を許可する';
980 +
981 + @override
982 + String get servers_title => 'サーバー';
983 +
984 + @override
985 + String get no_servers_yet => 'サーバーがありません';
986 +
987 + @override
988 + String get no_servers_desc => 'AIモデルとチャットを開始するには、最初のサーバーを追加してください。';
989 +
990 + @override
991 + String get add_server => 'サーバーを追加';
992 +
993 + @override
994 + String switched_to_server(String name) {
995 + return '$name に切り替えました';
996 + }
997 +
998 + @override
999 + String get edit_server => 'サーバーを編集';
1000 +
1001 + @override
1002 + String get add_server_title => 'サーバーを追加';
1003 +
1004 + @override
1005 + String get server_type_label => 'サーバータイプ';
1006 +
1007 + @override
1008 + String get server_icon_label => 'サーバーアイコン';
1009 +
1010 + @override
1011 + String get default_icon => 'デフォルトアイコン';
1012 +
1013 + @override
1014 + String get server_type_lm_studio_display => 'LM Studio';
1015 +
1016 + @override
1017 + String get server_type_openai_display => 'OpenAI 互換';
1018 +
1019 + @override
1020 + String get server_type_ollama_display => 'Ollama';
1021 +
1022 + @override
1023 + String get server_type_openrouter_display => 'OpenRouter';
1024 +
1025 + @override
1026 + String get server_type_on_device_display => 'ローカル';
1027 +
1028 + @override
1029 + String get server_address_openrouter => 'openrouter.ai';
1030 +
1031 + @override
1032 + String get server_address_on_device => 'ローカル推論';
1033 +
1034 + @override
1035 + String server_address_format(String host, String port) {
1036 + return '$host:$port';
1037 + }
1038 +
1039 + @override
1040 + String get default_badge => 'デフォルト';
1041 +
1042 + @override
1043 + String get set_as_default => 'デフォルトに設定';
1044 +
1045 + @override
1046 + String get select_icon => 'アイコンを選択';
1047 +
1048 + @override
1049 + String get select_icon_desc => 'サーバーのアイコンを選択してください';
1050 +
1051 + @override
1052 + String get search_icons_hint => 'アイコンを検索...';
1053 +
1054 + @override
1055 + String get server_icon_stack => 'サーバースタック';
1056 +
1057 + @override
1058 + String get server_icon_stack2 => 'サーバースタック 02';
1059 +
1060 + @override
1061 + String get server_icon_stack3 => 'サーバースタック 03';
1062 +
1063 + @override
1064 + String get server_icon_cloud => 'クラウド';
1065 +
1066 + @override
1067 + String get server_icon_cloud_server => 'クラウドサーバー';
1068 +
1069 + @override
1070 + String get server_icon_mcp => 'MCP サーバー';
1071 +
1072 + @override
1073 + String get server_icon_database => 'データベース';
1074 +
1075 + @override
1076 + String get server_icon_database1 => 'データベース 01';
1077 +
1078 + @override
1079 + String get server_icon_database2 => 'データベース 02';
1080 +
1081 + @override
1082 + String get server_icon_cpu => 'CPU';
1083 +
1084 + @override
1085 + String get server_icon_chip => 'チップ';
1086 +
1087 + @override
1088 + String get server_icon_chip2 => 'チップ 02';
1089 +
1090 + @override
1091 + String get server_icon_computer => 'コンピューター';
1092 +
1093 + @override
1094 + String get server_icon_laptop => 'ノートパソコン';
1095 +
1096 + @override
1097 + String get server_icon_terminal => 'コンピューターターミナル';
1098 +
1099 + @override
1100 + String get server_icon_code => 'コード';
1101 +
1102 + @override
1103 + String get server_icon_ai_brain => 'AI ブレイン';
1104 +
1105 + @override
1106 + String get server_icon_ai_brain2 => 'AI ブレイン 02';
1107 +
1108 + @override
1109 + String get server_icon_ai_cloud => 'AI クラウド';
1110 +
1111 + @override
1112 + String get server_icon_ai_network => 'AI ネットワーク';
1113 +
1114 + @override
1115 + String get server_icon_ai_chat => 'AI チャット';
1116 +
1117 + @override
1118 + String get server_icon_cellular => 'モバイルネットワーク';
1119 +
1120 + @override
1121 + String get server_icon_plug1 => 'プラグ 01';
1122 +
1123 + @override
1124 + String get server_icon_plug2 => 'プラグ 02';
1125 +
1126 + @override
1127 + String get server_icon_bot => 'ボット';
1128 +
1129 + @override
1130 + String get server_icon_bot2 => 'ボット 02';
1131 +
1132 + @override
1133 + String get server_icon_robotic => 'ロボット';
1134 +
1135 + @override
1136 + String get server_icon_rocket => 'ロケット';
1137 +
1138 + @override
1139 + String get server_icon_star => 'スター';
1140 +
1141 + @override
1142 + String get server_icon_settings1 => '設定 01';
1143 +
1144 + @override
1145 + String get server_icon_settings2 => '設定 02';
1146 +
1147 + @override
1148 + String get server_icon_home1 => 'ホーム 01';
1149 +
1150 + @override
1151 + String get server_icon_home2 => 'ホーム 02';
1152 +
1153 + @override
1154 + String get server_icon_folder1 => 'フォルダ 01';
1155 +
1156 + @override
1157 + String get server_icon_folder2 => 'フォルダ 02';
1158 +
1159 + @override
1160 + String get server_icon_file1 => 'ファイル 01';
1161 +
1162 + @override
1163 + String get server_icon_lock => 'ロック';
1164 +
1165 + @override
1166 + String get server_icon_key => 'キー 01';
1167 +
1168 + @override
1169 + String get server_icon_link => 'リンク 01';
1170 +
1171 + @override
1172 + String get server_icon_globe => '地球儀';
1173 +
1174 + @override
1175 + String get server_icon_api => 'API';
1176 +
1177 + @override
1178 + String get server_icon_arrow_right => '右矢印 01';
1179 +
1180 + @override
1181 + String get server_icon_check => 'チェックマーク';
1182 +
1183 + @override
1184 + String get server_icon_alert => '警告マーク';
1185 +
1186 + @override
1187 + String get server_icon_info => '情報マーク';
1188 +
1189 + @override
1190 + String get server_icon_zap => '稲妻マーク';
1191 +
1192 + @override
1193 + String get server_icon_cloud_upload => 'クラウドアップロード';
1194 +
1195 + @override
1196 + String get server_icon_cloud_download => 'クラウドダウンロード';
1197 +
1198 + @override
1199 + String get server_icon_refresh => '更新';
1200 +
1201 + @override
1202 + String get server_icon_hard_drive => 'ハードドライブ';
1203 +
1204 + @override
1205 + String get server_icon_drive => 'ドライブ';
1206 +
1207 + @override
1208 + String get personas_title => 'ペルソナ';
1209 +
1210 + @override
1211 + String get persona_category_general => '全般';
1212 +
1213 + @override
1214 + String get persona_category_coding => 'コーディング';
1215 +
1216 + @override
1217 + String get persona_category_education => '教育';
1218 +
1219 + @override
1220 + String get persona_category_creative => 'クリエイティブ';
1221 +
1222 + @override
1223 + String get persona_builtin_section => 'プリセット';
1224 +
1225 + @override
1226 + String get persona_my_section => 'マイペルソナ';
1227 +
1228 + @override
1229 + String get clone_edit => '複製して編集';
1230 +
1231 + @override
1232 + String get builtin_badge => 'プリセット';
1233 +
1234 + @override
1235 + String get no_personas_found => 'ペルソナが見つかりません';
1236 +
1237 + @override
1238 + String get no_personas_desc => '最初のペルソナを作成して、AIの動作をカスタマイズしましょう。';
1239 +
1240 + @override
1241 + String get edit_persona => 'ペルソナを編集';
1242 +
1243 + @override
1244 + String get create_persona => 'ペルソナを作成';
1245 +
1246 + @override
1247 + String get create_persona_button => '作成';
1248 +
1249 + @override
1250 + String get emoji_label => '絵文字';
1251 +
1252 + @override
1253 + String get name_label => '名前';
1254 +
1255 + @override
1256 + String get my_persona_hint => 'マイペルソナ';
1257 +
1258 + @override
1259 + String get category_label => 'カテゴリ';
1260 +
1261 + @override
1262 + String get description_optional => '説明(オプション)';
1263 +
1264 + @override
1265 + String get description_hint => 'このペルソナの役割について...';
1266 +
1267 + @override
1268 + String get system_prompt => 'システムプロンプト';
1269 +
1270 + @override
1271 + String character_count_max(int currentLen) {
1272 + return '$currentLen/4000';
1273 + }
1274 +
1275 + @override
1276 + String get no_prompt_placeholder => 'プロンプトがまだありません...';
1277 +
1278 + @override
1279 + String get prompt_hint => 'あなたは親切なアシスタントです...';
1280 +
1281 + @override
1282 + String get prompt_required => 'システムプロンプトは必須です';
1283 +
1284 + @override
1285 + String get prompt_max_chars => '最大4000文字';
1286 +
1287 + @override
1288 + String get advanced_settings => '詳細設定';
1289 +
1290 + @override
1291 + String get temperature_label => '温度(0.0-2.0)';
1292 +
1293 + @override
1294 + String get top_p_label => 'Top P(0.0-1.0)';
1295 +
1296 + @override
1297 + String get temp_hint => '0.7';
1298 +
1299 + @override
1300 + String get top_p_hint => '0.9';
1301 +
1302 + @override
1303 + String get range_0_2 => '0.0-2.0';
1304 +
1305 + @override
1306 + String get range_0_1 => '0.0-1.0';
1307 +
1308 + @override
1309 + String get persona_updated => 'ペルソナを更新しました';
1310 +
1311 + @override
1312 + String get persona_created => 'ペルソナを作成しました';
1313 +
1314 + @override
1315 + String get tts_models_title => '音声合成モデル';
1316 +
1317 + @override
1318 + String get always_available => 'いつでも利用可能';
1319 +
1320 + @override
1321 + String get tts_system_desc =>
1322 + 'デバイスの内蔵音声合成エンジンを使用します。\nダウンロードは不要です。音声の選択はデバイスのシステム設定を使用します。';
1323 +
1324 + @override
1325 + String get downloading_status => 'ダウンロード中...';
1326 +
1327 + @override
1328 + String tts_kitten_desc(String size) {
1329 + return '8つの表現力豊かな音声を備えた超高速ニューラル音声合成。\nダウンロードサイズ: $size。';
1330 + }
1331 +
1332 + @override
1333 + String tts_piper_desc(String size) {
1334 + return '2つの表現力豊かな音声を備えた高速オフラインPiper音声。\n音声ごとに $size のダウンロードが必要です。';
1335 + }
1336 +
1337 + @override
1338 + String engine_spec(String sizeMb, String ramMb, int voiceCount) {
1339 + return '$sizeMb MB · $ramMb MB RAM · $voiceCount 音声';
1340 + }
1341 +
1342 + @override
1343 + String get on_device_models_title => 'ローカルモデル';
1344 +
1345 + @override
1346 + String get available_models => '利用可能なモデル';
1347 +
1348 + @override
1349 + String get device_memory => 'デバイスのメモリ';
1350 +
1351 + @override
1352 + String get ram_usage => 'RAM使用量';
1353 +
1354 + @override
1355 + String get memory_healthy => '正常';
1356 +
1357 + @override
1358 + String get memory_critical => '致命的';
1359 +
1360 + @override
1361 + String get memory_low => '警告';
1362 +
1363 + @override
1364 + String ram_used(String percent) {
1365 + return '$percent% 使用中';
1366 + }
1367 +
1368 + @override
1369 + String get available_ram => '空き RAM';
1370 +
1371 + @override
1372 + String get total_capacity => '合計容量';
1373 +
1374 + @override
1375 + String get loaded_status => 'ロード済み';
1376 +
1377 + @override
1378 + String get inference_backend => '推論バックエンド';
1379 +
1380 + @override
1381 + String get backend_ios_notice => 'iOSではCPUバックエンドのみ利用可能です。';
1382 +
1383 + @override
1384 + String get backend_cpu_desc => 'すべてのデバイスで動作します。互換性が最も高いです。';
1385 +
1386 + @override
1387 + String get backend_gpu_desc => 'OpenCL アクセラレーション。サポートされているデバイスで高速に動作します。';
1388 +
1389 + @override
1390 + String get backend_npu_desc => 'ベンダー NPU (Qualcomm/MediaTek)。最も高速な推論。';
1391 +
1392 + @override
1393 + String get select_model_title => 'モデルを選択';
1394 +
1395 + @override
1396 + String get refresh_models => 'モデルを更新';
1397 +
1398 + @override
1399 + String get search_models_hint => 'モデルを検索...';
1400 +
1401 + @override
1402 + String get no_server_connected => 'サーバーが接続されていません';
1403 +
1404 + @override
1405 + String get add_server_first => '利用可能なモデルを表示するには、まずサーバーを追加してください。';
1406 +
1407 + @override
1408 + String get failed_load_models => 'モデルの読み込みに失敗しました';
1409 +
1410 + @override
1411 + String get no_models_available => '利用可能なモデルはありません';
1412 +
1413 + @override
1414 + String no_models_match(String searchQuery) {
1415 + return '「$searchQuery」に一致するモデルはありません';
1416 + }
1417 +
1418 + @override
1419 + String model_load_failed(String error) {
1420 + return 'モデルの読み込みに失敗しました: $error';
1421 + }
1422 +
1423 + @override
1424 + String model_unloaded_ollama(String name) {
1425 + return 'キープアライブ時間を経過すると $name がアンロードされます';
1426 + }
1427 +
1428 + @override
1429 + String model_unloaded_success(String name) {
1430 + return '$name を正常にアンロードしました';
1431 + }
1432 +
1433 + @override
1434 + String model_unload_failed(String error) {
1435 + return 'モデルのアンロードに失敗しました: $error';
1436 + }
1437 +
1438 + @override
1439 + String get unload_from_server => 'サーバーからアンロード';
1440 +
1441 + @override
1442 + String context_chip(String ctx) {
1443 + return '$ctx コンテキスト';
1444 + }
1445 +
1446 + @override
1447 + String download_notification_title(String modelName) {
1448 + return '$modelName をダウンロード中...';
1449 + }
1450 +
1451 + @override
1452 + String get download_complete_notification => 'ダウンロード完了!';
1453 +
1454 + @override
1455 + String download_complete_body(String modelName) {
1456 + return '$modelName のダウンロードが正常に完了しました。';
1457 + }
1458 +
1459 + @override
1460 + String download_failed_notification(String error) {
1461 + return 'ダウンロード失敗: $error';
1462 + }
1463 +
1464 + @override
1465 + String download_failed_body(String modelName) {
1466 + return '$modelName のダウンロードに失敗しました。';
1467 + }
1468 +
1469 + @override
1470 + String get engine_name_system => 'システム音声合成';
1471 +
1472 + @override
1473 + String get engine_tagline_system => 'デバイス内蔵エンジン';
1474 +
1475 + @override
1476 + String get engine_name_kitten => 'Kitten TTS';
1477 +
1478 + @override
1479 + String get engine_tagline_kitten => '高速ニューラル音声合成';
1480 +
1481 + @override
1482 + String get engine_name_sherpa => 'Sherpa ONNX VITS';
1483 +
1484 + @override
1485 + String get engine_tagline_sherpa => 'オフライン Piper 音声';
1486 +
1487 + @override
1488 + String get voice_jasper => 'Jasper';
1489 +
1490 + @override
1491 + String get voice_bella => 'Bella';
1492 +
1493 + @override
1494 + String get voice_bruno => 'Bruno';
1495 +
1496 + @override
1497 + String get voice_luna => 'Luna';
1498 +
1499 + @override
1500 + String get voice_hugo => 'Hugo';
1501 +
1502 + @override
1503 + String get voice_rosie => 'Rosie';
1504 +
1505 + @override
1506 + String get voice_leo => 'Leo';
1507 +
1508 + @override
1509 + String get voice_kiki => 'Kiki';
1510 +
1511 + @override
1512 + String get voice_lessac => 'Lessac (米国)';
1513 +
1514 + @override
1515 + String get voice_ryan => 'Ryan (米国)';
1516 +
1517 + @override
1518 + String get model_qwen_3 => 'Qwen 3 0.6B';
1519 +
1520 + @override
1521 + String get model_qwen_3_desc => '最小の汎用チャットモデル。高速な応答と低メモリ使用が特徴です。';
1522 +
1523 + @override
1524 + String get model_license_apache => 'Apache-2.0';
1525 +
1526 + @override
1527 + String get model_qwen_25 => 'Qwen 2.5 1.5B Instruct';
1528 +
1529 + @override
1530 + String get model_qwen_25_desc => '品質とサイズのバランスが取れたモデル。一般的な会話に適しています。';
1531 +
1532 + @override
1533 + String get model_deepseek => 'DeepSeek R1 Distill Qwen 1.5B';
1534 +
1535 + @override
1536 + String get model_deepseek_desc => '推論・思考プロセス(CoT)モデル。論理的なタスクに最適です。';
1537 +
1538 + @override
1539 + String get model_license_mit => 'MIT';
1540 +
1541 + @override
1542 + String get model_gemma => 'Gemma 4 E2B Instruct';
1543 +
1544 + @override
1545 + String get model_gemma_desc => 'Googleのフラッグシップモデル。最高品質ですが、より多くのRAMが必要です。';
1546 +
1547 + @override
1548 + String export_header(String date) {
1549 + return '*LocalMindからエクスポート — $date*';
1550 + }
1551 +
1552 + @override
1553 + String get export_role_user => '## 👤 ユーザー';
1554 +
1555 + @override
1556 + String get export_role_assistant => '## 🤖 アシスタント';
1557 +
1558 + @override
1559 + String get export_role_system => '## ⚙️ システム';
1560 +
1561 + @override
1562 + String get export_role_tool => '## 🔧 ツール';
1563 +
1564 + @override
1565 + String get export_text_user => '[ユーザー]';
1566 +
1567 + @override
1568 + String get export_text_assistant => '[アシスタント]';
1569 +
1570 + @override
1571 + String get export_text_system => '[システム]';
1572 +
1573 + @override
1574 + String get export_text_tool => '[ツール]';
1575 +
1576 + @override
1577 + String get export_label_user => 'ユーザー';
1578 +
1579 + @override
1580 + String get export_label_assistant => 'アシスタント';
1581 +
1582 + @override
1583 + String get export_label_system => 'システム';
1584 +
1585 + @override
1586 + String get export_label_tool => 'ツール';
1587 +
1588 + @override
1589 + String get select_model_hint => 'モデルを選択してチャットを開始';
1590 +
1591 + @override
1592 + String get test_notification_title => 'テスト通知';
1593 +
1594 + @override
1595 + String get test_notification_body => 'これはモデルのダウンロード進捗用のテスト通知です。';
1596 +}