@tduncan / Cortana / commits / 37b7ac2

feat: add data disclosure for cloud providers, fix empty-state privacy message, and add privacy policy link to settings

abdulmominsakib committed Jul 8, 2026 at 16:30 UTC 37b7ac201c2cd37b97387a62d2811832af5244ab
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"