26 files changed
+320
-27
lib/features/chat/views/components/message_list/empty_state.dart
+3
-1
@@ -17,6 +17,7 @@ class EmptyState extends StatefulWidget {
17
required this.onModelTap,
18
this.selectedPersonas = const [],
19
required this.onPersonaTap,
20
+ this.isCloudProvider = false,
21
});
22
23
final void Function(String) onQuickPrompt;
@@ -27,6 +28,7 @@ class EmptyState extends StatefulWidget {
28
final VoidCallback onModelTap;
29
final List<dynamic> selectedPersonas;
30
final VoidCallback onPersonaTap;
31
+ final bool isCloudProvider;
32
33
@override
34
State<EmptyState> createState() => _EmptyStateState();
@@ -94,7 +96,7 @@ class _EmptyStateState extends State<EmptyState>
96
List<String> _welcomeMessages(AppLocalizations l10n) => [
97
l10n.welcome_message_1,
98
l10n.welcome_message_2,
97
- l10n.welcome_message_3,
99
+ widget.isCloudProvider ? l10n.welcome_message_cloud : l10n.welcome_message_3,
100
l10n.welcome_message_4,
101
];
102
lib/features/chat/views/components/message_list/message_area.dart
+6
@@ -16,6 +16,8 @@ import 'package:localmind/features/chat/views/components/message_list/empty_stat
16
import 'package:localmind/features/chat/views/components/message_list/corrupted_state.dart';
17
import 'package:localmind/features/saved_messages/views/components/save_message_sheet.dart';
18
import 'package:localmind/features/personas/views/components/persona_picker_sheet.dart';
19
+import 'package:localmind/core/models/enums.dart';
20
+import 'package:localmind/features/servers/providers/server_providers.dart';
21
22
class MessageArea extends ConsumerWidget {
23
const MessageArea({
@@ -61,7 +63,11 @@ class MessageArea extends ConsumerWidget {
63
}
64
65
if (messages.isEmpty) {
66
+ final activeServer = ref.watch(activeServerProvider);
67
+ final isCloudProvider = activeServer?.type == ServerType.openRouter;
68
+
69
return EmptyState(
70
+ isCloudProvider: isCloudProvider,
71
onQuickPrompt: (prompt) =>
72
ref.read(chatProvider.notifier).sendMessage(prompt),
73
quickPrompts: [
lib/features/onboarding/screens/onboarding_server_setup_screen.dart
+33
@@ -297,6 +297,39 @@ class _OnboardingServerSetupScreenState
297
},
298
obscureText: true,
299
),
300
+ if (isCloud) ...[
301
+ const SizedBox(height: 12),
302
+ Container(
303
+ padding: const EdgeInsets.all(12),
304
+ decoration: BoxDecoration(
305
+ color: theme.colorScheme.primary.withValues(alpha: 0.08),
306
+ borderRadius: BorderRadius.circular(8),
307
+ border: Border.all(
308
+ color: theme.colorScheme.primary.withValues(alpha: 0.2),
309
+ ),
310
+ ),
311
+ child: Row(
312
+ crossAxisAlignment: CrossAxisAlignment.start,
313
+ children: [
314
+ HugeIcon(
315
+ icon: HugeIcons.strokeRoundedShield01,
316
+ size: 18,
317
+ color: theme.colorScheme.primary,
318
+ ),
319
+ const SizedBox(width: 8),
320
+ Expanded(
321
+ child: Text(
322
+ l10n.openrouter_disclosure,
323
+ style: theme.textTheme.bodySmall?.copyWith(
324
+ color: theme.colorScheme.onSurface.withValues(alpha: 0.8),
325
+ height: 1.4,
326
+ ),
327
+ ),
328
+ ),
329
+ ],
330
+ ),
331
+ ),
332
+ ],
333
],
334
),
335
),
lib/features/servers/views/add_server_screen.dart
+50
-13
@@ -477,19 +477,56 @@ class _AddServerScreenState extends ConsumerState<AddServerScreen> {
477
subtitle: _requiresMandatoryApiKey
478
? l10n.server_authentication_required_desc
479
: l10n.server_authentication_optional_desc,
480
- child: TextFormField(
481
- controller: _apiKeyController,
482
- decoration: InputDecoration(
483
- labelText: _requiresMandatoryApiKey
484
- ? l10n.api_key_required
485
- : l10n.api_key_optional,
486
- hintText: _requiresMandatoryApiKey
487
- ? l10n.api_key_hint_openrouter
488
- : l10n.api_key_hint_generic,
489
- ),
490
- validator: _validateApiKey,
491
- obscureText: true,
492
- textInputAction: TextInputAction.done,
480
+ child: Column(
481
+ children: [
482
+ TextFormField(
483
+ controller: _apiKeyController,
484
+ decoration: InputDecoration(
485
+ labelText: _requiresMandatoryApiKey
486
+ ? l10n.api_key_required
487
+ : l10n.api_key_optional,
488
+ hintText: _requiresMandatoryApiKey
489
+ ? l10n.api_key_hint_openrouter
490
+ : l10n.api_key_hint_generic,
491
+ ),
492
+ validator: _validateApiKey,
493
+ obscureText: true,
494
+ textInputAction: TextInputAction.done,
495
+ ),
496
+ if (_requiresMandatoryApiKey) ...[
497
+ const SizedBox(height: 12),
498
+ Container(
499
+ padding: const EdgeInsets.all(12),
500
+ decoration: BoxDecoration(
501
+ color: theme.colorScheme.primary.withValues(alpha: 0.08),
502
+ borderRadius: BorderRadius.circular(8),
503
+ border: Border.all(
504
+ color: theme.colorScheme.primary.withValues(alpha: 0.2),
505
+ ),
506
+ ),
507
+ child: Row(
508
+ crossAxisAlignment: CrossAxisAlignment.start,
509
+ children: [
510
+ HugeIcon(
511
+ icon: HugeIcons.strokeRoundedShield01,
512
+ size: 18,
513
+ color: theme.colorScheme.primary,
514
+ ),
515
+ const SizedBox(width: 8),
516
+ Expanded(
517
+ child: Text(
518
+ l10n.openrouter_disclosure,
519
+ style: theme.textTheme.bodySmall?.copyWith(
520
+ color: theme.colorScheme.onSurface.withValues(alpha: 0.8),
521
+ height: 1.4,
522
+ ),
523
+ ),
524
+ ),
525
+ ],
526
+ ),
527
+ ),
528
+ ],
529
+ ],
530
),
531
),
532
if (_testResult != null) ...[
lib/features/settings/views/settings_screen.dart
+50
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
3
import 'package:flutter_riverpod/flutter_riverpod.dart';
4
import 'package:go_router/go_router.dart';
5
import 'package:shadcn_ui/shadcn_ui.dart';
6
+import 'package:url_launcher/url_launcher.dart';
7
8
import 'package:localmind/l10n/app_localizations.dart';
9
@@ -529,6 +530,8 @@ class SettingsViews extends ConsumerWidget {
530
aboutCard,
531
],
532
),
533
+ const SizedBox(height: 24),
534
+ _PrivacyPolicyLink(),
535
],
536
),
537
),
@@ -2263,6 +2266,53 @@ class _HuggingFaceTokenSetting extends StatelessWidget {
2266
}
2267
}
2268
2269
+class _PrivacyPolicyLink extends StatelessWidget {
2270
+ static final Uri _privacyUrl = Uri.parse(
2271
+ 'https://momin.pro/privacy-policy-localmind/',
2272
+ );
2273
+
2274
+ @override
2275
+ Widget build(BuildContext context) {
2276
+ final l10n = AppLocalizations.of(context)!;
2277
+ final theme = Theme.of(context);
2278
+ final colorScheme = theme.colorScheme;
2279
+
2280
+ return Center(
2281
+ child: InkWell(
2282
+ onTap: () => launchUrl(_privacyUrl, mode: LaunchMode.externalApplication),
2283
+ borderRadius: BorderRadius.circular(8),
2284
+ child: Padding(
2285
+ padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
2286
+ child: Row(
2287
+ mainAxisSize: MainAxisSize.min,
2288
+ children: [
2289
+ HugeIcon(
2290
+ icon: HugeIcons.strokeRoundedShield01,
2291
+ size: 16,
2292
+ color: colorScheme.onSurfaceVariant,
2293
+ ),
2294
+ const SizedBox(width: 8),
2295
+ Text(
2296
+ l10n.privacy_policy,
2297
+ style: theme.textTheme.bodySmall?.copyWith(
2298
+ color: colorScheme.onSurfaceVariant,
2299
+ fontWeight: FontWeight.w500,
2300
+ ),
2301
+ ),
2302
+ const SizedBox(width: 6),
2303
+ HugeIcon(
2304
+ icon: HugeIcons.strokeRoundedShare01,
2305
+ size: 14,
2306
+ color: colorScheme.onSurfaceVariant.withValues(alpha: 0.5),
2307
+ ),
2308
+ ],
2309
+ ),
2310
+ ),
2311
+ ),
2312
+ );
2313
+ }
2314
+}
2315
+
2316
List<Widget> _withVerticalSpacing(List<Widget> children, {double gap = 12}) {
2317
if (children.isEmpty) {
2318
return const [];
lib/l10n/app_ar.arb
+4
-1
@@ -821,5 +821,8 @@
821
"could_not_establish_connection": "تعذر الاتصال بالخادم. يرجى التحقق مما إذا كان الخادم قيد التشغيل وصحة إعدادات المضيف/المنفذ.",
822
"retry_connection": "إعادة محاولة الاتصال",
823
"tokens_label": "الرموز",
824
- "enter_context_length": "أدخل طول السياق..."
824
+ "enter_context_length": "أدخل طول السياق...",
825
+ "openrouter_disclosure": "من خلال الاتصال بهذا المزود، سيتم إرسال رسائل الدردشة والمدخلات الخاصة بك إلى خوادمهم. لا يتتبع LocalMind محادثاتك أو يخزنها.",
826
+ "welcome_message_cloud": "يتم إرسال رسائلك إلى مزود الخدمة المتصل بك.",
827
+ "privacy_policy": "سياسة الخصوصية"
828
}
\ No newline at end of file
lib/l10n/app_bn.arb
+4
-1
@@ -821,5 +821,8 @@
821
"could_not_establish_connection": "সার্ভারের সাথে সংযোগ স্থাপন করা যায়নি। অনুগ্রহ করে আপনার সার্ভারটি চলছে কিনা এবং হোস্ট/পোর্ট সেটিংস সঠিক কিনা তা পরীক্ষা করুন।",
822
"retry_connection": "সংযোগের পুনরায় চেষ্টা করুন",
823
"tokens_label": "টোকেন",
824
- "enter_context_length": "প্রসঙ্গের দৈর্ঘ্য লিখুন..."
824
+ "enter_context_length": "প্রসঙ্গের দৈর্ঘ্য লিখুন...",
825
+ "openrouter_disclosure": "এই প্রদানকারীকে সংযুক্ত করার মাধ্যমে, আপনার চ্যাট বার্তা এবং ইনপুট তাদের সার্ভারে পাঠানো হবে। LocalMind আপনার কথোপকথন ট্র্যাক বা সংরক্ষণ করে না।",
826
+ "welcome_message_cloud": "আপনার বার্তাগুলি আপনার সংযুক্ত প্রদানকারীর কাছে পাঠানো হয়।",
827
+ "privacy_policy": "গোপনীয়তা নীতি"
828
}
\ No newline at end of file
lib/l10n/app_en.arb
+13
-1
@@ -2843,7 +2843,7 @@
2843
"preview_system_prompts": "Preview system prompts",
2844
"welcome_message_1": "What can I help you with today?",
2845
"welcome_message_2": "Ask me anything — I'm ready when you are.",
2846
- "welcome_message_3": "Start a conversation below.",
2846
+ "welcome_message_3": "Your data is processed locally and never leaves your device.",
2847
"welcome_message_4": "Need ideas? Try one of the quick prompts.",
2848
"temporary_chat": "Temporary chat",
2849
"temporary_chat_desc": "Chats aren't saved to history.",
@@ -2997,5 +2997,17 @@
2997
"enter_context_length": "Enter context length...",
2998
"@enter_context_length": {
2999
"description": "Context length input placeholder text"
3000
+ },
3001
+ "openrouter_disclosure": "By connecting this provider, your chat messages and inputs will be sent to their servers. LocalMind does not track or store your conversations.",
3002
+ "@openrouter_disclosure": {
3003
+ "description": "Disclosure shown when connecting to OpenRouter about data being sent to their servers"
3004
+ },
3005
+ "welcome_message_cloud": "Your messages are sent to your connected provider.",
3006
+ "@welcome_message_cloud": {
3007
+ "description": "Welcome message shown when a cloud provider (e.g. OpenRouter) is active"
3008
+ },
3009
+ "privacy_policy": "Privacy Policy",
3010
+ "@privacy_policy": {
3011
+ "description": "Privacy Policy link label"
3012
}
3013
}
lib/l10n/app_es.arb
+4
-1
@@ -821,5 +821,8 @@
821
"could_not_establish_connection": "No se pudo establecer una conexión con el servidor. Por favor, comprueba si tu servidor está funcionando y si la configuración de host/puerto es correcta.",
822
"retry_connection": "Reintentar conexión",
823
"tokens_label": "Tokens",
824
- "enter_context_length": "Introduce la longitud del contexto..."
824
+ "enter_context_length": "Introduce la longitud del contexto...",
825
+ "openrouter_disclosure": "Al conectar este proveedor, tus mensajes de chat y entradas se enviarán a sus servidores. LocalMind no rastrea ni almacena tus conversaciones.",
826
+ "welcome_message_cloud": "Tus mensajes se envían a tu proveedor conectado.",
827
+ "privacy_policy": "Política de privacidad"
828
}
\ No newline at end of file
lib/l10n/app_hi.arb
+4
-1
@@ -821,5 +821,8 @@
821
"could_not_establish_connection": "सर्वर से कनेक्शन स्थापित नहीं किया जा सका। कृपया जांचें कि क्या आपका सर्वर चल रहा है और होस्ट/पोर्ट सेटिंग्स सही हैं।",
822
"retry_connection": "कनेक्शन का पुनः प्रयास करें",
823
"tokens_label": "टोकन",
824
- "enter_context_length": "संदर्भ की लंबाई दर्ज करें..."
824
+ "enter_context_length": "संदर्भ की लंबाई दर्ज करें...",
825
+ "openrouter_disclosure": "इस प्रदाता को कनेक्ट करके, आपके चैट संदेश और इनपुट उनके सर्वर पर भेजे जाएंगे। LocalMind आपकी बातचीत को ट्रैक या संग्रहीत नहीं करता है।",
826
+ "welcome_message_cloud": "आपके संदेश आपके कनेक्टेड प्रदाता को भेजे जाते हैं।",
827
+ "privacy_policy": "गोपनीयता नीति"
828
}
\ No newline at end of file
lib/l10n/app_it.arb
+4
-1
@@ -821,5 +821,8 @@
821
"could_not_establish_connection": "Impossibile stabilire una connessione al server. Verifica se il server è attivo e se le impostazioni host/porta sono corrette.",
822
"retry_connection": "Riprova connessione",
823
"tokens_label": "Token",
824
- "enter_context_length": "Inserisci lunghezza del contesto..."
824
+ "enter_context_length": "Inserisci lunghezza del contesto...",
825
+ "openrouter_disclosure": "Collegando questo provider, i tuoi messaggi di chat e input verranno inviati ai loro server. LocalMind non traccia né memorizza le tue conversazioni.",
826
+ "welcome_message_cloud": "I tuoi messaggi vengono inviati al provider connesso.",
827
+ "privacy_policy": "Informativa sulla privacy"
828
}
\ No newline at end of file
lib/l10n/app_ja.arb
+4
-1
@@ -821,5 +821,8 @@
821
"could_not_establish_connection": "サーバーへの接続を確立できませんでした。サーバーが稼働していること、およびホスト/ポートの設定が正しいことを確認してください。",
822
"retry_connection": "接続を再試行",
823
"tokens_label": "トークン",
824
- "enter_context_length": "コンテキスト長を入力..."
824
+ "enter_context_length": "コンテキスト長を入力...",
825
+ "openrouter_disclosure": "このプロバイダーに接続すると、チャットメッセージと入力がそのサーバーに送信されます。LocalMindはお客様の会話を追跡または保存することはありません。",
826
+ "welcome_message_cloud": "メッセージは接続されたプロバイダーに送信されます。",
827
+ "privacy_policy": "プライバシーポリシー"
828
}
\ No newline at end of file
lib/l10n/app_localizations.dart
+19
-1
@@ -4454,7 +4454,7 @@ abstract class AppLocalizations {
4454
/// No description provided for @welcome_message_3.
4455
///
4456
/// In en, this message translates to:
4457
- /// **'Start a conversation below.'**
4457
+ /// **'Your data is processed locally and never leaves your device.'**
4458
String get welcome_message_3;
4459
4460
/// No description provided for @welcome_message_4.
@@ -5026,6 +5026,24 @@ abstract class AppLocalizations {
5026
/// In en, this message translates to:
5027
/// **'Enter context length...'**
5028
String get enter_context_length;
5029
+
5030
+ /// Disclosure shown when connecting to OpenRouter about data being sent to their servers
5031
+ ///
5032
+ /// In en, this message translates to:
5033
+ /// **'By connecting this provider, your chat messages and inputs will be sent to their servers. LocalMind does not track or store your conversations.'**
5034
+ String get openrouter_disclosure;
5035
+
5036
+ /// Welcome message shown when a cloud provider (e.g. OpenRouter) is active
5037
+ ///
5038
+ /// In en, this message translates to:
5039
+ /// **'Your messages are sent to your connected provider.'**
5040
+ String get welcome_message_cloud;
5041
+
5042
+ /// Privacy Policy link label
5043
+ ///
5044
+ /// In en, this message translates to:
5045
+ /// **'Privacy Policy'**
5046
+ String get privacy_policy;
5047
}
5048
5049
class _AppLocalizationsDelegate
lib/l10n/app_localizations_ar.dart
+11
@@ -2672,4 +2672,15 @@ class AppLocalizationsAr extends AppLocalizations {
2672
2673
@override
2674
String get enter_context_length => 'أدخل طول السياق...';
2675
+
2676
+ @override
2677
+ String get openrouter_disclosure =>
2678
+ 'من خلال الاتصال بهذا المزود، سيتم إرسال رسائل الدردشة والمدخلات الخاصة بك إلى خوادمهم. لا يتتبع LocalMind محادثاتك أو يخزنها.';
2679
+
2680
+ @override
2681
+ String get welcome_message_cloud =>
2682
+ 'يتم إرسال رسائلك إلى مزود الخدمة المتصل بك.';
2683
+
2684
+ @override
2685
+ String get privacy_policy => 'سياسة الخصوصية';
2686
}
lib/l10n/app_localizations_bn.dart
+11
@@ -2692,4 +2692,15 @@ class AppLocalizationsBn extends AppLocalizations {
2692
2693
@override
2694
String get enter_context_length => 'প্রসঙ্গের দৈর্ঘ্য লিখুন...';
2695
+
2696
+ @override
2697
+ String get openrouter_disclosure =>
2698
+ 'এই প্রদানকারীকে সংযুক্ত করার মাধ্যমে, আপনার চ্যাট বার্তা এবং ইনপুট তাদের সার্ভারে পাঠানো হবে। LocalMind আপনার কথোপকথন ট্র্যাক বা সংরক্ষণ করে না।';
2699
+
2700
+ @override
2701
+ String get welcome_message_cloud =>
2702
+ 'আপনার বার্তাগুলি আপনার সংযুক্ত প্রদানকারীর কাছে পাঠানো হয়।';
2703
+
2704
+ @override
2705
+ String get privacy_policy => 'গোপনীয়তা নীতি';
2706
}
lib/l10n/app_localizations_en.dart
+13
-1
@@ -2366,7 +2366,8 @@ class AppLocalizationsEn extends AppLocalizations {
2366
String get welcome_message_2 => 'Ask me anything — I\'m ready when you are.';
2367
2368
@override
2369
- String get welcome_message_3 => 'Start a conversation below.';
2369
+ String get welcome_message_3 =>
2370
+ 'Your data is processed locally and never leaves your device.';
2371
2372
@override
2373
String get welcome_message_4 => 'Need ideas? Try one of the quick prompts.';
@@ -2679,4 +2680,15 @@ class AppLocalizationsEn extends AppLocalizations {
2680
2681
@override
2682
String get enter_context_length => 'Enter context length...';
2683
+
2684
+ @override
2685
+ String get openrouter_disclosure =>
2686
+ 'By connecting this provider, your chat messages and inputs will be sent to their servers. LocalMind does not track or store your conversations.';
2687
+
2688
+ @override
2689
+ String get welcome_message_cloud =>
2690
+ 'Your messages are sent to your connected provider.';
2691
+
2692
+ @override
2693
+ String get privacy_policy => 'Privacy Policy';
2694
}
lib/l10n/app_localizations_es.dart
+11
@@ -2696,4 +2696,15 @@ class AppLocalizationsEs extends AppLocalizations {
2696
2697
@override
2698
String get enter_context_length => 'Introduce la longitud del contexto...';
2699
+
2700
+ @override
2701
+ String get openrouter_disclosure =>
2702
+ 'Al conectar este proveedor, tus mensajes de chat y entradas se enviarán a sus servidores. LocalMind no rastrea ni almacena tus conversaciones.';
2703
+
2704
+ @override
2705
+ String get welcome_message_cloud =>
2706
+ 'Tus mensajes se envían a tu proveedor conectado.';
2707
+
2708
+ @override
2709
+ String get privacy_policy => 'Política de privacidad';
2710
}
lib/l10n/app_localizations_hi.dart
+11
@@ -2685,4 +2685,15 @@ class AppLocalizationsHi extends AppLocalizations {
2685
2686
@override
2687
String get enter_context_length => 'संदर्भ की लंबाई दर्ज करें...';
2688
+
2689
+ @override
2690
+ String get openrouter_disclosure =>
2691
+ 'इस प्रदाता को कनेक्ट करके, आपके चैट संदेश और इनपुट उनके सर्वर पर भेजे जाएंगे। LocalMind आपकी बातचीत को ट्रैक या संग्रहीत नहीं करता है।';
2692
+
2693
+ @override
2694
+ String get welcome_message_cloud =>
2695
+ 'आपके संदेश आपके कनेक्टेड प्रदाता को भेजे जाते हैं।';
2696
+
2697
+ @override
2698
+ String get privacy_policy => 'गोपनीयता नीति';
2699
}
lib/l10n/app_localizations_it.dart
+11
@@ -2698,4 +2698,15 @@ class AppLocalizationsIt extends AppLocalizations {
2698
2699
@override
2700
String get enter_context_length => 'Inserisci lunghezza del contesto...';
2701
+
2702
+ @override
2703
+ String get openrouter_disclosure =>
2704
+ 'Collegando questo provider, i tuoi messaggi di chat e input verranno inviati ai loro server. LocalMind non traccia né memorizza le tue conversazioni.';
2705
+
2706
+ @override
2707
+ String get welcome_message_cloud =>
2708
+ 'I tuoi messaggi vengono inviati al provider connesso.';
2709
+
2710
+ @override
2711
+ String get privacy_policy => 'Informativa sulla privacy';
2712
}
lib/l10n/app_localizations_ja.dart
+10
@@ -2634,4 +2634,14 @@ class AppLocalizationsJa extends AppLocalizations {
2634
2635
@override
2636
String get enter_context_length => 'コンテキスト長を入力...';
2637
+
2638
+ @override
2639
+ String get openrouter_disclosure =>
2640
+ 'このプロバイダーに接続すると、チャットメッセージと入力がそのサーバーに送信されます。LocalMindはお客様の会話を追跡または保存することはありません。';
2641
+
2642
+ @override
2643
+ String get welcome_message_cloud => 'メッセージは接続されたプロバイダーに送信されます。';
2644
+
2645
+ @override
2646
+ String get privacy_policy => 'プライバシーポリシー';
2647
}
lib/l10n/app_localizations_ru.dart
+11
@@ -2699,4 +2699,15 @@ class AppLocalizationsRu extends AppLocalizations {
2699
2700
@override
2701
String get enter_context_length => 'Введите длину контекста...';
2702
+
2703
+ @override
2704
+ String get openrouter_disclosure =>
2705
+ 'Подключая этого поставщика, ваши сообщения чата и вводные данные будут отправлены на их серверы. LocalMind не отслеживает и не хранит ваши разговоры.';
2706
+
2707
+ @override
2708
+ String get welcome_message_cloud =>
2709
+ 'Ваши сообщения отправляются вашему подключенному поставщику.';
2710
+
2711
+ @override
2712
+ String get privacy_policy => 'Политика конфиденциальности';
2713
}
lib/l10n/app_localizations_zh.dart
+20
@@ -2615,6 +2615,16 @@ class AppLocalizationsZh extends AppLocalizations {
2615
2616
@override
2617
String get enter_context_length => '输入上下文长度...';
2618
+
2619
+ @override
2620
+ String get openrouter_disclosure =>
2621
+ '连接此提供商后,您的聊天消息和输入将被发送到他们的服务器。LocalMind 不会跟踪或存储您的对话。';
2622
+
2623
+ @override
2624
+ String get welcome_message_cloud => '您的消息将发送到您连接的提供商。';
2625
+
2626
+ @override
2627
+ String get privacy_policy => '隐私政策';
2628
}
2629
2630
/// The translations for Chinese, as used in Taiwan (`zh_TW`).
@@ -5229,4 +5239,14 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
5239
5240
@override
5241
String get enter_context_length => '輸入上下文長度...';
5242
+
5243
+ @override
5244
+ String get openrouter_disclosure =>
5245
+ '連接此提供者後,您的聊天訊息和輸入將被發送到他們的伺服器。LocalMind 不會追蹤或儲存您的對話。';
5246
+
5247
+ @override
5248
+ String get welcome_message_cloud => '您的訊息將發送到您連接的提供者。';
5249
+
5250
+ @override
5251
+ String get privacy_policy => '隱私權政策';
5252
}
lib/l10n/app_ru.arb
+4
-1
@@ -818,5 +818,8 @@
818
"could_not_establish_connection": "Не удалось подключиться к серверу. Убедитесь, что сервер запущен, а настройки хоста и порта указаны верно.",
819
"retry_connection": "Повторить подключение",
820
"tokens_label": "Токены",
821
- "enter_context_length": "Введите длину контекста..."
821
+ "enter_context_length": "Введите длину контекста...",
822
+ "openrouter_disclosure": "Подключая этого поставщика, ваши сообщения чата и вводные данные будут отправлены на их серверы. LocalMind не отслеживает и не хранит ваши разговоры.",
823
+ "welcome_message_cloud": "Ваши сообщения отправляются вашему подключенному поставщику.",
824
+ "privacy_policy": "Политика конфиденциальности"
825
}
\ No newline at end of file
lib/l10n/app_zh.arb
+4
-1
@@ -821,5 +821,8 @@
821
"could_not_establish_connection": "无法与服务器建立连接。请检查您的服务器是否正在运行,以及主机/端口设置是否正确。",
822
"retry_connection": "重试连接",
823
"tokens_label": "Token 数",
824
- "enter_context_length": "输入上下文长度..."
824
+ "enter_context_length": "输入上下文长度...",
825
+ "openrouter_disclosure": "连接此提供商后,您的聊天消息和输入将被发送到他们的服务器。LocalMind 不会跟踪或存储您的对话。",
826
+ "welcome_message_cloud": "您的消息将发送到您连接的提供商。",
827
+ "privacy_policy": "隐私政策"
828
}
\ No newline at end of file
lib/l10n/app_zh_TW.arb
+4
-1
@@ -821,5 +821,8 @@
821
"could_not_establish_connection": "無法與伺服器建立連線。請檢查您的伺服器是否正在運行,以及主機/埠設定是否正確。",
822
"retry_connection": "重試連線",
823
"tokens_label": "Token 數",
824
- "enter_context_length": "輸入上下文長度..."
824
+ "enter_context_length": "輸入上下文長度...",
825
+ "openrouter_disclosure": "連接此提供者後,您的聊天訊息和輸入將被發送到他們的伺服器。LocalMind 不會追蹤或儲存您的對話。",
826
+ "welcome_message_cloud": "您的訊息將發送到您連接的提供者。",
827
+ "privacy_policy": "隱私權政策"
828
}
\ 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.5.1+56
19
+version: 1.5.2+57
20
21
environment:
22
sdk: ">=3.12.0 <4.0.0"