@tduncan / Cortana / commits / 358f525

feat: add reasoning effort levels and auto-normalize model configuration selection

abdulmominsakib committed Aug 6, 2026 at 21:53 UTC 358f52538f677cf914ced72c6973fe7d730d2026
36 files changed +1127 -566
lib/features/chat/providers/chat_params_providers.dart
+8 -3
@@ -13,8 +13,13 @@ final chatParamsProvider = Provider<ChatParameters>((ref) {
13 final activeConv = ref.watch(conv.activeConversationProvider);
14 final selectedModel = ref.watch(selectedModelProvider);
15 final reasoningConfig = ref.watch(chatReasoningConfigProvider);
16 - final reasoningEnabled =
17 - (selectedModel?.supportsReasoning ?? false) ? reasoningConfig.enabled : null;
16 + final modelSupportsReasoning =
17 + selectedModel?.supportsReasoning ?? false;
18 + // Mandatory-reasoning models can't run with thinking off, so force it on
19 + // regardless of the toggle state.
20 + final reasoningEnabled = modelSupportsReasoning
21 + ? (selectedModel!.reasoningMandatory ? true : reasoningConfig.enabled)
22 + : null;
23
24 double temperature = settings.temperature;
25 double topP = settings.topP;
@@ -68,6 +73,6 @@ final chatParamsProvider = Provider<ChatParameters>((ref) {
73 contextLength: contextLength,
74 systemPrompt: systemPrompt,
75 reasoningEnabled: reasoningEnabled,
71 - reasoningEffort: reasoningConfig.effort,
76 + reasoningEffort: resolveEffortForModel(selectedModel, reasoningConfig.effort),
77 );
78 });
lib/features/chat/providers/chat_reasoning_providers.dart
+58 -1
@@ -1,13 +1,70 @@
1 import 'package:flutter_riverpod/flutter_riverpod.dart';
2
3 +import '../../models/data/models/model_info.dart';
4 +
5 /// How hard a reasoning-capable model should think, sent as the server's
6 /// `reasoning.effort` / `reasoning_effort` fields when thinking is enabled.
7 +///
8 +/// Ordered from lightest to heaviest. OpenRouter advertises a per-model
9 +/// subset (e.g. `["minimal","low","medium","high","xhigh"]`) plus a default
10 +/// and whether reasoning is mandatory; non-OpenRouter providers don't, so
11 +/// callers fall back to [low]/[medium]/[high] via [effortsForModel].
12 enum ReasoningEffort {
13 + minimal,
14 low,
15 medium,
8 - high;
16 + high,
17 + xhigh,
18 + max;
19
20 String get apiValue => name;
21 +
22 + /// Parses an OpenRouter effort string. Falls back to [medium] for unknown
23 + /// values so a request never sends an effort the enum can't represent.
24 + factory ReasoningEffort.fromApiValue(String value) {
25 + for (final e in ReasoningEffort.values) {
26 + if (e.apiValue == value) return e;
27 + }
28 + return ReasoningEffort.medium;
29 + }
30 +}
31 +
32 +/// Returns the effort levels to offer for a model, in lightest→heaviest
33 +/// order. When [supported] is null/empty (non-OpenRouter providers, or an
34 +/// OpenRouter model that didn't advertise efforts) the classic
35 +/// low/medium/high set is returned so existing behaviour is preserved.
36 +List<ReasoningEffort> effortsForModel(List<String>? supported) {
37 + if (supported == null || supported.isEmpty) {
38 + return const [ReasoningEffort.low, ReasoningEffort.medium, ReasoningEffort.high];
39 + }
40 + final list = ReasoningEffort.values
41 + .where((e) => supported.contains(e.apiValue))
42 + .toList(growable: false);
43 + // Shouldn't happen (an OpenRouter model advertising only efforts we don't
44 + // model), but fall back to the classic set rather than rendering nothing.
45 + if (list.isEmpty) {
46 + return const [ReasoningEffort.low, ReasoningEffort.medium, ReasoningEffort.high];
47 + }
48 + return list;
49 +}
50 +
51 +/// Resolves the effort to actually send for [model], snapping [current] to
52 +/// the model's advertised default when [current] isn't supported. Used when
53 +/// building request params so a stale UI config never produces an invalid
54 +/// `reasoning_effort` (e.g. `low` for a model that only supports `high`).
55 +ReasoningEffort resolveEffortForModel(ModelInfo? model, ReasoningEffort current) {
56 + final supported = model?.supportedReasoningEfforts;
57 + if (supported == null || supported.isEmpty) return current;
58 + if (supported.contains(current.apiValue)) return current;
59 + final defaultVal = model?.defaultReasoningEffort;
60 + if (defaultVal != null && supported.contains(defaultVal)) {
61 + return ReasoningEffort.fromApiValue(defaultVal);
62 + }
63 + // Pick the heaviest supported effort we model, else the first advertised.
64 + for (final e in ReasoningEffort.values.reversed) {
65 + if (supported.contains(e.apiValue)) return e;
66 + }
67 + return ReasoningEffort.fromApiValue(supported.first);
68 }
69
70 class ChatReasoningConfig {
lib/features/chat/providers/model_selection_providers.dart
+21
@@ -5,6 +5,7 @@ import 'package:localmind/core/models/enums.dart';
5 import 'package:localmind/core/providers/app_providers.dart';
6 import 'package:localmind/core/providers/service_providers.dart';
7 import 'package:localmind/features/chat/providers/chat_params_providers.dart';
8 +import 'package:localmind/features/chat/providers/chat_reasoning_providers.dart';
9 import 'package:localmind/features/chat/providers/model_loading_providers.dart';
10 import 'package:localmind/features/models/data/models/model_info.dart';
11 import 'package:localmind/features/models/utils/model_instance_utils.dart';
@@ -23,6 +24,26 @@ class SelectedModelNotifier extends Notifier<ModelInfo?> {
24
25 void setModel(ModelInfo? model) {
26 state = model;
27 + if (model != null) {
28 + _normalizeReasoningForModel(model);
29 + }
30 + }
31 +
32 + /// Snaps the reasoning config to a value the newly selected model actually
33 + /// supports, so the next request never carries an invalid `reasoning_effort`
34 + /// (e.g. `low` for a model that only advertises `high`). Also forces
35 + /// reasoning on for mandatory-reasoning models, since they can't run with
36 + /// it disabled.
37 + void _normalizeReasoningForModel(ModelInfo model) {
38 + final reasoning = ref.read(chatReasoningConfigProvider);
39 + final notifier = ref.read(chatReasoningConfigProvider.notifier);
40 + if (model.reasoningMandatory && !reasoning.enabled) {
41 + notifier.setEnabled(true);
42 + }
43 + final supported = model.supportedReasoningEfforts;
44 + if (supported != null && !supported.contains(reasoning.effort.apiValue)) {
45 + notifier.setEffort(resolveEffortForModel(model, reasoning.effort));
46 + }
47 }
48
49 void clear() {
lib/features/models/components/inline_thinking_selector.dart
+38 -22
@@ -7,13 +7,17 @@ import 'package:localmind/features/chat/providers/chat_reasoning_providers.dart'
7 import 'package:localmind/l10n/app_localizations.dart';
8
9 /// Inline widget rendered under a model tile in the selection bottom sheet.
10 -/// Shows direct level options (Off, Low, Medium, High) without needing a dropdown.
10 +/// Shows the effort levels the model actually advertises (plus an "Off"
11 +/// toggle unless reasoning is mandatory), keeping the choice in sync with
12 +/// [chatReasoningConfigProvider].
13 class InlineThinkingSelector extends ConsumerWidget {
14 const InlineThinkingSelector({
15 super.key,
16 required this.isDark,
17 this.isSelected = false,
18 this.onSelectModel,
19 + this.supportedEfforts,
20 + this.reasoningMandatory = false,
21 });
22
23 final bool isDark;
@@ -22,6 +26,13 @@ class InlineThinkingSelector extends ConsumerWidget {
26 /// Optional callback to select/load the parent model if it's not already selected.
27 final VoidCallback? onSelectModel;
28
29 + /// Effort strings the model supports (OpenRouter `supported_efforts`).
30 + /// Null/empty falls back to low/medium/high for non-OpenRouter providers.
31 + final List<String>? supportedEfforts;
32 +
33 + /// When true the model can't run without reasoning, so "Off" is hidden.
34 + final bool reasoningMandatory;
35 +
36 @override
37 Widget build(BuildContext context, WidgetRef ref) {
38 final l10n = AppLocalizations.of(context)!;
@@ -30,29 +41,21 @@ class InlineThinkingSelector extends ConsumerWidget {
41 final notifier = ref.read(chatReasoningConfigProvider.notifier);
42
43 final accent = theme.colorScheme.primary;
44 + final efforts = effortsForModel(supportedEfforts);
45
34 - // Options: Off, Low, Medium, High
46 final options = <_ThinkingOption>[
36 - _ThinkingOption(
37 - label: 'Off',
38 - isEnabled: false,
39 - effort: ReasoningEffort.low,
40 - ),
41 - _ThinkingOption(
42 - label: l10n.reasoning_effort_low,
43 - isEnabled: true,
44 - effort: ReasoningEffort.low,
45 - ),
46 - _ThinkingOption(
47 - label: l10n.reasoning_effort_medium,
48 - isEnabled: true,
49 - effort: ReasoningEffort.medium,
50 - ),
51 - _ThinkingOption(
52 - label: l10n.reasoning_effort_high,
53 - isEnabled: true,
54 - effort: ReasoningEffort.high,
55 - ),
47 + if (!reasoningMandatory)
48 + _ThinkingOption(
49 + label: l10n.reasoning_effort_off,
50 + isEnabled: false,
51 + effort: ReasoningEffort.low,
52 + ),
53 + for (final effort in efforts)
54 + _ThinkingOption(
55 + label: effort.shortLabel(l10n),
56 + isEnabled: true,
57 + effort: effort,
58 + ),
59 ];
60
61 return Padding(
@@ -164,3 +167,16 @@ class _ThinkingOption {
167 final bool isEnabled;
168 final ReasoningEffort effort;
169 }
170 +
171 +extension on ReasoningEffort {
172 + String shortLabel(AppLocalizations l10n) {
173 + return switch (this) {
174 + ReasoningEffort.minimal => l10n.reasoning_effort_minimal,
175 + ReasoningEffort.low => l10n.reasoning_effort_low,
176 + ReasoningEffort.medium => l10n.reasoning_effort_medium,
177 + ReasoningEffort.high => l10n.reasoning_effort_high,
178 + ReasoningEffort.xhigh => l10n.reasoning_effort_xhigh,
179 + ReasoningEffort.max => l10n.reasoning_effort_max,
180 + };
181 + }
182 +}
lib/features/models/components/model_tile.dart
+2
@@ -185,6 +185,8 @@ class ModelTile extends StatelessWidget {
185 isDark: isDark,
186 isSelected: isSelected,
187 onSelectModel: onTap,
188 + supportedEfforts: model.supportedReasoningEfforts,
189 + reasoningMandatory: model.reasoningMandatory,
190 ),
191 ],
192 ),
lib/features/models/components/thinking_mode_chip.dart
+26 -18
@@ -54,6 +54,11 @@ class ThinkingModeChip extends ConsumerWidget {
54 final config = ref.watch(chatReasoningConfigProvider);
55 final notifier = ref.read(chatReasoningConfigProvider.notifier);
56
57 + // Mandatory-reasoning models can't be turned off, so the toggle side is
58 + // non-interactive and the effort picker stays visible.
59 + final canDisable = !(model?.reasoningMandatory ?? false);
60 + final showPicker = config.enabled || !canDisable;
61 +
62 final accent = theme.colorScheme.primary;
63 final enabledFg = accent;
64 final disabledFg = isDark
@@ -74,16 +79,18 @@ class ThinkingModeChip extends ConsumerWidget {
79 final String labelText;
80 if (fullWidth) {
81 labelText = l10n.thinking_mode_title;
77 - } else if (config.enabled) {
82 + } else if (config.enabled || !canDisable) {
83 labelText = _effortShortLabel(l10n, config.effort);
84 } else {
80 - labelText = 'Off';
85 + labelText = l10n.reasoning_effort_off;
86 }
87
88 final toggleSide = InkWell(
84 - onTap: () {
85 - notifier.setEnabled(!config.enabled);
86 - },
89 + onTap: canDisable
90 + ? () {
91 + notifier.setEnabled(!config.enabled);
92 + }
93 + : null,
94 borderRadius: borderRadius,
95 child: Padding(
96 padding: EdgeInsetsDirectional.fromSTEB(
@@ -113,7 +120,7 @@ class ThinkingModeChip extends ConsumerWidget {
120 ),
121 ),
122 ),
116 - if (fullWidth && config.enabled) ...[
123 + if (fullWidth && showPicker) ...[
124 SizedBox(width: compact ? 3 : 6),
125 Container(
126 padding: EdgeInsets.symmetric(
@@ -139,10 +146,11 @@ class ThinkingModeChip extends ConsumerWidget {
146 ),
147 );
148
142 - // Right-side effort picker. Hidden when thinking is off because the
143 - // choice has no effect — the entire chip is then a single tap toggle.
149 + // Right-side effort picker. Hidden when thinking is off (and the model
150 + // allows turning it off) because the choice has no effect there — the
151 + // entire chip is then a single tap toggle.
152 Widget pickerSide = const SizedBox.shrink();
145 - if (config.enabled) {
153 + if (showPicker) {
154 pickerSide = PopupMenuButton<ReasoningEffort>(
155 tooltip: '',
156 padding: EdgeInsets.zero,
@@ -151,7 +159,7 @@ class ThinkingModeChip extends ConsumerWidget {
159 notifier.setEnabled(true);
160 notifier.setEffort(effort);
161 },
154 - itemBuilder: (context) => ReasoningEffort.values
162 + itemBuilder: (context) => effortsForModel(model?.supportedReasoningEfforts)
163 .map(
164 (effort) => PopupMenuItem(
165 value: effort,
@@ -225,13 +233,13 @@ class ThinkingModeChip extends ConsumerWidget {
233 AppLocalizations l10n,
234 ReasoningEffort effort,
235 ) {
228 - switch (effort) {
229 - case ReasoningEffort.low:
230 - return l10n.reasoning_effort_low;
231 - case ReasoningEffort.medium:
232 - return l10n.reasoning_effort_medium;
233 - case ReasoningEffort.high:
234 - return l10n.reasoning_effort_high;
235 - }
236 + return switch (effort) {
237 + ReasoningEffort.minimal => l10n.reasoning_effort_minimal,
238 + ReasoningEffort.low => l10n.reasoning_effort_low,
239 + ReasoningEffort.medium => l10n.reasoning_effort_medium,
240 + ReasoningEffort.high => l10n.reasoning_effort_high,
241 + ReasoningEffort.xhigh => l10n.reasoning_effort_xhigh,
242 + ReasoningEffort.max => l10n.reasoning_effort_max,
243 + };
244 }
245 }
lib/features/models/data/models/model_info.dart
+21
@@ -20,6 +20,16 @@ class ModelInfo {
20 final bool supportsVision;
21 final bool supportsReasoning;
22 final bool supportsToolUse;
23 + /// Effort strings the model advertises for reasoning (OpenRouter
24 + /// `reasoning.supported_efforts`), e.g. `["minimal","low","medium","high"]`.
25 + /// Null for providers that don't expose per-model efforts.
26 + final List<String>? supportedReasoningEfforts;
27 + /// The model's default reasoning effort (OpenRouter
28 + /// `reasoning.default_effort`), e.g. `"medium"`.
29 + final String? defaultReasoningEffort;
30 + /// When true the model cannot run without reasoning (OpenRouter
31 + /// `reasoning.mandatory`); the "Off" toggle should be hidden.
32 + final bool reasoningMandatory;
33 /// Input token price in USD per 1M tokens (OpenRouter `pricing.prompt`).
34 final double? inputPricePerMillion;
35 /// Output token price in USD per 1M tokens (OpenRouter `pricing.completion`).
@@ -44,6 +54,9 @@ class ModelInfo {
54 this.supportsVision = false,
55 this.supportsReasoning = false,
56 this.supportsToolUse = false,
57 + this.supportedReasoningEfforts,
58 + this.defaultReasoningEffort,
59 + this.reasoningMandatory = false,
60 this.inputPricePerMillion,
61 this.outputPricePerMillion,
62 });
@@ -141,6 +154,9 @@ class ModelInfo {
154 bool? supportsVision,
155 bool? supportsReasoning,
156 bool? supportsToolUse,
157 + List<String>? supportedReasoningEfforts,
158 + String? defaultReasoningEffort,
159 + bool? reasoningMandatory,
160 double? inputPricePerMillion,
161 double? outputPricePerMillion,
162 }) {
@@ -163,6 +179,11 @@ class ModelInfo {
179 supportsVision: supportsVision ?? this.supportsVision,
180 supportsReasoning: supportsReasoning ?? this.supportsReasoning,
181 supportsToolUse: supportsToolUse ?? this.supportsToolUse,
182 + supportedReasoningEfforts:
183 + supportedReasoningEfforts ?? this.supportedReasoningEfforts,
184 + defaultReasoningEffort:
185 + defaultReasoningEffort ?? this.defaultReasoningEffort,
186 + reasoningMandatory: reasoningMandatory ?? this.reasoningMandatory,
187 inputPricePerMillion:
188 inputPricePerMillion ?? this.inputPricePerMillion,
189 outputPricePerMillion:
lib/features/servers/data/server_api_service.dart
+26 -4
@@ -567,6 +567,9 @@ class ServerApiService {
567 supportsVision: capabilities.supportsVision,
568 supportsReasoning: capabilities.supportsReasoning,
569 supportsToolUse: capabilities.supportsToolUse,
570 + supportedReasoningEfforts: capabilities.supportedReasoningEfforts,
571 + defaultReasoningEffort: capabilities.defaultReasoningEffort,
572 + reasoningMandatory: capabilities.reasoningMandatory,
573 inputPricePerMillion: pricing.inputPricePerMillion,
574 outputPricePerMillion: pricing.outputPricePerMillion,
575 ),
@@ -580,6 +583,9 @@ class ServerApiService {
583 bool supportsVision,
584 bool supportsReasoning,
585 bool supportsToolUse,
586 + List<String>? supportedReasoningEfforts,
587 + String? defaultReasoningEffort,
588 + bool reasoningMandatory,
589 }) _parseOpenRouterCapabilities(Map<dynamic, dynamic> item) {
590 final architecture = item['architecture'];
591 final arch = architecture is Map ? architecture : const <String, dynamic>{};
@@ -597,16 +603,32 @@ class ServerApiService {
603 <String>{};
604 final supportsToolUse = supportedParams.contains('tools') ||
605 supportedParams.contains('tool_choice');
606 +
607 final reasoningField = item['reasoning'];
601 - final supportsReasoning =
602 - (reasoningField is Map && reasoningField.isNotEmpty) ||
603 - supportedParams.contains('reasoning') ||
604 - supportedParams.contains('include_reasoning');
608 + final reasoning = reasoningField is Map ? reasoningField : null;
609 + final supportedEffortsRaw = reasoning?['supported_efforts'];
610 + final supportedReasoningEfforts = supportedEffortsRaw is List
611 + ? supportedEffortsRaw
612 + .map((e) => e.toString().trim().toLowerCase())
613 + .where((e) => e.isNotEmpty)
614 + .toList(growable: false)
615 + : null;
616 + final defaultReasoningEffort =
617 + reasoning?['default_effort']?.toString().trim().toLowerCase();
618 + final reasoningMandatory = reasoning?['mandatory'] == true;
619 + final supportsReasoning = reasoning != null && reasoning.isNotEmpty ||
620 + supportedReasoningEfforts != null && supportedReasoningEfforts.isNotEmpty ||
621 + reasoningMandatory ||
622 + supportedParams.contains('reasoning') ||
623 + supportedParams.contains('include_reasoning');
624
625 return (
626 supportsVision: supportsVision,
627 supportsReasoning: supportsReasoning,
628 supportsToolUse: supportsToolUse,
629 + supportedReasoningEfforts: supportedReasoningEfforts,
630 + defaultReasoningEffort: defaultReasoningEffort,
631 + reasoningMandatory: reasoningMandatory,
632 );
633 }
634
lib/l10n/app_ar.arb
+30 -1
@@ -871,5 +871,34 @@
871 "model_required_toast": "يجب عليك اختيار نموذج أولاً",
872 "server_type_on_device_sub": "لا يحتاج خادماً",
873 "server_type_lm_studio_sub": "API محلي",
874 - "server_type_ollama_sub": "محرك أوامر"
874 + "server_type_ollama_sub": "محرك أوامر",
875 + "settings_default_model": "النموذج الافتراضي",
876 + "settings_default_model_desc": "يتم تحديده تلقائيًا عند بدء محادثة جديدة.",
877 + "import_mcp_json": "استيراد JSON",
878 + "import_mcp_json_dialog_title": "استيراد تكوين MCP JSON",
879 + "import_mcp_json_instructions": "قم بنسخ mcpServers JSON مباشرة من LM Studio (mcp.json) أو ألصق مصفوفة الملحقات أدناه:",
880 + "import_mcp_json_placeholder": "ألصق mcpServers JSON أو قائمة الملحقات هنا...",
881 + "mcp_import_success": "تم استيراد {count} من التكاملات بنجاح",
882 + "mcp_import_failed": "لم يتم العثور على تكاملات MCP صالحة في ملف JSON",
883 + "server_type_ollama_cloud": "Ollama Cloud",
884 + "server_type_ollama_cloud_sub": "سحابة مُدارة",
885 + "server_type_ollama_cloud_display": "Ollama Cloud",
886 + "server_address_ollama_cloud": "ollama.com",
887 + "ollama_cloud_disclosure": "عند الاتصال بـ Ollama Cloud، يتم إرسال رسائل المحادثة والإدخالات إلى خوادم Ollama المُدارة للاستنتاج. لا يقوم LocalMind بتتبع أو تخزين محادثاتك. يمكنك إلغاء هذا المفتاح في أي وقت عبر ollama.com/settings/keys.",
888 + "api_key_required_ollama_cloud": "مفتاح API مطلوب لـ Ollama Cloud",
889 + "api_key_hint_ollama_cloud": "ألصق مفتاح API الخاص بـ Ollama Cloud",
890 + "add_server_ollama_cloud_subtitle": "اتصل بـ Ollama Cloud باستخدام مفتاح API من ollama.com/settings/keys للوصول إلى النماذج السحابية المُدارة.",
891 + "add_server_openrouter_subtitle": "اتصل عبر OpenRouter باستخدام مفتاح API صالح واحتفظ بهذا الملف الشخصي جاهزًا لتوجيه النماذج.",
892 + "add_server_endpoint_subtitle": "قم بتكوين نقطة نهاية محلية أو مستضافة ذاتيًا، ثم تحقق من الاتصال قبل الحفظ.",
893 + "model_set_default": "تعيين كنموذج افتراضي",
894 + "model_clear_default": "إزالة من النموذج الافتراضي",
895 + "model_default_badge": "افتراضي",
896 + "model_capabilities": "القدرات",
897 + "model_api_pricing": "أسعار API (لكل 1M رمز)",
898 + "openrouter_pricing_free": "مجاني",
899 + "openrouter_pricing_tooltip": "الإدخال {input} / الإخراج {output} لكل 1M رمز",
900 + "reasoning_effort_minimal": "أدنى",
901 + "reasoning_effort_xhigh": "عالي جداً",
902 + "reasoning_effort_max": "أقصى",
903 + "reasoning_effort_off": "موقف"
904 }
lib/l10n/app_bn.arb
+30 -1
@@ -871,5 +871,34 @@
871 "model_required_toast": "আপনাকে প্রথমে একটি মডেল নির্বাচন করতে হবে",
872 "server_type_lm_studio_sub": "লোকাল এপিআই",
873 "server_type_ollama_sub": "সিএলআই ইঞ্জিন",
874 - "server_type_on_device_sub": "কোনো সার্ভারের প্রয়োজন নেই"
874 + "server_type_on_device_sub": "কোনো সার্ভারের প্রয়োজন নেই",
875 + "settings_default_model": "ডিফল্ট মডেল",
876 + "settings_default_model_desc": "নতুন চ্যাট শুরু করার সময় স্বয়ংক্রিয়ভাবে নির্বাচিত হয়।",
877 + "import_mcp_json": "JSON ইম্পোর্ট করুন",
878 + "import_mcp_json_dialog_title": "MCP কনফিগ JSON ইম্পোর্ট করুন",
879 + "import_mcp_json_instructions": "LM Studio (mcp.json) থেকে সরাসরি আপনার mcpServers JSON কপি করুন অথবা নিচে প্লাগইন অ্যারে পেস্ট করুন:",
880 + "import_mcp_json_placeholder": "এখানে mcpServers JSON বা প্লাগইন তালিকা পেস্ট করুন...",
881 + "mcp_import_success": "সফলভাবে {count}টি ইন্টিগ্রেশন ইম্পোর্ট করা হয়েছে",
882 + "mcp_import_failed": "JSON-এ কোনো বৈধ MCP ইন্টিগ্রেশন পাওয়া যায়নি",
883 + "server_type_ollama_cloud": "Ollama Cloud",
884 + "server_type_ollama_cloud_sub": "ক্লাউড পরিচালিত",
885 + "server_type_ollama_cloud_display": "Ollama Cloud",
886 + "server_address_ollama_cloud": "ollama.com",
887 + "ollama_cloud_disclosure": "Ollama Cloud সংযোগ করলে আপনার চ্যাট বার্তা এবং ইনপুট অনুমানের জন্য Ollama-এর পরিচালিত সার্ভারে পাঠানো হয়। LocalMind আপনার কথোপকথন ট্র্যাক বা সংরক্ষণ করে না। আপনি যেকোনো সময় ollama.com/settings/keys থেকে এই কী বাতিল করতে পারেন।",
888 + "api_key_required_ollama_cloud": "Ollama Cloud-এর জন্য API Key প্রয়োজন",
889 + "api_key_hint_ollama_cloud": "আপনার Ollama Cloud API key পেস্ট করুন",
890 + "add_server_ollama_cloud_subtitle": "পরিচালিত ক্লাউড মডেল অ্যাক্সেস করতে ollama.com/settings/keys থেকে একটি API Key দিয়ে Ollama Cloud-এ সংযোগ করুন।",
891 + "add_server_openrouter_subtitle": "একটি বৈধ API Key দিয়ে OpenRouter-এর মাধ্যমে সংযোগ করুন এবং মডেল রাউটিংয়ের জন্য এই প্রোফাইলটি প্রস্তুত রাখুন।",
892 + "add_server_endpoint_subtitle": "একটি স্থানীয় বা স্ব-হোস্ট করা এন্ডপয়েন্ট কনফিগার করুন, তারপর সংরক্ষণ করার আগে সংযোগ যাচাই করুন।",
893 + "model_set_default": "ডিফল্ট মডেল হিসেবে সেট করুন",
894 + "model_clear_default": "ডিফল্ট মডেল হিসেবে সরিয়ে ফেলুন",
895 + "model_default_badge": "ডিফল্ট",
896 + "model_capabilities": "ক্ষমতাসমূহ",
897 + "model_api_pricing": "API মূল্য (প্রতি ১ মিলিয়ন টোকেন)",
898 + "openrouter_pricing_free": "বিনামূল্যে",
899 + "openrouter_pricing_tooltip": "ইনপুট {input} / আউটপুট {output} প্রতি ১ মিলিয়ন টোকেন",
900 + "reasoning_effort_minimal": "ন্যূনতম",
901 + "reasoning_effort_xhigh": "অতিরিক্ত উচ্চ",
902 + "reasoning_effort_max": "সর্বোচ্চ",
903 + "reasoning_effort_off": "বন্ধ"
904 }
lib/l10n/app_en.arb
+16
@@ -3102,6 +3102,22 @@
3102 "@reasoning_effort_high": {
3103 "description": "High reasoning effort level"
3104 },
3105 + "reasoning_effort_minimal": "Minimal",
3106 + "@reasoning_effort_minimal": {
3107 + "description": "Minimal reasoning effort level"
3108 + },
3109 + "reasoning_effort_xhigh": "X-High",
3110 + "@reasoning_effort_xhigh": {
3111 + "description": "Extra-high reasoning effort level"
3112 + },
3113 + "reasoning_effort_max": "Max",
3114 + "@reasoning_effort_max": {
3115 + "description": "Maximum reasoning effort level"
3116 + },
3117 + "reasoning_effort_off": "Off",
3118 + "@reasoning_effort_off": {
3119 + "description": "Label for disabling reasoning entirely"
3120 + },
3121 "could_not_read_file": "Could not read file",
3122 "@could_not_read_file": {
3123 "description": "Error message when file cannot be read"
lib/l10n/app_es.arb
+30 -1
@@ -871,5 +871,34 @@
871 "model_required_toast": "Primero debes seleccionar un modelo",
872 "server_type_lm_studio_sub": "API LOCAL",
873 "server_type_ollama_sub": "MOTOR CLI",
874 - "server_type_on_device_sub": "NO SE REQUIERE SERVIDOR"
874 + "server_type_on_device_sub": "NO SE REQUIERE SERVIDOR",
875 + "settings_default_model": "Modelo predeterminado",
876 + "settings_default_model_desc": "Se selecciona automáticamente al iniciar un nuevo chat.",
877 + "import_mcp_json": "Importar JSON",
878 + "import_mcp_json_dialog_title": "Importar JSON de configuración MCP",
879 + "import_mcp_json_instructions": "Copia tu JSON de mcpServers directamente desde LM Studio (mcp.json) o pega una lista de complementos a continuación:",
880 + "import_mcp_json_placeholder": "Pega el JSON de mcpServers o la lista de complementos aquí...",
881 + "mcp_import_success": "{count} integración(es) importada(s) con éxito",
882 + "mcp_import_failed": "No se encontraron integraciones MCP válidas en el JSON",
883 + "server_type_ollama_cloud": "Ollama Cloud",
884 + "server_type_ollama_cloud_sub": "NUBE ADMINISTRADA",
885 + "server_type_ollama_cloud_display": "Ollama Cloud",
886 + "server_address_ollama_cloud": "ollama.com",
887 + "ollama_cloud_disclosure": "Al conectar Ollama Cloud, tus mensajes e insumos de chat se envían a los servidores administrados de Ollama para la inferencia. LocalMind no rastrea ni almacena tus conversaciones. Puedes revocar esta clave en cualquier momento en ollama.com/settings/keys.",
888 + "api_key_required_ollama_cloud": "Se requiere clave API para Ollama Cloud",
889 + "api_key_hint_ollama_cloud": "Pega tu clave API de Ollama Cloud",
890 + "add_server_ollama_cloud_subtitle": "Conéctate a Ollama Cloud con una clave API de ollama.com/settings/keys para acceder a modelos administrados en la nube.",
891 + "add_server_openrouter_subtitle": "Conéctate a través de OpenRouter con una clave API válida y mantén este perfil listo para el enrutamiento de modelos.",
892 + "add_server_endpoint_subtitle": "Configura un punto de enlace local o alojado por ti mismo y luego verifica la conexión antes de guardar.",
893 + "model_set_default": "Establecer como modelo predeterminado",
894 + "model_clear_default": "Quitar como modelo predeterminado",
895 + "model_default_badge": "Predeterminado",
896 + "model_capabilities": "Capacidades",
897 + "model_api_pricing": "Precios de API (por millón de tokens)",
898 + "openrouter_pricing_free": "Gratis",
899 + "openrouter_pricing_tooltip": "Entrada {input} / Salida {output} por millón de tokens",
900 + "reasoning_effort_minimal": "Mínimo",
901 + "reasoning_effort_xhigh": "Muy alto",
902 + "reasoning_effort_max": "Máximo",
903 + "reasoning_effort_off": "Desactivado"
904 }
lib/l10n/app_fr.arb
+21 -2
@@ -878,5 +878,24 @@
878 "delete_folder_title": "Supprimer folder?",
879 "delete_folder_body": "Are you sure you want to delete \"{name}\"? Conversations or saved messages inside will be moved back to \"Unfiled\". This cannot be undone.",
880 "folder_name_required": "Please enter a folder name",
881 - "model_required_toast": "You need to select a model first"
882 -}
\ No newline at end of file
881 + "model_required_toast": "You need to select a model first",
882 + "settings_default_model": "Modèle par défaut",
883 + "settings_default_model_desc": "Sélectionné automatiquement lorsque vous démarrez un nouveau chat.",
884 + "import_mcp_json": "Importer JSON",
885 + "import_mcp_json_dialog_title": "Importer la configuration MCP (JSON)",
886 + "import_mcp_json_instructions": "Copiez votre JSON mcpServers directement depuis LM Studio (mcp.json) ou collez un tableau de plugins ci-dessous :",
887 + "import_mcp_json_placeholder": "Collez le JSON mcpServers ou la liste de plugins ici...",
888 + "mcp_import_success": "{count} intégration(s) importée(s) avec succès",
889 + "mcp_import_failed": "Aucune intégration MCP valide trouvée dans le JSON",
890 + "model_set_default": "Définir comme modèle par défaut",
891 + "model_clear_default": "Retirer comme modèle par défaut",
892 + "model_default_badge": "Par défaut",
893 + "model_capabilities": "Capacités",
894 + "model_api_pricing": "Tarifs de l'API (par 1M de tokens)",
895 + "openrouter_pricing_free": "Gratuit",
896 + "openrouter_pricing_tooltip": "Entrée {input} / Sortie {output} par 1M de tokens",
897 + "reasoning_effort_minimal": "Minimal",
898 + "reasoning_effort_xhigh": "Très élevé",
899 + "reasoning_effort_max": "Maximal",
900 + "reasoning_effort_off": "Désactivé"
901 +}
lib/l10n/app_hi.arb
+30 -1
@@ -871,5 +871,34 @@
871 "model_required_toast": "आपको पहले एक मॉडल चुनना होगा",
872 "server_type_lm_studio_sub": "स्थानीय API",
873 "server_type_ollama_sub": "CLI इंजन",
874 - "server_type_on_device_sub": "किसी सर्वर की आवश्यकता नहीं है"
874 + "server_type_on_device_sub": "किसी सर्वर की आवश्यकता नहीं है",
875 + "settings_default_model": "डिफ़ॉल्ट मॉडल",
876 + "settings_default_model_desc": "नया चैट शुरू करने पर स्वचालित रूप से चुना जाता है।",
877 + "import_mcp_json": "JSON आयात करें",
878 + "import_mcp_json_dialog_title": "MCP कॉन्फ़िगरेशन JSON आयात करें",
879 + "import_mcp_json_instructions": "LM Studio (mcp.json) से सीधे अपना mcpServers JSON कॉपी करें या नीचे प्लगइन एरे पेस्ट करें:",
880 + "import_mcp_json_placeholder": "यहाँ mcpServers JSON या प्लगइन सूची पेस्ट करें...",
881 + "mcp_import_success": "सफलतापूर्वक {count} एकीकरण आयात किए गए",
882 + "mcp_import_failed": "JSON में कोई वैध MCP एकीकरण नहीं मिला",
883 + "server_type_ollama_cloud": "Ollama Cloud",
884 + "server_type_ollama_cloud_sub": "क्लाउड प्रबंधित",
885 + "server_type_ollama_cloud_display": "Ollama Cloud",
886 + "server_address_ollama_cloud": "ollama.com",
887 + "ollama_cloud_disclosure": "Ollama Cloud कनेक्ट करने पर आपके चैट संदेश और इनपुट अनुमान के लिए Ollama के प्रबंधित सर्वर पर भेजे जाते हैं। LocalMind आपकी बातचीत को ट्रैक या स्टोर नहीं करता है। आप ollama.com/settings/keys पर किसी भी समय इस कुंजी को रद्द कर सकते हैं।",
888 + "api_key_required_ollama_cloud": "Ollama Cloud के लिए API Key आवश्यक है",
889 + "api_key_hint_ollama_cloud": "अपनी Ollama Cloud API key पेस्ट करें",
890 + "add_server_ollama_cloud_subtitle": "प्रबंधित क्लाउड मॉडल तक पहुँचने के लिए ollama.com/settings/keys से API Key के साथ Ollama Cloud से कनेक्ट करें।",
891 + "add_server_openrouter_subtitle": "एक वैध API Key के साथ OpenRouter के माध्यम से कनेक्ट करें और इस प्रोफ़ाइल को मॉडल राउटिंग के लिए तैयार रखें।",
892 + "add_server_endpoint_subtitle": "एक स्थानीय या स्व-होस्ट किए गए एंडपॉइंट को कॉन्फ़िगर करें, फिर सहेजने से पहले कनेक्शन सत्यापित करें।",
893 + "model_set_default": "डिफ़ॉल्ट मॉडल के रूप में सेट करें",
894 + "model_clear_default": "डिफ़ॉल्ट मॉडल के रूप में हटाएं",
895 + "model_default_badge": "डिफ़ॉल्ट",
896 + "model_capabilities": "क्षमताएं",
897 + "model_api_pricing": "API मूल्य निर्धारण (प्रति 1M टोकन)",
898 + "openrouter_pricing_free": "निःशुल्क",
899 + "openrouter_pricing_tooltip": "इनपुट {input} / आउटपुट {output} प्रति 1M टोकन",
900 + "reasoning_effort_minimal": "न्यूनतम",
901 + "reasoning_effort_xhigh": "अत्यधिक उच्च",
902 + "reasoning_effort_max": "अधिकतम",
903 + "reasoning_effort_off": "बंद"
904 }
lib/l10n/app_it.arb
+30 -1
@@ -871,5 +871,34 @@
871 "model_required_toast": "Devi prima selezionare un modello",
872 "server_type_on_device_sub": "NESSUN SERVER NECESSARIO",
873 "server_type_lm_studio_sub": "API LOCALE",
874 - "server_type_ollama_sub": "MOTORE CLI"
874 + "server_type_ollama_sub": "MOTORE CLI",
875 + "settings_default_model": "Modello predefinito",
876 + "settings_default_model_desc": "Selezionato automaticamente quando avvii una nuova chat.",
877 + "import_mcp_json": "Importa JSON",
878 + "import_mcp_json_dialog_title": "Importa JSON configurazione MCP",
879 + "import_mcp_json_instructions": "Copia il tuo JSON mcpServers direttamente da LM Studio (mcp.json) o incolla un array di plugin qui sotto:",
880 + "import_mcp_json_placeholder": "Incolla il JSON mcpServers o l'elenco dei plugin qui...",
881 + "mcp_import_success": "{count} integrazione/i importata/e con successo",
882 + "mcp_import_failed": "Nessuna integrazione MCP valida trovata nel JSON",
883 + "server_type_ollama_cloud": "Ollama Cloud",
884 + "server_type_ollama_cloud_sub": "CLOUD GESTITO",
885 + "server_type_ollama_cloud_display": "Ollama Cloud",
886 + "server_address_ollama_cloud": "ollama.com",
887 + "ollama_cloud_disclosure": "Connettendo Ollama Cloud, i tuoi messaggi di chat e i tuoi input vengono inviati ai server gestiti di Ollama per l'inferenza. LocalMind non traccia né memorizza le tue conversazioni. Puoi revocare questa chiave in qualsiasi momento su ollama.com/settings/keys.",
888 + "api_key_required_ollama_cloud": "Chiave API richiesta per Ollama Cloud",
889 + "api_key_hint_ollama_cloud": "Incolla la tua chiave API di Ollama Cloud",
890 + "add_server_ollama_cloud_subtitle": "Connettiti a Ollama Cloud con una chiave API da ollama.com/settings/keys per accedere ai modelli cloud gestiti.",
891 + "add_server_openrouter_subtitle": "Connettiti tramite OpenRouter con una chiave API valida e tieni pronto questo profilo per l'instradamento dei modelli.",
892 + "add_server_endpoint_subtitle": "Configura un endpoint locale o self-hosted, quindi verifica la connessione prima di salvare.",
893 + "model_set_default": "Imposta come modello predefinito",
894 + "model_clear_default": "Rimuovi come modello predefinito",
895 + "model_default_badge": "Predefinito",
896 + "model_capabilities": "Capacità",
897 + "model_api_pricing": "Prezzi API (per 1M di token)",
898 + "openrouter_pricing_free": "Gratuito",
899 + "openrouter_pricing_tooltip": "Input {input} / Output {output} per 1M di token",
900 + "reasoning_effort_minimal": "Minimo",
901 + "reasoning_effort_xhigh": "Molto alto",
902 + "reasoning_effort_max": "Massimo",
903 + "reasoning_effort_off": "Disattivato"
904 }
lib/l10n/app_ja.arb
+30 -1
@@ -871,5 +871,34 @@
871 "model_required_toast": "最初にモデルを選択する必要があります",
872 "server_type_on_device_sub": "サーバー不要",
873 "server_type_lm_studio_sub": "ローカルAPI",
874 - "server_type_ollama_sub": "CLIエンジン"
874 + "server_type_ollama_sub": "CLIエンジン",
875 + "settings_default_model": "デフォルトモデル",
876 + "settings_default_model_desc": "新しいチャットを開始するときに自動的に選択されます。",
877 + "import_mcp_json": "JSONをインポート",
878 + "import_mcp_json_dialog_title": "MCP設定JSONをインポート",
879 + "import_mcp_json_instructions": "LM Studio (mcp.json) から mcpServers JSON を直接コピーするか、以下にプラグイン配列を貼り付けてください:",
880 + "import_mcp_json_placeholder": "ここに mcpServers JSON またはプラグインリストを貼り付け...",
881 + "mcp_import_success": "{count} 件の統合を正常にインポートしました",
882 + "mcp_import_failed": "JSON 内に有効な MCP 統合が見つかりませんでした",
883 + "server_type_ollama_cloud": "Ollama Cloud",
884 + "server_type_ollama_cloud_sub": "クラウド管理",
885 + "server_type_ollama_cloud_display": "Ollama Cloud",
886 + "server_address_ollama_cloud": "ollama.com",
887 + "ollama_cloud_disclosure": "Ollama Cloud に接続すると、チャットメッセージと入力は推論のために Ollama の管理サーバーに送信されます。LocalMind は会話を追跡または保存しません。このキーは ollama.com/settings/keys でいつでも取り消すことができます。",
888 + "api_key_required_ollama_cloud": "Ollama Cloud には API キーが必要です",
889 + "api_key_hint_ollama_cloud": "Ollama Cloud API キーを貼り付け",
890 + "add_server_ollama_cloud_subtitle": "ollama.com/settings/keys の API キーで Ollama Cloud に接続し、管理対象のクラウドモデルにアクセスします。",
891 + "add_server_openrouter_subtitle": "有効な API キーで OpenRouter 経由で接続し、モデルルーティングの準備を整えます。",
892 + "add_server_endpoint_subtitle": "ローカルまたはセルフホストのエンドポイントを設定し、保存前に接続を確認します。",
893 + "model_set_default": "デフォルトモデルに設定",
894 + "model_clear_default": "デフォルトモデルから解除",
895 + "model_default_badge": "デフォルト",
896 + "model_capabilities": "機能",
897 + "model_api_pricing": "API 価格設定 (100万トークンあたり)",
898 + "openrouter_pricing_free": "無料",
899 + "openrouter_pricing_tooltip": "入力 {input} / 出力 {output} (100万トークンあたり)",
900 + "reasoning_effort_minimal": "最小",
901 + "reasoning_effort_xhigh": "極高",
902 + "reasoning_effort_max": "最大",
903 + "reasoning_effort_off": "オフ"
904 }
lib/l10n/app_localizations.dart
+24
@@ -5205,6 +5205,30 @@ abstract class AppLocalizations {
5205 /// **'High'**
5206 String get reasoning_effort_high;
5207
5208 + /// Minimal reasoning effort level
5209 + ///
5210 + /// In en, this message translates to:
5211 + /// **'Minimal'**
5212 + String get reasoning_effort_minimal;
5213 +
5214 + /// Extra-high reasoning effort level
5215 + ///
5216 + /// In en, this message translates to:
5217 + /// **'X-High'**
5218 + String get reasoning_effort_xhigh;
5219 +
5220 + /// Maximum reasoning effort level
5221 + ///
5222 + /// In en, this message translates to:
5223 + /// **'Max'**
5224 + String get reasoning_effort_max;
5225 +
5226 + /// Label for disabling reasoning entirely
5227 + ///
5228 + /// In en, this message translates to:
5229 + /// **'Off'**
5230 + String get reasoning_effort_off;
5231 +
5232 /// Error message when file cannot be read
5233 ///
5234 /// In en, this message translates to:
lib/l10n/app_localizations_ar.dart
+36 -23
@@ -548,11 +548,11 @@ class AppLocalizationsAr extends AppLocalizations {
548 String get settings_default_persona => 'الشخصية الافتراضية';
549
550 @override
551 - String get settings_default_model => 'Default Model';
551 + String get settings_default_model => 'النموذج الافتراضي';
552
553 @override
554 String get settings_default_model_desc =>
555 - 'Automatically selected when you start a new chat.';
555 + 'يتم تحديده تلقائيًا عند بدء محادثة جديدة.';
556
557 @override
558 String get settings_privacy => 'الخصوصية';
@@ -901,26 +901,27 @@ class AppLocalizationsAr extends AppLocalizations {
901 String get active_integrations => 'التكاملات النشطة';
902
903 @override
904 - String get import_mcp_json => 'Import JSON';
904 + String get import_mcp_json => 'استيراد JSON';
905
906 @override
907 - String get import_mcp_json_dialog_title => 'Import MCP Config JSON';
907 + String get import_mcp_json_dialog_title => 'استيراد تكوين MCP JSON';
908
909 @override
910 String get import_mcp_json_instructions =>
911 - 'Copy your mcpServers JSON directly from LM Studio (mcp.json) or paste a plugin array below:';
911 + 'قم بنسخ mcpServers JSON مباشرة من LM Studio (mcp.json) أو ألصق مصفوفة الملحقات أدناه:';
912
913 @override
914 String get import_mcp_json_placeholder =>
915 - 'Paste mcpServers JSON or plugin list here...';
915 + 'ألصق mcpServers JSON أو قائمة الملحقات هنا...';
916
917 @override
918 String mcp_import_success(int count) {
919 - return 'Successfully imported $count integration(s)';
919 + return 'تم استيراد $count من التكاملات بنجاح';
920 }
921
922 @override
923 - String get mcp_import_failed => 'No valid MCP integrations found in JSON';
923 + String get mcp_import_failed =>
924 + 'لم يتم العثور على تكاملات MCP صالحة في ملف JSON';
925
926 @override
927 String get enable_notifications => 'تفعيل الإشعارات';
@@ -1040,7 +1041,7 @@ class AppLocalizationsAr extends AppLocalizations {
1041 String get server_type_ollama_cloud => 'Ollama Cloud';
1042
1043 @override
1043 - String get server_type_ollama_cloud_sub => 'CLOUD MANAGED';
1044 + String get server_type_ollama_cloud_sub => 'سحابة مُدارة';
1045
1046 @override
1047 String get server_type_ollama_cloud_display => 'Ollama Cloud';
@@ -1050,26 +1051,26 @@ class AppLocalizationsAr extends AppLocalizations {
1051
1052 @override
1053 String get ollama_cloud_disclosure =>
1053 - 'By connecting Ollama Cloud, your chat messages and inputs are sent to Ollama\'s managed servers for inference. LocalMind does not track or store your conversations. You can revoke this key any time at ollama.com/settings/keys.';
1054 + 'عند الاتصال بـ Ollama Cloud، يتم إرسال رسائل المحادثة والإدخالات إلى خوادم Ollama المُدارة للاستنتاج. لا يقوم LocalMind بتتبع أو تخزين محادثاتك. يمكنك إلغاء هذا المفتاح في أي وقت عبر ollama.com/settings/keys.';
1055
1056 @override
1056 - String get api_key_required_ollama_cloud =>
1057 - 'API Key required for Ollama Cloud';
1057 + String get api_key_required_ollama_cloud => 'مفتاح API مطلوب لـ Ollama Cloud';
1058
1059 @override
1060 - String get api_key_hint_ollama_cloud => 'Paste your Ollama Cloud API key';
1060 + String get api_key_hint_ollama_cloud =>
1061 + 'ألصق مفتاح API الخاص بـ Ollama Cloud';
1062
1063 @override
1064 String get add_server_ollama_cloud_subtitle =>
1064 - 'Connect to Ollama Cloud with an API key from ollama.com/settings/keys to access managed cloud models.';
1065 + 'اتصل بـ Ollama Cloud باستخدام مفتاح API من ollama.com/settings/keys للوصول إلى النماذج السحابية المُدارة.';
1066
1067 @override
1068 String get add_server_openrouter_subtitle =>
1068 - 'Connect through OpenRouter with a valid API key and keep this profile ready for model routing.';
1069 + 'اتصل عبر OpenRouter باستخدام مفتاح API صالح واحتفظ بهذا الملف الشخصي جاهزًا لتوجيه النماذج.';
1070
1071 @override
1072 String get add_server_endpoint_subtitle =>
1072 - 'Configure a local or self-hosted endpoint, then verify the connection before saving.';
1073 + 'قم بتكوين نقطة نهاية محلية أو مستضافة ذاتيًا، ثم تحقق من الاتصال قبل الحفظ.';
1074
1075 @override
1076 String get server_type_openrouter => 'OpenRouter';
@@ -2228,13 +2229,13 @@ class AppLocalizationsAr extends AppLocalizations {
2229 String get model_favorite_toggle => 'تبديل المفضلة';
2230
2231 @override
2231 - String get model_set_default => 'Set as default model';
2232 + String get model_set_default => 'تعيين كنموذج افتراضي';
2233
2234 @override
2234 - String get model_clear_default => 'Remove as default model';
2235 + String get model_clear_default => 'إزالة من النموذج الافتراضي';
2236
2237 @override
2237 - String get model_default_badge => 'Default';
2238 + String get model_default_badge => 'افتراضي';
2239
2240 @override
2241 String get model_note_label => 'ملاحظة';
@@ -2507,10 +2508,10 @@ class AppLocalizationsAr extends AppLocalizations {
2508 String get model_identifier => 'معرف النموذج';
2509
2510 @override
2510 - String get model_capabilities => 'Capabilities';
2511 + String get model_capabilities => 'القدرات';
2512
2513 @override
2513 - String get model_api_pricing => 'API pricing (per 1M tokens)';
2514 + String get model_api_pricing => 'أسعار API (لكل 1M رمز)';
2515
2516 @override
2517 String get not_available => 'غير متاح';
@@ -2705,11 +2706,11 @@ class AppLocalizationsAr extends AppLocalizations {
2706 String get lm_studio_reasoning => 'التفكير والاستنتاج';
2707
2708 @override
2708 - String get openrouter_pricing_free => 'Free';
2709 + String get openrouter_pricing_free => 'مجاني';
2710
2711 @override
2712 String openrouter_pricing_tooltip(String input, String output) {
2712 - return 'Input $input / Output $output per 1M tokens';
2713 + return 'الإدخال $input / الإخراج $output لكل 1M رمز';
2714 }
2715
2716 @override
@@ -2771,6 +2772,18 @@ class AppLocalizationsAr extends AppLocalizations {
2772 @override
2773 String get reasoning_effort_high => 'مرتفع';
2774
2775 + @override
2776 + String get reasoning_effort_minimal => 'أدنى';
2777 +
2778 + @override
2779 + String get reasoning_effort_xhigh => 'عالي جداً';
2780 +
2781 + @override
2782 + String get reasoning_effort_max => 'أقصى';
2783 +
2784 + @override
2785 + String get reasoning_effort_off => 'موقف';
2786 +
2787 @override
2788 String get could_not_read_file => 'تعذر قراءة الملف';
2789
lib/l10n/app_localizations_bn.dart
+36 -22
@@ -549,11 +549,11 @@ class AppLocalizationsBn extends AppLocalizations {
549 String get settings_default_persona => 'ডিফল্ট পার্সোনা';
550
551 @override
552 - String get settings_default_model => 'Default Model';
552 + String get settings_default_model => 'ডিফল্ট মডেল';
553
554 @override
555 String get settings_default_model_desc =>
556 - 'Automatically selected when you start a new chat.';
556 + 'নতুন চ্যাট শুরু করার সময় স্বয়ংক্রিয়ভাবে নির্বাচিত হয়।';
557
558 @override
559 String get settings_privacy => 'গোপনীয়তা';
@@ -906,26 +906,27 @@ class AppLocalizationsBn extends AppLocalizations {
906 String get active_integrations => 'সক্রিয় ইন্টিগ্রেশনসমূহ';
907
908 @override
909 - String get import_mcp_json => 'Import JSON';
909 + String get import_mcp_json => 'JSON ইম্পোর্ট করুন';
910
911 @override
912 - String get import_mcp_json_dialog_title => 'Import MCP Config JSON';
912 + String get import_mcp_json_dialog_title => 'MCP কনফিগ JSON ইম্পোর্ট করুন';
913
914 @override
915 String get import_mcp_json_instructions =>
916 - 'Copy your mcpServers JSON directly from LM Studio (mcp.json) or paste a plugin array below:';
916 + 'LM Studio (mcp.json) থেকে সরাসরি আপনার mcpServers JSON কপি করুন অথবা নিচে প্লাগইন অ্যারে পেস্ট করুন:';
917
918 @override
919 String get import_mcp_json_placeholder =>
920 - 'Paste mcpServers JSON or plugin list here...';
920 + 'এখানে mcpServers JSON বা প্লাগইন তালিকা পেস্ট করুন...';
921
922 @override
923 String mcp_import_success(int count) {
924 - return 'Successfully imported $count integration(s)';
924 + return 'সফলভাবে $countটি ইন্টিগ্রেশন ইম্পোর্ট করা হয়েছে';
925 }
926
927 @override
928 - String get mcp_import_failed => 'No valid MCP integrations found in JSON';
928 + String get mcp_import_failed =>
929 + 'JSON-এ কোনো বৈধ MCP ইন্টিগ্রেশন পাওয়া যায়নি';
930
931 @override
932 String get enable_notifications => 'নোটিফিকেশন সক্ষম করুন';
@@ -1046,7 +1047,7 @@ class AppLocalizationsBn extends AppLocalizations {
1047 String get server_type_ollama_cloud => 'Ollama Cloud';
1048
1049 @override
1049 - String get server_type_ollama_cloud_sub => 'CLOUD MANAGED';
1050 + String get server_type_ollama_cloud_sub => 'ক্লাউড পরিচালিত';
1051
1052 @override
1053 String get server_type_ollama_cloud_display => 'Ollama Cloud';
@@ -1056,26 +1057,27 @@ class AppLocalizationsBn extends AppLocalizations {
1057
1058 @override
1059 String get ollama_cloud_disclosure =>
1059 - 'By connecting Ollama Cloud, your chat messages and inputs are sent to Ollama\'s managed servers for inference. LocalMind does not track or store your conversations. You can revoke this key any time at ollama.com/settings/keys.';
1060 + 'Ollama Cloud সংযোগ করলে আপনার চ্যাট বার্তা এবং ইনপুট অনুমানের জন্য Ollama-এর পরিচালিত সার্ভারে পাঠানো হয়। LocalMind আপনার কথোপকথন ট্র্যাক বা সংরক্ষণ করে না। আপনি যেকোনো সময় ollama.com/settings/keys থেকে এই কী বাতিল করতে পারেন।';
1061
1062 @override
1063 String get api_key_required_ollama_cloud =>
1063 - 'API Key required for Ollama Cloud';
1064 + 'Ollama Cloud-এর জন্য API Key প্রয়োজন';
1065
1066 @override
1066 - String get api_key_hint_ollama_cloud => 'Paste your Ollama Cloud API key';
1067 + String get api_key_hint_ollama_cloud =>
1068 + 'আপনার Ollama Cloud API key পেস্ট করুন';
1069
1070 @override
1071 String get add_server_ollama_cloud_subtitle =>
1070 - 'Connect to Ollama Cloud with an API key from ollama.com/settings/keys to access managed cloud models.';
1072 + 'পরিচালিত ক্লাউড মডেল অ্যাক্সেস করতে ollama.com/settings/keys থেকে একটি API Key দিয়ে Ollama Cloud-এ সংযোগ করুন।';
1073
1074 @override
1075 String get add_server_openrouter_subtitle =>
1074 - 'Connect through OpenRouter with a valid API key and keep this profile ready for model routing.';
1076 + 'একটি বৈধ API Key দিয়ে OpenRouter-এর মাধ্যমে সংযোগ করুন এবং মডেল রাউটিংয়ের জন্য এই প্রোফাইলটি প্রস্তুত রাখুন।';
1077
1078 @override
1079 String get add_server_endpoint_subtitle =>
1078 - 'Configure a local or self-hosted endpoint, then verify the connection before saving.';
1080 + 'একটি স্থানীয় বা স্ব-হোস্ট করা এন্ডপয়েন্ট কনফিগার করুন, তারপর সংরক্ষণ করার আগে সংযোগ যাচাই করুন।';
1081
1082 @override
1083 String get server_type_openrouter => 'OpenRouter';
@@ -2245,13 +2247,13 @@ class AppLocalizationsBn extends AppLocalizations {
2247 String get model_favorite_toggle => 'প্রিয় টগল করুন';
2248
2249 @override
2248 - String get model_set_default => 'Set as default model';
2250 + String get model_set_default => 'ডিফল্ট মডেল হিসেবে সেট করুন';
2251
2252 @override
2251 - String get model_clear_default => 'Remove as default model';
2253 + String get model_clear_default => 'ডিফল্ট মডেল হিসেবে সরিয়ে ফেলুন';
2254
2255 @override
2254 - String get model_default_badge => 'Default';
2256 + String get model_default_badge => 'ডিফল্ট';
2257
2258 @override
2259 String get model_note_label => 'নোট';
@@ -2528,10 +2530,10 @@ class AppLocalizationsBn extends AppLocalizations {
2530 String get model_identifier => 'মডেল সনাক্তকারী';
2531
2532 @override
2531 - String get model_capabilities => 'Capabilities';
2533 + String get model_capabilities => 'ক্ষমতাসমূহ';
2534
2535 @override
2534 - String get model_api_pricing => 'API pricing (per 1M tokens)';
2536 + String get model_api_pricing => 'API মূল্য (প্রতি ১ মিলিয়ন টোকেন)';
2537
2538 @override
2539 String get not_available => 'অনুপলব্ধ';
@@ -2728,11 +2730,11 @@ class AppLocalizationsBn extends AppLocalizations {
2730 String get lm_studio_reasoning => 'রিজনিং';
2731
2732 @override
2731 - String get openrouter_pricing_free => 'Free';
2733 + String get openrouter_pricing_free => 'বিনামূল্যে';
2734
2735 @override
2736 String openrouter_pricing_tooltip(String input, String output) {
2735 - return 'Input $input / Output $output per 1M tokens';
2737 + return 'ইনপুট $input / আউটপুট $output প্রতি ১ মিলিয়ন টোকেন';
2738 }
2739
2740 @override
@@ -2792,6 +2794,18 @@ class AppLocalizationsBn extends AppLocalizations {
2794 @override
2795 String get reasoning_effort_high => 'উচ্চ';
2796
2797 + @override
2798 + String get reasoning_effort_minimal => 'ন্যূনতম';
2799 +
2800 + @override
2801 + String get reasoning_effort_xhigh => 'অতিরিক্ত উচ্চ';
2802 +
2803 + @override
2804 + String get reasoning_effort_max => 'সর্বোচ্চ';
2805 +
2806 + @override
2807 + String get reasoning_effort_off => 'বন্ধ';
2808 +
2809 @override
2810 String get could_not_read_file => 'ফাইল পড়া যায়নি';
2811
lib/l10n/app_localizations_en.dart
+12
@@ -2780,6 +2780,18 @@ class AppLocalizationsEn extends AppLocalizations {
2780 @override
2781 String get reasoning_effort_high => 'High';
2782
2783 + @override
2784 + String get reasoning_effort_minimal => 'Minimal';
2785 +
2786 + @override
2787 + String get reasoning_effort_xhigh => 'X-High';
2788 +
2789 + @override
2790 + String get reasoning_effort_max => 'Max';
2791 +
2792 + @override
2793 + String get reasoning_effort_off => 'Off';
2794 +
2795 @override
2796 String get could_not_read_file => 'Could not read file';
2797
lib/l10n/app_localizations_es.dart
+36 -22
@@ -549,11 +549,11 @@ class AppLocalizationsEs extends AppLocalizations {
549 String get settings_default_persona => 'Personaje predeterminado';
550
551 @override
552 - String get settings_default_model => 'Default Model';
552 + String get settings_default_model => 'Modelo predeterminado';
553
554 @override
555 String get settings_default_model_desc =>
556 - 'Automatically selected when you start a new chat.';
556 + 'Se selecciona automáticamente al iniciar un nuevo chat.';
557
558 @override
559 String get settings_privacy => 'Privacidad';
@@ -907,26 +907,28 @@ class AppLocalizationsEs extends AppLocalizations {
907 String get active_integrations => 'Integraciones activas';
908
909 @override
910 - String get import_mcp_json => 'Import JSON';
910 + String get import_mcp_json => 'Importar JSON';
911
912 @override
913 - String get import_mcp_json_dialog_title => 'Import MCP Config JSON';
913 + String get import_mcp_json_dialog_title =>
914 + 'Importar JSON de configuración MCP';
915
916 @override
917 String get import_mcp_json_instructions =>
917 - 'Copy your mcpServers JSON directly from LM Studio (mcp.json) or paste a plugin array below:';
918 + 'Copia tu JSON de mcpServers directamente desde LM Studio (mcp.json) o pega una lista de complementos a continuación:';
919
920 @override
921 String get import_mcp_json_placeholder =>
921 - 'Paste mcpServers JSON or plugin list here...';
922 + 'Pega el JSON de mcpServers o la lista de complementos aquí...';
923
924 @override
925 String mcp_import_success(int count) {
925 - return 'Successfully imported $count integration(s)';
926 + return '$count integración(es) importada(s) con éxito';
927 }
928
929 @override
929 - String get mcp_import_failed => 'No valid MCP integrations found in JSON';
930 + String get mcp_import_failed =>
931 + 'No se encontraron integraciones MCP válidas en el JSON';
932
933 @override
934 String get enable_notifications => 'Habilitar notificaciones';
@@ -1047,7 +1049,7 @@ class AppLocalizationsEs extends AppLocalizations {
1049 String get server_type_ollama_cloud => 'Ollama Cloud';
1050
1051 @override
1050 - String get server_type_ollama_cloud_sub => 'CLOUD MANAGED';
1052 + String get server_type_ollama_cloud_sub => 'NUBE ADMINISTRADA';
1053
1054 @override
1055 String get server_type_ollama_cloud_display => 'Ollama Cloud';
@@ -1057,26 +1059,26 @@ class AppLocalizationsEs extends AppLocalizations {
1059
1060 @override
1061 String get ollama_cloud_disclosure =>
1060 - 'By connecting Ollama Cloud, your chat messages and inputs are sent to Ollama\'s managed servers for inference. LocalMind does not track or store your conversations. You can revoke this key any time at ollama.com/settings/keys.';
1062 + 'Al conectar Ollama Cloud, tus mensajes e insumos de chat se envían a los servidores administrados de Ollama para la inferencia. LocalMind no rastrea ni almacena tus conversaciones. Puedes revocar esta clave en cualquier momento en ollama.com/settings/keys.';
1063
1064 @override
1065 String get api_key_required_ollama_cloud =>
1064 - 'API Key required for Ollama Cloud';
1066 + 'Se requiere clave API para Ollama Cloud';
1067
1068 @override
1067 - String get api_key_hint_ollama_cloud => 'Paste your Ollama Cloud API key';
1069 + String get api_key_hint_ollama_cloud => 'Pega tu clave API de Ollama Cloud';
1070
1071 @override
1072 String get add_server_ollama_cloud_subtitle =>
1071 - 'Connect to Ollama Cloud with an API key from ollama.com/settings/keys to access managed cloud models.';
1073 + 'Conéctate a Ollama Cloud con una clave API de ollama.com/settings/keys para acceder a modelos administrados en la nube.';
1074
1075 @override
1076 String get add_server_openrouter_subtitle =>
1075 - 'Connect through OpenRouter with a valid API key and keep this profile ready for model routing.';
1077 + 'Conéctate a través de OpenRouter con una clave API válida y mantén este perfil listo para el enrutamiento de modelos.';
1078
1079 @override
1080 String get add_server_endpoint_subtitle =>
1079 - 'Configure a local or self-hosted endpoint, then verify the connection before saving.';
1081 + 'Configura un punto de enlace local o alojado por ti mismo y luego verifica la conexión antes de guardar.';
1082
1083 @override
1084 String get server_type_openrouter => 'OpenRouter';
@@ -2252,13 +2254,13 @@ class AppLocalizationsEs extends AppLocalizations {
2254 String get model_favorite_toggle => 'Alternar favorito';
2255
2256 @override
2255 - String get model_set_default => 'Set as default model';
2257 + String get model_set_default => 'Establecer como modelo predeterminado';
2258
2259 @override
2258 - String get model_clear_default => 'Remove as default model';
2260 + String get model_clear_default => 'Quitar como modelo predeterminado';
2261
2262 @override
2261 - String get model_default_badge => 'Default';
2263 + String get model_default_badge => 'Predeterminado';
2264
2265 @override
2266 String get model_note_label => 'Nota';
@@ -2533,10 +2535,10 @@ class AppLocalizationsEs extends AppLocalizations {
2535 String get model_identifier => 'Identificador del modelo';
2536
2537 @override
2536 - String get model_capabilities => 'Capabilities';
2538 + String get model_capabilities => 'Capacidades';
2539
2540 @override
2539 - String get model_api_pricing => 'API pricing (per 1M tokens)';
2541 + String get model_api_pricing => 'Precios de API (por millón de tokens)';
2542
2543 @override
2544 String get not_available => 'No disponible';
@@ -2732,11 +2734,11 @@ class AppLocalizationsEs extends AppLocalizations {
2734 String get lm_studio_reasoning => 'Razonamiento';
2735
2736 @override
2735 - String get openrouter_pricing_free => 'Free';
2737 + String get openrouter_pricing_free => 'Gratis';
2738
2739 @override
2740 String openrouter_pricing_tooltip(String input, String output) {
2739 - return 'Input $input / Output $output per 1M tokens';
2741 + return 'Entrada $input / Salida $output por millón de tokens';
2742 }
2743
2744 @override
@@ -2796,6 +2798,18 @@ class AppLocalizationsEs extends AppLocalizations {
2798 @override
2799 String get reasoning_effort_high => 'Alto';
2800
2801 + @override
2802 + String get reasoning_effort_minimal => 'Mínimo';
2803 +
2804 + @override
2805 + String get reasoning_effort_xhigh => 'Muy alto';
2806 +
2807 + @override
2808 + String get reasoning_effort_max => 'Máximo';
2809 +
2810 + @override
2811 + String get reasoning_effort_off => 'Desactivado';
2812 +
2813 @override
2814 String get could_not_read_file => 'No se pudo leer el archivo';
2815
lib/l10n/app_localizations_fr.dart
+29 -15
@@ -547,11 +547,11 @@ class AppLocalizationsFr extends AppLocalizations {
547 String get settings_default_persona => 'Default Persona';
548
549 @override
550 - String get settings_default_model => 'Default Model';
550 + String get settings_default_model => 'Modèle par défaut';
551
552 @override
553 String get settings_default_model_desc =>
554 - 'Automatically selected when you start a new chat.';
554 + 'Sélectionné automatiquement lorsque vous démarrez un nouveau chat.';
555
556 @override
557 String get settings_privacy => 'Privacy';
@@ -901,26 +901,28 @@ class AppLocalizationsFr extends AppLocalizations {
901 String get active_integrations => 'Active Integrations';
902
903 @override
904 - String get import_mcp_json => 'Import JSON';
904 + String get import_mcp_json => 'Importer JSON';
905
906 @override
907 - String get import_mcp_json_dialog_title => 'Import MCP Config JSON';
907 + String get import_mcp_json_dialog_title =>
908 + 'Importer la configuration MCP (JSON)';
909
910 @override
911 String get import_mcp_json_instructions =>
911 - 'Copy your mcpServers JSON directly from LM Studio (mcp.json) or paste a plugin array below:';
912 + 'Copiez votre JSON mcpServers directement depuis LM Studio (mcp.json) ou collez un tableau de plugins ci-dessous :';
913
914 @override
915 String get import_mcp_json_placeholder =>
915 - 'Paste mcpServers JSON or plugin list here...';
916 + 'Collez le JSON mcpServers ou la liste de plugins ici...';
917
918 @override
919 String mcp_import_success(int count) {
919 - return 'Successfully imported $count integration(s)';
920 + return '$count intégration(s) importée(s) avec succès';
921 }
922
923 @override
923 - String get mcp_import_failed => 'No valid MCP integrations found in JSON';
924 + String get mcp_import_failed =>
925 + 'Aucune intégration MCP valide trouvée dans le JSON';
926
927 @override
928 String get enable_notifications => 'Enable Nontifications';
@@ -2235,13 +2237,13 @@ class AppLocalizationsFr extends AppLocalizations {
2237 String get model_favorite_toggle => 'Toggle favorite';
2238
2239 @override
2238 - String get model_set_default => 'Set as default model';
2240 + String get model_set_default => 'Définir comme modèle par défaut';
2241
2242 @override
2241 - String get model_clear_default => 'Remove as default model';
2243 + String get model_clear_default => 'Retirer comme modèle par défaut';
2244
2245 @override
2244 - String get model_default_badge => 'Default';
2246 + String get model_default_badge => 'Par défaut';
2247
2248 @override
2249 String get model_note_label => 'Nonte';
@@ -2515,10 +2517,10 @@ class AppLocalizationsFr extends AppLocalizations {
2517 String get model_identifier => 'Identifier';
2518
2519 @override
2518 - String get model_capabilities => 'Capabilities';
2520 + String get model_capabilities => 'Capacités';
2521
2522 @override
2521 - String get model_api_pricing => 'API pricing (per 1M tokens)';
2523 + String get model_api_pricing => 'Tarifs de l\'API (par 1M de tokens)';
2524
2525 @override
2526 String get not_available => 'Nont available';
@@ -2721,11 +2723,11 @@ class AppLocalizationsFr extends AppLocalizations {
2723 String get lm_studio_reasoning => 'Reasoning';
2724
2725 @override
2724 - String get openrouter_pricing_free => 'Free';
2726 + String get openrouter_pricing_free => 'Gratuit';
2727
2728 @override
2729 String openrouter_pricing_tooltip(String input, String output) {
2728 - return 'Input $input / Output $output per 1M tokens';
2730 + return 'Entrée $input / Sortie $output par 1M de tokens';
2731 }
2732
2733 @override
@@ -2785,6 +2787,18 @@ class AppLocalizationsFr extends AppLocalizations {
2787 @override
2788 String get reasoning_effort_high => 'High';
2789
2790 + @override
2791 + String get reasoning_effort_minimal => 'Minimal';
2792 +
2793 + @override
2794 + String get reasoning_effort_xhigh => 'Très élevé';
2795 +
2796 + @override
2797 + String get reasoning_effort_max => 'Maximal';
2798 +
2799 + @override
2800 + String get reasoning_effort_off => 'Désactivé';
2801 +
2802 @override
2803 String get could_not_read_file => 'Could not read file';
2804
lib/l10n/app_localizations_hi.dart
+35 -22
@@ -550,11 +550,11 @@ class AppLocalizationsHi extends AppLocalizations {
550 String get settings_default_persona => 'डिफ़ॉल्ट चरित्र';
551
552 @override
553 - String get settings_default_model => 'Default Model';
553 + String get settings_default_model => 'डिफ़ॉल्ट मॉडल';
554
555 @override
556 String get settings_default_model_desc =>
557 - 'Automatically selected when you start a new chat.';
557 + 'नया चैट शुरू करने पर स्वचालित रूप से चुना जाता है।';
558
559 @override
560 String get settings_privacy => 'गोपनीयता';
@@ -906,26 +906,26 @@ class AppLocalizationsHi extends AppLocalizations {
906 String get active_integrations => 'सक्रिय एकीकरण';
907
908 @override
909 - String get import_mcp_json => 'Import JSON';
909 + String get import_mcp_json => 'JSON आयात करें';
910
911 @override
912 - String get import_mcp_json_dialog_title => 'Import MCP Config JSON';
912 + String get import_mcp_json_dialog_title => 'MCP कॉन्फ़िगरेशन JSON आयात करें';
913
914 @override
915 String get import_mcp_json_instructions =>
916 - 'Copy your mcpServers JSON directly from LM Studio (mcp.json) or paste a plugin array below:';
916 + 'LM Studio (mcp.json) से सीधे अपना mcpServers JSON कॉपी करें या नीचे प्लगइन एरे पेस्ट करें:';
917
918 @override
919 String get import_mcp_json_placeholder =>
920 - 'Paste mcpServers JSON or plugin list here...';
920 + 'यहाँ mcpServers JSON या प्लगइन सूची पेस्ट करें...';
921
922 @override
923 String mcp_import_success(int count) {
924 - return 'Successfully imported $count integration(s)';
924 + return 'सफलतापूर्वक $count एकीकरण आयात किए गए';
925 }
926
927 @override
928 - String get mcp_import_failed => 'No valid MCP integrations found in JSON';
928 + String get mcp_import_failed => 'JSON में कोई वैध MCP एकीकरण नहीं मिला';
929
930 @override
931 String get enable_notifications => 'सूचनाएं सक्षम करें';
@@ -1045,7 +1045,7 @@ class AppLocalizationsHi extends AppLocalizations {
1045 String get server_type_ollama_cloud => 'Ollama Cloud';
1046
1047 @override
1048 - String get server_type_ollama_cloud_sub => 'CLOUD MANAGED';
1048 + String get server_type_ollama_cloud_sub => 'क्लाउड प्रबंधित';
1049
1050 @override
1051 String get server_type_ollama_cloud_display => 'Ollama Cloud';
@@ -1055,26 +1055,27 @@ class AppLocalizationsHi extends AppLocalizations {
1055
1056 @override
1057 String get ollama_cloud_disclosure =>
1058 - 'By connecting Ollama Cloud, your chat messages and inputs are sent to Ollama\'s managed servers for inference. LocalMind does not track or store your conversations. You can revoke this key any time at ollama.com/settings/keys.';
1058 + 'Ollama Cloud कनेक्ट करने पर आपके चैट संदेश और इनपुट अनुमान के लिए Ollama के प्रबंधित सर्वर पर भेजे जाते हैं। LocalMind आपकी बातचीत को ट्रैक या स्टोर नहीं करता है। आप ollama.com/settings/keys पर किसी भी समय इस कुंजी को रद्द कर सकते हैं।';
1059
1060 @override
1061 String get api_key_required_ollama_cloud =>
1062 - 'API Key required for Ollama Cloud';
1062 + 'Ollama Cloud के लिए API Key आवश्यक है';
1063
1064 @override
1065 - String get api_key_hint_ollama_cloud => 'Paste your Ollama Cloud API key';
1065 + String get api_key_hint_ollama_cloud =>
1066 + 'अपनी Ollama Cloud API key पेस्ट करें';
1067
1068 @override
1069 String get add_server_ollama_cloud_subtitle =>
1069 - 'Connect to Ollama Cloud with an API key from ollama.com/settings/keys to access managed cloud models.';
1070 + 'प्रबंधित क्लाउड मॉडल तक पहुँचने के लिए ollama.com/settings/keys से API Key के साथ Ollama Cloud से कनेक्ट करें।';
1071
1072 @override
1073 String get add_server_openrouter_subtitle =>
1073 - 'Connect through OpenRouter with a valid API key and keep this profile ready for model routing.';
1074 + 'एक वैध API Key के साथ OpenRouter के माध्यम से कनेक्ट करें और इस प्रोफ़ाइल को मॉडल राउटिंग के लिए तैयार रखें।';
1075
1076 @override
1077 String get add_server_endpoint_subtitle =>
1077 - 'Configure a local or self-hosted endpoint, then verify the connection before saving.';
1078 + 'एक स्थानीय या स्व-होस्ट किए गए एंडपॉइंट को कॉन्फ़िगर करें, फिर सहेजने से पहले कनेक्शन सत्यापित करें।';
1079
1080 @override
1081 String get server_type_openrouter => 'OpenRouter';
@@ -2240,13 +2241,13 @@ class AppLocalizationsHi extends AppLocalizations {
2241 String get model_favorite_toggle => 'पसंदीदा टॉगल करें';
2242
2243 @override
2243 - String get model_set_default => 'Set as default model';
2244 + String get model_set_default => 'डिफ़ॉल्ट मॉडल के रूप में सेट करें';
2245
2246 @override
2246 - String get model_clear_default => 'Remove as default model';
2247 + String get model_clear_default => 'डिफ़ॉल्ट मॉडल के रूप में हटाएं';
2248
2249 @override
2249 - String get model_default_badge => 'Default';
2250 + String get model_default_badge => 'डिफ़ॉल्ट';
2251
2252 @override
2253 String get model_note_label => 'टिप्पणी (Note)';
@@ -2521,10 +2522,10 @@ class AppLocalizationsHi extends AppLocalizations {
2522 String get model_identifier => 'मॉडल पहचानकर्ता';
2523
2524 @override
2524 - String get model_capabilities => 'Capabilities';
2525 + String get model_capabilities => 'क्षमताएं';
2526
2527 @override
2527 - String get model_api_pricing => 'API pricing (per 1M tokens)';
2528 + String get model_api_pricing => 'API मूल्य निर्धारण (प्रति 1M टोकन)';
2529
2530 @override
2531 String get not_available => 'अनुपलब्ध';
@@ -2721,11 +2722,11 @@ class AppLocalizationsHi extends AppLocalizations {
2722 String get lm_studio_reasoning => 'तर्क (Reasoning)';
2723
2724 @override
2724 - String get openrouter_pricing_free => 'Free';
2725 + String get openrouter_pricing_free => 'निःशुल्क';
2726
2727 @override
2728 String openrouter_pricing_tooltip(String input, String output) {
2728 - return 'Input $input / Output $output per 1M tokens';
2729 + return 'इनपुट $input / आउटपुट $output प्रति 1M टोकन';
2730 }
2731
2732 @override
@@ -2785,6 +2786,18 @@ class AppLocalizationsHi extends AppLocalizations {
2786 @override
2787 String get reasoning_effort_high => 'उच्च';
2788
2789 + @override
2790 + String get reasoning_effort_minimal => 'न्यूनतम';
2791 +
2792 + @override
2793 + String get reasoning_effort_xhigh => 'अत्यधिक उच्च';
2794 +
2795 + @override
2796 + String get reasoning_effort_max => 'अधिकतम';
2797 +
2798 + @override
2799 + String get reasoning_effort_off => 'बंद';
2800 +
2801 @override
2802 String get could_not_read_file => 'फ़ाइल पढ़ी नहीं जा सकी';
2803
lib/l10n/app_localizations_it.dart
+36 -22
@@ -551,11 +551,11 @@ class AppLocalizationsIt extends AppLocalizations {
551 String get settings_default_persona => 'Persona predefinita';
552
553 @override
554 - String get settings_default_model => 'Default Model';
554 + String get settings_default_model => 'Modello predefinito';
555
556 @override
557 String get settings_default_model_desc =>
558 - 'Automatically selected when you start a new chat.';
558 + 'Selezionato automaticamente quando avvii una nuova chat.';
559
560 @override
561 String get settings_privacy => 'Privacy';
@@ -908,26 +908,27 @@ class AppLocalizationsIt extends AppLocalizations {
908 String get active_integrations => 'Integrazioni attive';
909
910 @override
911 - String get import_mcp_json => 'Import JSON';
911 + String get import_mcp_json => 'Importa JSON';
912
913 @override
914 - String get import_mcp_json_dialog_title => 'Import MCP Config JSON';
914 + String get import_mcp_json_dialog_title => 'Importa JSON configurazione MCP';
915
916 @override
917 String get import_mcp_json_instructions =>
918 - 'Copy your mcpServers JSON directly from LM Studio (mcp.json) or paste a plugin array below:';
918 + 'Copia il tuo JSON mcpServers direttamente da LM Studio (mcp.json) o incolla un array di plugin qui sotto:';
919
920 @override
921 String get import_mcp_json_placeholder =>
922 - 'Paste mcpServers JSON or plugin list here...';
922 + 'Incolla il JSON mcpServers o l\'elenco dei plugin qui...';
923
924 @override
925 String mcp_import_success(int count) {
926 - return 'Successfully imported $count integration(s)';
926 + return '$count integrazione/i importata/e con successo';
927 }
928
929 @override
930 - String get mcp_import_failed => 'No valid MCP integrations found in JSON';
930 + String get mcp_import_failed =>
931 + 'Nessuna integrazione MCP valida trovata nel JSON';
932
933 @override
934 String get enable_notifications => 'Abilita notifiche';
@@ -1047,7 +1048,7 @@ class AppLocalizationsIt extends AppLocalizations {
1048 String get server_type_ollama_cloud => 'Ollama Cloud';
1049
1050 @override
1050 - String get server_type_ollama_cloud_sub => 'CLOUD MANAGED';
1051 + String get server_type_ollama_cloud_sub => 'CLOUD GESTITO';
1052
1053 @override
1054 String get server_type_ollama_cloud_display => 'Ollama Cloud';
@@ -1057,26 +1058,27 @@ class AppLocalizationsIt extends AppLocalizations {
1058
1059 @override
1060 String get ollama_cloud_disclosure =>
1060 - 'By connecting Ollama Cloud, your chat messages and inputs are sent to Ollama\'s managed servers for inference. LocalMind does not track or store your conversations. You can revoke this key any time at ollama.com/settings/keys.';
1061 + 'Connettendo Ollama Cloud, i tuoi messaggi di chat e i tuoi input vengono inviati ai server gestiti di Ollama per l\'inferenza. LocalMind non traccia né memorizza le tue conversazioni. Puoi revocare questa chiave in qualsiasi momento su ollama.com/settings/keys.';
1062
1063 @override
1064 String get api_key_required_ollama_cloud =>
1064 - 'API Key required for Ollama Cloud';
1065 + 'Chiave API richiesta per Ollama Cloud';
1066
1067 @override
1067 - String get api_key_hint_ollama_cloud => 'Paste your Ollama Cloud API key';
1068 + String get api_key_hint_ollama_cloud =>
1069 + 'Incolla la tua chiave API di Ollama Cloud';
1070
1071 @override
1072 String get add_server_ollama_cloud_subtitle =>
1071 - 'Connect to Ollama Cloud with an API key from ollama.com/settings/keys to access managed cloud models.';
1073 + 'Connettiti a Ollama Cloud con una chiave API da ollama.com/settings/keys per accedere ai modelli cloud gestiti.';
1074
1075 @override
1076 String get add_server_openrouter_subtitle =>
1075 - 'Connect through OpenRouter with a valid API key and keep this profile ready for model routing.';
1077 + 'Connettiti tramite OpenRouter con una chiave API valida e tieni pronto questo profilo per l\'instradamento dei modelli.';
1078
1079 @override
1080 String get add_server_endpoint_subtitle =>
1079 - 'Configure a local or self-hosted endpoint, then verify the connection before saving.';
1081 + 'Configura un endpoint locale o self-hosted, quindi verifica la connessione prima di salvare.';
1082
1083 @override
1084 String get server_type_openrouter => 'OpenRouter';
@@ -2253,13 +2255,13 @@ class AppLocalizationsIt extends AppLocalizations {
2255 String get model_favorite_toggle => 'Attiva/disattiva preferito';
2256
2257 @override
2256 - String get model_set_default => 'Set as default model';
2258 + String get model_set_default => 'Imposta come modello predefinito';
2259
2260 @override
2259 - String get model_clear_default => 'Remove as default model';
2261 + String get model_clear_default => 'Rimuovi come modello predefinito';
2262
2263 @override
2262 - String get model_default_badge => 'Default';
2264 + String get model_default_badge => 'Predefinito';
2265
2266 @override
2267 String get model_note_label => 'Nota';
@@ -2535,10 +2537,10 @@ class AppLocalizationsIt extends AppLocalizations {
2537 String get model_identifier => 'Identificatore modello';
2538
2539 @override
2538 - String get model_capabilities => 'Capabilities';
2540 + String get model_capabilities => 'Capacità';
2541
2542 @override
2541 - String get model_api_pricing => 'API pricing (per 1M tokens)';
2543 + String get model_api_pricing => 'Prezzi API (per 1M di token)';
2544
2545 @override
2546 String get not_available => 'Non disponibile';
@@ -2734,11 +2736,11 @@ class AppLocalizationsIt extends AppLocalizations {
2736 String get lm_studio_reasoning => 'Ragionamento';
2737
2738 @override
2737 - String get openrouter_pricing_free => 'Free';
2739 + String get openrouter_pricing_free => 'Gratuito';
2740
2741 @override
2742 String openrouter_pricing_tooltip(String input, String output) {
2741 - return 'Input $input / Output $output per 1M tokens';
2743 + return 'Input $input / Output $output per 1M di token';
2744 }
2745
2746 @override
@@ -2798,6 +2800,18 @@ class AppLocalizationsIt extends AppLocalizations {
2800 @override
2801 String get reasoning_effort_high => 'Alto';
2802
2803 + @override
2804 + String get reasoning_effort_minimal => 'Minimo';
2805 +
2806 + @override
2807 + String get reasoning_effort_xhigh => 'Molto alto';
2808 +
2809 + @override
2810 + String get reasoning_effort_max => 'Massimo';
2811 +
2812 + @override
2813 + String get reasoning_effort_off => 'Disattivato';
2814 +
2815 @override
2816 String get could_not_read_file => 'Impossibile leggere il file';
2817
lib/l10n/app_localizations_ja.dart
+34 -24
@@ -540,11 +540,10 @@ class AppLocalizationsJa extends AppLocalizations {
540 String get settings_default_persona => 'デフォルトペルソナ';
541
542 @override
543 - String get settings_default_model => 'Default Model';
543 + String get settings_default_model => 'デフォルトモデル';
544
545 @override
546 - String get settings_default_model_desc =>
547 - 'Automatically selected when you start a new chat.';
546 + String get settings_default_model_desc => '新しいチャットを開始するときに自動的に選択されます。';
547
548 @override
549 String get settings_privacy => 'プライバシー';
@@ -887,26 +886,26 @@ class AppLocalizationsJa extends AppLocalizations {
886 String get active_integrations => '有効な統合';
887
888 @override
890 - String get import_mcp_json => 'Import JSON';
889 + String get import_mcp_json => 'JSONをインポート';
890
891 @override
893 - String get import_mcp_json_dialog_title => 'Import MCP Config JSON';
892 + String get import_mcp_json_dialog_title => 'MCP設定JSONをインポート';
893
894 @override
895 String get import_mcp_json_instructions =>
897 - 'Copy your mcpServers JSON directly from LM Studio (mcp.json) or paste a plugin array below:';
896 + 'LM Studio (mcp.json) から mcpServers JSON を直接コピーするか、以下にプラグイン配列を貼り付けてください:';
897
898 @override
899 String get import_mcp_json_placeholder =>
901 - 'Paste mcpServers JSON or plugin list here...';
900 + 'ここに mcpServers JSON またはプラグインリストを貼り付け...';
901
902 @override
903 String mcp_import_success(int count) {
905 - return 'Successfully imported $count integration(s)';
904 + return '$count 件の統合を正常にインポートしました';
905 }
906
907 @override
909 - String get mcp_import_failed => 'No valid MCP integrations found in JSON';
908 + String get mcp_import_failed => 'JSON 内に有効な MCP 統合が見つかりませんでした';
909
910 @override
911 String get enable_notifications => '通知を有効にする';
@@ -1024,7 +1023,7 @@ class AppLocalizationsJa extends AppLocalizations {
1023 String get server_type_ollama_cloud => 'Ollama Cloud';
1024
1025 @override
1027 - String get server_type_ollama_cloud_sub => 'CLOUD MANAGED';
1026 + String get server_type_ollama_cloud_sub => 'クラウド管理';
1027
1028 @override
1029 String get server_type_ollama_cloud_display => 'Ollama Cloud';
@@ -1034,26 +1033,25 @@ class AppLocalizationsJa extends AppLocalizations {
1033
1034 @override
1035 String get ollama_cloud_disclosure =>
1037 - 'By connecting Ollama Cloud, your chat messages and inputs are sent to Ollama\'s managed servers for inference. LocalMind does not track or store your conversations. You can revoke this key any time at ollama.com/settings/keys.';
1036 + 'Ollama Cloud に接続すると、チャットメッセージと入力は推論のために Ollama の管理サーバーに送信されます。LocalMind は会話を追跡または保存しません。このキーは ollama.com/settings/keys でいつでも取り消すことができます。';
1037
1038 @override
1040 - String get api_key_required_ollama_cloud =>
1041 - 'API Key required for Ollama Cloud';
1039 + String get api_key_required_ollama_cloud => 'Ollama Cloud には API キーが必要です';
1040
1041 @override
1044 - String get api_key_hint_ollama_cloud => 'Paste your Ollama Cloud API key';
1042 + String get api_key_hint_ollama_cloud => 'Ollama Cloud API キーを貼り付け';
1043
1044 @override
1045 String get add_server_ollama_cloud_subtitle =>
1048 - 'Connect to Ollama Cloud with an API key from ollama.com/settings/keys to access managed cloud models.';
1046 + 'ollama.com/settings/keys の API キーで Ollama Cloud に接続し、管理対象のクラウドモデルにアクセスします。';
1047
1048 @override
1049 String get add_server_openrouter_subtitle =>
1052 - 'Connect through OpenRouter with a valid API key and keep this profile ready for model routing.';
1050 + '有効な API キーで OpenRouter 経由で接続し、モデルルーティングの準備を整えます。';
1051
1052 @override
1053 String get add_server_endpoint_subtitle =>
1056 - 'Configure a local or self-hosted endpoint, then verify the connection before saving.';
1054 + 'ローカルまたはセルフホストのエンドポイントを設定し、保存前に接続を確認します。';
1055
1056 @override
1057 String get server_type_openrouter => 'OpenRouter';
@@ -2202,13 +2200,13 @@ class AppLocalizationsJa extends AppLocalizations {
2200 String get model_favorite_toggle => 'お気に入りの切り替え';
2201
2202 @override
2205 - String get model_set_default => 'Set as default model';
2203 + String get model_set_default => 'デフォルトモデルに設定';
2204
2205 @override
2208 - String get model_clear_default => 'Remove as default model';
2206 + String get model_clear_default => 'デフォルトモデルから解除';
2207
2208 @override
2211 - String get model_default_badge => 'Default';
2209 + String get model_default_badge => 'デフォルト';
2210
2211 @override
2212 String get model_note_label => 'メモ';
@@ -2473,10 +2471,10 @@ class AppLocalizationsJa extends AppLocalizations {
2471 String get model_identifier => 'モデル識別子';
2472
2473 @override
2476 - String get model_capabilities => 'Capabilities';
2474 + String get model_capabilities => '機能';
2475
2476 @override
2479 - String get model_api_pricing => 'API pricing (per 1M tokens)';
2477 + String get model_api_pricing => 'API 価格設定 (100万トークンあたり)';
2478
2479 @override
2480 String get not_available => '利用不可';
@@ -2670,11 +2668,11 @@ class AppLocalizationsJa extends AppLocalizations {
2668 String get lm_studio_reasoning => '推論';
2669
2670 @override
2673 - String get openrouter_pricing_free => 'Free';
2671 + String get openrouter_pricing_free => '無料';
2672
2673 @override
2674 String openrouter_pricing_tooltip(String input, String output) {
2677 - return 'Input $input / Output $output per 1M tokens';
2675 + return '入力 $input / 出力 $output (100万トークンあたり)';
2676 }
2677
2678 @override
@@ -2733,6 +2731,18 @@ class AppLocalizationsJa extends AppLocalizations {
2731 @override
2732 String get reasoning_effort_high => '高';
2733
2734 + @override
2735 + String get reasoning_effort_minimal => '最小';
2736 +
2737 + @override
2738 + String get reasoning_effort_xhigh => '極高';
2739 +
2740 + @override
2741 + String get reasoning_effort_max => '最大';
2742 +
2743 + @override
2744 + String get reasoning_effort_off => 'オフ';
2745 +
2746 @override
2747 String get could_not_read_file => 'ファイルを読み込めませんでした';
2748
lib/l10n/app_localizations_ru.dart
+35 -22
@@ -549,11 +549,11 @@ class AppLocalizationsRu extends AppLocalizations {
549 String get settings_default_persona => 'Персона по умолчанию';
550
551 @override
552 - String get settings_default_model => 'Default Model';
552 + String get settings_default_model => 'Модель по умолчанию';
553
554 @override
555 String get settings_default_model_desc =>
556 - 'Automatically selected when you start a new chat.';
556 + 'Автоматически выбирается при начале нового чата.';
557
558 @override
559 String get settings_privacy => 'Конфиденциальность';
@@ -907,26 +907,27 @@ class AppLocalizationsRu extends AppLocalizations {
907 String get active_integrations => 'Активная интеграция';
908
909 @override
910 - String get import_mcp_json => 'Import JSON';
910 + String get import_mcp_json => 'Импортировать JSON';
911
912 @override
913 - String get import_mcp_json_dialog_title => 'Import MCP Config JSON';
913 + String get import_mcp_json_dialog_title => 'Импорт JSON конфигурации MCP';
914
915 @override
916 String get import_mcp_json_instructions =>
917 - 'Copy your mcpServers JSON directly from LM Studio (mcp.json) or paste a plugin array below:';
917 + 'Скопируйте ваш mcpServers JSON напрямую из LM Studio (mcp.json) или вставьте массив плагинов ниже:';
918
919 @override
920 String get import_mcp_json_placeholder =>
921 - 'Paste mcpServers JSON or plugin list here...';
921 + 'Вставьте сюда mcpServers JSON или список плагинов...';
922
923 @override
924 String mcp_import_success(int count) {
925 - return 'Successfully imported $count integration(s)';
925 + return 'Успешно импортировано интеграций: $count';
926 }
927
928 @override
929 - String get mcp_import_failed => 'No valid MCP integrations found in JSON';
929 + String get mcp_import_failed =>
930 + 'В JSON не найдено действительных интеграций MCP';
931
932 @override
933 String get enable_notifications => 'Включить уведомления';
@@ -1046,7 +1047,7 @@ class AppLocalizationsRu extends AppLocalizations {
1047 String get server_type_ollama_cloud => 'Ollama Cloud';
1048
1049 @override
1049 - String get server_type_ollama_cloud_sub => 'CLOUD MANAGED';
1050 + String get server_type_ollama_cloud_sub => 'УПРАВЛЯЕМОЕ ОБЛАКО';
1051
1052 @override
1053 String get server_type_ollama_cloud_display => 'Ollama Cloud';
@@ -1056,26 +1057,26 @@ class AppLocalizationsRu extends AppLocalizations {
1057
1058 @override
1059 String get ollama_cloud_disclosure =>
1059 - 'By connecting Ollama Cloud, your chat messages and inputs are sent to Ollama\'s managed servers for inference. LocalMind does not track or store your conversations. You can revoke this key any time at ollama.com/settings/keys.';
1060 + 'При подключении к Ollama Cloud ваши сообщения чата и ввод отправляются на управляемые серверы Ollama для генерации. LocalMind не отслеживает и не сохраняет ваши разговоры. Вы можете отозвать этот ключ в любое время на странице ollama.com/settings/keys.';
1061
1062 @override
1063 String get api_key_required_ollama_cloud =>
1063 - 'API Key required for Ollama Cloud';
1064 + 'Требуется API-ключ для Ollama Cloud';
1065
1066 @override
1066 - String get api_key_hint_ollama_cloud => 'Paste your Ollama Cloud API key';
1067 + String get api_key_hint_ollama_cloud => 'Вставьте ваш API-ключ Ollama Cloud';
1068
1069 @override
1070 String get add_server_ollama_cloud_subtitle =>
1070 - 'Connect to Ollama Cloud with an API key from ollama.com/settings/keys to access managed cloud models.';
1071 + 'Подключитесь к Ollama Cloud с помощью API-ключа с сайта ollama.com/settings/keys для доступа к управляемым облачным моделям.';
1072
1073 @override
1074 String get add_server_openrouter_subtitle =>
1074 - 'Connect through OpenRouter with a valid API key and keep this profile ready for model routing.';
1075 + 'Подключитесь через OpenRouter с помощью действительного API-ключа и держите этот профиль готовым для маршрутизации моделей.';
1076
1077 @override
1078 String get add_server_endpoint_subtitle =>
1078 - 'Configure a local or self-hosted endpoint, then verify the connection before saving.';
1079 + 'Настройте локальную или собственную конечную точку, затем проверьте соединение перед сохранением.';
1080
1081 @override
1082 String get server_type_openrouter => 'OpenRouter';
@@ -2252,13 +2253,13 @@ class AppLocalizationsRu extends AppLocalizations {
2253 String get model_favorite_toggle => 'Добавить в избранное';
2254
2255 @override
2255 - String get model_set_default => 'Set as default model';
2256 + String get model_set_default => 'Сделать модель по умолчанию';
2257
2258 @override
2258 - String get model_clear_default => 'Remove as default model';
2259 + String get model_clear_default => 'Убрать из моделей по умолчанию';
2260
2261 @override
2261 - String get model_default_badge => 'Default';
2262 + String get model_default_badge => 'По умолчанию';
2263
2264 @override
2265 String get model_note_label => 'Заметка';
@@ -2533,10 +2534,10 @@ class AppLocalizationsRu extends AppLocalizations {
2534 String get model_identifier => 'Идентификатор модели';
2535
2536 @override
2536 - String get model_capabilities => 'Capabilities';
2537 + String get model_capabilities => 'Возможности';
2538
2539 @override
2539 - String get model_api_pricing => 'API pricing (per 1M tokens)';
2540 + String get model_api_pricing => 'Цены на API (за 1 млн токенов)';
2541
2542 @override
2543 String get not_available => 'Недоступно';
@@ -2733,11 +2734,11 @@ class AppLocalizationsRu extends AppLocalizations {
2734 String get lm_studio_reasoning => 'Рассуждение';
2735
2736 @override
2736 - String get openrouter_pricing_free => 'Free';
2737 + String get openrouter_pricing_free => 'Бесплатно';
2738
2739 @override
2740 String openrouter_pricing_tooltip(String input, String output) {
2740 - return 'Input $input / Output $output per 1M tokens';
2741 + return 'Вход $input / Выход $output за 1 млн токенов';
2742 }
2743
2744 @override
@@ -2799,6 +2800,18 @@ class AppLocalizationsRu extends AppLocalizations {
2800 @override
2801 String get reasoning_effort_high => 'Высокая';
2802
2803 + @override
2804 + String get reasoning_effort_minimal => 'Минимальный';
2805 +
2806 + @override
2807 + String get reasoning_effort_xhigh => 'Очень высокий';
2808 +
2809 + @override
2810 + String get reasoning_effort_max => 'Максимальный';
2811 +
2812 + @override
2813 + String get reasoning_effort_off => 'Выкл';
2814 +
2815 @override
2816 String get could_not_read_file => 'Не удалось прочитать файл';
2817
lib/l10n/app_localizations_tr.dart
+29 -15
@@ -549,11 +549,11 @@ class AppLocalizationsTr extends AppLocalizations {
549 String get settings_default_persona => 'Varsayılan Persona';
550
551 @override
552 - String get settings_default_model => 'Default Model';
552 + String get settings_default_model => 'Varsayılan Model';
553
554 @override
555 String get settings_default_model_desc =>
556 - 'Automatically selected when you start a new chat.';
556 + 'Yeni bir sohbet başlattığınızda otomatik olarak seçilir.';
557
558 @override
559 String get settings_privacy => 'Gizlilik';
@@ -907,26 +907,28 @@ class AppLocalizationsTr extends AppLocalizations {
907 String get active_integrations => 'Aktif Entegrasyonlar';
908
909 @override
910 - String get import_mcp_json => 'Import JSON';
910 + String get import_mcp_json => 'JSON İçe Aktar';
911
912 @override
913 - String get import_mcp_json_dialog_title => 'Import MCP Config JSON';
913 + String get import_mcp_json_dialog_title =>
914 + 'MCP Yapılandırma JSON\'ını İçe Aktar';
915
916 @override
917 String get import_mcp_json_instructions =>
917 - 'Copy your mcpServers JSON directly from LM Studio (mcp.json) or paste a plugin array below:';
918 + 'mcpServers JSON dosyanızı doğrudan LM Studio\'dan (mcp.json) kopyalayın veya aşağıya bir eklenti dizisi yapıştırın:';
919
920 @override
921 String get import_mcp_json_placeholder =>
921 - 'Paste mcpServers JSON or plugin list here...';
922 + 'mcpServers JSON veya eklenti listesini buraya yapıştırın...';
923
924 @override
925 String mcp_import_success(int count) {
925 - return 'Successfully imported $count integration(s)';
926 + return '$count entegrasyon başarıyla içe aktarıldı';
927 }
928
929 @override
929 - String get mcp_import_failed => 'No valid MCP integrations found in JSON';
930 + String get mcp_import_failed =>
931 + 'JSON içinde geçerli bir MCP entegrasyonu bulunamadı';
932
933 @override
934 String get enable_notifications => 'Bildirimleri Etkinleştir';
@@ -2249,13 +2251,13 @@ class AppLocalizationsTr extends AppLocalizations {
2251 String get model_favorite_toggle => 'Toggle favorite';
2252
2253 @override
2252 - String get model_set_default => 'Set as default model';
2254 + String get model_set_default => 'Varsayılan model olarak ayarla';
2255
2256 @override
2255 - String get model_clear_default => 'Remove as default model';
2257 + String get model_clear_default => 'Varsayılan modelden kaldır';
2258
2259 @override
2258 - String get model_default_badge => 'Default';
2260 + String get model_default_badge => 'Varsayılan';
2261
2262 @override
2263 String get model_note_label => 'Note';
@@ -2531,10 +2533,10 @@ class AppLocalizationsTr extends AppLocalizations {
2533 String get model_identifier => 'Kimlik (Identifier)';
2534
2535 @override
2534 - String get model_capabilities => 'Capabilities';
2536 + String get model_capabilities => 'Yetenekler';
2537
2538 @override
2537 - String get model_api_pricing => 'API pricing (per 1M tokens)';
2539 + String get model_api_pricing => 'API fiyatlandırması (1M jeton başına)';
2540
2541 @override
2542 String get not_available => 'Mevcut değil';
@@ -2738,11 +2740,11 @@ class AppLocalizationsTr extends AppLocalizations {
2740 String get lm_studio_reasoning => 'Mantık yürütme';
2741
2742 @override
2741 - String get openrouter_pricing_free => 'Free';
2743 + String get openrouter_pricing_free => 'Ücretsiz';
2744
2745 @override
2746 String openrouter_pricing_tooltip(String input, String output) {
2745 - return 'Input $input / Output $output per 1M tokens';
2747 + return '1M jeton başına Girdi $input / Çıktı $output';
2748 }
2749
2750 @override
@@ -2804,6 +2806,18 @@ class AppLocalizationsTr extends AppLocalizations {
2806 @override
2807 String get reasoning_effort_high => 'Yüksek';
2808
2809 + @override
2810 + String get reasoning_effort_minimal => 'Minimum';
2811 +
2812 + @override
2813 + String get reasoning_effort_xhigh => 'Çok Yüksek';
2814 +
2815 + @override
2816 + String get reasoning_effort_max => 'Maksimum';
2817 +
2818 + @override
2819 + String get reasoning_effort_off => 'Kapalı';
2820 +
2821 @override
2822 String get could_not_read_file => 'Dosya okunamadı';
2823
lib/l10n/app_localizations_zh.dart
+129 -26
@@ -536,11 +536,10 @@ class AppLocalizationsZh extends AppLocalizations {
536 String get settings_default_persona => '默认角色';
537
538 @override
539 - String get settings_default_model => 'Default Model';
539 + String get settings_default_model => '默认模型';
540
541 @override
542 - String get settings_default_model_desc =>
543 - 'Automatically selected when you start a new chat.';
542 + String get settings_default_model_desc => '开始新聊天时自动选择。';
543
544 @override
545 String get settings_privacy => '隐私';
@@ -881,26 +880,25 @@ class AppLocalizationsZh extends AppLocalizations {
880 String get active_integrations => '活动集成';
881
882 @override
884 - String get import_mcp_json => 'Import JSON';
883 + String get import_mcp_json => '导入 JSON';
884
885 @override
887 - String get import_mcp_json_dialog_title => 'Import MCP Config JSON';
886 + String get import_mcp_json_dialog_title => '导入 MCP 配置 JSON';
887
888 @override
889 String get import_mcp_json_instructions =>
891 - 'Copy your mcpServers JSON directly from LM Studio (mcp.json) or paste a plugin array below:';
890 + '直接从 LM Studio (mcp.json) 复制 mcpServers JSON 或在下方粘贴插件数组:';
891
892 @override
894 - String get import_mcp_json_placeholder =>
895 - 'Paste mcpServers JSON or plugin list here...';
893 + String get import_mcp_json_placeholder => '在此粘贴 mcpServers JSON 或插件列表...';
894
895 @override
896 String mcp_import_success(int count) {
899 - return 'Successfully imported $count integration(s)';
897 + return '已成功导入 $count 个集成';
898 }
899
900 @override
903 - String get mcp_import_failed => 'No valid MCP integrations found in JSON';
901 + String get mcp_import_failed => 'JSON 中未找到有效的 MCP 集成';
902
903 @override
904 String get enable_notifications => '启用通知';
@@ -1017,7 +1015,7 @@ class AppLocalizationsZh extends AppLocalizations {
1015 String get server_type_ollama_cloud => 'Ollama Cloud';
1016
1017 @override
1020 - String get server_type_ollama_cloud_sub => 'CLOUD MANAGED';
1018 + String get server_type_ollama_cloud_sub => '托管云服务';
1019
1020 @override
1021 String get server_type_ollama_cloud_display => 'Ollama Cloud';
@@ -1027,26 +1025,24 @@ class AppLocalizationsZh extends AppLocalizations {
1025
1026 @override
1027 String get ollama_cloud_disclosure =>
1030 - 'By connecting Ollama Cloud, your chat messages and inputs are sent to Ollama\'s managed servers for inference. LocalMind does not track or store your conversations. You can revoke this key any time at ollama.com/settings/keys.';
1028 + '连接 Ollama Cloud 后,您的聊天消息和输入将被发送至 Ollama 的托管服务器进行推理。LocalMind 不会跟踪或存储您的对话。您可以随时在 ollama.com/settings/keys 撤销此密钥。';
1029
1030 @override
1033 - String get api_key_required_ollama_cloud =>
1034 - 'API Key required for Ollama Cloud';
1031 + String get api_key_required_ollama_cloud => 'Ollama Cloud 需要 API 密钥';
1032
1033 @override
1037 - String get api_key_hint_ollama_cloud => 'Paste your Ollama Cloud API key';
1034 + String get api_key_hint_ollama_cloud => '粘贴您的 Ollama Cloud API 密钥';
1035
1036 @override
1037 String get add_server_ollama_cloud_subtitle =>
1041 - 'Connect to Ollama Cloud with an API key from ollama.com/settings/keys to access managed cloud models.';
1038 + '使用来自 ollama.com/settings/keys 的 API 密钥连接到 Ollama Cloud,以访问托管云端模型。';
1039
1040 @override
1041 String get add_server_openrouter_subtitle =>
1045 - 'Connect through OpenRouter with a valid API key and keep this profile ready for model routing.';
1042 + '使用有效的 API 密钥通过 OpenRouter 连接,并为此配置文件做好模型路由准备。';
1043
1044 @override
1048 - String get add_server_endpoint_subtitle =>
1049 - 'Configure a local or self-hosted endpoint, then verify the connection before saving.';
1045 + String get add_server_endpoint_subtitle => '配置本地或自托管端点,然后在保存前验证连接。';
1046
1047 @override
1048 String get server_type_openrouter => 'OpenRouter';
@@ -2191,13 +2187,13 @@ class AppLocalizationsZh extends AppLocalizations {
2187 String get model_favorite_toggle => '切换收藏';
2188
2189 @override
2194 - String get model_set_default => 'Set as default model';
2190 + String get model_set_default => '设为默认模型';
2191
2192 @override
2197 - String get model_clear_default => 'Remove as default model';
2193 + String get model_clear_default => '取消默认模型';
2194
2195 @override
2200 - String get model_default_badge => 'Default';
2196 + String get model_default_badge => '默认';
2197
2198 @override
2199 String get model_note_label => '备注';
@@ -2457,10 +2453,10 @@ class AppLocalizationsZh extends AppLocalizations {
2453 String get model_identifier => '模型标识符';
2454
2455 @override
2460 - String get model_capabilities => 'Capabilities';
2456 + String get model_capabilities => '能力';
2457
2458 @override
2463 - String get model_api_pricing => 'API pricing (per 1M tokens)';
2459 + String get model_api_pricing => 'API 价格(每 100 万 token)';
2460
2461 @override
2462 String get not_available => '不可用';
@@ -2652,11 +2648,11 @@ class AppLocalizationsZh extends AppLocalizations {
2648 String get lm_studio_reasoning => '推理能力';
2649
2650 @override
2655 - String get openrouter_pricing_free => 'Free';
2651 + String get openrouter_pricing_free => '免费';
2652
2653 @override
2654 String openrouter_pricing_tooltip(String input, String output) {
2659 - return 'Input $input / Output $output per 1M tokens';
2655 + return '输入 $input / 输出 $output(每 100 万 token)';
2656 }
2657
2658 @override
@@ -2714,6 +2710,18 @@ class AppLocalizationsZh extends AppLocalizations {
2710 @override
2711 String get reasoning_effort_high => '高';
2712
2713 + @override
2714 + String get reasoning_effort_minimal => '极低';
2715 +
2716 + @override
2717 + String get reasoning_effort_xhigh => '极高';
2718 +
2719 + @override
2720 + String get reasoning_effort_max => '最大';
2721 +
2722 + @override
2723 + String get reasoning_effort_off => '关闭';
2724 +
2725 @override
2726 String get could_not_read_file => '无法读取文件';
2727
@@ -3389,6 +3397,12 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
3397 @override
3398 String get settings_default_persona => '預設角色';
3399
3400 + @override
3401 + String get settings_default_model => '預設模型';
3402 +
3403 + @override
3404 + String get settings_default_model_desc => '開始新聊天時自動選擇。';
3405 +
3406 @override
3407 String get settings_privacy => '隱私';
3408
@@ -3727,6 +3741,27 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
3741 @override
3742 String get active_integrations => '活動整合';
3743
3744 + @override
3745 + String get import_mcp_json => '匯入 JSON';
3746 +
3747 + @override
3748 + String get import_mcp_json_dialog_title => '匯入 MCP 設定 JSON';
3749 +
3750 + @override
3751 + String get import_mcp_json_instructions =>
3752 + '直接從 LM Studio (mcp.json) 複製 mcpServers JSON 或在下方貼上擴充功能陣列:';
3753 +
3754 + @override
3755 + String get import_mcp_json_placeholder => '在此貼上 mcpServers JSON 或擴充功能清單...';
3756 +
3757 + @override
3758 + String mcp_import_success(int count) {
3759 + return '已成功匯入 $count 個整合';
3760 + }
3761 +
3762 + @override
3763 + String get mcp_import_failed => 'JSON 中未找到有效的 MCP 整合';
3764 +
3765 @override
3766 String get enable_notifications => '啟用通知';
3767
@@ -3838,6 +3873,39 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
3873 @override
3874 String get server_type_ollama => 'Ollama';
3875
3876 + @override
3877 + String get server_type_ollama_cloud => 'Ollama Cloud';
3878 +
3879 + @override
3880 + String get server_type_ollama_cloud_sub => '託管雲端服務';
3881 +
3882 + @override
3883 + String get server_type_ollama_cloud_display => 'Ollama Cloud';
3884 +
3885 + @override
3886 + String get server_address_ollama_cloud => 'ollama.com';
3887 +
3888 + @override
3889 + String get ollama_cloud_disclosure =>
3890 + '連線至 Ollama Cloud 後,您的聊天訊息與輸入將傳送至 Ollama 的託管伺服器進行推論。LocalMind 不會追蹤或儲存您的對話。您可隨時在 ollama.com/settings/keys 撤銷此金鑰。';
3891 +
3892 + @override
3893 + String get api_key_required_ollama_cloud => 'Ollama Cloud 需要 API 金鑰';
3894 +
3895 + @override
3896 + String get api_key_hint_ollama_cloud => '貼上您的 Ollama Cloud API 金鑰';
3897 +
3898 + @override
3899 + String get add_server_ollama_cloud_subtitle =>
3900 + '使用來自 ollama.com/settings/keys 的 API 金鑰連線至 Ollama Cloud,以存取託管雲端模型。';
3901 +
3902 + @override
3903 + String get add_server_openrouter_subtitle =>
3904 + '使用有效的 API 金鑰透過 OpenRouter 連線,並為此設定檔做好模型路由準備。';
3905 +
3906 + @override
3907 + String get add_server_endpoint_subtitle => '設定本地或自託管端點,並在儲存前驗證連線。';
3908 +
3909 @override
3910 String get server_type_openrouter => 'OpenRouter';
3911
@@ -4981,6 +5049,15 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
5049 @override
5050 String get model_favorite_toggle => '切換收藏';
5051
5052 + @override
5053 + String get model_set_default => '設為預設模型';
5054 +
5055 + @override
5056 + String get model_clear_default => '取消預設模型';
5057 +
5058 + @override
5059 + String get model_default_badge => '預設';
5060 +
5061 @override
5062 String get model_note_label => '備註';
5063
@@ -5238,6 +5315,12 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
5315 @override
5316 String get model_identifier => '模型識別碼';
5317
5318 + @override
5319 + String get model_capabilities => '能力';
5320 +
5321 + @override
5322 + String get model_api_pricing => 'API 價格(每 100 萬 token)';
5323 +
5324 @override
5325 String get not_available => '不可用';
5326
@@ -5427,6 +5510,14 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
5510 @override
5511 String get lm_studio_reasoning => '推理能力';
5512
5513 + @override
5514 + String get openrouter_pricing_free => '免費';
5515 +
5516 + @override
5517 + String openrouter_pricing_tooltip(String input, String output) {
5518 + return '輸入 $input / 輸出 $output(每 100 萬 token)';
5519 + }
5520 +
5521 @override
5522 String get lm_studio_download_options => '下載選項';
5523
@@ -5482,6 +5573,18 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
5573 @override
5574 String get reasoning_effort_high => '高';
5575
5576 + @override
5577 + String get reasoning_effort_minimal => '極低';
5578 +
5579 + @override
5580 + String get reasoning_effort_xhigh => '極高';
5581 +
5582 + @override
5583 + String get reasoning_effort_max => '最大';
5584 +
5585 + @override
5586 + String get reasoning_effort_off => '關閉';
5587 +
5588 @override
5589 String get could_not_read_file => '無法讀取檔案';
5590
lib/l10n/app_ru.arb
+30 -1
@@ -868,5 +868,34 @@
868 "delete_folder_title": "Удалить папку?",
869 "delete_folder_body": "Удалить папку «{name}»? Содержащиеся в ней беседы и сохранённые сообщения будут перенесены в «Без папки». Это действие нельзя отменить.",
870 "folder_name_required": "Введите название папки",
871 - "model_required_toast": "Сначала выберите модель"
871 + "model_required_toast": "Сначала выберите модель",
872 + "settings_default_model": "Модель по умолчанию",
873 + "settings_default_model_desc": "Автоматически выбирается при начале нового чата.",
874 + "import_mcp_json": "Импортировать JSON",
875 + "import_mcp_json_dialog_title": "Импорт JSON конфигурации MCP",
876 + "import_mcp_json_instructions": "Скопируйте ваш mcpServers JSON напрямую из LM Studio (mcp.json) или вставьте массив плагинов ниже:",
877 + "import_mcp_json_placeholder": "Вставьте сюда mcpServers JSON или список плагинов...",
878 + "mcp_import_success": "Успешно импортировано интеграций: {count}",
879 + "mcp_import_failed": "В JSON не найдено действительных интеграций MCP",
880 + "server_type_ollama_cloud": "Ollama Cloud",
881 + "server_type_ollama_cloud_sub": "УПРАВЛЯЕМОЕ ОБЛАКО",
882 + "server_type_ollama_cloud_display": "Ollama Cloud",
883 + "server_address_ollama_cloud": "ollama.com",
884 + "ollama_cloud_disclosure": "При подключении к Ollama Cloud ваши сообщения чата и ввод отправляются на управляемые серверы Ollama для генерации. LocalMind не отслеживает и не сохраняет ваши разговоры. Вы можете отозвать этот ключ в любое время на странице ollama.com/settings/keys.",
885 + "api_key_required_ollama_cloud": "Требуется API-ключ для Ollama Cloud",
886 + "api_key_hint_ollama_cloud": "Вставьте ваш API-ключ Ollama Cloud",
887 + "add_server_ollama_cloud_subtitle": "Подключитесь к Ollama Cloud с помощью API-ключа с сайта ollama.com/settings/keys для доступа к управляемым облачным моделям.",
888 + "add_server_openrouter_subtitle": "Подключитесь через OpenRouter с помощью действительного API-ключа и держите этот профиль готовым для маршрутизации моделей.",
889 + "add_server_endpoint_subtitle": "Настройте локальную или собственную конечную точку, затем проверьте соединение перед сохранением.",
890 + "model_set_default": "Сделать модель по умолчанию",
891 + "model_clear_default": "Убрать из моделей по умолчанию",
892 + "model_default_badge": "По умолчанию",
893 + "model_capabilities": "Возможности",
894 + "model_api_pricing": "Цены на API (за 1 млн токенов)",
895 + "openrouter_pricing_free": "Бесплатно",
896 + "openrouter_pricing_tooltip": "Вход {input} / Выход {output} за 1 млн токенов",
897 + "reasoning_effort_minimal": "Минимальный",
898 + "reasoning_effort_xhigh": "Очень высокий",
899 + "reasoning_effort_max": "Максимальный",
900 + "reasoning_effort_off": "Выкл"
901 }
lib/l10n/app_tr.arb
+21 -2
@@ -878,5 +878,24 @@
878 "delete_folder_title": "Sil folder?",
879 "delete_folder_body": "Silmek istediğinizden emin misiniz \"{name}\"? Sohbetler or saved messages inside will be moved back to \"Unfiled\". Bu işlem geri alınamaz.",
880 "folder_name_required": "Lütfen bir klasör adı girin",
881 - "model_required_toast": "Önce bir model seçmeniz gerekiyor"
882 -}
\ No newline at end of file
881 + "model_required_toast": "Önce bir model seçmeniz gerekiyor",
882 + "settings_default_model": "Varsayılan Model",
883 + "settings_default_model_desc": "Yeni bir sohbet başlattığınızda otomatik olarak seçilir.",
884 + "import_mcp_json": "JSON İçe Aktar",
885 + "import_mcp_json_dialog_title": "MCP Yapılandırma JSON'ını İçe Aktar",
886 + "import_mcp_json_instructions": "mcpServers JSON dosyanızı doğrudan LM Studio'dan (mcp.json) kopyalayın veya aşağıya bir eklenti dizisi yapıştırın:",
887 + "import_mcp_json_placeholder": "mcpServers JSON veya eklenti listesini buraya yapıştırın...",
888 + "mcp_import_success": "{count} entegrasyon başarıyla içe aktarıldı",
889 + "mcp_import_failed": "JSON içinde geçerli bir MCP entegrasyonu bulunamadı",
890 + "model_set_default": "Varsayılan model olarak ayarla",
891 + "model_clear_default": "Varsayılan modelden kaldır",
892 + "model_default_badge": "Varsayılan",
893 + "model_capabilities": "Yetenekler",
894 + "model_api_pricing": "API fiyatlandırması (1M jeton başına)",
895 + "openrouter_pricing_free": "Ücretsiz",
896 + "openrouter_pricing_tooltip": "1M jeton başına Girdi {input} / Çıktı {output}",
897 + "reasoning_effort_minimal": "Minimum",
898 + "reasoning_effort_xhigh": "Çok Yüksek",
899 + "reasoning_effort_max": "Maksimum",
900 + "reasoning_effort_off": "Kapalı"
901 +}
lib/l10n/app_zh.arb
+30 -1
@@ -871,5 +871,34 @@
871 "model_required_toast": "您需要先选择一个模型",
872 "server_type_lm_studio_sub": "本地 API",
873 "server_type_ollama_sub": "CLI 引擎",
874 - "server_type_on_device_sub": "无需服务器"
874 + "server_type_on_device_sub": "无需服务器",
875 + "settings_default_model": "默认模型",
876 + "settings_default_model_desc": "开始新聊天时自动选择。",
877 + "import_mcp_json": "导入 JSON",
878 + "import_mcp_json_dialog_title": "导入 MCP 配置 JSON",
879 + "import_mcp_json_instructions": "直接从 LM Studio (mcp.json) 复制 mcpServers JSON 或在下方粘贴插件数组:",
880 + "import_mcp_json_placeholder": "在此粘贴 mcpServers JSON 或插件列表...",
881 + "mcp_import_success": "已成功导入 {count} 个集成",
882 + "mcp_import_failed": "JSON 中未找到有效的 MCP 集成",
883 + "server_type_ollama_cloud": "Ollama Cloud",
884 + "server_type_ollama_cloud_sub": "托管云服务",
885 + "server_type_ollama_cloud_display": "Ollama Cloud",
886 + "server_address_ollama_cloud": "ollama.com",
887 + "ollama_cloud_disclosure": "连接 Ollama Cloud 后,您的聊天消息和输入将被发送至 Ollama 的托管服务器进行推理。LocalMind 不会跟踪或存储您的对话。您可以随时在 ollama.com/settings/keys 撤销此密钥。",
888 + "api_key_required_ollama_cloud": "Ollama Cloud 需要 API 密钥",
889 + "api_key_hint_ollama_cloud": "粘贴您的 Ollama Cloud API 密钥",
890 + "add_server_ollama_cloud_subtitle": "使用来自 ollama.com/settings/keys 的 API 密钥连接到 Ollama Cloud,以访问托管云端模型。",
891 + "add_server_openrouter_subtitle": "使用有效的 API 密钥通过 OpenRouter 连接,并为此配置文件做好模型路由准备。",
892 + "add_server_endpoint_subtitle": "配置本地或自托管端点,然后在保存前验证连接。",
893 + "model_set_default": "设为默认模型",
894 + "model_clear_default": "取消默认模型",
895 + "model_default_badge": "默认",
896 + "model_capabilities": "能力",
897 + "model_api_pricing": "API 价格(每 100 万 token)",
898 + "openrouter_pricing_free": "免费",
899 + "openrouter_pricing_tooltip": "输入 {input} / 输出 {output}(每 100 万 token)",
900 + "reasoning_effort_minimal": "极低",
901 + "reasoning_effort_xhigh": "极高",
902 + "reasoning_effort_max": "最大",
903 + "reasoning_effort_off": "关闭"
904 }
lib/l10n/app_zh_TW.arb
+30 -1
@@ -871,5 +871,34 @@
871 "model_required_toast": "您需要先選擇一個模型",
872 "server_type_lm_studio_sub": "本機 API",
873 "server_type_ollama_sub": "CLI 引擎",
874 - "server_type_on_device_sub": "無需伺服器"
874 + "server_type_on_device_sub": "無需伺服器",
875 + "settings_default_model": "預設模型",
876 + "settings_default_model_desc": "開始新聊天時自動選擇。",
877 + "import_mcp_json": "匯入 JSON",
878 + "import_mcp_json_dialog_title": "匯入 MCP 設定 JSON",
879 + "import_mcp_json_instructions": "直接從 LM Studio (mcp.json) 複製 mcpServers JSON 或在下方貼上擴充功能陣列:",
880 + "import_mcp_json_placeholder": "在此貼上 mcpServers JSON 或擴充功能清單...",
881 + "mcp_import_success": "已成功匯入 {count} 個整合",
882 + "mcp_import_failed": "JSON 中未找到有效的 MCP 整合",
883 + "server_type_ollama_cloud": "Ollama Cloud",
884 + "server_type_ollama_cloud_sub": "託管雲端服務",
885 + "server_type_ollama_cloud_display": "Ollama Cloud",
886 + "server_address_ollama_cloud": "ollama.com",
887 + "ollama_cloud_disclosure": "連線至 Ollama Cloud 後,您的聊天訊息與輸入將傳送至 Ollama 的託管伺服器進行推論。LocalMind 不會追蹤或儲存您的對話。您可隨時在 ollama.com/settings/keys 撤銷此金鑰。",
888 + "api_key_required_ollama_cloud": "Ollama Cloud 需要 API 金鑰",
889 + "api_key_hint_ollama_cloud": "貼上您的 Ollama Cloud API 金鑰",
890 + "add_server_ollama_cloud_subtitle": "使用來自 ollama.com/settings/keys 的 API 金鑰連線至 Ollama Cloud,以存取託管雲端模型。",
891 + "add_server_openrouter_subtitle": "使用有效的 API 金鑰透過 OpenRouter 連線,並為此設定檔做好模型路由準備。",
892 + "add_server_endpoint_subtitle": "設定本地或自託管端點,並在儲存前驗證連線。",
893 + "model_set_default": "設為預設模型",
894 + "model_clear_default": "取消預設模型",
895 + "model_default_badge": "預設",
896 + "model_capabilities": "能力",
897 + "model_api_pricing": "API 價格(每 100 萬 token)",
898 + "openrouter_pricing_free": "免費",
899 + "openrouter_pricing_tooltip": "輸入 {input} / 輸出 {output}(每 100 萬 token)",
900 + "reasoning_effort_minimal": "極低",
901 + "reasoning_effort_xhigh": "極高",
902 + "reasoning_effort_max": "最大",
903 + "reasoning_effort_off": "關閉"
904 }
lib/l10n/untranslated.txt
+1 -289
@@ -1,289 +1 @@
1 -{
2 - "ar": [
3 - "settings_default_model",
4 - "settings_default_model_desc",
5 - "import_mcp_json",
6 - "import_mcp_json_dialog_title",
7 - "import_mcp_json_instructions",
8 - "import_mcp_json_placeholder",
9 - "mcp_import_success",
10 - "mcp_import_failed",
11 - "server_type_ollama_cloud",
12 - "server_type_ollama_cloud_sub",
13 - "server_type_ollama_cloud_display",
14 - "server_address_ollama_cloud",
15 - "ollama_cloud_disclosure",
16 - "api_key_required_ollama_cloud",
17 - "api_key_hint_ollama_cloud",
18 - "add_server_ollama_cloud_subtitle",
19 - "add_server_openrouter_subtitle",
20 - "add_server_endpoint_subtitle",
21 - "model_set_default",
22 - "model_clear_default",
23 - "model_default_badge",
24 - "model_capabilities",
25 - "model_api_pricing",
26 - "openrouter_pricing_free",
27 - "openrouter_pricing_tooltip"
28 - ],
29 -
30 - "bn": [
31 - "settings_default_model",
32 - "settings_default_model_desc",
33 - "import_mcp_json",
34 - "import_mcp_json_dialog_title",
35 - "import_mcp_json_instructions",
36 - "import_mcp_json_placeholder",
37 - "mcp_import_success",
38 - "mcp_import_failed",
39 - "server_type_ollama_cloud",
40 - "server_type_ollama_cloud_sub",
41 - "server_type_ollama_cloud_display",
42 - "server_address_ollama_cloud",
43 - "ollama_cloud_disclosure",
44 - "api_key_required_ollama_cloud",
45 - "api_key_hint_ollama_cloud",
46 - "add_server_ollama_cloud_subtitle",
47 - "add_server_openrouter_subtitle",
48 - "add_server_endpoint_subtitle",
49 - "model_set_default",
50 - "model_clear_default",
51 - "model_default_badge",
52 - "model_capabilities",
53 - "model_api_pricing",
54 - "openrouter_pricing_free",
55 - "openrouter_pricing_tooltip"
56 - ],
57 -
58 - "es": [
59 - "settings_default_model",
60 - "settings_default_model_desc",
61 - "import_mcp_json",
62 - "import_mcp_json_dialog_title",
63 - "import_mcp_json_instructions",
64 - "import_mcp_json_placeholder",
65 - "mcp_import_success",
66 - "mcp_import_failed",
67 - "server_type_ollama_cloud",
68 - "server_type_ollama_cloud_sub",
69 - "server_type_ollama_cloud_display",
70 - "server_address_ollama_cloud",
71 - "ollama_cloud_disclosure",
72 - "api_key_required_ollama_cloud",
73 - "api_key_hint_ollama_cloud",
74 - "add_server_ollama_cloud_subtitle",
75 - "add_server_openrouter_subtitle",
76 - "add_server_endpoint_subtitle",
77 - "model_set_default",
78 - "model_clear_default",
79 - "model_default_badge",
80 - "model_capabilities",
81 - "model_api_pricing",
82 - "openrouter_pricing_free",
83 - "openrouter_pricing_tooltip"
84 - ],
85 -
86 - "fr": [
87 - "settings_default_model",
88 - "settings_default_model_desc",
89 - "import_mcp_json",
90 - "import_mcp_json_dialog_title",
91 - "import_mcp_json_instructions",
92 - "import_mcp_json_placeholder",
93 - "mcp_import_success",
94 - "mcp_import_failed",
95 - "model_set_default",
96 - "model_clear_default",
97 - "model_default_badge",
98 - "model_capabilities",
99 - "model_api_pricing",
100 - "openrouter_pricing_free",
101 - "openrouter_pricing_tooltip"
102 - ],
103 -
104 - "hi": [
105 - "settings_default_model",
106 - "settings_default_model_desc",
107 - "import_mcp_json",
108 - "import_mcp_json_dialog_title",
109 - "import_mcp_json_instructions",
110 - "import_mcp_json_placeholder",
111 - "mcp_import_success",
112 - "mcp_import_failed",
113 - "server_type_ollama_cloud",
114 - "server_type_ollama_cloud_sub",
115 - "server_type_ollama_cloud_display",
116 - "server_address_ollama_cloud",
117 - "ollama_cloud_disclosure",
118 - "api_key_required_ollama_cloud",
119 - "api_key_hint_ollama_cloud",
120 - "add_server_ollama_cloud_subtitle",
121 - "add_server_openrouter_subtitle",
122 - "add_server_endpoint_subtitle",
123 - "model_set_default",
124 - "model_clear_default",
125 - "model_default_badge",
126 - "model_capabilities",
127 - "model_api_pricing",
128 - "openrouter_pricing_free",
129 - "openrouter_pricing_tooltip"
130 - ],
131 -
132 - "it": [
133 - "settings_default_model",
134 - "settings_default_model_desc",
135 - "import_mcp_json",
136 - "import_mcp_json_dialog_title",
137 - "import_mcp_json_instructions",
138 - "import_mcp_json_placeholder",
139 - "mcp_import_success",
140 - "mcp_import_failed",
141 - "server_type_ollama_cloud",
142 - "server_type_ollama_cloud_sub",
143 - "server_type_ollama_cloud_display",
144 - "server_address_ollama_cloud",
145 - "ollama_cloud_disclosure",
146 - "api_key_required_ollama_cloud",
147 - "api_key_hint_ollama_cloud",
148 - "add_server_ollama_cloud_subtitle",
149 - "add_server_openrouter_subtitle",
150 - "add_server_endpoint_subtitle",
151 - "model_set_default",
152 - "model_clear_default",
153 - "model_default_badge",
154 - "model_capabilities",
155 - "model_api_pricing",
156 - "openrouter_pricing_free",
157 - "openrouter_pricing_tooltip"
158 - ],
159 -
160 - "ja": [
161 - "settings_default_model",
162 - "settings_default_model_desc",
163 - "import_mcp_json",
164 - "import_mcp_json_dialog_title",
165 - "import_mcp_json_instructions",
166 - "import_mcp_json_placeholder",
167 - "mcp_import_success",
168 - "mcp_import_failed",
169 - "server_type_ollama_cloud",
170 - "server_type_ollama_cloud_sub",
171 - "server_type_ollama_cloud_display",
172 - "server_address_ollama_cloud",
173 - "ollama_cloud_disclosure",
174 - "api_key_required_ollama_cloud",
175 - "api_key_hint_ollama_cloud",
176 - "add_server_ollama_cloud_subtitle",
177 - "add_server_openrouter_subtitle",
178 - "add_server_endpoint_subtitle",
179 - "model_set_default",
180 - "model_clear_default",
181 - "model_default_badge",
182 - "model_capabilities",
183 - "model_api_pricing",
184 - "openrouter_pricing_free",
185 - "openrouter_pricing_tooltip"
186 - ],
187 -
188 - "ru": [
189 - "settings_default_model",
190 - "settings_default_model_desc",
191 - "import_mcp_json",
192 - "import_mcp_json_dialog_title",
193 - "import_mcp_json_instructions",
194 - "import_mcp_json_placeholder",
195 - "mcp_import_success",
196 - "mcp_import_failed",
197 - "server_type_ollama_cloud",
198 - "server_type_ollama_cloud_sub",
199 - "server_type_ollama_cloud_display",
200 - "server_address_ollama_cloud",
201 - "ollama_cloud_disclosure",
202 - "api_key_required_ollama_cloud",
203 - "api_key_hint_ollama_cloud",
204 - "add_server_ollama_cloud_subtitle",
205 - "add_server_openrouter_subtitle",
206 - "add_server_endpoint_subtitle",
207 - "model_set_default",
208 - "model_clear_default",
209 - "model_default_badge",
210 - "model_capabilities",
211 - "model_api_pricing",
212 - "openrouter_pricing_free",
213 - "openrouter_pricing_tooltip"
214 - ],
215 -
216 - "tr": [
217 - "settings_default_model",
218 - "settings_default_model_desc",
219 - "import_mcp_json",
220 - "import_mcp_json_dialog_title",
221 - "import_mcp_json_instructions",
222 - "import_mcp_json_placeholder",
223 - "mcp_import_success",
224 - "mcp_import_failed",
225 - "model_set_default",
226 - "model_clear_default",
227 - "model_default_badge",
228 - "model_capabilities",
229 - "model_api_pricing",
230 - "openrouter_pricing_free",
231 - "openrouter_pricing_tooltip"
232 - ],
233 -
234 - "zh": [
235 - "settings_default_model",
236 - "settings_default_model_desc",
237 - "import_mcp_json",
238 - "import_mcp_json_dialog_title",
239 - "import_mcp_json_instructions",
240 - "import_mcp_json_placeholder",
241 - "mcp_import_success",
242 - "mcp_import_failed",
243 - "server_type_ollama_cloud",
244 - "server_type_ollama_cloud_sub",
245 - "server_type_ollama_cloud_display",
246 - "server_address_ollama_cloud",
247 - "ollama_cloud_disclosure",
248 - "api_key_required_ollama_cloud",
249 - "api_key_hint_ollama_cloud",
250 - "add_server_ollama_cloud_subtitle",
251 - "add_server_openrouter_subtitle",
252 - "add_server_endpoint_subtitle",
253 - "model_set_default",
254 - "model_clear_default",
255 - "model_default_badge",
256 - "model_capabilities",
257 - "model_api_pricing",
258 - "openrouter_pricing_free",
259 - "openrouter_pricing_tooltip"
260 - ],
261 -
262 - "zh_TW": [
263 - "settings_default_model",
264 - "settings_default_model_desc",
265 - "import_mcp_json",
266 - "import_mcp_json_dialog_title",
267 - "import_mcp_json_instructions",
268 - "import_mcp_json_placeholder",
269 - "mcp_import_success",
270 - "mcp_import_failed",
271 - "server_type_ollama_cloud",
272 - "server_type_ollama_cloud_sub",
273 - "server_type_ollama_cloud_display",
274 - "server_address_ollama_cloud",
275 - "ollama_cloud_disclosure",
276 - "api_key_required_ollama_cloud",
277 - "api_key_hint_ollama_cloud",
278 - "add_server_ollama_cloud_subtitle",
279 - "add_server_openrouter_subtitle",
280 - "add_server_endpoint_subtitle",
281 - "model_set_default",
282 - "model_clear_default",
283 - "model_default_badge",
284 - "model_capabilities",
285 - "model_api_pricing",
286 - "openrouter_pricing_free",
287 - "openrouter_pricing_tooltip"
288 - ]
289 -}
1 +{}
\ No newline at end of file
pubspec.yaml
+1 -1
@@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
16 # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
17 # In Windows, build-name is used as the major, minor, and patch parts
18 # of the product and file versions while build-number is used as the build suffix.
19 -version: 1.6.3+68
19 +version: 1.6.4+69
20
21 environment:
22 sdk: ">=3.12.0 <4.0.0"
test/features/chat/providers/chat_reasoning_providers_test.dart new
+85
@@ -0,0 +1,85 @@
1 +import 'package:flutter_test/flutter_test.dart';
2 +import 'package:localmind/features/chat/providers/chat_reasoning_providers.dart';
3 +import 'package:localmind/features/models/data/models/model_info.dart';
4 +import 'package:localmind/core/models/enums.dart';
5 +
6 +void main() {
7 + group('effortsForModel', () {
8 + test('falls back to low/medium/high when efforts are unknown', () {
9 + expect(effortsForModel(null), [ReasoningEffort.low, ReasoningEffort.medium, ReasoningEffort.high]);
10 + expect(effortsForModel(const []), [ReasoningEffort.low, ReasoningEffort.medium, ReasoningEffort.high]);
11 + });
12 +
13 + test('filters and orders advertised efforts lightest to heaviest', () {
14 + expect(
15 + effortsForModel(const ['max', 'high', 'low']),
16 + [ReasoningEffort.low, ReasoningEffort.high, ReasoningEffort.max],
17 + );
18 + expect(
19 + effortsForModel(const ['xhigh', 'high', 'medium', 'low', 'minimal']),
20 + [
21 + ReasoningEffort.minimal,
22 + ReasoningEffort.low,
23 + ReasoningEffort.medium,
24 + ReasoningEffort.high,
25 + ReasoningEffort.xhigh,
26 + ],
27 + );
28 + });
29 +
30 + test('falls back when no advertised effort maps to the enum', () {
31 + expect(
32 + effortsForModel(const ['bogus']),
33 + [ReasoningEffort.low, ReasoningEffort.medium, ReasoningEffort.high],
34 + );
35 + });
36 + });
37 +
38 + group('resolveEffortForModel', () {
39 + ModelInfo modelWithEfforts(List<String> efforts, {String? defaultEffort}) {
40 + return ModelInfo(
41 + id: 'm',
42 + name: 'M',
43 + serverType: ServerType.openRouter,
44 + serverId: 's',
45 + supportedReasoningEfforts: efforts,
46 + defaultReasoningEffort: defaultEffort,
47 + );
48 + }
49 +
50 + test('returns current unchanged when no efforts are advertised', () {
51 + expect(resolveEffortForModel(null, ReasoningEffort.low), ReasoningEffort.low);
52 + expect(
53 + resolveEffortForModel(modelWithEfforts(const []), ReasoningEffort.high),
54 + ReasoningEffort.high,
55 + );
56 + });
57 +
58 + test('keeps current when it is supported', () {
59 + final model = modelWithEfforts(const ['max', 'high', 'low'], defaultEffort: 'high');
60 + expect(resolveEffortForModel(model, ReasoningEffort.high), ReasoningEffort.high);
61 + });
62 +
63 + test('snaps to the advertised default when current is unsupported', () {
64 + final model = modelWithEfforts(const ['high'], defaultEffort: 'high');
65 + expect(resolveEffortForModel(model, ReasoningEffort.low), ReasoningEffort.high);
66 + });
67 +
68 + test('picks the heaviest supported effort when no default is advertised', () {
69 + final model = modelWithEfforts(const ['high', 'max']);
70 + expect(resolveEffortForModel(model, ReasoningEffort.low), ReasoningEffort.max);
71 + });
72 + });
73 +
74 + group('ReasoningEffort.fromApiValue', () {
75 + test('maps known values', () {
76 + expect(ReasoningEffort.fromApiValue('minimal'), ReasoningEffort.minimal);
77 + expect(ReasoningEffort.fromApiValue('max'), ReasoningEffort.max);
78 + expect(ReasoningEffort.fromApiValue('xhigh'), ReasoningEffort.xhigh);
79 + });
80 +
81 + test('falls back to medium for unknown values', () {
82 + expect(ReasoningEffort.fromApiValue('bogus'), ReasoningEffort.medium);
83 + });
84 + });
85 +}
test/features/servers/server_api_service_test.dart
+41 -2
@@ -544,7 +544,11 @@ void main() {
544 'output_modalities': ['text'],
545 'tokenizer': 'DeepSeek',
546 },
547 - 'reasoning': {'mandatory': true},
547 + 'reasoning': {
548 + 'mandatory': false,
549 + 'default_effort': 'high',
550 + 'supported_efforts': ['max', 'high', 'low'],
551 + },
552 'supported_parameters': ['tools', 'reasoning', 'temperature'],
553 },
554 {
@@ -580,6 +584,9 @@ void main() {
584 expect(reasoner.supportsReasoning, isTrue);
585 expect(reasoner.supportsToolUse, isTrue);
586 expect(reasoner.supportsVision, isFalse);
587 + expect(reasoner.reasoningMandatory, isFalse);
588 + expect(reasoner.defaultReasoningEffort, 'high');
589 + expect(reasoner.supportedReasoningEfforts, ['max', 'high', 'low']);
590
591 final free = byId['meta-llama/llama-3.1-8b-instruct:free']!;
592 expect(free.isPricingFree, isTrue);
@@ -613,8 +620,40 @@ void main() {
620 expect(models.single.pricingLabel, isNull);
621 });
622
616 - test('treats non-finite pricing values as unknown', () async {
623 + test('parses mandatory reasoning with a single supported effort', () async {
624 final data = {
625 + 'data': [
626 + {
627 + 'id': 'openai/gpt-5-pro',
628 + 'name': 'OpenAI: GPT-5 Pro',
629 + 'context_length': 200000,
630 + 'architecture': {
631 + 'modality': 'text->text',
632 + 'tokenizer': 'GPT',
633 + },
634 + 'reasoning': {
635 + 'mandatory': true,
636 + 'default_effort': 'high',
637 + 'supported_efforts': ['high'],
638 + },
639 + },
640 + ],
641 + };
642 +
643 + final service = ServerApiService(
644 + Dio()..interceptors.add(TestInterceptor(data)),
645 + );
646 + final models = await service.fetchModels(openRouterServer);
647 +
648 + expect(models, hasLength(1));
649 + final model = models.single;
650 + expect(model.supportsReasoning, isTrue);
651 + expect(model.reasoningMandatory, isTrue);
652 + expect(model.supportedReasoningEfforts, ['high']);
653 + expect(model.defaultReasoningEffort, 'high');
654 + });
655 +
656 + test('treats non-finite pricing values as unknown', () async { final data = {
657 'data': [
658 {
659 'id': 'weird/model',