From 1ca7c370fdb19e3fd37d72c6469890ab919f17c8 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 14 Mar 2026 12:15:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(i18n):=20=E6=B7=BB=E5=8A=A0=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1=E7=9A=84=E7=BF=BB=E8=AF=91=E9=94=AE=E5=B9=B6=E5=BC=95?= =?UTF-8?q?=E5=85=A5i18n=E5=AE=A1=E8=AE=A1=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增蓝牙扫描、工具调用、导航选择、OTA升级等模块的翻译键,覆盖多个语言文件。 添加i18n审计脚本以检测翻译质量问题,包括与基线文件相同但可能是英文的翻译。 引入允许列表文件以排除特定键的审计检查。 --- lib/core/translations/language/ar_sa.dart | 310 +++-- lib/core/translations/language/bg_bg.dart | 132 +- lib/core/translations/language/cs_cz.dart | 148 +- lib/core/translations/language/da_dk.dart | 172 ++- lib/core/translations/language/de_de.dart | 394 ++++-- lib/core/translations/language/el_gr.dart | 663 +++++---- lib/core/translations/language/en_us.dart | 124 +- lib/core/translations/language/es_es.dart | 932 +++++++------ lib/core/translations/language/et_ee.dart | 312 +++-- lib/core/translations/language/fa_ir.dart | 715 ++++++---- lib/core/translations/language/fi_fi.dart | 102 ++ lib/core/translations/language/fr_fr.dart | 1002 ++++++++------ lib/core/translations/language/hi_in.dart | 339 +++-- lib/core/translations/language/hr_hr.dart | 339 +++-- lib/core/translations/language/hu_hu.dart | 312 +++-- lib/core/translations/language/id_id.dart | 736 ++++++---- lib/core/translations/language/is_is.dart | 102 ++ lib/core/translations/language/it_it.dart | 340 +++-- lib/core/translations/language/ja_jp.dart | 273 ++-- lib/core/translations/language/ko_kr.dart | 1195 ++++++++-------- lib/core/translations/language/lt_lt.dart | 337 +++-- lib/core/translations/language/lv_lv.dart | 867 +++++++----- lib/core/translations/language/ms_my.dart | 719 ++++++---- lib/core/translations/language/nb_no.dart | 102 ++ lib/core/translations/language/nl_nl.dart | 339 +++-- lib/core/translations/language/pl_pl.dart | 190 ++- lib/core/translations/language/pt_pt.dart | 318 +++-- lib/core/translations/language/ro_ro.dart | 340 +++-- lib/core/translations/language/ru_ru.dart | 290 ++-- lib/core/translations/language/sk_sk.dart | 312 +++-- lib/core/translations/language/sl_si.dart | 314 +++-- lib/core/translations/language/sr_rs.dart | 1311 ++++++++++-------- lib/core/translations/language/sv_se.dart | 100 ++ lib/core/translations/language/th_th.dart | 680 +++++++--- lib/core/translations/language/tl_ph.dart | 1185 ++++++++++------ lib/core/translations/language/tr_tr.dart | 733 ++++++---- lib/core/translations/language/uk_ua.dart | 843 ++++++++---- lib/core/translations/language/vi_vn.dart | 1505 ++++++++++++--------- lib/core/translations/language/zh_cn.dart | 14 +- lib/core/translations/language/zh_hk.dart | 107 +- lib/core/translations/language/zh_tw.dart | 107 +- tools/i18n_allowlist.json | 24 + tools/i18n_audit.py | 201 +++ 43 files changed, 12702 insertions(+), 6878 deletions(-) create mode 100644 tools/i18n_allowlist.json create mode 100644 tools/i18n_audit.py diff --git a/lib/core/translations/language/ar_sa.dart b/lib/core/translations/language/ar_sa.dart index 3fd0d0523..359530ff4 100644 --- a/lib/core/translations/language/ar_sa.dart +++ b/lib/core/translations/language/ar_sa.dart @@ -1,5 +1,4 @@ const Map arSA = { - // 通用 'continue': 'متابعة', 'confirm': 'تأكيد', @@ -130,8 +129,7 @@ const Map arSA = { "aiAssistantInfo": "مستشار حصري على مدار 24 ساعة للإجابة على الأسئلة وتقديم الاقتراحات", "interpretation": "الترجمة", - "simultaneousInterpretationInfo": - "ترجمة فورية لعدة لغات، سفر خالٍ من القلق", + "simultaneousInterpretationInfo": "ترجمة فورية لعدة لغات، سفر خالٍ من القلق", "aiCompanion": "رفيق العائلة", "aiCompanionInfo": "يفهمك ويقدم لك رفقة دافئة", "homeSlogan": "تواصل مع العالم، أبعد من الصوت", @@ -167,6 +165,29 @@ const Map arSA = { 'right': 'يمين', 'checkConnectionStatusFailed': 'فشل التحقق من حالة الاتصال', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'فشل تهيئة البلوتوث: @error', + 'needBluetoothAndLocationPermission': + 'مطلوبة أذونات البلوتوث والموقع لمسح الأجهزة', + 'permissionRequestFailedWithError': 'فشل طلب الإذن: @error', + 'needPermission': 'الإذن مطلوب', + 'blePermissionDialogContent': + 'يتطلب هذا التطبيق أذونات البلوتوث والموقع لمسح الأجهزة. يرجى تمكينها من الإعدادات.', + 'needEnableBluetooth': 'فعّل البلوتوث', + 'enableBluetoothDialogContent': + 'يرجى تفعيل البلوتوث لمسح الأجهزة والاتصال بها.', + 'bleScanFailedWithError': 'فشل المسح: @error', + 'bleConnectionSuccess': 'تم الاتصال بنجاح', + 'bleConnectedToDevice': 'تم الاتصال بـ @device', + 'bleConnectionFailedWithError': 'فشل الاتصال: @error', + 'bleDisconnected': 'تم قطع الاتصال', + 'bleDeviceDisconnected': 'تم قطع اتصال الجهاز', + 'bleDisconnectFailedWithError': 'فشل قطع الاتصال: @error', + 'signalStrong': 'قوية', + 'signalMedium': 'متوسطة', + 'signalWeak': 'ضعيفة', + 'signalVeryWeak': 'ضعيفة جدًا', + // 发现页 "searchAi": "بحث عن وظائف الذكاء الاصطناعي...", "exploreSlogan": "سماعات ذكية، إمكانيات لا حصر لها", @@ -241,60 +262,61 @@ const Map arSA = { 'totalQuota': 'إجمالي الحصة', 'remaining': 'المتبقي', 'featureDescription': 'وصف الميزة', - 'paymentSuccess': 'تم الدفع بنجاح', - 'paymentFailed': 'فشل الدفع', - 'gotIt': 'فهمت', - 'paymentFailedTryAgain': 'فشل الدفع. يرجى المحاولة مرة أخرى.', - 'selectPaymentMethod': 'اختر طريقة الدفع', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'فشل إنشاء طلب WeChat', - 'alipayOrderCreateFailed': 'فشل إنشاء طلب Alipay', - 'appleOrderCreateFailed': 'فشل إنشاء طلب Apple', - 'googleOrderCreateFailed': 'فشل إنشاء طلب Google', - 'paypalOrderCreateFailed': 'فشل إنشاء طلب PayPal', - 'paymentException': 'استثناء في الدفع', - 'paymentLaunchFailed': 'فشل بدء الدفع', - 'paymentExceptionWithError': 'استثناء في الدفع: @error', - 'paymentProcessingCheckLater': 'طلبك قيد المعالجة. يرجى التحقق لاحقًا.', - 'paymentResultQueryException': 'فشل الاستعلام عن نتيجة الدفع: @error', - 'orderConfirmedQuotaRefreshed': 'تم تأكيد الطلب. تم تحديث رصيدك.', - 'paymentCompletedConfirming': 'تم الدفع. جاري التأكيد…', - 'paymentCancelled': 'تم إلغاء الدفع', - 'paypalOpenedCompleteInBrowser': 'تم فتح PayPal. يرجى إكمال الدفع في متصفحك.', - 'paypalOpenFailed': 'تعذر فتح صفحة الدفع عبر PayPal', - 'paymentTestTitle': 'اختبار الدفع', - 'paymentTestOrderInfo': 'معلومات طلب الاختبار', - 'paymentTestProductId': 'معرّف المنتج', - 'paymentTestProductDescription': 'وصف المنتج', - 'paymentTestWechatDescription': 'اختبار الدفع عبر WeChat', - 'paymentTestAlipayDescription': 'اختبار الدفع عبر Alipay', - 'paymentTestAmount': 'المبلغ', - 'paymentTestSelectAmount': 'اختر مبلغ الاختبار', - 'paying': 'جاري الدفع...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'حالة الدفع', - 'errorInfoWithMessage': 'خطأ: @message', - 'retest': 'إعادة الاختبار', - 'paymentTestInstructionsTitle': 'التعليمات', - 'paymentTestInstructionsContent': '1. اختر مبلغ اختبار (يُنصح بـ: ¥0.01)\n2. انقر على زر الدفع للبدء\n3. أكمل الدفع في تطبيق الدفع\n4. ارجع للتحقق من النتيجة', - 'startingWechatPayment': 'جاري تشغيل WeChat Pay...', - 'startingAlipayPayment': 'جاري تشغيل Alipay...', - 'wechatPaymentSuccess': 'تم الدفع عبر WeChat Pay بنجاح!', - 'wechatPaymentFailed': 'فشل WeChat Pay', - 'wechatPaymentLaunchFailed': 'فشل تشغيل WeChat Pay', - 'cannotLaunchWechatPayment': 'تعذر تشغيل WeChat Pay', - 'wechatPaymentException': 'استثناء WeChat Pay', - 'wechatPaymentTestCompleted': 'اكتمل اختبار WeChat Pay', - 'alipayPaymentSuccess': 'تم الدفع عبر Alipay بنجاح!', - 'alipayPaymentFailed': 'فشل Alipay', - 'alipayPaymentLaunchFailed': 'فشل تشغيل Alipay', - 'cannotLaunchAlipayPayment': 'تعذر تشغيل Alipay', - 'alipayPaymentException': 'استثناء Alipay', + 'paymentSuccess': 'تم الدفع بنجاح', + 'paymentFailed': 'فشل الدفع', + 'gotIt': 'فهمت', + 'paymentFailedTryAgain': 'فشل الدفع. يرجى المحاولة مرة أخرى.', + 'selectPaymentMethod': 'اختر طريقة الدفع', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'فشل إنشاء طلب WeChat', + 'alipayOrderCreateFailed': 'فشل إنشاء طلب Alipay', + 'appleOrderCreateFailed': 'فشل إنشاء طلب Apple', + 'googleOrderCreateFailed': 'فشل إنشاء طلب Google', + 'paypalOrderCreateFailed': 'فشل إنشاء طلب PayPal', + 'paymentException': 'استثناء في الدفع', + 'paymentLaunchFailed': 'فشل بدء الدفع', + 'paymentExceptionWithError': 'استثناء في الدفع: @error', + 'paymentProcessingCheckLater': 'طلبك قيد المعالجة. يرجى التحقق لاحقًا.', + 'paymentResultQueryException': 'فشل الاستعلام عن نتيجة الدفع: @error', + 'orderConfirmedQuotaRefreshed': 'تم تأكيد الطلب. تم تحديث رصيدك.', + 'paymentCompletedConfirming': 'تم الدفع. جاري التأكيد…', + 'paymentCancelled': 'تم إلغاء الدفع', + 'paypalOpenedCompleteInBrowser': 'تم فتح PayPal. يرجى إكمال الدفع في متصفحك.', + 'paypalOpenFailed': 'تعذر فتح صفحة الدفع عبر PayPal', + 'paymentTestTitle': 'اختبار الدفع', + 'paymentTestOrderInfo': 'معلومات طلب الاختبار', + 'paymentTestProductId': 'معرّف المنتج', + 'paymentTestProductDescription': 'وصف المنتج', + 'paymentTestWechatDescription': 'اختبار الدفع عبر WeChat', + 'paymentTestAlipayDescription': 'اختبار الدفع عبر Alipay', + 'paymentTestAmount': 'المبلغ', + 'paymentTestSelectAmount': 'اختر مبلغ الاختبار', + 'paying': 'جاري الدفع...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'حالة الدفع', + 'errorInfoWithMessage': 'خطأ: @message', + 'retest': 'إعادة الاختبار', + 'paymentTestInstructionsTitle': 'التعليمات', + 'paymentTestInstructionsContent': + '1. اختر مبلغ اختبار (يُنصح بـ: ¥0.01)\n2. انقر على زر الدفع للبدء\n3. أكمل الدفع في تطبيق الدفع\n4. ارجع للتحقق من النتيجة', + 'startingWechatPayment': 'جاري تشغيل WeChat Pay...', + 'startingAlipayPayment': 'جاري تشغيل Alipay...', + 'wechatPaymentSuccess': 'تم الدفع عبر WeChat Pay بنجاح!', + 'wechatPaymentFailed': 'فشل WeChat Pay', + 'wechatPaymentLaunchFailed': 'فشل تشغيل WeChat Pay', + 'cannotLaunchWechatPayment': 'تعذر تشغيل WeChat Pay', + 'wechatPaymentException': 'استثناء WeChat Pay', + 'wechatPaymentTestCompleted': 'اكتمل اختبار WeChat Pay', + 'alipayPaymentSuccess': 'تم الدفع عبر Alipay بنجاح!', + 'alipayPaymentFailed': 'فشل Alipay', + 'alipayPaymentLaunchFailed': 'فشل تشغيل Alipay', + 'cannotLaunchAlipayPayment': 'تعذر تشغيل Alipay', + 'alipayPaymentException': 'استثناء Alipay', "insufficientIntegral": "نقاط غير كافية", "insufficientBalanceDesc": "الرصيد غير كافٍ، يرجى الانتقال إلى صفحة الشحن المقابلة للشحن", @@ -495,15 +517,22 @@ const Map arSA = { 'meetingRecordEndAndSave': 'إنهاء التسجيل وحفظه', // 结束录音并保存 'meetingRecordEndWithoutSave': 'إنهاء التسجيل دون حفظ', // 结束录音不保存 'meetingRecordContinueInBackground': 'متابعة التسجيل في الخلفية', // 后台继续录音 - 'meetingRecordStopTimeout': 'انتهت مهلة إيقاف التسجيل. يرجى المحاولة مرة أخرى.', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'تعذر إيقاف التسجيل. يرجى المحاولة مرة أخرى.', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'تعذر حفظ التسجيل. يرجى المحاولة مرة أخرى.', // 保存录音失败,请重试 + 'meetingRecordStopTimeout': + 'انتهت مهلة إيقاف التسجيل. يرجى المحاولة مرة أخرى.', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'تعذر إيقاف التسجيل. يرجى المحاولة مرة أخرى.', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'تعذر حفظ التسجيل. يرجى المحاولة مرة أخرى.', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'التسجيل جارٍ', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'يتم التسجيل في الخلفية. اضغط للعودة إلى التطبيق.', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'يتم التسجيل في الخلفية. اضغط للعودة إلى التطبيق.', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'الظهور فوق التطبيقات الأخرى', // 悬浮窗权限 - 'overlayPermissionTranslationDesc': 'لعرض نتائج الترجمة أثناء المكالمات أو ترجمة الصوت/الفيديو، نحتاج إلى إذن الظهور فوق التطبيقات الأخرى. يتيح لك ذلك رؤية الترجمات الفورية أثناء استخدام تطبيقات أخرى.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 - 'overlayPermissionRecordingDesc': 'لعرض شريط التسجيل العائم (المؤقت/إيقاف مؤقت/استئناف) أثناء التسجيل، نحتاج إلى إذن الظهور فوق التطبيقات الأخرى.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 - 'overlayPermissionOpenSettingsFailed': 'تعذر فتح إعدادات النظام تلقائيًا. يرجى فتح الإعدادات وتمكين إذن الظهور فوق التطبيقات الأخرى يدويًا.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 + 'overlayPermissionTranslationDesc': + 'لعرض نتائج الترجمة أثناء المكالمات أو ترجمة الصوت/الفيديو، نحتاج إلى إذن الظهور فوق التطبيقات الأخرى. يتيح لك ذلك رؤية الترجمات الفورية أثناء استخدام تطبيقات أخرى.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 + 'overlayPermissionRecordingDesc': + 'لعرض شريط التسجيل العائم (المؤقت/إيقاف مؤقت/استئناف) أثناء التسجيل، نحتاج إلى إذن الظهور فوق التطبيقات الأخرى.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 + 'overlayPermissionOpenSettingsFailed': + 'تعذر فتح إعدادات النظام تلقائيًا. يرجى فتح الإعدادات وتمكين إذن الظهور فوق التطبيقات الأخرى يدويًا.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 'transcribing': 'جاري النسخ...', 'summarizing': 'جاري التلخيص...', 'analyzing': 'جاري التحليل...', @@ -528,21 +557,22 @@ const Map arSA = { 'selectSummaryTemplate': 'اختر قالب الملخص', 'useThisTemplate': 'استخدم هذا القالب', 'lastUsed': 'آخر استخدام', - 'create': 'إنشاء', - 'templateDetails': 'تفاصيل القالب', - 'tag': 'علامة', - 'description': 'الوصف', - 'template': 'قالب', - 'deleteTemplate': 'حذف القالب', - 'deleteTemplateConfirm': 'هل أنت متأكد من أنك تريد حذف هذا القالب؟', - 'editTemplate': 'تعديل القالب', - 'createTemplate': 'إنشاء قالب', - 'name': 'الاسم', - 'templateContentHint': 'يرجى إدخال محتوى القالب! نصيحة: انقر على زر الذكاء الاصطناعي أعلاه لإنشاء محتوى القالب بسرعة بناءً على الاسم والوصف الذي أدخلته', - 'inputNameHint': 'يرجى إدخال الاسم', - 'inputDescHint': 'يرجى إدخال الوصف', - 'custom': 'مخصص', - 'pleaseEnter': 'يرجى الإدخال', + 'create': 'إنشاء', + 'templateDetails': 'تفاصيل القالب', + 'tag': 'علامة', + 'description': 'الوصف', + 'template': 'قالب', + 'deleteTemplate': 'حذف القالب', + 'deleteTemplateConfirm': 'هل أنت متأكد من أنك تريد حذف هذا القالب؟', + 'editTemplate': 'تعديل القالب', + 'createTemplate': 'إنشاء قالب', + 'name': 'الاسم', + 'templateContentHint': + 'يرجى إدخال محتوى القالب! نصيحة: انقر على زر الذكاء الاصطناعي أعلاه لإنشاء محتوى القالب بسرعة بناءً على الاسم والوصف الذي أدخلته', + 'inputNameHint': 'يرجى إدخال الاسم', + 'inputDescHint': 'يرجى إدخال الوصف', + 'custom': 'مخصص', + 'pleaseEnter': 'يرجى الإدخال', 'viewAll': 'عرض الكل', 'recordingLanguage': 'لغة التسجيل', 'chineseSimplified': 'الصينية الماندرين (المبسطة)', @@ -565,7 +595,7 @@ const Map arSA = { 'fileProcessingFailed': 'فشلت معالجة الملف: {filePath}, خطأ: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'حفظ الخريطة الذهنية', + 'saveMindMap': 'حفظ الخريطة الذهنية', 'shareMindMap': 'مشاركة الخريطة الذهنية', 'shareSuccess': 'تمت المشاركة بنجاح', @@ -587,7 +617,7 @@ const Map arSA = { 'exportSummary': 'تصدير الملخص', 'exportAs': 'تصدير كـ', 'exportingPDF': 'جاري تصدير PDF...', - 'export': 'تصدير', + 'export': 'تصدير', // Meeting模块 - 发言者 'applyToAllParagraphs': 'تطبيق على جميع فقرات هذا المتحدث', @@ -697,18 +727,18 @@ const Map arSA = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'لغة غير معروفة', - 'analysisFailed': 'فشل التحليل، يرجى المحاولة لاحقًا', - 'transcriptionFailed': 'فشل النسخ، يرجى المحاولة لاحقًا', - 'summaryFailed': 'فشل الملخص، يرجى المحاولة لاحقًا', - 'summaryFailedShort': 'فشل الملخص', - 'transcriptionFailedShort': 'فشل النسخ', + 'analysisFailed': 'فشل التحليل، يرجى المحاولة لاحقًا', + 'transcriptionFailed': 'فشل النسخ، يرجى المحاولة لاحقًا', + 'summaryFailed': 'فشل الملخص، يرجى المحاولة لاحقًا', + 'summaryFailedShort': 'فشل الملخص', + 'transcriptionFailedShort': 'فشل النسخ', // Meeting模块 - 播放器 - 'playerNotReady': 'مشغل الصوت غير جاهز، يرجى الانتظار', - 'playFailed': 'فشل التشغيل', - 'audioFileNotFound': 'ملف الصوت غير موجود', - 'fetchingAudio': 'جاري جلب الصوت من السحابة...', - 'playerLoadFailed': 'فشل تحميل مشغل الصوت', + 'playerNotReady': 'مشغل الصوت غير جاهز، يرجى الانتظار', + 'playFailed': 'فشل التشغيل', + 'audioFileNotFound': 'ملف الصوت غير موجود', + 'fetchingAudio': 'جاري جلب الصوت من السحابة...', + 'playerLoadFailed': 'فشل تحميل مشغل الصوت', // 设置页 "systemSettings": "إعدادات النظام", @@ -813,7 +843,8 @@ const Map arSA = { "swipeUpForMore": "اسحب للأعلى لرؤية المزيد", "callingTool": "أنا أساعدك، يرجى الانتظار!", // 正在帮您,请稍等! "voice_interrupt": "مقاطعة صوتية", // 语音打断 - 'voice_interrupt_tip': 'عند التفعيل: لن يتم مقاطعة الذكاء الاصطناعي بصوتك أثناء تحدثه ويمكنه التعامل مع جولة محادثة واحدة فقط في كل مرة. لبدء جولة جديدة، ما عليك سوى قول كلمة التنبيه.', + 'voice_interrupt_tip': + 'عند التفعيل: لن يتم مقاطعة الذكاء الاصطناعي بصوتك أثناء تحدثه ويمكنه التعامل مع جولة محادثة واحدة فقط في كل مرة. لبدء جولة جديدة، ما عليك سوى قول كلمة التنبيه.', // Agent模块 - 预设提示词 "presetMusic": "شغل بعض الموسيقى", // 来点音乐 @@ -869,6 +900,13 @@ const Map arSA = { 'نود معرفة سبب إبلاغك، يمكنك وصف المشكلة التي واجهتها.', 'generatedByAi': 'تم إنشاؤه بواسطة AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'إليك بعض الموسيقى الموصى بها:', 'playList': 'قائمة التشغيل', @@ -889,6 +927,29 @@ const Map arSA = { "bicycling": "ركوب الدراجات", "tsransit": "نقل عام", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'اختر تطبيق الملاحة', + 'amapMap': 'Amap', + 'useAmapNavigation': 'التنقل باستخدام Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'التنقل باستخدام Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'التنقل باستخدام Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'التنقل باستخدام خرائط Apple', + 'builtInNavigation': 'الملاحة المدمجة', + 'useBuiltInNavigation': 'التنقل باستخدام الخريطة المدمجة', + 'navigationStartFailed': 'فشل بدء التنقل', + 'cannotPlayMusicListRetryLater': + 'تعذر تشغيل قائمة الموسيقى، يرجى المحاولة لاحقًا', + 'cannotPlaySong': 'تعذر تشغيل الأغنية', + 'openMapError': 'خطأ أثناء فتح الخريطة', + 'pleaseInstallAmapApp': 'يرجى تثبيت تطبيق Amap أولاً', + 'pleaseInstallBaiduMapApp': 'يرجى تثبيت تطبيق Baidu Maps أولاً', + 'appleMapStartFailed': 'فشل تشغيل خرائط Apple', + 'appleMapUnavailable': 'خرائط Apple غير متاحة', + 'openAppleMapError': 'خطأ أثناء فتح خرائط Apple', + // Agent模块 - 天气卡片 'weatherQuery': 'استعلام عن الطقس:', 'highest': 'الأعلى', @@ -960,8 +1021,18 @@ const Map arSA = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "فشل اكتشاف اللغة", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'تعطيل النافذة العائمة', + 'enableFloatingWindow': 'تمكين النافذة العائمة', + 'permissionTip': 'تنبيه الأذونات', + 'micPermissionRequiredForRecording': 'إذن الميكروفون مطلوب للتسجيل', + 'deleteTranslationRecordError': 'خطأ في حذف سجل الترجمة: @error', "translationFailed": "فشلت الترجمة", + "translating": "جارٍ الترجمة", + "translate": "ترجمة", "pleaseInputText": "يرجى إدخال النص", + "inputTextToTranslate": "يرجى إدخال النص المراد ترجمته", "textTooLong": "النص طويل جدًا، بحد أقصى 5000 حرف", // 翻译模块 - 历史记录 @@ -1228,7 +1299,8 @@ const Map arSA = { 'native.notification.navigation.title': 'التنقل جارٍ', // 导航进行中 'native.notification.navigation.keepRunning': 'التنقل جارٍ، يرجى إبقاء التطبيق قيد التشغيل', // 正在导航中,请保持应用运行 - 'native.notification.bleAgent.running': 'المساعد الصوتي قيد التشغيل', // 语音助手正在运行 + 'native.notification.bleAgent.running': + 'المساعد الصوتي قيد التشغيل', // 语音助手正在运行 'native.notification.audioRecording.recording': 'يتم التسجيل، اضغط للعودة إلى التطبيق', // 正在录音,点击返回应用 'native.notification.music.waiting': 'في انتظار التشغيل', // 等待播放 @@ -1371,6 +1443,58 @@ const Map arSA = { "removeEarbudsEnsureBattery": "أخرج السماعتين، وتأكد من أن مستوى البطارية أعلى من 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'تم العثور على إصدار جديد @version', + 'otaConfirmUpdateNow': 'هل تريد التحديث الآن؟', + 'otaUpdate': 'تحديث', + 'otaUpgradeSuccess': 'تمت الترقية بنجاح', + 'otaUpgradeCompleteRepair': + 'اكتملت ترقية البرنامج الثابت!\n\nيجب إعادة إقران الجهاز ليعمل بشكل صحيح. هل تريد الانتقال إلى صفحة الإقران الآن؟', + 'otaPairLater': 'الإقران لاحقًا', + 'otaPairNow': 'الإقران الآن', + 'okConfirm': 'موافق', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'خطأ أثناء التحقق من اتصال BLE: @error', + 'otaBleNotConnected': 'جهاز BLE غير متصل', + 'otaBleNeedConnection': + 'تتطلب ترقية البرنامج الثابت اتصال جهاز BLE\nيرجى التأكد من اتصال الجهاز بشكل صحيح ثم المحاولة مرة أخرى', + 'otaDeviceInfoUnavailableTitle': 'معلومات الجهاز غير متاحة', + 'otaCannotGetDeviceInfo': + 'تعذر الحصول على معلومات الجهاز\nيرجى إعادة توصيل الجهاز أو المحاولة لاحقًا', + 'otaBleCheckFailed': 'فشل التحقق من اتصال BLE', + 'otaCannotGetDeviceInfoCheckConnection': + 'تعذر الحصول على معلومات الجهاز، يرجى التحقق من اتصال الجهاز', + 'otaCannotGetProductInfoWithName': + 'تعذر الحصول على معلومات المنتج، اسم الجهاز: @deviceName', + 'otaCannotGetBatteryInfo': 'تعذر الحصول على معلومات بطارية صالحة', + 'otaLowBattery': 'البطارية منخفضة', + 'otaSingleBatteryLow': + 'بطارية الجهاز منخفضة جدًا لترقية البرنامج الثابت\nالمتطلب: يجب أن تكون البطارية أعلى من 20%\nالحالي: @ear @battery%\nيرجى الشحن ثم المحاولة مرة أخرى', + 'otaDoubleBatteryLow': + 'بطارية الجهاز منخفضة جدًا لترقية البرنامج الثابت\nالمتطلب: يجب أن تكون كلتا السماعتين أعلى من 20%\nالحالي: اليسار @left%، اليمين @right%\nيرجى الشحن ثم المحاولة مرة أخرى', + 'otaBatteryCheckFailed': 'فشل التحقق من البطارية', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'يتضمن هذا التحديث تحسينات في الأداء وإصلاحات للأخطاء.', + 'otaGetLatestVersionFailed': 'فشل الحصول على معلومات أحدث إصدار', + 'otaGetVersionInfoFailed': 'فشل الحصول على معلومات الإصدار', + 'otaCheckingDeviceStatus': 'جارٍ التحقق من حالة الجهاز...', + 'otaDownloadFailedCheckNetwork': 'فشل التنزيل، يرجى التحقق من اتصال الشبكة', + 'otaDownloadFailed': 'فشل التنزيل', + 'otaPreparingConnection': 'جارٍ تحضير اتصال الجهاز...', + 'otaConnectingDevice': 'جارٍ الاتصال بالجهاز...', + 'otaUpgradeStarted': 'بدأت ترقية OTA...', + 'otaUpgradeProgressWithPercent': 'تقدم الترقية: @percent%', + 'otaUpgradeSuccessComplete': 'اكتملت الترقية بنجاح', + 'otaUpgradeFailedWithCode': 'فشلت الترقية، رمز الخطأ: @code', + 'otaUpgradeFailedTitle': 'فشلت الترقية', + 'otaUpgradeFailedDesc': + 'يرجى التحقق من اتصال الجهاز أو حزمة التحديث، رمز الخطأ: @code', + 'otaDeviceDisconnected': 'تم قطع اتصال الجهاز', + 'otaDeviceConnected': 'تم اتصال الجهاز', + // 音乐模块 "noMusic": "لا توجد موسيقى", // 暂无音乐 "noPlayingMusic": "لا توجد موسيقى قيد التشغيل", // 暂无播放音乐 diff --git a/lib/core/translations/language/bg_bg.dart b/lib/core/translations/language/bg_bg.dart index 33df7640b..94b8b67db 100644 --- a/lib/core/translations/language/bg_bg.dart +++ b/lib/core/translations/language/bg_bg.dart @@ -167,6 +167,26 @@ const Map bgBG = { 'checkConnectionStatusFailed': 'Неуспешна проверка на състоянието на връзката', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Неуспешна инициализация на Bluetooth: @error', + 'needBluetoothAndLocationPermission': 'За сканиране на устройства са необходими разрешения за Bluetooth и местоположение', + 'permissionRequestFailedWithError': 'Неуспешна заявка за разрешение: @error', + 'needPermission': 'Необходимо разрешение', + 'blePermissionDialogContent': 'Това приложение изисква разрешения за Bluetooth и местоположение за сканиране на устройства. Моля, включете ги в Настройки.', + 'needEnableBluetooth': 'Включете Bluetooth', + 'enableBluetoothDialogContent': 'Моля, включете Bluetooth за сканиране и свързване на устройства.', + 'bleScanFailedWithError': 'Неуспешно сканиране: @error', + 'bleConnectionSuccess': 'Успешно свързване', + 'bleConnectedToDevice': 'Свързан към @device', + 'bleConnectionFailedWithError': 'Неуспешно свързване: @error', + 'bleDisconnected': 'Прекъсната връзка', + 'bleDeviceDisconnected': 'Устройството е прекъснато', + 'bleDisconnectFailedWithError': 'Неуспешно прекъсване на връзката: @error', + 'signalStrong': 'Strong', + 'signalMedium': 'Medium', + 'signalWeak': 'Weak', + 'signalVeryWeak': 'Very Weak', + // 发现页 "searchAi": "Търсене на AI функции...", "exploreSlogan": "Интелигентни слушалки, безгранични възможности", @@ -563,20 +583,20 @@ const Map bgBG = { // Meeting模块 - 文件操作 'importing': 'Importing...', 'batchImporting': 'Batch importing...', - 'importingLocalRecordings': 'Importing local recordings...', - 'importFailed': 'Import file failed: {filePath}, error: {error}', - 'importSuccess': 'Successfully imported {count} local recordings', - 'importError': 'Import failed: {error}', - 'pleaseSelectAudioFile': 'Please select audio file', + 'importingLocalRecordings': 'Импортиране на локални записи...', + 'importFailed': 'Неуспешен импорт на файл: {filePath}, грешка: {error}', + 'importSuccess': 'Успешно импортирани {count} локални записа', + 'importError': 'Неуспешен импорт: {error}', + 'pleaseSelectAudioFile': 'Моля, изберете аудио файл', 'shareAudio': 'Share Meeting Audio', 'shareComplete': 'Share complete!', - 'shareFailed': 'Share failed: {error}', - 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', + 'shareFailed': 'Неуспешно споделяне: {error}', + 'fileProcessingFailed': 'Неуспешна обработка на файл: {filePath}, грешка: {error}', // Meeting模块 - 思维导图 'saveMindMap': 'Запази интелектуална карта', 'shareMindMap': 'Share Mind Map', - 'shareSuccess': 'Share Success', + 'shareSuccess': 'Успешно споделяне', // Meeting模块 - AI问答 'askAI': 'Ask AI ...', @@ -612,9 +632,9 @@ const Map bgBG = { // Meeting模块 - 云端同步 'syncToCloud': 'Sync to Cloud', 'syncToCloudTip': - 'Automatically sync your recordings to the cloud, you can play, manage and share recordings through any VOITRANS APP or VOITRANS Web (web.voitrans.com).', - 'syncToVoitransApp': 'Sync VOITRANS APP', - 'transcriptionRecord': 'Transcription Record', + 'Автоматично синхронизирайте записите си в облака. Можете да възпроизвеждате, управлявате и споделяте записи чрез всяко приложение VOITRANS или VOITRANS Web (web.voitrans.com).', + 'syncToVoitransApp': 'Синхронизирай с VOITRANS APP', + 'transcriptionRecord': 'Запис на транскрипция', // Meeting模块 - 我的页面 'transcriptionRecords': 'Записи на транскрипции', @@ -701,7 +721,7 @@ const Map bgBG = { 'purchase': 'Покупка', // Meeting模块 - 录音语言 - 'recordLanguage': 'Recording Language', + 'recordLanguage': 'Език на записа', 'cantonese': 'Cantonese', 'sichuan': 'Sichuan Dialect', 'shanghai': 'Shanghai Dialect', @@ -731,7 +751,7 @@ const Map bgBG = { "memberService": "Member Service", "bindRewardTitle": "Rewards", "bindRewardSimpleDesc": - "First bind device reward has been issued. Tap OK to close.", + "Наградата за първо свързване на устройство е издадена. Натиснете ОК за затваряне.", "joinDevice": "Свързано устройство:", "accountId": "ID на акаунта:", "systemSetting": "Системни настройки", @@ -883,6 +903,13 @@ const Map bgBG = { 'Искаме да знаем причината за доклада ви, можете да опишете проблема, с който сте се сблъскали.', 'generatedByAi': 'Генерирано от AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Ето някои препоръчани музики:', 'playList': 'Плейлист', @@ -903,6 +930,28 @@ const Map bgBG = { "bicycling": "Колоездене", "tsransit": "Обществен транспорт", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Неуспешно стартиране на навигацията', + 'cannotPlayMusicListRetryLater': 'Не може да се възпроизведе музикалният списък, моля опитайте отново по-късно', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Грешка при отваряне на картата', + 'pleaseInstallAmapApp': 'Моля, първо инсталирайте приложението Amap', + 'pleaseInstallBaiduMapApp': 'Моля, първо инсталирайте приложението Baidu Maps', + 'appleMapStartFailed': 'Неуспешно стартиране на Apple Maps', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Грешка при отваряне на Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Заявка за времето:', 'highest': 'Най-висока', @@ -975,8 +1024,18 @@ const Map bgBG = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Неуспешно откриване на езика", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Изключи плаващ прозорец', + 'enableFloatingWindow': 'Включи плаващ прозорец', + 'permissionTip': 'Съвет за разрешение', + 'micPermissionRequiredForRecording': 'За записване е необходимо разрешение за микрофон', + 'deleteTranslationRecordError': 'Грешка при изтриване на запис за превод: @error', "translationFailed": "Неуспешен превод", + "translating": "Превеждане", + "translate": "Преведи", "pleaseInputText": "Моля въведете текст", + "inputTextToTranslate": "Моля, въведете текста за превод", "textTooLong": "Текстът е твърде дълъг, макс 5000 символа", // 翻译模块 - 历史记录 @@ -1143,9 +1202,9 @@ const Map bgBG = { // 权限模块 'meetingStoragePermission': 'Storage', 'meetingStoragePermissionExplanation': - 'We need access to storage permissions so you can select and upload audio files.', + 'Нуждаем се от достъп до разрешения за съхранение, за да можете да избирате и качвате аудио файлове.', 'meetingStoragePermissionPermanentDenial': - 'Detected that you have permanently denied storage permission. To continue using this feature, please go to app settings to manually enable storage permission.', + 'Установихме, че сте отказали постоянно разрешението за съхранение. За да продължите да използвате тази функция, моля отидете в настройките на приложението, за да включите ръчно разрешението за съхранение.', 'getPermissionStatusFailed': 'Неуспешно получаване на състоянието на разрешенията', 'communicationPermissions': 'Разрешения за комуникация', @@ -1414,6 +1473,49 @@ const Map bgBG = { "removeEarbudsEnsureBattery": "Извадете двете слушалки и се уверете, че батерията на двете е над 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Успешна актуализация', + 'otaUpgradeCompleteRepair': 'Актуализацията на фърмуера е завършена!\n\nУстройството трябва да бъде сдвоено отново, за да работи правилно. Да отидете на страницата за сдвояване сега?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', + // 音乐模块 "noMusic": "Няма музика", // 暂无音乐 "noPlayingMusic": "Няма възпроизвеждаща се музика", // 暂无播放音乐 diff --git a/lib/core/translations/language/cs_cz.dart b/lib/core/translations/language/cs_cz.dart index ba8b66543..ec0bd85e5 100644 --- a/lib/core/translations/language/cs_cz.dart +++ b/lib/core/translations/language/cs_cz.dart @@ -166,6 +166,26 @@ const Map csCZ = { 'right': 'Pravý', 'checkConnectionStatusFailed': 'Kontrola stavu připojení selhala', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Inicializace Bluetooth selhala: @error', + 'needBluetoothAndLocationPermission': 'Pro vyhledávání zařízení jsou vyžadována oprávnění Bluetooth a polohy', + 'permissionRequestFailedWithError': 'Žádost o oprávnění selhala: @error', + 'needPermission': 'Vyžadováno oprávnění', + 'blePermissionDialogContent': 'Tato aplikace vyžaduje oprávnění Bluetooth a polohy pro vyhledávání zařízení. Povolte je prosím v Nastavení.', + 'needEnableBluetooth': 'Zapnout Bluetooth', + 'enableBluetoothDialogContent': 'Zapněte prosím Bluetooth pro vyhledávání a připojení zařízení.', + 'bleScanFailedWithError': 'Vyhledávání selhalo: @error', + 'bleConnectionSuccess': 'Připojení úspěšné', + 'bleConnectedToDevice': 'Připojeno k @device', + 'bleConnectionFailedWithError': 'Připojení selhalo: @error', + 'bleDisconnected': 'Odpojeno', + 'bleDeviceDisconnected': 'Zařízení odpojeno', + 'bleDisconnectFailedWithError': 'Odpojení selhalo: @error', + 'signalStrong': 'Strong', + 'signalMedium': 'Medium', + 'signalWeak': 'Weak', + 'signalVeryWeak': 'Very Weak', + // 发现页 "searchAi": "Hledat AI funkce...", "exploreSlogan": "Chytrá sluchátka, nekonečné možnosti", @@ -420,28 +440,28 @@ const Map csCZ = { 'guideAwakenSuccess': 'Skvělé! Lily je vzhůru – požádejte ji o pomoc.', 'confirmInput': 'Potvrdit vstup', 'guideClickSendPrefix': 'Klepněte na odeslat, ', - 'guideWeatherStart': 'Řekněte Lily: „Jaké je dnes počasí?“', + 'guideWeatherStart': 'Řekněte Lily: „Jaké je dnes počasí?"', 'guideWeatherInput': 'Jaké je dnes počasí?', 'guideWeatherSend': 'Lily nahlásí počasí v reálném čase', 'guideWeatherEnd': 'Lily může hlásit počasí živě – zkuste jiné příkazy', - 'guideMusicStart': 'Řekněte Lily: „Zahraj nějaký rock“', + 'guideMusicStart': 'Řekněte Lily: „Zahraj nějaký rock"', 'guideMusicInput': 'Zahraj nějaký rock', 'guideMusicSend': 'Lily pro vás najde hudbu', 'guideMusicEnd': 'Lily našla hudbu – zkuste jiné příkazy', - 'guideNavStart': 'Řekněte Lily: „Naviguj na letiště Šen-čen“', + 'guideNavStart': 'Řekněte Lily: „Naviguj na letiště Šen-čen"', 'guideNavInput': 'Naviguj na letiště Šen-čen', 'guideNavSend': 'Lily naplánuje trasu', 'guideNavEnd': 'Navigace nastavena – zkuste jiné příkazy', 'guideMeetingStart': - 'Řekněte Lily: „Vytvoř připomínku schůzky na zítra ve 3 odpoledne“', + 'Řekněte Lily: „Vytvoř připomínku schůzky na zítra ve 3 odpoledne"', 'guideMeetingInput': 'Vytvoř připomínku schůzky na zítra ve 3 odpoledne', 'guideMeetingSend': 'Lily vytvoří připomínku schůzky', 'guideMeetingEnd': 'Připomínka vytvořena – zkuste jiné příkazy', - 'guidePhoneStart': 'Řekněte Lily: „Zavolej mámě“', + 'guidePhoneStart': 'Řekněte Lily: „Zavolej mámě"', 'guidePhoneInput': 'Zavolej mámě', 'guidePhoneSend': 'Lily uskuteční hovor', 'guidePhoneEnd': 'Hovor zahájen – zkuste jiné příkazy', - 'guideSmsStart': 'Řekněte Lily: „Pošli tátovi SMS: Přijdu na večeři domů“', + 'guideSmsStart': 'Řekněte Lily: „Pošli tátovi SMS: Přijdu na večeři domů"', 'guideSmsInput': 'SMS tátovi: Přijdu na večeři domů', 'guideSmsSend': 'Lily odešle zprávu', 'guideSmsEnd': 'Zpráva odeslána – hlasové ovládání je pohodlné', @@ -546,30 +566,30 @@ const Map csCZ = { 'custom': 'Vlastní', 'pleaseEnter': 'Prosím zadejte', 'viewAll': 'View All', - 'recordingLanguage': 'Recording Language', + 'recordingLanguage': 'Jazyk nahrávání', 'chineseSimplified': 'Chinese Mandarin (Simplified)', 'meetingGenerateNow': 'Generate Now', 'keyEventsAnalyzed': 'Analyzed {count} key events.', 'aiAnalysisDesc': - 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', + 'AI analýza identifikuje klíčové události v nahrávkách a umožňuje vám vybrat důležité události pro generování pomocí AI.', // Meeting模块 - 文件操作 'importing': 'Importing...', 'batchImporting': 'Batch importing...', - 'importingLocalRecordings': 'Importing local recordings...', - 'importFailed': 'Import file failed: {filePath}, error: {error}', - 'importSuccess': 'Successfully imported {count} local recordings', - 'importError': 'Import failed: {error}', - 'pleaseSelectAudioFile': 'Please select audio file', + 'importingLocalRecordings': 'Importování místních nahrávek...', + 'importFailed': 'Import souboru selhal: {filePath}, chyba: {error}', + 'importSuccess': 'Úspěšně importováno {count} místních nahrávek', + 'importError': 'Import selhal: {error}', + 'pleaseSelectAudioFile': 'Vyberte prosím zvukový soubor', 'shareAudio': 'Share Meeting Audio', 'shareComplete': 'Share complete!', - 'shareFailed': 'Share failed: {error}', - 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', + 'shareFailed': 'Sdílení selhalo: {error}', + 'fileProcessingFailed': 'Zpracování souboru selhalo: {filePath}, chyba: {error}', // Meeting模块 - 思维导图 'saveMindMap': 'Uložit myšlenkovou mapu', 'shareMindMap': 'Share Mind Map', - 'shareSuccess': 'Share Success', + 'shareSuccess': 'Sdílení úspěšné', // Meeting模块 - AI问答 'askAI': 'Ask AI ...', @@ -605,9 +625,9 @@ const Map csCZ = { // Meeting模块 - 云端同步 'syncToCloud': 'Sync to Cloud', 'syncToCloudTip': - 'Automatically sync your recordings to the cloud, you can play, manage and share recordings through any VOITRANS APP or VOITRANS Web (web.voitrans.com).', + 'Automaticky synchronizujte nahrávky do cloudu. Nahrávky můžete přehrávat, spravovat a sdílet prostřednictvím libovolné aplikace VOITRANS nebo VOITRANS Web (web.voitrans.com).', 'syncToVoitransApp': 'Sync VOITRANS APP', - 'transcriptionRecord': 'Transcription Record', + 'transcriptionRecord': 'Záznam přepisu', // Meeting模块 - 我的页面 'transcriptionRecords': 'Záznamy přepisů', @@ -693,7 +713,7 @@ const Map csCZ = { 'purchase': 'Purchase', // Meeting模块 - 录音语言 - 'recordLanguage': 'Recording Language', + 'recordLanguage': 'Jazyk nahrávání', 'cantonese': 'Cantonese', 'sichuan': 'Sichuan Dialect', 'shanghai': 'Shanghai Dialect', @@ -723,7 +743,7 @@ const Map csCZ = { "memberService": "Member Service", "bindRewardTitle": "Rewards", "bindRewardSimpleDesc": - "First bind device reward has been issued. Tap OK to close.", + "Odměna za první propojení zařízení byla vydána. Klepněte na OK pro zavření.", "joinDevice": "Připojené zařízení:", "accountId": "ID účtu:", "systemSetting": "Systémová nastavení", @@ -783,7 +803,7 @@ const Map csCZ = { "noMacAddress": "Žádná MAC adresa", "licenseCode": "Licenční kód", "confirmUnbind": "Potvrdit odpojení", - "confirmUnbindMessage": "Opravdu chcete odpojit zařízení „{deviceName}“?", + "confirmUnbindMessage": 'Opravdu chcete odpojit zařízení „{deviceName}"?', "confirmUnbindAction": "Potvrdit odpojení", // Agent模块 - 主界面 @@ -872,6 +892,13 @@ const Map csCZ = { 'Chceme znát důvod vašeho hlášení, můžete popsat problém, se kterým jste se setkali.', 'generatedByAi': 'Generováno AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Zde jsou některé doporučené hudby:', 'playList': 'Playlist', @@ -892,6 +919,28 @@ const Map csCZ = { "bicycling": "Jízda na kole", "tsransit": "Veřejná doprava", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Spuštění navigace selhalo', + 'cannotPlayMusicListRetryLater': 'Nelze přehrát seznam hudby, zkuste to prosím později', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Chyba při otevírání mapy', + 'pleaseInstallAmapApp': 'Nejprve prosím nainstalujte aplikaci Amap', + 'pleaseInstallBaiduMapApp': 'Nejprve prosím nainstalujte aplikaci Baidu Maps', + 'appleMapStartFailed': 'Spuštění Apple Maps selhalo', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Chyba při otevírání Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Dotaz na počasí:', 'highest': 'Nejvyšší', @@ -964,8 +1013,18 @@ const Map csCZ = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Detekce jazyka selhala", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Zakázat plovoucí okno', + 'enableFloatingWindow': 'Povolit plovoucí okno', + 'permissionTip': 'Upozornění na oprávnění', + 'micPermissionRequiredForRecording': 'Pro nahrávání je vyžadováno oprávnění k mikrofonu', + 'deleteTranslationRecordError': 'Chyba při mazání záznamu překladu: @error', "translationFailed": "Překlad selhal", + "translating": "Translating", + "translate": "Přeložit", "pleaseInputText": "Zadejte prosím text", + "inputTextToTranslate": "Zadejte text k překladu", "textTooLong": "Text je příliš dlouhý, maximálně 5000 znaků", // 翻译模块 - 历史记录 @@ -1125,9 +1184,9 @@ const Map csCZ = { // 权限模块 'meetingStoragePermission': 'Storage', 'meetingStoragePermissionExplanation': - 'We need access to storage permissions so you can select and upload audio files.', + 'Potřebujeme přístup k oprávnění úložiště, abyste mohli vybírat a nahrávat zvukové soubory.', 'meetingStoragePermissionPermanentDenial': - 'Detected that you have permanently denied storage permission. To continue using this feature, please go to app settings to manually enable storage permission.', + 'Zjistili jsme, že jste trvale odmítli oprávnění k úložišti. Chcete-li tuto funkci dále používat, přejděte prosím do nastavení aplikace a ručně povolte oprávnění k úložišti.', 'getPermissionStatusFailed': 'Získání stavu oprávnění selhalo', 'communicationPermissions': 'Komunikační oprávnění', 'bluetoothPermissions': 'Oprávnění Bluetooth', @@ -1390,6 +1449,49 @@ const Map csCZ = { "removeEarbudsEnsureBattery": "Vyjměte obě sluchátka a ujistěte se, že baterie obou je nad 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Aktualizace úspěšná', + 'otaUpgradeCompleteRepair': 'Aktualizace firmwaru dokončena!\n\nPro správné fungování je třeba zařízení znovu spárovat. Přejít na stránku párování?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Chyba při kontrole BLE připojení: @error', + 'otaBleNotConnected': 'BLE zařízení nepřipojeno', + 'otaBleNeedConnection': 'Aktualizace firmwaru vyžaduje připojení BLE zařízení\nUjistěte se prosím, že je zařízení správně připojeno, a zkuste to znovu', + 'otaDeviceInfoUnavailableTitle': 'Informace o zařízení nedostupné', + 'otaCannotGetDeviceInfo': 'Nelze získat informace o zařízení\nZnovu připojte zařízení nebo to zkuste později', + 'otaBleCheckFailed': 'Kontrola BLE připojení selhala', + 'otaCannotGetDeviceInfoCheckConnection': 'Nelze získat informace o zařízení, zkontrolujte prosím připojení zařízení', + 'otaCannotGetProductInfoWithName': 'Nelze získat informace o produktu, název zařízení: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': 'Baterie zařízení je příliš slabá pro aktualizaci firmwaru\nPožadavek: baterie musí být nad 20 %\nAktuálně: @ear @battery %\nNabijte prosím zařízení a zkuste to znovu', + 'otaDoubleBatteryLow': 'Baterie zařízení je příliš slabá pro aktualizaci firmwaru\nPožadavek: obě sluchátka musí mít baterii nad 20 %\nAktuálně: Levé @left %, Pravé @right %\nNabijte prosím zařízení a zkuste to znovu', + 'otaBatteryCheckFailed': 'Kontrola baterie selhala', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Nepodařilo se získat informace o nejnovější verzi', + 'otaGetVersionInfoFailed': 'Nepodařilo se získat informace o verzi', + 'otaCheckingDeviceStatus': 'Kontrola stavu zařízení...', + 'otaDownloadFailedCheckNetwork': 'Stahování selhalo, zkontrolujte prosím připojení k síti', + 'otaDownloadFailed': 'Stahování selhalo', + 'otaPreparingConnection': 'Příprava připojení zařízení...', + 'otaConnectingDevice': 'Připojování k zařízení...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Aktualizace byla úspěšně dokončena', + 'otaUpgradeFailedWithCode': 'Aktualizace selhala, kód chyby: @code', + 'otaUpgradeFailedTitle': 'Aktualizace selhala', + 'otaUpgradeFailedDesc': 'Zkontrolujte prosím připojení zařízení nebo aktualizační balíček, kód chyby: @code', + 'otaDeviceDisconnected': 'Zařízení odpojeno', + 'otaDeviceConnected': 'Zařízení připojeno', + // 音乐模块 "noMusic": "Žádná hudba", // 暂无音乐 "noPlayingMusic": "Žádná přehrávaná hudba", // 暂无播放音乐 diff --git a/lib/core/translations/language/da_dk.dart b/lib/core/translations/language/da_dk.dart index d1e9e3581..92a11940f 100644 --- a/lib/core/translations/language/da_dk.dart +++ b/lib/core/translations/language/da_dk.dart @@ -166,6 +166,26 @@ const Map daDK = { 'right': 'Højre', 'checkConnectionStatusFailed': 'Kontrol af forbindelsesstatus mislykkedes', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth-initialisering mislykkedes: @error', + 'needBluetoothAndLocationPermission': 'Bluetooth- og placeringstilladelser kræves for at scanne enheder', + 'permissionRequestFailedWithError': 'Tilladelsesanmodning mislykkedes: @error', + 'needPermission': 'Tilladelse påkrævet', + 'blePermissionDialogContent': 'Appen kræver Bluetooth- og placeringstilladelser for at scanne enheder. Aktivér dem i Indstillinger.', + 'needEnableBluetooth': 'Aktivér Bluetooth', + 'enableBluetoothDialogContent': 'Aktivér Bluetooth for at scanne og forbinde enheder.', + 'bleScanFailedWithError': 'Scanning mislykkedes: @error', + 'bleConnectionSuccess': 'Forbindelse oprettet', + 'bleConnectedToDevice': 'Forbundet til @device', + 'bleConnectionFailedWithError': 'Forbindelse mislykkedes: @error', + 'bleDisconnected': 'Frakoblet', + 'bleDeviceDisconnected': 'Enhed frakoblet', + 'bleDisconnectFailedWithError': 'Frakobling mislykkedes: @error', + 'signalStrong': 'Stærkt signal', + 'signalMedium': 'Middel signal', + 'signalWeak': 'Svagt signal', + 'signalVeryWeak': 'Meget svagt signal', + // 发现页 "searchAi": "Søg AI funktioner...", "exploreSlogan": "Smarte øretelefoner, uendelige muligheder", @@ -726,7 +746,7 @@ const Map daDK = { "memberService": "Member Service", "bindRewardTitle": "Rewards", "bindRewardSimpleDesc": - "First bind device reward has been issued. Tap OK to close.", + "Belønning for første enhedsbinding er udstedt. Tryk OK for at lukke.", "joinDevice": "Tilsluttet enhed:", "accountId": "Konto-ID:", "systemSetting": "Systemindstillinger", @@ -776,19 +796,19 @@ const Map daDK = { "loading": "Indlæser...", // 设备管理模块 - "deviceTypeUnknown": "Unknown Device", + "deviceTypeUnknown": "Ukendt enhed", "deviceTypeClassicBluetoothHeadset": "Classic Bluetooth Headset", "deviceTypeBleBluetoothHeadset": "BLE Bluetooth Headset", - "deviceTypeSmartVoiceRecorder": "Smart Voice Recorder", + "deviceTypeSmartVoiceRecorder": "Smart stemmeoptager", "deviceTypeSmartEye": "Smart Glasses", "unbind": "Afbind", - "noDevicesBound": "No devices bound yet", - "pleaseBindDeviceFirst": "Please bind a device first to manage", + "noDevicesBound": "Ingen enheder bundet endnu", + "pleaseBindDeviceFirst": "Bind venligst en enhed først for at administrere", "noMacAddress": "No MAC Address", "licenseCode": "License Code", "confirmUnbind": "Confirm Unbind", "confirmUnbindMessage": - "Are you sure you want to unbind device \"{deviceName}\"?", + "Er du sikker på, at du vil afbinde enheden \"{deviceName}\"?", "confirmUnbindAction": "Confirm Unbind", // Agent模块 - 主界面 @@ -819,7 +839,7 @@ const Map daDK = { "loadMoreMessages": "Indlæs flere beskeder...", "loadFailedClickRetry": "Indlæsning mislykkedes, klik for at prøve igen", "swipeUpForMore": "Stryg op for mere", - "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! + "callingTool": "Jeg hjælper dig, vent venligst!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 'voice_interrupt_tip': 'Når aktiveret: AI\'en bliver ikke afbrudt af din stemme, mens den taler, og kan kun håndtere én samtaleomgang ad gangen. For at starte en ny omgang skal du bare sige vækkeordet.', @@ -830,7 +850,7 @@ const Map daDK = { "presetNews": "Today's news", // 今日新闻 "presetFood": "Nearby food", // 美食 "playSomeMusic": "Play some popular music", // 播放一些流行音乐 - "navigationTo": "Please help me navigate to", // 导航到 + "navigationTo": "Hjælp mig venligst med at navigere til", // 导航到 "todayWeather": "How's the weather today?", // 今日天气 "todayNews": "What's the news today?", // 今日新闻 "nearbyFood": "What delicious food is nearby?", // 美食 @@ -877,6 +897,13 @@ const Map daDK = { 'Vi vil gerne vide årsagen til din rapport, du kan beskrive problemet du stødte på.', 'generatedByAi': 'Genereret af AI', + // Agent模块 - 工具调用 + 'toolCall': 'Værktøjskald', + 'noResult': 'Intet resultat', + 'noToolCallContentToCopy': 'Intet værktøjskald at kopiere', + 'toolCallDetails': 'Værktøjskaldsdetaljer:', + 'toolCallContentCopied': 'Værktøjskald kopieret til udklipsholder', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Her er nogle anbefalede musikker:', 'playList': 'Afspilningsliste', @@ -897,6 +924,28 @@ const Map daDK = { "bicycling": "Cykling", "tsransit": "Offentlig transport", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Vælg navigationsapp', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigér med Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigér med Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigér med Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigér med Apple Maps', + 'builtInNavigation': 'Indbygget navigation', + 'useBuiltInNavigation': 'Navigér med indbygget kort', + 'navigationStartFailed': 'Kunne ikke starte navigation', + 'cannotPlayMusicListRetryLater': 'Kan ikke afspille musiklisten, prøv igen senere', + 'cannotPlaySong': 'Kan ikke afspille sangen', + 'openMapError': 'Fejl ved åbning af kort', + 'pleaseInstallAmapApp': 'Installér Amap-appen først', + 'pleaseInstallBaiduMapApp': 'Installér Baidu Maps-appen først', + 'appleMapStartFailed': 'Apple Maps kunne ikke starte', + 'appleMapUnavailable': 'Apple Maps er ikke tilgængeligt', + 'openAppleMapError': 'Fejl ved åbning af Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Vejrforespørgsel:', 'highest': 'Højeste', @@ -950,8 +999,8 @@ const Map daDK = { "strongWind": "Kraftig vind", // 翻译模块 - 中间层 - "pictureTranslation": "Picture Translation", - "textTranslation": "Text Translation", + "pictureTranslation": "Billedoversættelse", + "textTranslation": "Tekstoversættelse", // 翻译模块 - 主页 "translationHistory": "Oversættelseshistorik", @@ -964,18 +1013,28 @@ const Map daDK = { "me": "Me", "counterPart": "Counterpart", "bluetoothCallStateError": - "Please make sure the Bluetooth headset is connected to the phone and in a call state", + "Sørg venligst for, at Bluetooth-headsettet er forbundet til telefonen og i opkaldstilstand", "autoDetect": "Auto Detect", // 自动检测 // 翻译模块 - 文本翻译 - "languageDetectionFailed": "Language detection failed", - "translationFailed": "Translation failed", - "pleaseInputText": "Please input text", + "languageDetectionFailed": "Sprogregistrering mislykkedes", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Deaktivér flydende vindue', + 'enableFloatingWindow': 'Aktivér flydende vindue', + 'permissionTip': 'Tilladelsestip', + 'micPermissionRequiredForRecording': 'Mikrofontilladelse kræves til optagelse', + 'deleteTranslationRecordError': 'Fejl ved sletning af oversættelsespost: @error', + "translationFailed": "Oversættelse mislykkedes", + "translating": "Oversætter", + "translate": "Oversæt", + "pleaseInputText": "Indtast venligst tekst", + "inputTextToTranslate": "Indtast venligst teksten, der skal oversættes", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 "noTranslationHistory": "Ingen oversættelseshistorik", - "historyRecords": "History Records", + "historyRecords": "Historik", "clearResults": "Clear Results", "clearHistory": "Ryd historik", "clearHistoryConfirm": @@ -988,12 +1047,12 @@ const Map daDK = { // 翻译模块 - 图片翻译 "selectImageSource": "Select Image Source", "imagePreview": "Image Preview", - "translationResult": "Translation Result", + "translationResult": "Oversættelsesresultat", "recognitionResult": "Recognition Result", - "translatedImagePreview": "Translated Image Preview", - "translatedImageLoadFailed": "Failed to load translated image", - "pleaseSelectImage": "Please select an image", - "imageLoadFailed": "Image load failed", + "translatedImagePreview": "Forhåndsvisning af oversat billede", + "translatedImageLoadFailed": "Kunne ikke indlæse oversat billede", + "pleaseSelectImage": "Vælg venligst et billede", + "imageLoadFailed": "Billedindlæsning mislykkedes", "imageQuality": "Image Quality", "maxSize": "Max Size", "close": "Close", @@ -1002,38 +1061,38 @@ const Map daDK = { "setMaxSize": "Set Max Size", "currentMaxSize": "Current: @pxpx", "waitingForAction": "Waiting for action", - "pleaseSelectImageToStart": "Please select an image to start", + "pleaseSelectImageToStart": "Vælg venligst et billede for at starte", "chooseImage": "Choose Image", "openingCamera": "Opening camera...", "openingPhotoAlbum": "Opening photo album...", "cancelled": "Cancelled", "userCancelledSelection": "User cancelled selection", "translatingImage": "Translating Image", - "callingImageTranslateService": "Calling image translation service...", - "savingRecord": "Saving Record", - "savingTranslationResult": "Saving translation result...", - "translationCompleted": "Translation Completed", + "callingImageTranslateService": "Kalder billedoversættelsestjeneste...", + "savingRecord": "Gemmer optegnelse", + "savingTranslationResult": "Gemmer oversættelsesresultat...", + "translationCompleted": "Oversættelse fuldført", "allStepsCompleted": "All steps completed", - "processingFailed": "Processing Failed", + "processingFailed": "Behandling mislykkedes", "imageProcessingOrTranslationFailed": - "Image processing or translation failed. Please retry.\nError: {error}", + "Billedbehandling eller oversættelse mislykkedes. Prøv venligst igen.\nFejl: {error}", "imageTooLarge": "Image size exceeds 4MB limit", "imageTooLargeHint": "Image size exceeds 4MB. Reduce quality or dimensions and retry", - "emptyTranslationResult": "Image translation API returned empty result", + "emptyTranslationResult": "Billedoversættelses-API returnerede tomt resultat", "imageTranslationFailedTryLater": - "Image translation failed. Network issue or rate limit. Please try later", + "Billedoversættelse mislykkedes. Netværksproblem eller hastighedsbegrænsning. Prøv venligst igen senere", "imageTranslationApiException": - "Image translation API exception. Check network and retry", - "permissionRequired": "Permission Required", - "cameraPermissionRequired": "Camera permission required to take photos", + "Billedoversættelses-API undtagelse. Kontroller netværket og prøv igen", + "permissionRequired": "Tilladelse påkrævet", + "cameraPermissionRequired": "Kameratilladelse kræves for at tage billeder", "photoAlbumPermissionRequired": - "Photo album permission required to pick images", - "translationDetails": "Translation Details", + "Fotoalbumtilladelse kræves for at vælge billeder", + "translationDetails": "Oversættelsesdetaljer", "originalImage": "Original Image", "sourceLanguage": "Source Language", "targetLanguage": "Target Language", - "translationTime": "Translation Time", + "translationTime": "Oversættelsestid", "shareInDevelopment": "Sharing feature under development", // 翻译模块 - 录音文件 @@ -1391,6 +1450,49 @@ const Map daDK = { "removeEarbudsEnsureBattery": "Tag begge øretelefoner ud og sørg for at batteriet på begge er over 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Ny version @version fundet', + 'otaConfirmUpdateNow': 'Opdatér nu?', + 'otaUpdate': 'Opdatér', + 'otaUpgradeSuccess': 'Opgradering gennemført', + 'otaUpgradeCompleteRepair': 'Firmware-opgradering fuldført!\n\nEnheden skal parres igen. Gå til parringssiden?', + 'otaPairLater': 'Par senere', + 'otaPairNow': 'Par nu', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Fejl ved BLE-kontrol: @error', + 'otaBleNotConnected': 'BLE-enhed ikke forbundet', + 'otaBleNeedConnection': 'Firmware-opgradering kræver BLE-forbindelse\nSørg for at enheden er forbundet og prøv igen', + 'otaDeviceInfoUnavailableTitle': 'Enhedsinfo utilgængelig', + 'otaCannotGetDeviceInfo': 'Kan ikke hente enhedsinfo\nTilslut enheden igen eller prøv senere', + 'otaBleCheckFailed': 'BLE-kontrol mislykkedes', + 'otaCannotGetDeviceInfoCheckConnection': 'Kan ikke hente enhedsinfo, kontrollér forbindelsen', + 'otaCannotGetProductInfoWithName': 'Kan ikke hente produktinfo, enhedsnavn: @deviceName', + 'otaCannotGetBatteryInfo': 'Kan ikke hente batteriinfo', + 'otaLowBattery': 'Lavt batteri', + 'otaSingleBatteryLow': 'Batteriniveau for lavt til opgradering\nKrav: batteri over 20%\nNuværende: @ear @battery%\nOplad og prøv igen', + 'otaDoubleBatteryLow': 'Batteriniveau for lavt til opgradering\nKrav: begge ørepropper over 20%\nNuværende: Venstre @left%, Højre @right%\nOplad og prøv igen', + 'otaBatteryCheckFailed': 'Batterikontrol mislykkedes', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': 'Opdateringen indeholder ydelsesforbedringer og fejlrettelser.', + 'otaGetLatestVersionFailed': 'Kunne ikke hente seneste version', + 'otaGetVersionInfoFailed': 'Kunne ikke hente versionsinfo', + 'otaCheckingDeviceStatus': 'Kontrollerer enhedsstatus...', + 'otaDownloadFailedCheckNetwork': 'Download mislykkedes, kontrollér netværksforbindelsen', + 'otaDownloadFailed': 'Download mislykkedes', + 'otaPreparingConnection': 'Forbereder enhedsforbindelse...', + 'otaConnectingDevice': 'Forbinder til enhed...', + 'otaUpgradeStarted': 'OTA-opgradering startet...', + 'otaUpgradeProgressWithPercent': 'Opgraderingsforløb: @percent%', + 'otaUpgradeSuccessComplete': 'Opgradering gennemført', + 'otaUpgradeFailedWithCode': 'Opgradering mislykkedes, fejlkode: @code', + 'otaUpgradeFailedTitle': 'Opgradering mislykkedes', + 'otaUpgradeFailedDesc': 'Kontrollér forbindelse eller opdateringspakke, fejlkode: @code', + 'otaDeviceDisconnected': 'Enhed frakoblet', + 'otaDeviceConnected': 'Enhed forbundet', + // 音乐模块 "noMusic": "Ingen musik", // 暂无音乐 "noPlayingMusic": "Ingen musik afspilles", // 暂无播放音乐 diff --git a/lib/core/translations/language/de_de.dart b/lib/core/translations/language/de_de.dart index dfc0e753c..36c2c84bf 100644 --- a/lib/core/translations/language/de_de.dart +++ b/lib/core/translations/language/de_de.dart @@ -1,5 +1,4 @@ const Map deDE = { - // 通用 'continue': 'Fortfahren', 'confirm': 'Bestätigen', @@ -19,11 +18,11 @@ const Map deDE = { "unknownError": "Unbekannter Fehler", "asrConnectionFailed": "Verbindung zum Spracherkennungsdienst fehlgeschlagen. Bitte Netzwerk prüfen oder es später erneut versuchen.", - "justNow": "Just now", - "minutesAgo": "@minutes minutes ago", - "yesterday": "Yesterday", - "daysAgo": "@days days ago", - "hoursAgo": "@hours hours ago", + "justNow": "Gerade eben", + "minutesAgo": "vor @minutes Minuten", + "yesterday": "Gestern", + "daysAgo": "vor @days Tagen", + "hoursAgo": "vor @hours Stunden", // 启动页 "slogan": "Die Welt verbinden, jenseits der Stimme", @@ -170,6 +169,30 @@ const Map deDE = { 'right': 'Rechts', 'checkConnectionStatusFailed': 'Verbindungsstatus-Überprüfung fehlgeschlagen', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth-Initialisierung fehlgeschlagen: @error', + 'needBluetoothAndLocationPermission': + 'Bluetooth- und Standortberechtigungen werden zum Scannen benoetigt', + 'permissionRequestFailedWithError': + 'Berechtigungsanfrage fehlgeschlagen: @error', + 'needPermission': 'Berechtigung erforderlich', + 'blePermissionDialogContent': + 'Die App benoetigt Bluetooth- und Standortberechtigungen zum Scannen von Geraeten. Bitte aktivieren Sie diese in den Einstellungen.', + 'needEnableBluetooth': 'Bluetooth aktivieren', + 'enableBluetoothDialogContent': + 'Bitte aktivieren Sie Bluetooth zum Scannen und Verbinden von Geraeten.', + 'bleScanFailedWithError': 'Scan fehlgeschlagen: @error', + 'bleConnectionSuccess': 'Verbindung erfolgreich', + 'bleConnectedToDevice': 'Verbunden mit @device', + 'bleConnectionFailedWithError': 'Verbindung fehlgeschlagen: @error', + 'bleDisconnected': 'Getrennt', + 'bleDeviceDisconnected': 'Geraet getrennt', + 'bleDisconnectFailedWithError': 'Trennung fehlgeschlagen: @error', + 'signalStrong': 'Stark', + 'signalMedium': 'Mittel', + 'signalWeak': 'Schwach', + 'signalVeryWeak': 'Sehr schwach', + // 发现页 "searchAi": "KI-Funktionen suchen...", "exploreSlogan": "Intelligente Kopfhörer, unendliche Möglichkeiten", @@ -246,66 +269,72 @@ const Map deDE = { 'totalQuota': 'Gesamtkontingent', 'remaining': 'Verbleibend', 'featureDescription': 'Funktionsbeschreibung', - 'paymentSuccess': 'Zahlung erfolgreich', - 'paymentFailed': 'Zahlung fehlgeschlagen', - 'gotIt': 'Verstanden', - 'paymentFailedTryAgain': 'Zahlung fehlgeschlagen. Bitte versuchen Sie es erneut.', - 'selectPaymentMethod': 'Zahlungsmethode auswählen', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'WeChat-Bestellung konnte nicht erstellt werden', - 'alipayOrderCreateFailed': 'Alipay-Bestellung konnte nicht erstellt werden', - 'appleOrderCreateFailed': 'Apple-Bestellung konnte nicht erstellt werden', - 'googleOrderCreateFailed': 'Google-Bestellung konnte nicht erstellt werden', - 'paypalOrderCreateFailed': 'PayPal-Bestellung konnte nicht erstellt werden', - 'paymentException': 'Zahlungsausnahme', - 'paymentLaunchFailed': 'Zahlungsstart fehlgeschlagen', - 'paymentExceptionWithError': 'Zahlungsausnahme: @error', - 'paymentProcessingCheckLater': 'Ihre Bestellung wird bearbeitet. Bitte überprüfen Sie es später.', - 'paymentResultQueryException': 'Abfrage des Zahlungsergebnisses fehlgeschlagen: @error', - 'orderConfirmedQuotaRefreshed': 'Bestellung bestätigt. Ihr Kontingent wurde aktualisiert.', - 'paymentCompletedConfirming': 'Zahlung abgeschlossen. Bestätigung läuft…', - 'paymentCancelled': 'Zahlung abgebrochen', - 'paypalOpenedCompleteInBrowser': 'PayPal geöffnet. Bitte schließen Sie die Zahlung in Ihrem Browser ab.', - 'paypalOpenFailed': 'PayPal-Zahlungsseite konnte nicht geöffnet werden', - 'paymentTestTitle': 'Zahlungstest', - 'paymentTestOrderInfo': 'Testbestellungsinformationen', - 'paymentTestProductId': 'Produkt-ID', - 'paymentTestProductDescription': 'Produktbeschreibung', - 'paymentTestWechatDescription': 'WeChat Pay-Zahlungstest', - 'paymentTestAlipayDescription': 'Alipay-Zahlungstest', - 'paymentTestAmount': 'Betrag', - 'paymentTestSelectAmount': 'Testbetrag auswählen', - 'paying': 'Zahlung wird durchgeführt...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Zahlungsstatus', - 'errorInfoWithMessage': 'Fehler: @message', - 'retest': 'Erneut testen', - 'paymentTestInstructionsTitle': 'Anleitung', - 'paymentTestInstructionsContent': '1. Wählen Sie einen Testbetrag (empfohlen: ¥0,01)\n2. Klicken Sie auf die Zahlungsschaltfläche, um zu starten\n3. Schließen Sie die Zahlung in der Zahlungs-App ab\n4. Kehren Sie zurück, um das Ergebnis zu überprüfen', - 'startingWechatPayment': 'WeChat Pay wird gestartet...', - 'startingAlipayPayment': 'Alipay wird gestartet...', - 'wechatPaymentSuccess': 'WeChat Pay-Zahlung erfolgreich!', - 'wechatPaymentFailed': 'WeChat Pay-Zahlung fehlgeschlagen', - 'wechatPaymentLaunchFailed': 'WeChat Pay konnte nicht gestartet werden', - 'cannotLaunchWechatPayment': 'WeChat Pay kann nicht gestartet werden', - 'wechatPaymentException': 'WeChat Pay-Ausnahme', - 'wechatPaymentTestCompleted': 'WeChat Pay-Zahlungstest abgeschlossen', - 'alipayPaymentSuccess': 'Alipay-Zahlung erfolgreich!', - 'alipayPaymentFailed': 'Alipay-Zahlung fehlgeschlagen', - 'alipayPaymentLaunchFailed': 'Alipay konnte nicht gestartet werden', - 'cannotLaunchAlipayPayment': 'Alipay kann nicht gestartet werden', - 'alipayPaymentException': 'Alipay-Ausnahme', - "insufficientIntegral": "Insufficient integral", + 'paymentSuccess': 'Zahlung erfolgreich', + 'paymentFailed': 'Zahlung fehlgeschlagen', + 'gotIt': 'Verstanden', + 'paymentFailedTryAgain': + 'Zahlung fehlgeschlagen. Bitte versuchen Sie es erneut.', + 'selectPaymentMethod': 'Zahlungsmethode auswählen', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'WeChat-Bestellung konnte nicht erstellt werden', + 'alipayOrderCreateFailed': 'Alipay-Bestellung konnte nicht erstellt werden', + 'appleOrderCreateFailed': 'Apple-Bestellung konnte nicht erstellt werden', + 'googleOrderCreateFailed': 'Google-Bestellung konnte nicht erstellt werden', + 'paypalOrderCreateFailed': 'PayPal-Bestellung konnte nicht erstellt werden', + 'paymentException': 'Zahlungsausnahme', + 'paymentLaunchFailed': 'Zahlungsstart fehlgeschlagen', + 'paymentExceptionWithError': 'Zahlungsausnahme: @error', + 'paymentProcessingCheckLater': + 'Ihre Bestellung wird bearbeitet. Bitte überprüfen Sie es später.', + 'paymentResultQueryException': + 'Abfrage des Zahlungsergebnisses fehlgeschlagen: @error', + 'orderConfirmedQuotaRefreshed': + 'Bestellung bestätigt. Ihr Kontingent wurde aktualisiert.', + 'paymentCompletedConfirming': 'Zahlung abgeschlossen. Bestätigung läuft…', + 'paymentCancelled': 'Zahlung abgebrochen', + 'paypalOpenedCompleteInBrowser': + 'PayPal geöffnet. Bitte schließen Sie die Zahlung in Ihrem Browser ab.', + 'paypalOpenFailed': 'PayPal-Zahlungsseite konnte nicht geöffnet werden', + 'paymentTestTitle': 'Zahlungstest', + 'paymentTestOrderInfo': 'Testbestellungsinformationen', + 'paymentTestProductId': 'Produkt-ID', + 'paymentTestProductDescription': 'Produktbeschreibung', + 'paymentTestWechatDescription': 'WeChat Pay-Zahlungstest', + 'paymentTestAlipayDescription': 'Alipay-Zahlungstest', + 'paymentTestAmount': 'Betrag', + 'paymentTestSelectAmount': 'Testbetrag auswählen', + 'paying': 'Zahlung wird durchgeführt...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Zahlungsstatus', + 'errorInfoWithMessage': 'Fehler: @message', + 'retest': 'Erneut testen', + 'paymentTestInstructionsTitle': 'Anleitung', + 'paymentTestInstructionsContent': + '1. Wählen Sie einen Testbetrag (empfohlen: ¥0,01)\n2. Klicken Sie auf die Zahlungsschaltfläche, um zu starten\n3. Schließen Sie die Zahlung in der Zahlungs-App ab\n4. Kehren Sie zurück, um das Ergebnis zu überprüfen', + 'startingWechatPayment': 'WeChat Pay wird gestartet...', + 'startingAlipayPayment': 'Alipay wird gestartet...', + 'wechatPaymentSuccess': 'WeChat Pay-Zahlung erfolgreich!', + 'wechatPaymentFailed': 'WeChat Pay-Zahlung fehlgeschlagen', + 'wechatPaymentLaunchFailed': 'WeChat Pay konnte nicht gestartet werden', + 'cannotLaunchWechatPayment': 'WeChat Pay kann nicht gestartet werden', + 'wechatPaymentException': 'WeChat Pay-Ausnahme', + 'wechatPaymentTestCompleted': 'WeChat Pay-Zahlungstest abgeschlossen', + 'alipayPaymentSuccess': 'Alipay-Zahlung erfolgreich!', + 'alipayPaymentFailed': 'Alipay-Zahlung fehlgeschlagen', + 'alipayPaymentLaunchFailed': 'Alipay konnte nicht gestartet werden', + 'cannotLaunchAlipayPayment': 'Alipay kann nicht gestartet werden', + 'alipayPaymentException': 'Alipay-Ausnahme', + "insufficientIntegral": "Nicht genügend Punkte", "insufficientBalanceDesc": - 'Insufficient balance, please go to the corresponding recharge page to recharge.', - "recharge": 'Go to Recharge', + 'Unzureichendes Guthaben, bitte gehen Sie zur entsprechenden Aufladeseite, um aufzuladen.', + "recharge": 'Aufladen', "aiMemberExpiredDesc": - 'AI membership expired, please go to the membership recharge page to renew.', + 'Die KI-Mitgliedschaft ist abgelaufen, bitte gehen Sie zur Mitgliedschafts-Aufladeseite, um zu verlängern.', // 商品模块 - AI商品页 'musicAndRecommendation': 'Musik & Empfehlung', @@ -314,26 +343,28 @@ const Map deDE = { 'newsInformation': 'Nachrichten', 'communicationAssistant': 'Kommunikationsassistent', 'aiHeaderDesc1': - 'Longer conversation quota, more tool calls, extended context length.', + 'Längeres Gesprächskontingent, mehr Tool-Aufrufe, längerer Kontext.', 'aiHeaderDesc2': - 'Suitable for agent Q&A, summarization, analysis, and task execution.', - 'musicSearchPlaybackControl': 'Music library search and playback control', + 'Geeignet für Agent-Q&A, Zusammenfassungen, Analysen und Aufgaben.', + 'musicSearchPlaybackControl': + 'Musikbibliothek durchsuchen und Wiedergabe steuern', 'smartPlaylistAndSimilarRecommendations': - 'Smart playlist and similar song recommendations', - 'routePlanningAndCongestionAvoidance': - 'Route planning and congestion avoidance', - 'voiceBroadcastAndWaypoints': 'Voice broadcast and waypoint settings', - 'realTimeWeatherForecast': 'Real-time weather and forecast', - 'clothingAdviceAndTravelReminders': 'Clothing advice and travel reminders', - 'poiSearchFoodGasParking': 'POI search: dining / gas / parking', - 'ratingsHoursAndDirectRoutes': 'Ratings, business hours, and direct routing', - 'hotNewsAndTopicOverview': 'Hot news and topic overview', - 'longArticleSummariesAndKeyPoints': 'Long-article summaries and key points', - 'helpCallAndSMS': 'Help with calls and SMS', + 'Smarte Playlists und Empfehlungen ähnlicher Songs', + 'routePlanningAndCongestionAvoidance': 'Routenplanung und Stauvermeidung', + 'voiceBroadcastAndWaypoints': 'Sprachansagen und Zwischenziele', + 'realTimeWeatherForecast': 'Echtzeit-Wetter und Vorhersage', + 'clothingAdviceAndTravelReminders': 'Kleidungstipps und Reisehinweise', + 'poiSearchFoodGasParking': 'POI-Suche: Essen / Tanken / Parken', + 'ratingsHoursAndDirectRoutes': + 'Bewertungen, Öffnungszeiten und direkte Routen', + 'hotNewsAndTopicOverview': 'Top-Nachrichten und Themenübersicht', + 'longArticleSummariesAndKeyPoints': + 'Zusammenfassungen langer Artikel und Kernpunkte', + 'helpCallAndSMS': 'Hilfe bei Anrufen und SMS', 'templatedMessagesAndScheduleReminders': - 'Template messages and schedule reminders', + 'Vorlagen-Nachrichten und Termin-Erinnerungen', 'aiDisclaimer': - 'Features depend on device permissions, service availability, and network conditions.', + 'Funktionen hängen von Geräteberechtigungen, Dienstverfügbarkeit und Netzwerkbedingungen ab.', // 商品模块 - 翻译商品页 'realtimeTranscription': 'Echtzeit-Transkription', @@ -363,16 +394,16 @@ const Map deDE = { 'Audio recording, transcription, keyword search, and auto summary.', 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', - 'meetingAutoRecording': 'Auto recording and segmentation', - 'meetingSpeakerTagging': 'Speaker labeling', - 'meetingLongAudioTranscription': 'Long audio transcription', - 'meetingKeyPointSummary': 'Key point extraction', - 'meetingTopicNameSearch': 'Search by topic/name', - 'meetingTimelineJump': 'Timeline jump', - 'meetingExportSummary': 'Export minutes', - 'meetingMultiPlatformShare': 'Share across platforms', + 'meetingAutoRecording': 'Automatische Aufnahme und Segmentierung', + 'meetingSpeakerTagging': 'Sprecherkennzeichnung', + 'meetingLongAudioTranscription': 'Transkription langer Audios', + 'meetingKeyPointSummary': 'Kernpunkte extrahieren', + 'meetingTopicNameSearch': 'Suche nach Thema/Name', + 'meetingTimelineJump': 'Sprung in der Timeline', + 'meetingExportSummary': 'Protokoll exportieren', + 'meetingMultiPlatformShare': 'Plattformübergreifend teilen', 'meetingDisclaimer': - 'Use in quiet environments; performance depends on microphone and network.', + 'In ruhiger Umgebung verwenden; Leistung hängt von Mikrofon und Netzwerk ab.', // 商品模块 - VIP会员页 'benefitsOverview': 'Übersicht der Vorteile', @@ -548,21 +579,22 @@ const Map deDE = { 'selectSummaryTemplate': 'Zusammenfassungsvorlage auswählen', 'useThisTemplate': 'Diese Vorlage verwenden', 'lastUsed': 'Zuletzt verwendet', - 'create': 'Erstellen', - 'templateDetails': 'Vorlagendetails', - 'tag': 'Schlagwort', - 'description': 'Beschreibung', - 'template': 'Vorlage', - 'deleteTemplate': 'Vorlage löschen', - 'deleteTemplateConfirm': 'Möchten Sie diese Vorlage wirklich löschen?', - 'editTemplate': 'Vorlage bearbeiten', - 'createTemplate': 'Vorlage erstellen', - 'name': 'Name', - 'templateContentHint': 'Bitte geben Sie den Vorlageninhalt ein! Tipp: Klicken Sie oben auf die KI-Schaltfläche, um schnell Vorlageninhalt basierend auf dem eingegebenen Namen und der Beschreibung zu generieren', - 'inputNameHint': 'Bitte Namen eingeben', - 'inputDescHint': 'Bitte Beschreibung eingeben', - 'custom': 'Benutzerdefiniert', - 'pleaseEnter': 'Bitte eingeben', + 'create': 'Erstellen', + 'templateDetails': 'Vorlagendetails', + 'tag': 'Schlagwort', + 'description': 'Beschreibung', + 'template': 'Vorlage', + 'deleteTemplate': 'Vorlage löschen', + 'deleteTemplateConfirm': 'Möchten Sie diese Vorlage wirklich löschen?', + 'editTemplate': 'Vorlage bearbeiten', + 'createTemplate': 'Vorlage erstellen', + 'name': 'Name', + 'templateContentHint': + 'Bitte geben Sie den Vorlageninhalt ein! Tipp: Klicken Sie oben auf die KI-Schaltfläche, um schnell Vorlageninhalt basierend auf dem eingegebenen Namen und der Beschreibung zu generieren', + 'inputNameHint': 'Bitte Namen eingeben', + 'inputDescHint': 'Bitte Beschreibung eingeben', + 'custom': 'Benutzerdefiniert', + 'pleaseEnter': 'Bitte eingeben', 'viewAll': 'Alle anzeigen', 'recordingLanguage': 'Aufnahmesprache', 'chineseSimplified': 'Chinesisch (Vereinfacht)', @@ -586,7 +618,7 @@ const Map deDE = { 'Dateiverarbeitung fehlgeschlagen: {filePath}, Fehler: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Mindmap speichern', + 'saveMindMap': 'Mindmap speichern', 'shareMindMap': 'Mindmap teilen', 'shareSuccess': 'Teilen erfolgreich', @@ -608,7 +640,7 @@ const Map deDE = { 'exportSummary': 'Zusammenfassung exportieren', 'exportAs': 'Exportieren als', 'exportingPDF': 'Exportiere PDF...', - 'export': 'Exportieren', + 'export': 'Exportieren', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Auf alle Absätze dieses Sprechers anwenden', @@ -720,18 +752,21 @@ const Map deDE = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unbekannte Sprache', - 'analysisFailed': 'Analyse fehlgeschlagen, bitte versuchen Sie es später erneut', - 'transcriptionFailed': 'Transkription fehlgeschlagen, bitte versuchen Sie es später erneut', - 'summaryFailed': 'Zusammenfassung fehlgeschlagen, bitte versuchen Sie es später erneut', - 'summaryFailedShort': 'Zusammenfassung fehlgeschlagen', - 'transcriptionFailedShort': 'Transkription fehlgeschlagen', + 'analysisFailed': + 'Analyse fehlgeschlagen, bitte versuchen Sie es später erneut', + 'transcriptionFailed': + 'Transkription fehlgeschlagen, bitte versuchen Sie es später erneut', + 'summaryFailed': + 'Zusammenfassung fehlgeschlagen, bitte versuchen Sie es später erneut', + 'summaryFailedShort': 'Zusammenfassung fehlgeschlagen', + 'transcriptionFailedShort': 'Transkription fehlgeschlagen', // Meeting模块 - 播放器 - 'playerNotReady': 'Audioplayer ist nicht bereit, bitte warten', - 'playFailed': 'Wiedergabe fehlgeschlagen', - 'audioFileNotFound': 'Audiodatei nicht gefunden', - 'fetchingAudio': 'Audio wird aus der Cloud abgerufen...', - 'playerLoadFailed': 'Audioplayer konnte nicht geladen werden', + 'playerNotReady': 'Audioplayer ist nicht bereit, bitte warten', + 'playFailed': 'Wiedergabe fehlgeschlagen', + 'audioFileNotFound': 'Audiodatei nicht gefunden', + 'fetchingAudio': 'Audio wird aus der Cloud abgerufen...', + 'playerLoadFailed': 'Audioplayer konnte nicht geladen werden', // 设置页 "systemSettings": "Systemeinstellungen", @@ -743,7 +778,7 @@ const Map deDE = { "memberService": "Member Service", "bindRewardTitle": "Rewards", "bindRewardSimpleDesc": - "First bind device reward has been issued. Tap OK to close.", + "Die Prämie für die erste Gerätebindung wurde ausgegeben. Tippen Sie auf OK, um zu schließen.", "joinDevice": "Verbundenes Gerät:", "accountId": "Konto-ID:", "systemSetting": "Systemeinstellungen", @@ -839,7 +874,8 @@ const Map deDE = { "swipeUpForMore": "Nach oben wischen für mehr", "callingTool": "Ich helfe Ihnen, bitte warten!", // 正在帮您,请稍等! "voice_interrupt": "Unterbrechen", // 语音打断 - 'voice_interrupt_tip': 'Wenn aktiviert: Die KI wird nicht durch Ihre Stimme unterbrochen, während sie spricht, und kann nur eine Gesprächsrunde gleichzeitig bearbeiten. Um eine neue Runde zu starten, sagen Sie einfach das Aktivierungswort.', + 'voice_interrupt_tip': + 'Wenn aktiviert: Die KI wird nicht durch Ihre Stimme unterbrochen, während sie spricht, und kann nur eine Gesprächsrunde gleichzeitig bearbeiten. Um eine neue Runde zu starten, sagen Sie einfach das Aktivierungswort.', // Agent模块 - 预设提示词 "presetMusic": "Musik abspielen", // 来点音乐 @@ -897,6 +933,13 @@ const Map deDE = { 'Wir möchten den Grund für Ihre Meldung wissen, Sie können das Problem beschreiben, das Sie erlebt haben.', 'generatedByAi': 'Von KI generiert', + // Agent模块 - 工具调用 + 'toolCall': 'Werkzeugaufruf', + 'noResult': 'Kein Ergebnis', + 'noToolCallContentToCopy': 'Kein Werkzeugaufruf-Inhalt zum Kopieren', + 'toolCallDetails': 'Werkzeugaufruf-Details:', + 'toolCallContentCopied': 'Werkzeugaufruf-Inhalt in Zwischenablage kopiert', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Hier sind einige empfohlene Musik:', 'playList': 'Wiedergabeliste', @@ -917,6 +960,30 @@ const Map deDE = { "bicycling": "Radfahren", "tsransit": "ÖPNV", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Navigations-App waehlen', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Mit Amap navigieren', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Mit Baidu Maps navigieren', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Mit Google Maps navigieren', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Mit Apple Maps navigieren', + 'builtInNavigation': 'Integrierte Navigation', + 'useBuiltInNavigation': 'Mit integrierter Karte navigieren', + 'navigationStartFailed': 'Navigation konnte nicht gestartet werden', + 'cannotPlayMusicListRetryLater': + 'Musikliste kann nicht abgespielt werden, bitte spaeter erneut versuchen', + 'cannotPlaySong': 'Lied kann nicht abgespielt werden', + 'openMapError': 'Fehler beim Oeffnen der Karte', + 'pleaseInstallAmapApp': 'Bitte installieren Sie zuerst die Amap-App', + 'pleaseInstallBaiduMapApp': + 'Bitte installieren Sie zuerst die Baidu Maps-App', + 'appleMapStartFailed': 'Apple Maps konnte nicht gestartet werden', + 'appleMapUnavailable': 'Apple Maps nicht verfuegbar', + 'openAppleMapError': 'Fehler beim Oeffnen von Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Wetterabfrage:', 'highest': 'Höchste', @@ -989,8 +1056,20 @@ const Map deDE = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Spracherkennung fehlgeschlagen", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Schwebendes Fenster deaktivieren', + 'enableFloatingWindow': 'Schwebendes Fenster aktivieren', + 'permissionTip': 'Berechtigungshinweis', + 'micPermissionRequiredForRecording': + 'Mikrofonberechtigung fuer Aufnahme erforderlich', + 'deleteTranslationRecordError': + 'Fehler beim Loeschen des Uebersetzungsdatensatzes: @error', "translationFailed": "Übersetzung fehlgeschlagen", + "translating": "Wird uebersetzt", + "translate": "Uebersetzen", "pleaseInputText": "Bitte Text eingeben", + "inputTextToTranslate": "Bitte geben Sie den zu übersetzenden Text ein", "textTooLong": "Text zu lang, max. 5000 Zeichen", // 翻译模块 - 历史记录 @@ -1365,17 +1444,18 @@ const Map deDE = { 'bleConnectionFailed': 'BLE-Verbindung fehlgeschlagen', 'deviceAuthorizationFailedCheckCode': 'Geräteautorisierung fehlgeschlagen, bitte überprüfen Sie den Autorisierungscode', - 'bluetoothGuideTitle': 'Manual Bluetooth Activation Required', // 需要手动开启蓝牙 - 'bluetoothGuideSteps': 'Please follow these steps:', // 请按照以下步骤操作: + 'bluetoothGuideTitle': + 'Manuelle Bluetooth-Aktivierung erforderlich', // 需要手动开启蓝牙 + 'bluetoothGuideSteps': 'Bitte folgen Sie diesen Schritten:', // 请按照以下步骤操作: 'bluetoothGuideStep1': - 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 + 'Bluetooth aktivieren: Einstellungen → Bluetooth → Einschalten', // 开启蓝牙:设置 → 蓝牙 → 开启 'bluetoothGuideStep2': - 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 + 'Gerät verbinden: Finden Sie Ihr Gerät unter „Meine Geräte“ und tippen Sie zum Verbinden', // 连接设备:在"我的设备"中找到您的设备并点击连接 'bluetoothGuideStep3': - 'Return to app to continue pairing process', // 返回应用继续配对流程 + 'Zur App zurückkehren, um den Kopplungsvorgang fortzusetzen', // 返回应用继续配对流程 'bluetoothGuideTip': - 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 - 'iKnow': 'I Know', // 我知道了 + 'Tipp: Sie können das Bluetooth-Symbol im Kontrollzentrum auch lange drücken, um schnell zu den Bluetooth-Einstellungen zu gelangen', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 + 'iKnow': 'Verstanden', // 我知道了 // 配对模块 - 绑定奖励 "firstBindRewardTitle": "Willkommensbonus", @@ -1416,13 +1496,14 @@ const Map deDE = { "connectionFailed": "Verbindung fehlgeschlagen", "retryConnection": "Verbindung wiederholen", "ota_updateNow": "Jetzt aktualisieren", - "otaVersionInfoFailed": "Failed to get version info. Please try again later.", + "otaVersionInfoFailed": + "Versioninformationen konnten nicht abgerufen werden. Bitte versuchen Sie es später erneut.", "otaDeviceInfoUnavailable": - "Unable to get device info. Please check the connection and retry.", + "Geräteinformationen konnten nicht abgerufen werden. Bitte prüfen Sie die Verbindung und versuchen Sie es erneut.", "otaProductInfoUnavailable": - "Unable to identify the device. Please reconnect and retry.", + "Das Gerät konnte nicht erkannt werden. Bitte verbinden Sie es erneut und versuchen Sie es erneut.", "otaFirmwareVersionInvalid": - "Firmware version is abnormal. Please reconnect and retry.", + "Die Firmware-Version ist ungültig. Bitte verbinden Sie das Gerät erneut und versuchen Sie es erneut.", "keepConnectedDontClose": "Bitte halten Sie das Gerät verbunden, schließen Sie die App nicht", "doNotDisconnect": "Nicht trennen", @@ -1431,6 +1512,61 @@ const Map deDE = { "removeEarbudsEnsureBattery": "Entfernen Sie beide Ohrhörer und stellen Sie sicher, dass der Batteriestand über 20% liegt", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Neue Version @version gefunden', + 'otaConfirmUpdateNow': 'Jetzt aktualisieren?', + 'otaUpdate': 'Aktualisieren', + 'otaUpgradeSuccess': 'Upgrade erfolgreich', + 'otaUpgradeCompleteRepair': + 'Firmware-Upgrade abgeschlossen!\n\nDas Geraet muss neu gekoppelt werden. Zur Kopplungsseite wechseln?', + 'otaPairLater': 'Spaeter koppeln', + 'otaPairNow': 'Jetzt koppeln', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Fehler bei der BLE-Verbindungspruefung: @error', + 'otaBleNotConnected': 'BLE-Geraet nicht verbunden', + 'otaBleNeedConnection': + 'Firmware-Upgrade erfordert BLE-Verbindung\nBitte Geraet verbinden und erneut versuchen', + 'otaDeviceInfoUnavailableTitle': 'Geraeteinformationen nicht verfuegbar', + 'otaCannotGetDeviceInfo': + 'Geräteinformationen konnten nicht abgerufen werden\nBitte verbinden Sie das Gerät erneut oder versuchen Sie es später erneut', + 'otaBleCheckFailed': 'BLE-Verbindungspruefung fehlgeschlagen', + 'otaCannotGetDeviceInfoCheckConnection': + 'Geraeteinformationen nicht verfuegbar, bitte Verbindung pruefen', + 'otaCannotGetProductInfoWithName': + 'Produktinformationen nicht verfuegbar, Geraetename: @deviceName', + 'otaCannotGetBatteryInfo': 'Keine gueltigen Batterieinformationen verfuegbar', + 'otaLowBattery': 'Niedriger Akkustand', + 'otaSingleBatteryLow': + 'Akku zu schwach fuer Firmware-Upgrade\nAnforderung: Akku ueber 20%\nAktuell: @ear @battery%\nBitte laden und erneut versuchen', + 'otaDoubleBatteryLow': + 'Akku zu schwach fuer Firmware-Upgrade\nAnforderung: Beide Ohrhoerer ueber 20%\nAktuell: Links @left%, Rechts @right%\nBitte laden und erneut versuchen', + 'otaBatteryCheckFailed': 'Batteriepruefung fehlgeschlagen', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'Dieses Update enthaelt Leistungsoptimierungen und Fehlerbehebungen.', + 'otaGetLatestVersionFailed': + 'Neueste Versionsinformationen konnten nicht abgerufen werden', + 'otaGetVersionInfoFailed': + 'Versionsinformationen konnten nicht abgerufen werden', + 'otaCheckingDeviceStatus': 'Geraetestatus wird geprueft...', + 'otaDownloadFailedCheckNetwork': + 'Download fehlgeschlagen, bitte Netzwerkverbindung pruefen', + 'otaDownloadFailed': 'Download fehlgeschlagen', + 'otaPreparingConnection': 'Geraeteverbindung wird vorbereitet...', + 'otaConnectingDevice': 'Verbindung zum Geraet wird hergestellt...', + 'otaUpgradeStarted': 'OTA-Upgrade gestartet...', + 'otaUpgradeProgressWithPercent': 'Upgrade-Fortschritt: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade erfolgreich abgeschlossen', + 'otaUpgradeFailedWithCode': 'Upgrade fehlgeschlagen, Fehlercode: @code', + 'otaUpgradeFailedTitle': 'Upgrade fehlgeschlagen', + 'otaUpgradeFailedDesc': + 'Bitte Geraeteverbindung oder Update-Paket pruefen, Fehlercode: @code', + 'otaDeviceDisconnected': 'Geraet getrennt', + 'otaDeviceConnected': 'Geraet verbunden', + // 音乐模块 "noMusic": "Keine Musik", // 暂无音乐 "noPlayingMusic": "Keine Musik wird abgespielt", // 暂无播放音乐 diff --git a/lib/core/translations/language/el_gr.dart b/lib/core/translations/language/el_gr.dart index f329bd823..6df5ac37f 100644 --- a/lib/core/translations/language/el_gr.dart +++ b/lib/core/translations/language/el_gr.dart @@ -1,5 +1,4 @@ const Map elGR = { - // 通用 'continue': 'Συνέχεια', 'confirm': 'Επιβεβαίωση', @@ -19,11 +18,11 @@ const Map elGR = { "unknownError": "Άγνωστο σφάλμα", "asrConnectionFailed": "Η σύνδεση με την υπηρεσία αναγνώρισης ομιλίας απέτυχε. Ελέγξτε το δίκτυο ή δοκιμάστε ξανά αργότερα.", - "justNow": "Just now", - "minutesAgo": "@minutes minutes ago", - "yesterday": "Yesterday", - "daysAgo": "@days days ago", - "hoursAgo": "@hours hours ago", + "justNow": "Μόλις τώρα", + "minutesAgo": "Πριν @minutes λεπτά", + "yesterday": "Χθες", + "daysAgo": "Πριν @days ημέρες", + "hoursAgo": "Πριν @hours ώρες", // 启动页 "slogan": "Συνδέοντας τον κόσμο, πέρα από τον ήχο", @@ -168,6 +167,29 @@ const Map elGR = { 'right': 'Δεξιά', 'checkConnectionStatusFailed': 'Αποτυχία ελέγχου κατάστασης σύνδεσης', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Αποτυχία αρχικοποίησης Bluetooth: @error', + 'needBluetoothAndLocationPermission': + 'Απαιτούνται δικαιώματα Bluetooth και τοποθεσίας για σάρωση συσκευών', + 'permissionRequestFailedWithError': 'Αποτυχία αιτήματος δικαιώματος: @error', + 'needPermission': 'Απαιτείται δικαίωμα', + 'blePermissionDialogContent': + 'Αυτή η εφαρμογή χρειάζεται δικαιώματα Bluetooth και τοποθεσίας για σάρωση συσκευών. Ενεργοποιήστε τα στις Ρυθμίσεις.', + 'needEnableBluetooth': 'Ενεργοποίηση Bluetooth', + 'enableBluetoothDialogContent': + 'Ενεργοποιήστε το Bluetooth για σάρωση και σύνδεση συσκευών.', + 'bleScanFailedWithError': 'Αποτυχία σάρωσης: @error', + 'bleConnectionSuccess': 'Επιτυχής σύνδεση', + 'bleConnectedToDevice': 'Συνδέθηκε με @device', + 'bleConnectionFailedWithError': 'Αποτυχία σύνδεσης: @error', + 'bleDisconnected': 'Αποσυνδέθηκε', + 'bleDeviceDisconnected': 'Η συσκευή αποσυνδέθηκε', + 'bleDisconnectFailedWithError': 'Αποτυχία αποσύνδεσης: @error', + 'signalStrong': 'Δυνατό', + 'signalMedium': 'Μέτριο', + 'signalWeak': 'Αδύναμο', + 'signalVeryWeak': 'Πολύ αδύναμο', + // 发现页 "searchAi": "Αναζήτηση λειτουργιών AI...", "exploreSlogan": "Έξυπνα ακουστικά, απεριόριστες δυνατότητες", @@ -194,7 +216,7 @@ const Map elGR = { "scene": "Σενάρια", // 用量统计模块 - "aiChat": "AI Chat", + "aiChat": "Συνομιλία AI", "translationStats": "Στατιστικά Μετάφρασης", "meetingStats": "Στατιστικά Συνάντησης", "today": "Σήμερα", @@ -243,66 +265,71 @@ const Map elGR = { 'totalQuota': 'Συνολικό όριο', 'remaining': 'Υπόλοιπο', 'featureDescription': 'Περιγραφή λειτουργίας', - 'paymentSuccess': 'Πληρωμή επιτυχής', - 'paymentFailed': 'Αποτυχία πληρωμής', - 'gotIt': 'Κατάλαβα', - 'paymentFailedTryAgain': 'Η πληρωμή απέτυχε. Παρακαλώ δοκιμάστε ξανά.', - 'selectPaymentMethod': 'Επιλέξτε τρόπο πληρωμής', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Αποτυχία δημιουργίας παραγγελίας WeChat Pay', - 'alipayOrderCreateFailed': 'Αποτυχία δημιουργίας παραγγελίας Alipay', - 'appleOrderCreateFailed': 'Αποτυχία δημιουργίας παραγγελίας Apple', - 'googleOrderCreateFailed': 'Αποτυχία δημιουργίας παραγγελίας Google', - 'paypalOrderCreateFailed': 'Αποτυχία δημιουργίας παραγγελίας PayPal', - 'paymentException': 'Εξαίρεση πληρωμής', - 'paymentLaunchFailed': 'Αποτυχία εκκίνησης πληρωμής', - 'paymentExceptionWithError': 'Εξαίρεση πληρωμής: @error', - 'paymentProcessingCheckLater': 'Η παραγγελία σας επεξεργάζεται. Παρακαλώ ελέγξτε αργότερα.', - 'paymentResultQueryException': 'Αποτυχία αναζήτησης αποτελέσματος πληρωμής: @error', - 'orderConfirmedQuotaRefreshed': 'Η παραγγελία επιβεβαιώθηκε. Το όριό σας ανανεώθηκε.', - 'paymentCompletedConfirming': 'Η πληρωμή ολοκληρώθηκε. Επιβεβαίωση…', - 'paymentCancelled': 'Η πληρωμή ακυρώθηκε', - 'paypalOpenedCompleteInBrowser': 'Το PayPal άνοιξε. Παρακαλώ ολοκληρώστε την πληρωμή στο πρόγραμμα περιήγησής σας.', - 'paypalOpenFailed': 'Αδυναμία ανοίγματος σελίδας πληρωμής PayPal', - 'paymentTestTitle': 'Δοκιμή Πληρωμής', - 'paymentTestOrderInfo': 'Πληροφορίες Δοκιμαστικής Παραγγελίας', - 'paymentTestProductId': 'Αναγνωριστικό Προϊόντος', - 'paymentTestProductDescription': 'Περιγραφή προϊόντος', - 'paymentTestWechatDescription': 'Δοκιμή πληρωμής WeChat Pay', - 'paymentTestAlipayDescription': 'Δοκιμή πληρωμής Alipay', - 'paymentTestAmount': 'Ποσό', - 'paymentTestSelectAmount': 'Επιλέξτε ποσό δοκιμής', - 'paying': 'Πληρωμή...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Κατάσταση πληρωμής', - 'errorInfoWithMessage': 'Σφάλμα: @message', - 'retest': 'Επανέλεγχος', - 'paymentTestInstructionsTitle': 'Οδηγίες', - 'paymentTestInstructionsContent': '1. Επιλέξτε ένα ποσό δοκιμής (προτεινόμενο: ¥0,01)\n2. Κάντε κλικ στο κουμπί πληρωμής για να ξεκινήσετε\n3. Ολοκληρώστε την πληρωμή στην εφαρμογή πληρωμής\n4. Επιστρέψτε για να ελέγξετε το αποτέλεσμα', - 'startingWechatPayment': 'Εκκίνηση WeChat Pay...', - 'startingAlipayPayment': 'Εκκίνηση Alipay...', - 'wechatPaymentSuccess': 'WeChat Pay επιτυχής!', - 'wechatPaymentFailed': 'Αποτυχία WeChat Pay', - 'wechatPaymentLaunchFailed': 'Αποτυχία εκκίνησης WeChat Pay', - 'cannotLaunchWechatPayment': 'Αδυναμία εκκίνησης WeChat Pay', - 'wechatPaymentException': 'Εξαίρεση WeChat Pay', - 'wechatPaymentTestCompleted': 'Η δοκιμή WeChat Pay ολοκληρώθηκε', - 'alipayPaymentSuccess': 'Alipay επιτυχής!', - 'alipayPaymentFailed': 'Αποτυχία Alipay', - 'alipayPaymentLaunchFailed': 'Αποτυχία εκκίνησης Alipay', - 'cannotLaunchAlipayPayment': 'Αδυναμία εκκίνησης Alipay', - 'alipayPaymentException': 'Εξαίρεση Alipay', - "insufficientIntegral": "Insufficient integral", + 'paymentSuccess': 'Πληρωμή επιτυχής', + 'paymentFailed': 'Αποτυχία πληρωμής', + 'gotIt': 'Κατάλαβα', + 'paymentFailedTryAgain': 'Η πληρωμή απέτυχε. Παρακαλώ δοκιμάστε ξανά.', + 'selectPaymentMethod': 'Επιλέξτε τρόπο πληρωμής', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Αποτυχία δημιουργίας παραγγελίας WeChat Pay', + 'alipayOrderCreateFailed': 'Αποτυχία δημιουργίας παραγγελίας Alipay', + 'appleOrderCreateFailed': 'Αποτυχία δημιουργίας παραγγελίας Apple', + 'googleOrderCreateFailed': 'Αποτυχία δημιουργίας παραγγελίας Google', + 'paypalOrderCreateFailed': 'Αποτυχία δημιουργίας παραγγελίας PayPal', + 'paymentException': 'Εξαίρεση πληρωμής', + 'paymentLaunchFailed': 'Αποτυχία εκκίνησης πληρωμής', + 'paymentExceptionWithError': 'Εξαίρεση πληρωμής: @error', + 'paymentProcessingCheckLater': + 'Η παραγγελία σας επεξεργάζεται. Παρακαλώ ελέγξτε αργότερα.', + 'paymentResultQueryException': + 'Αποτυχία αναζήτησης αποτελέσματος πληρωμής: @error', + 'orderConfirmedQuotaRefreshed': + 'Η παραγγελία επιβεβαιώθηκε. Το όριό σας ανανεώθηκε.', + 'paymentCompletedConfirming': 'Η πληρωμή ολοκληρώθηκε. Επιβεβαίωση…', + 'paymentCancelled': 'Η πληρωμή ακυρώθηκε', + 'paypalOpenedCompleteInBrowser': + 'Το PayPal άνοιξε. Παρακαλώ ολοκληρώστε την πληρωμή στο πρόγραμμα περιήγησής σας.', + 'paypalOpenFailed': 'Αδυναμία ανοίγματος σελίδας πληρωμής PayPal', + 'paymentTestTitle': 'Δοκιμή Πληρωμής', + 'paymentTestOrderInfo': 'Πληροφορίες Δοκιμαστικής Παραγγελίας', + 'paymentTestProductId': 'Αναγνωριστικό Προϊόντος', + 'paymentTestProductDescription': 'Περιγραφή προϊόντος', + 'paymentTestWechatDescription': 'Δοκιμή πληρωμής WeChat Pay', + 'paymentTestAlipayDescription': 'Δοκιμή πληρωμής Alipay', + 'paymentTestAmount': 'Ποσό', + 'paymentTestSelectAmount': 'Επιλέξτε ποσό δοκιμής', + 'paying': 'Πληρωμή...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Κατάσταση πληρωμής', + 'errorInfoWithMessage': 'Σφάλμα: @message', + 'retest': 'Επανέλεγχος', + 'paymentTestInstructionsTitle': 'Οδηγίες', + 'paymentTestInstructionsContent': + '1. Επιλέξτε ένα ποσό δοκιμής (προτεινόμενο: ¥0,01)\n2. Κάντε κλικ στο κουμπί πληρωμής για να ξεκινήσετε\n3. Ολοκληρώστε την πληρωμή στην εφαρμογή πληρωμής\n4. Επιστρέψτε για να ελέγξετε το αποτέλεσμα', + 'startingWechatPayment': 'Εκκίνηση WeChat Pay...', + 'startingAlipayPayment': 'Εκκίνηση Alipay...', + 'wechatPaymentSuccess': 'WeChat Pay επιτυχής!', + 'wechatPaymentFailed': 'Αποτυχία WeChat Pay', + 'wechatPaymentLaunchFailed': 'Αποτυχία εκκίνησης WeChat Pay', + 'cannotLaunchWechatPayment': 'Αδυναμία εκκίνησης WeChat Pay', + 'wechatPaymentException': 'Εξαίρεση WeChat Pay', + 'wechatPaymentTestCompleted': 'Η δοκιμή WeChat Pay ολοκληρώθηκε', + 'alipayPaymentSuccess': 'Alipay επιτυχής!', + 'alipayPaymentFailed': 'Αποτυχία Alipay', + 'alipayPaymentLaunchFailed': 'Αποτυχία εκκίνησης Alipay', + 'cannotLaunchAlipayPayment': 'Αδυναμία εκκίνησης Alipay', + 'alipayPaymentException': 'Εξαίρεση Alipay', + "insufficientIntegral": "Ανεπαρκείς πόντοι", "insufficientBalanceDesc": - 'Insufficient balance, please go to the corresponding recharge page to recharge.', - "recharge": 'Go to Recharge', + 'Ανεπαρκές υπόλοιπο, μεταβείτε στη σελίδα φόρτισης για ανανέωση.', + "recharge": 'Μετάβαση στην ανανέωση', "aiMemberExpiredDesc": - 'AI membership expired, please go to the membership recharge page to renew.', + 'Η συνδρομή AI έληξε, μεταβείτε στη σελίδα ανανέωσης συνδρομής.', // 商品模块 - AI商品页 'musicAndRecommendation': 'Μουσική & Προτάσεις', @@ -401,9 +428,9 @@ const Map elGR = { 'meet_001_name': 'Meeting Basic 100', 'meet_002_name': 'Meeting Basic 500', 'meet_003_name': 'Meeting Basic 1000', - 'trans_001_name': 'Translation Basic 100', - 'trans_002_name': 'Translation Basic 500', - 'trans_003_name': 'Translation Basic 1000', + 'trans_001_name': 'Μετάφραση Basic 100', + 'trans_002_name': 'Μετάφραση Basic 500', + 'trans_003_name': 'Μετάφραση Basic 1000', 'ai_001_desc': 'Περιλαμβάνει 100 χρήσεις. Πρόσβαση σε βασικές λειτουργίες AI.', 'ai_002_desc': @@ -511,16 +538,25 @@ const Map elGR = { 'meetingRecordExitMessage': 'Επιλέξτε τι θα κάνετε πριν φύγετε', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Τερματισμός και αποθήκευση', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Τερματισμός χωρίς αποθήκευση', // 结束录音不保存 - 'meetingRecordContinueInBackground': 'Συνέχιση εγγραφής στο παρασκήνιο', // 后台继续录音 - 'meetingRecordStopTimeout': 'Έληξε το χρονικό όριο διακοπής της εγγραφής. Δοκιμάστε ξανά.', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'Αποτυχία διακοπής της εγγραφής. Δοκιμάστε ξανά.', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'Αποτυχία αποθήκευσης της εγγραφής. Δοκιμάστε ξανά.', // 保存录音失败,请重试 - 'meetingRecordRecordingNotificationTitle': 'Η εγγραφή είναι σε εξέλιξη', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Γίνεται εγγραφή στο παρασκήνιο. Πατήστε για επιστροφή στην εφαρμογή.', // 正在后台录音,点击返回应用 + 'meetingRecordContinueInBackground': + 'Συνέχιση εγγραφής στο παρασκήνιο', // 后台继续录音 + 'meetingRecordStopTimeout': + 'Έληξε το χρονικό όριο διακοπής της εγγραφής. Δοκιμάστε ξανά.', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'Αποτυχία διακοπής της εγγραφής. Δοκιμάστε ξανά.', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'Αποτυχία αποθήκευσης της εγγραφής. Δοκιμάστε ξανά.', // 保存录音失败,请重试 + 'meetingRecordRecordingNotificationTitle': + 'Η εγγραφή είναι σε εξέλιξη', // 录音进行中 + 'meetingRecordRecordingNotificationBody': + 'Γίνεται εγγραφή στο παρασκήνιο. Πατήστε για επιστροφή στην εφαρμογή.', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Εμφάνιση πάνω από άλλες εφαρμογές', // 悬浮窗权限 - 'overlayPermissionTranslationDesc': 'Για να εμφανίζουμε τα αποτελέσματα μετάφρασης κατά τη διάρκεια κλήσεων ή μετάφρασης ήχου/βίντεο, χρειαζόμαστε άδεια εμφάνισης πάνω από άλλες εφαρμογές. Έτσι θα βλέπετε μεταφράσεις σε πραγματικό χρόνο ενώ χρησιμοποιείτε άλλες εφαρμογές.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 - 'overlayPermissionRecordingDesc': 'Για να εμφανίζουμε την αιωρούμενη μπάρα εγγραφής (χρονομετρητής/παύση/συνέχιση) κατά την εγγραφή, χρειαζόμαστε άδεια εμφάνισης πάνω από άλλες εφαρμογές.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 - 'overlayPermissionOpenSettingsFailed': 'Δεν ήταν δυνατή η αυτόματη μετάβαση στις ρυθμίσεις συστήματος. Ανοίξτε τις Ρυθμίσεις και ενεργοποιήστε χειροκίνητα την άδεια εμφάνισης πάνω από άλλες εφαρμογές.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 + 'overlayPermissionTranslationDesc': + 'Για να εμφανίζουμε τα αποτελέσματα μετάφρασης κατά τη διάρκεια κλήσεων ή μετάφρασης ήχου/βίντεο, χρειαζόμαστε άδεια εμφάνισης πάνω από άλλες εφαρμογές. Έτσι θα βλέπετε μεταφράσεις σε πραγματικό χρόνο ενώ χρησιμοποιείτε άλλες εφαρμογές.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 + 'overlayPermissionRecordingDesc': + 'Για να εμφανίζουμε την αιωρούμενη μπάρα εγγραφής (χρονομετρητής/παύση/συνέχιση) κατά την εγγραφή, χρειαζόμαστε άδεια εμφάνισης πάνω από άλλες εφαρμογές.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 + 'overlayPermissionOpenSettingsFailed': + 'Δεν ήταν δυνατή η αυτόματη μετάβαση στις ρυθμίσεις συστήματος. Ανοίξτε τις Ρυθμίσεις και ενεργοποιήστε χειροκίνητα την άδεια εμφάνισης πάνω από άλλες εφαρμογές.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 'transcribing': 'Απομαγνητοφώνηση...', 'summarizing': 'Δημιουργία περίληψης...', 'analyzing': 'Ανάλυση...', @@ -545,21 +581,23 @@ const Map elGR = { 'selectSummaryTemplate': 'Επιλογή προτύπου περίληψης', 'useThisTemplate': 'Χρήση αυτού του προτύπου', 'lastUsed': 'Τελευταία χρήση', - 'create': 'Δημιουργία', - 'templateDetails': 'Λεπτομέρειες Προτύπου', - 'tag': 'Ετικέτα', - 'description': 'Περιγραφή', - 'template': 'Πρότυπο', - 'deleteTemplate': 'Διαγραφή Προτύπου', - 'deleteTemplateConfirm': 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το πρότυπο;', - 'editTemplate': 'Επεξεργασία Προτύπου', - 'createTemplate': 'Δημιουργία Προτύπου', - 'name': 'Όνομα', - 'templateContentHint': 'Παρακαλώ εισάγετε περιεχόμενο προτύπου! Συμβουλή: Κάντε κλικ στο κουμπί AI παραπάνω για γρήγορη δημιουργία περιεχομένου προτύπου βάσει του ονόματος και της περιγραφής που εισάγατε', - 'inputNameHint': 'Παρακαλώ εισάγετε όνομα', - 'inputDescHint': 'Παρακαλώ εισάγετε περιγραφή', - 'custom': 'Προσαρμοσμένο', - 'pleaseEnter': 'Παρακαλώ εισάγετε', + 'create': 'Δημιουργία', + 'templateDetails': 'Λεπτομέρειες Προτύπου', + 'tag': 'Ετικέτα', + 'description': 'Περιγραφή', + 'template': 'Πρότυπο', + 'deleteTemplate': 'Διαγραφή Προτύπου', + 'deleteTemplateConfirm': + 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το πρότυπο;', + 'editTemplate': 'Επεξεργασία Προτύπου', + 'createTemplate': 'Δημιουργία Προτύπου', + 'name': 'Όνομα', + 'templateContentHint': + 'Παρακαλώ εισάγετε περιεχόμενο προτύπου! Συμβουλή: Κάντε κλικ στο κουμπί AI παραπάνω για γρήγορη δημιουργία περιεχομένου προτύπου βάσει του ονόματος και της περιγραφής που εισάγατε', + 'inputNameHint': 'Παρακαλώ εισάγετε όνομα', + 'inputDescHint': 'Παρακαλώ εισάγετε περιγραφή', + 'custom': 'Προσαρμοσμένο', + 'pleaseEnter': 'Παρακαλώ εισάγετε', 'viewAll': 'Προβολή όλων', 'recordingLanguage': 'Γλώσσα εγγραφής', 'chineseSimplified': 'Κινέζικα (Απλοποιημένα)', @@ -583,7 +621,7 @@ const Map elGR = { 'Αποτυχία επεξεργασίας αρχείου: {filePath}, σφάλμα: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Αποθήκευση Νοητικού Χάρτη', + 'saveMindMap': 'Αποθήκευση Νοητικού Χάρτη', 'shareMindMap': 'Κοινοποίηση χάρτη μυαλού', 'shareSuccess': 'Επιτυχής κοινοποίηση', @@ -605,7 +643,7 @@ const Map elGR = { 'exportSummary': 'Εξαγωγή περίληψης', 'exportAs': 'Εξαγωγή ως', 'exportingPDF': 'Εξαγωγή PDF...', - 'export': 'Εξαγωγή', + 'export': 'Εξαγωγή', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Εφαρμογή σε όλες τις παραγράφους αυτού του ομιλητή', @@ -717,18 +755,20 @@ const Map elGR = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Άγνωστη γλώσσα', - 'analysisFailed': 'Η ανάλυση απέτυχε, παρακαλώ δοκιμάστε ξανά αργότερα', - 'transcriptionFailed': 'Η μεταγραφή απέτυχε, παρακαλώ δοκιμάστε ξανά αργότερα', - 'summaryFailed': 'Η σύνοψη απέτυχε, παρακαλώ δοκιμάστε ξανά αργότερα', - 'summaryFailedShort': 'Αποτυχία σύνοψης', - 'transcriptionFailedShort': 'Αποτυχία μεταγραφής', + 'analysisFailed': 'Η ανάλυση απέτυχε, παρακαλώ δοκιμάστε ξανά αργότερα', + 'transcriptionFailed': + 'Η μεταγραφή απέτυχε, παρακαλώ δοκιμάστε ξανά αργότερα', + 'summaryFailed': 'Η σύνοψη απέτυχε, παρακαλώ δοκιμάστε ξανά αργότερα', + 'summaryFailedShort': 'Αποτυχία σύνοψης', + 'transcriptionFailedShort': 'Αποτυχία μεταγραφής', // Meeting模块 - 播放器 - 'playerNotReady': 'Ο αναπαραγωγέας ήχου δεν είναι έτοιμος, παρακαλώ περιμένετε', - 'playFailed': 'Αποτυχία αναπαραγωγής', - 'audioFileNotFound': 'Το αρχείο ήχου δεν βρέθηκε', - 'fetchingAudio': 'Λήψη ήχου από το cloud...', - 'playerLoadFailed': 'Αποτυχία φόρτωσης αναπαραγωγέα ήχου', + 'playerNotReady': + 'Ο αναπαραγωγέας ήχου δεν είναι έτοιμος, παρακαλώ περιμένετε', + 'playFailed': 'Αποτυχία αναπαραγωγής', + 'audioFileNotFound': 'Το αρχείο ήχου δεν βρέθηκε', + 'fetchingAudio': 'Λήψη ήχου από το cloud...', + 'playerLoadFailed': 'Αποτυχία φόρτωσης αναπαραγωγέα ήχου', // 设置页 "systemSettings": "Ρυθμίσεις συστήματος", @@ -737,10 +777,10 @@ const Map elGR = { "translationRecharge": "Περιορέωση μετάφρασης", "meetingAssistantRecharge": "Περιορέωση βοηθού συνάντησης", "cloudSync": "Περιορέωση συγχρονισμού στο cloud", - "memberService": "Member Service", - "bindRewardTitle": "Rewards", + "memberService": "Υπηρεσία μελών", + "bindRewardTitle": "Ανταμοιβές", "bindRewardSimpleDesc": - "First bind device reward has been issued. Tap OK to close.", + "Η ανταμοιβή πρώτης σύνδεσης συσκευής εκδόθηκε. Πατήστε OK για κλείσιμο.", "joinDevice": "Συνδεδεμένη συσκευή:", "accountId": "ID λογαριασμού:", "systemSetting": "Ρυθμίσεις συστήματος", @@ -790,20 +830,20 @@ const Map elGR = { "loading": "Φόρτωση...", // 设备管理模块 - "deviceTypeUnknown": "Unknown Device", - "deviceTypeClassicBluetoothHeadset": "Classic Bluetooth Headset", - "deviceTypeBleBluetoothHeadset": "BLE Bluetooth Headset", - "deviceTypeSmartVoiceRecorder": "Smart Voice Recorder", - "deviceTypeSmartEye": "Smart Glasses", + "deviceTypeUnknown": "Άγνωστη συσκευή", + "deviceTypeClassicBluetoothHeadset": "Κλασικά ακουστικά Bluetooth", + "deviceTypeBleBluetoothHeadset": "Ακουστικά BLE Bluetooth", + "deviceTypeSmartVoiceRecorder": "Έξυπνη συσκευή εγγραφής φωνής", + "deviceTypeSmartEye": "Έξυπνα γυαλιά", "unbind": "Αποσύνδεση", - "noDevicesBound": "No devices bound yet", - "pleaseBindDeviceFirst": "Please bind a device first to manage", - "noMacAddress": "No MAC Address", - "licenseCode": "License Code", - "confirmUnbind": "Confirm Unbind", + "noDevicesBound": "Δεν υπάρχουν συνδεδεμένες συσκευές", + "pleaseBindDeviceFirst": "Συνδέστε πρώτα μια συσκευή για διαχείριση", + "noMacAddress": "Χωρίς διεύθυνση MAC", + "licenseCode": "Κωδικός άδειας", + "confirmUnbind": "Επιβεβαίωση αποσύνδεσης", "confirmUnbindMessage": - "Are you sure you want to unbind device \"{deviceName}\"?", - "confirmUnbindAction": "Confirm Unbind", + "Είστε βέβαιοι ότι θέλετε να αποσυνδέσετε τη συσκευή \"{deviceName}\";", + "confirmUnbindAction": "Επιβεβαίωση αποσύνδεσης", // Agent模块 - 主界面 "Lily": "Lily", @@ -833,21 +873,22 @@ const Map elGR = { "loadMoreMessages": "Φόρτωση περισσότερων μηνυμάτων...", "loadFailedClickRetry": "Αποτυχία φόρτωσης, κάντε κλικ για επανάληψη", "swipeUpForMore": "Σύρετε προς τα πάνω για περισσότερα", - "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! - "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Όταν είναι ενεργοποιημένο: Η AI δεν θα διακοπεί από τη φωνή σας κατά τη διάρκεια της ομιλίας και μπορεί να χειριστεί μόνο έναν γύρο συνομιλίας τη φορά. Για να ξεκινήσετε νέο γύρο, απλά πείτε τη λέξη αφύπνισης.', + "callingTool": "Σας βοηθάω, παρακαλώ περιμένετε!", // 正在帮您,请稍等! + "voice_interrupt": "Διακοπή", // 语音打断 + 'voice_interrupt_tip': + 'Όταν είναι ενεργοποιημένο: Η AI δεν θα διακοπεί από τη φωνή σας κατά τη διάρκεια της ομιλίας και μπορεί να χειριστεί μόνο έναν γύρο συνομιλίας τη φορά. Για να ξεκινήσετε νέο γύρο, απλά πείτε τη λέξη αφύπνισης.', // Agent模块 - 预设提示词 - "presetMusic": "Play some music", // 来点音乐 - "presetNavigation": "Navigation to", // 导航 - "presetWeather": "Today's weather", // 今日天气 - "presetNews": "Today's news", // 今日新闻 - "presetFood": "Nearby food", // 美食 - "playSomeMusic": "Play some popular music", // 播放一些流行音乐 - "navigationTo": "Please help me navigate to", // 导航到 - "todayWeather": "How's the weather today?", // 今日天气 - "todayNews": "What's the news today?", // 今日新闻 - "nearbyFood": "What delicious food is nearby?", // 美食 + "presetMusic": "Παίξε μουσική", // 来点音乐 + "presetNavigation": "Πλοήγηση σε", // 导航 + "presetWeather": "Καιρός σήμερα", // 今日天气 + "presetNews": "Ειδήσεις σήμερα", // 今日新闻 + "presetFood": "Φαγητό κοντά", // 美食 + "playSomeMusic": "Παίξε δημοφιλή μουσική", // 播放一些流行音乐 + "navigationTo": "Βοηθήστε με να πλοηγηθώ στο", // 导航到 + "todayWeather": "Πώς είναι ο καιρός σήμερα;", // 今日天气 + "todayNews": "Ποια είναι τα νέα σήμερα;", // 今日新闻 + "nearbyFood": "Τι νόστιμο φαγητό υπάρχει κοντά;", // 美食 // Agent模块 - 欢迎消息与权限 'welcomeMessage': 'Γεια σας! Είμαι ο **Lily**, μπορώ να σας βοηθήσω με:\n\n' @@ -893,6 +934,13 @@ const Map elGR = { 'Θέλουμε να γνωρίζουμε τον λόγο της αναφοράς σας, μπορείτε να περιγράψετε το πρόβλημα που αντιμετωπίσατε.', 'generatedByAi': 'Δημιουργήθηκε από AI', + // Agent模块 - 工具调用 + 'toolCall': 'Κλήση εργαλείου', + 'noResult': 'Κανένα αποτέλεσμα', + 'noToolCallContentToCopy': 'Δεν υπάρχει περιεχόμενο κλήσης εργαλείου για αντιγραφή', + 'toolCallDetails': 'Λεπτομέρειες κλήσης εργαλείου:', + 'toolCallContentCopied': 'Το περιεχόμενο κλήσης εργαλείου αντιγράφηκε στο πρόχειρο', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Ορίστε μερικές προτεινόμενες μουσικές:', 'playList': 'Λίστα αναπαραγωγής', @@ -913,6 +961,29 @@ const Map elGR = { "bicycling": "Ποδηλασία", "tsransit": "Δημόσια συγκοινωνία", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Επιλογή εφαρμογής πλοήγησης', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Πλοήγηση με Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Πλοήγηση με Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Πλοήγηση με Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Πλοήγηση με Apple Maps', + 'builtInNavigation': 'Ενσωματωμένη πλοήγηση', + 'useBuiltInNavigation': 'Πλοήγηση με ενσωματωμένο χάρτη', + 'navigationStartFailed': 'Αποτυχία εκκίνησης πλοήγησης', + 'cannotPlayMusicListRetryLater': + 'Δεν είναι δυνατή η αναπαραγωγή της λίστας μουσικής, δοκιμάστε ξανά αργότερα', + 'cannotPlaySong': 'Δεν είναι δυνατή η αναπαραγωγή τραγουδιού', + 'openMapError': 'Σφάλμα κατά το άνοιγμα του χάρτη', + 'pleaseInstallAmapApp': 'Εγκαταστήστε πρώτα την εφαρμογή Amap', + 'pleaseInstallBaiduMapApp': 'Εγκαταστήστε πρώτα την εφαρμογή Baidu Maps', + 'appleMapStartFailed': 'Αποτυχία εκκίνησης Apple Maps', + 'appleMapUnavailable': 'Τα Apple Maps δεν είναι διαθέσιμα', + 'openAppleMapError': 'Σφάλμα κατά το άνοιγμα των Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Ερώτημα καιρού:', 'highest': 'Υψηλότερη', @@ -966,8 +1037,8 @@ const Map elGR = { "strongWind": "Δυνατός άνεμος", // 翻译模块 - 中间层 - "pictureTranslation": "Picture Translation", - "textTranslation": "Text Translation", + "pictureTranslation": "Μετάφραση εικόνας", + "textTranslation": "Μετάφραση κειμένου", // 翻译模块 - 主页 "translationHistory": "Ιστορικό μεταφράσεων", @@ -977,22 +1048,33 @@ const Map elGR = { "phoneUser": "Χρήστης τηλεφώνου", "selectSourceLanguage": "Επιλέξτε γλώσσα προέλευσης", "selectTargetLanguage": "Επιλέξτε γλώσσα προορισμού", - "me": "Me", - "counterPart": "Counterpart", + "me": "Εγώ", + "counterPart": "Συνομιλητής", "bluetoothCallStateError": - "Please make sure the Bluetooth headset is connected to the phone and in a call state", - "autoDetect": "Auto Detect", // 自动检测 + "Βεβαιωθείτε ότι τα ακουστικά Bluetooth είναι συνδεδεμένα στο τηλέφωνο και σε κατάσταση κλήσης", + "autoDetect": "Αυτόματη ανίχνευση", // 自动检测 // 翻译模块 - 文本翻译 - "languageDetectionFailed": "Language detection failed", - "translationFailed": "Translation failed", - "pleaseInputText": "Please input text", - "textTooLong": "Text too long, max 5000 characters", + "languageDetectionFailed": "Αποτυχία ανίχνευσης γλώσσας", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Απενεργοποίηση αιωρούμενου παραθύρου', + 'enableFloatingWindow': 'Ενεργοποίηση αιωρούμενου παραθύρου', + 'permissionTip': 'Υπόδειξη δικαιώματος', + 'micPermissionRequiredForRecording': + 'Απαιτείται δικαίωμα μικροφώνου για εγγραφή', + 'deleteTranslationRecordError': 'Σφάλμα κατά τη διαγραφή εγγραφής μετάφρασης: @error', + "translationFailed": "Αποτυχία μετάφρασης", + "translating": "Μετάφραση σε εξέλιξη", + "translate": "Μετάφραση", + "pleaseInputText": "Εισαγάγετε κείμενο", + "inputTextToTranslate": "Παρακαλώ εισαγάγετε το κείμενο προς μετάφραση", + "textTooLong": "Το κείμενο είναι πολύ μεγάλο, μέγιστο 5000 χαρακτήρες", // 翻译模块 - 历史记录 "noTranslationHistory": "Δεν υπάρχει ιστορικό μεταφράσεων", - "historyRecords": "History Records", - "clearResults": "Clear Results", + "historyRecords": "Ιστορικό εγγραφών", + "clearResults": "Εκκαθάριση αποτελεσμάτων", "clearHistory": "Εκκαθάριση ιστορικού", "clearHistoryConfirm": "Είστε βέβαιοι ότι θέλετε να εκκαθαρίσετε όλο το ιστορικό μεταφράσεων; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", @@ -1002,55 +1084,55 @@ const Map elGR = { "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλες τις εγγραφές μεταφράσεων για αυτή τη συνεδρία; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", // 翻译模块 - 图片翻译 - "selectImageSource": "Select Image Source", - "imagePreview": "Image Preview", - "translationResult": "Translation Result", - "recognitionResult": "Recognition Result", - "translatedImagePreview": "Translated Image Preview", - "translatedImageLoadFailed": "Failed to load translated image", - "pleaseSelectImage": "Please select an image", - "imageLoadFailed": "Image load failed", - "imageQuality": "Image Quality", - "maxSize": "Max Size", - "close": "Close", - "setImageQuality": "Set Image Quality", - "currentQuality": "Current quality: @value%", - "setMaxSize": "Set Max Size", - "currentMaxSize": "Current: @pxpx", - "waitingForAction": "Waiting for action", - "pleaseSelectImageToStart": "Please select an image to start", - "chooseImage": "Choose Image", - "openingCamera": "Opening camera...", - "openingPhotoAlbum": "Opening photo album...", - "cancelled": "Cancelled", - "userCancelledSelection": "User cancelled selection", - "translatingImage": "Translating Image", - "callingImageTranslateService": "Calling image translation service...", - "savingRecord": "Saving Record", - "savingTranslationResult": "Saving translation result...", - "translationCompleted": "Translation Completed", - "allStepsCompleted": "All steps completed", - "processingFailed": "Processing Failed", + "selectImageSource": "Επιλογή πηγής εικόνας", + "imagePreview": "Προεπισκόπηση εικόνας", + "translationResult": "Αποτέλεσμα μετάφρασης", + "recognitionResult": "Αποτέλεσμα αναγνώρισης", + "translatedImagePreview": "Προεπισκόπηση μεταφρασμένης εικόνας", + "translatedImageLoadFailed": "Αποτυχία φόρτωσης μεταφρασμένης εικόνας", + "pleaseSelectImage": "Επιλέξτε μια εικόνα", + "imageLoadFailed": "Αποτυχία φόρτωσης εικόνας", + "imageQuality": "Ποιότητα εικόνας", + "maxSize": "Μέγιστο μέγεθος", + "close": "Κλείσιμο", + "setImageQuality": "Ρύθμιση ποιότητας εικόνας", + "currentQuality": "Τρέχουσα ποιότητα: @value%", + "setMaxSize": "Ρύθμιση μέγιστου μεγέθους", + "currentMaxSize": "Τρέχον: @pxpx", + "waitingForAction": "Αναμονή ενέργειας", + "pleaseSelectImageToStart": "Επιλέξτε μια εικόνα για να ξεκινήσετε", + "chooseImage": "Επιλογή εικόνας", + "openingCamera": "Άνοιγμα κάμερας...", + "openingPhotoAlbum": "Άνοιγμα άλμπουμ φωτογραφιών...", + "cancelled": "Ακυρώθηκε", + "userCancelledSelection": "Ο χρήστης ακύρωσε την επιλογή", + "translatingImage": "Μετάφραση εικόνας", + "callingImageTranslateService": "Κλήση υπηρεσίας μετάφρασης εικόνας...", + "savingRecord": "Αποθήκευση εγγραφής", + "savingTranslationResult": "Αποθήκευση αποτελέσματος μετάφρασης...", + "translationCompleted": "Η μετάφραση ολοκληρώθηκε", + "allStepsCompleted": "Όλα τα βήματα ολοκληρώθηκαν", + "processingFailed": "Αποτυχία επεξεργασίας", "imageProcessingOrTranslationFailed": - "Image processing or translation failed. Please retry.\nError: {error}", - "imageTooLarge": "Image size exceeds 4MB limit", + "Αποτυχία επεξεργασίας ή μετάφρασης εικόνας. Δοκιμάστε ξανά.\nΣφάλμα: {error}", + "imageTooLarge": "Το μέγεθος εικόνας υπερβαίνει το όριο των 4MB", "imageTooLargeHint": - "Image size exceeds 4MB. Reduce quality or dimensions and retry", - "emptyTranslationResult": "Image translation API returned empty result", + "Το μέγεθος εικόνας υπερβαίνει τα 4MB. Μειώστε την ποιότητα ή τις διαστάσεις και δοκιμάστε ξανά", + "emptyTranslationResult": "Το API μετάφρασης εικόνας επέστρεψε κενό αποτέλεσμα", "imageTranslationFailedTryLater": - "Image translation failed. Network issue or rate limit. Please try later", + "Αποτυχία μετάφρασης εικόνας. Πρόβλημα δικτύου ή όριο αιτημάτων. Δοκιμάστε αργότερα", "imageTranslationApiException": - "Image translation API exception. Check network and retry", - "permissionRequired": "Permission Required", - "cameraPermissionRequired": "Camera permission required to take photos", + "Εξαίρεση API μετάφρασης εικόνας. Ελέγξτε το δίκτυο και δοκιμάστε ξανά", + "permissionRequired": "Απαιτείται δικαίωμα", + "cameraPermissionRequired": "Απαιτείται δικαίωμα κάμερας για λήψη φωτογραφιών", "photoAlbumPermissionRequired": - "Photo album permission required to pick images", - "translationDetails": "Translation Details", - "originalImage": "Original Image", - "sourceLanguage": "Source Language", - "targetLanguage": "Target Language", - "translationTime": "Translation Time", - "shareInDevelopment": "Sharing feature under development", + "Απαιτείται δικαίωμα άλμπουμ φωτογραφιών για επιλογή εικόνων", + "translationDetails": "Λεπτομέρειες μετάφρασης", + "originalImage": "Αρχική εικόνα", + "sourceLanguage": "Γλώσσα προέλευσης", + "targetLanguage": "Γλώσσα προορισμού", + "translationTime": "Χρόνος μετάφρασης", + "shareInDevelopment": "Η λειτουργία κοινοποίησης βρίσκεται υπό ανάπτυξη", // 翻译模块 - 录音文件 "translateAudioFiles": "Μετάφραση αρχείων ήχου", @@ -1103,8 +1185,8 @@ const Map elGR = { 'deleteAccount': 'Διαγραφή λογαριασμού', 'deleteAccountTips': 'Είστε βέβαιοι ότι θέλετε να διαγράψετε μόνιμα τον λογαριασμό σας; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί', - 'clean': 'Clear Cache', - 'cleanTips': 'Are you sure you want to clear personal cache?', + 'clean': 'Εκκαθάριση προσωρινής μνήμης', + 'cleanTips': 'Είστε βέβαιοι ότι θέλετε να εκκαθαρίσετε την προσωπική προσωρινή μνήμη;', 'networkConnectionFailed': 'Αποτυχία σύνδεσης δικτύου, ελέγξτε τις ρυθμίσεις δικτύου και δοκιμάστε ξανά', 'serverTemporarilyUnavailable': @@ -1152,18 +1234,18 @@ const Map elGR = { 'Εντοπίστηκε ότι έχετε αρνηθεί μόνιμα το δικαίωμα αποθήκευσης. Για να συνεχίσετε να χρησιμοποιείτε αυτή τη λειτουργία, παρακαλώ μεταβείτε στις ρυθμίσεις εφαρμογής για να ενεργοποιήσετε χειροκίνητα το δικαίωμα αποθήκευσης.', 'getPermissionStatusFailed': 'Αποτυχία λήψης κατάστασης δικαιωμάτων', 'communicationPermissions': 'Δικαιώματα επικοινωνίας', - 'bluetoothPermissions': 'Bluetooth Permissions', - 'notificationPermissions': 'Notification Permissions', - 'storagePermissions': 'Storage Permissions', - 'microphonePermissions': 'Microphone Permissions', - 'alarmPermissions': 'Alarm Permissions', + 'bluetoothPermissions': 'Δικαιώματα Bluetooth', + 'notificationPermissions': 'Δικαιώματα ειδοποιήσεων', + 'storagePermissions': 'Δικαιώματα αποθήκευσης', + 'microphonePermissions': 'Δικαιώματα μικροφώνου', + 'alarmPermissions': 'Δικαιώματα ξυπνητηριού', 'calendarPermissions': 'Δικαιώματα ημερολογίου', 'locationPermissions': 'Δικαιώματα τοποθεσίας', 'phone': 'Τηλέφωνο', 'sms': 'SMS', - 'contacts': 'Contacts', - 'notification': 'Notification', - 'alarm': 'Alarm', + 'contacts': 'Επαφές', + 'notification': 'Ειδοποίηση', + 'alarm': 'Ξυπνητήρι', 'calendarWrite': 'Εγγραφή ημερολογίου', 'calendarFullAccess': 'Πλήρης πρόσβαση ημερολογίου', 'locationInfo': 'Πληροφορίες τοποθεσίας', @@ -1171,7 +1253,7 @@ const Map elGR = { 'Χρησιμοποιείται για τη λειτουργία τηλεφωνικών κλήσεων', 'smsPermissionDesc': 'Χρησιμοποιείται για τη λειτουργία αποστολής SMS', 'alarmPermissionDesc': - 'Used to set exact alarms to ensure reminders trigger on time', + 'Χρησιμοποιείται για τη ρύθμιση ακριβών ξυπνητηριών ώστε οι υπενθυμίσεις να ενεργοποιούνται έγκαιρα', 'calendarWritePermissionDesc': 'Χρησιμοποιείται για τη δημιουργία γεγονότων και υπενθυμίσεων ημερολογίου', 'calendarFullAccessPermissionDesc': @@ -1192,86 +1274,88 @@ const Map elGR = { 'smsPermissionDetailDesc': 'Η λειτουργία αποστολής SMS χρειάζεται δικαίωμα SMS', 'alarmPermissionDetailDesc': - 'This permission is required to set exact alarms and ensure reminders trigger on time', + 'Αυτό το δικαίωμα απαιτείται για τη ρύθμιση ακριβών ξυπνητηριών και τη διασφάλιση ότι οι υπενθυμίσεις ενεργοποιούνται έγκαιρα', 'calendarWritePermissionDetailDesc': 'Η δημιουργία γεγονότων ημερολογίου χρειάζεται δικαίωμα εγγραφής ημερολογίου', 'calendarFullAccessPermissionDetailDesc': 'Η διαχείριση γεγονότων ημερολογίου χρειάζεται πλήρες δικαίωμα ημερολογίου', 'locationPermissionDetailDesc': 'Η λήψη πληροφοριών τοποθεσίας χρειάζεται δικαίωμα τοποθεσίας', - 'contactsPermissionDesc': 'Used for accessing contact information', + 'contactsPermissionDesc': 'Χρησιμοποιείται για πρόσβαση σε πληροφορίες επαφών', 'contactsPermissionDetailDesc': - 'Phone call and SMS functionality requires contacts permission to select contacts', + 'Η λειτουργία τηλεφωνικών κλήσεων και SMS χρειάζεται δικαίωμα επαφών για επιλογή επαφών', 'bluetoothPermissionDesc': - 'Used for connecting and managing Bluetooth devices', + 'Χρησιμοποιείται για σύνδεση και διαχείριση συσκευών Bluetooth', 'bluetoothPermissionDetailDesc': - 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', - 'bluetoothScanPermissionDesc': 'Used for scanning nearby Bluetooth devices', + 'Η σύνδεση με ακουστικά Bluetooth και άλλες συσκευές απαιτεί δικαίωμα Bluetooth', + 'bluetoothScanPermissionDesc': 'Χρησιμοποιείται για σάρωση κοντινών συσκευών Bluetooth', 'bluetoothScanPermissionDetailDesc': - 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', - 'bluetoothConnectPermissionDesc': 'Used for connecting to Bluetooth devices', + 'Η σάρωση κοντινών συσκευών Bluetooth απαιτεί δικαίωμα σάρωσης Bluetooth', + 'bluetoothConnectPermissionDesc': 'Χρησιμοποιείται για σύνδεση σε συσκευές Bluetooth', 'bluetoothConnectPermissionDetailDesc': - 'Connecting to Bluetooth devices requires Bluetooth connect permission', - 'notificationPermissionDesc': 'Used for sending notification messages', + 'Η σύνδεση σε συσκευές Bluetooth απαιτεί δικαίωμα σύνδεσης Bluetooth', + 'notificationPermissionDesc': 'Χρησιμοποιείται για αποστολή μηνυμάτων ειδοποίησης', 'notificationPermissionDetailDesc': - 'App needs notification permission to send you important alerts and messages', + 'Η εφαρμογή χρειάζεται δικαίωμα ειδοποιήσεων για να σας στέλνει σημαντικές ειδοποιήσεις και μηνύματα', 'appNeedsPermissionForFullFunction': 'Η εφαρμογή χρειάζεται αυτό το δικαίωμα για να παρέχει πλήρη λειτουργικότητα', 'permanentDenialText': 'Έχετε αρνηθεί μόνιμα το δικαίωμα {permission}, μεταβείτε στις ρυθμίσεις εφαρμογής για να το ενεργοποιήσετε', 'goToSettings': 'Μετάβαση στις ρυθμίσεις', - 'bluetoothScan': 'Bluetooth Scan', - 'bluetoothConnect': 'Bluetooth Connect', + 'bluetoothScan': 'Σάρωση Bluetooth', + 'bluetoothConnect': 'Σύνδεση Bluetooth', 'bluetoothScanExplanation': - 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', + 'Η εφαρμογή χρειάζεται δικαίωμα σάρωσης Bluetooth για σάρωση κοντινών συσκευών Bluetooth.', 'bluetoothConnectExplanation': - 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', + 'Η εφαρμογή χρειάζεται δικαίωμα σύνδεσης Bluetooth για σύνδεση σε συσκευές Bluetooth.', 'locationForBluetoothExplanation': - 'The app needs location permission to scan Bluetooth devices.', + 'Η εφαρμογή χρειάζεται δικαίωμα τοποθεσίας για σάρωση συσκευών Bluetooth.', 'bluetoothScanPermanentDenial': - 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', + 'Το δικαίωμα σάρωσης Bluetooth έχει απορριφθεί μόνιμα, μεταβείτε στις ρυθμίσεις για χειροκίνητη ενεργοποίηση.', 'bluetoothConnectPermanentDenial': - 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', + 'Το δικαίωμα σύνδεσης Bluetooth έχει απορριφθεί μόνιμα, μεταβείτε στις ρυθμίσεις για χειροκίνητη ενεργοποίηση.', 'locationPermanentDenial': - 'Location permission has been permanently denied, please go to settings to enable it manually.', - 'notificationPermission': 'Notification', - 'locationPermission': 'Location', + 'Το δικαίωμα τοποθεσίας έχει απορριφθεί μόνιμα, μεταβείτε στις ρυθμίσεις για χειροκίνητη ενεργοποίηση.', + 'notificationPermission': 'Ειδοποίηση', + 'locationPermission': 'Τοποθεσία', 'notificationPermissionExplanation': - 'Notification permission is required to display music playback status.', + 'Απαιτείται δικαίωμα ειδοποιήσεων για εμφάνιση κατάστασης αναπαραγωγής μουσικής.', 'locationPermissionExplanation': - 'Location permission is required to get current location.', + 'Απαιτείται δικαίωμα τοποθεσίας για λήψη τρέχουσας τοποθεσίας.', 'notificationPermissionPermanentDenial': - 'You have permanently denied notification permission, please go to settings to enable it.', + 'Έχετε απορρίψει μόνιμα το δικαίωμα ειδοποιήσεων, μεταβείτε στις ρυθμίσεις για ενεργοποίηση.', 'locationPermissionPermanentDenial': - 'You have permanently denied location permission, please go to settings to enable it.', - 'storagePermission': 'Storage', + 'Έχετε απορρίψει μόνιμα το δικαίωμα τοποθεσίας, μεταβείτε στις ρυθμίσεις για ενεργοποίηση.', + 'storagePermission': 'Αποθήκευση', 'microphonePermissionExplanation': - 'We need microphone permission to record audio content.', + 'Χρειαζόμαστε δικαίωμα μικροφώνου για εγγραφή ηχητικού περιεχομένου.', 'storagePermissionExplanation': - 'We need storage permission so you can select and upload audio files.', + 'Χρειαζόμαστε δικαίωμα αποθήκευσης ώστε να μπορείτε να επιλέξετε και να ανεβάσετε αρχεία ήχου.', 'microphonePermissionPermanentDenial': - 'Microphone permission has been permanently denied. To continue using this feature, please go to app settings to manually enable microphone permission.', + 'Το δικαίωμα μικροφώνου έχει απορριφθεί μόνιμα. Για να συνεχίσετε να χρησιμοποιείτε αυτή τη λειτουργία, μεταβείτε στις ρυθμίσεις εφαρμογής για χειροκίνητη ενεργοποίηση.', 'storagePermissionPermanentDenial': - 'Storage permission has been permanently denied. To continue using this feature, please go to app settings to manually enable storage permission.', - 'permissionUtilNeed': 'Need ', - 'permissionUtilPermission': ' Permission', - 'permissionUtilRestricted': ' Permission Restricted', + 'Το δικαίωμα αποθήκευσης έχει απορριφθεί μόνιμα. Για να συνεχίσετε να χρησιμοποιείτε αυτή τη λειτουργία, μεταβείτε στις ρυθμίσεις εφαρμογής για χειροκίνητη ενεργοποίηση.', + 'permissionUtilNeed': 'Απαιτείται ', + 'permissionUtilPermission': ' Δικαίωμα', + 'permissionUtilRestricted': ' Δικαίωμα περιορισμένο', 'permissionUtilRestrictedMessage': - 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', + 'Αυτή η λειτουργία δεν είναι διαθέσιμη ή είναι περιορισμένη στην τρέχουσα συσκευή, ελέγξτε τις ρυθμίσεις συσκευής ή τους περιορισμούς συστήματος', 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Πλοήγηση σε εξέλιξη', - 'native.notification.navigation.keepRunning': 'Πλοήγηση σε εξέλιξη, διατηρήστε την εφαρμογή ανοιχτή', - 'native.notification.bleAgent.running': 'Ο φωνητικός βοηθός εκτελείται', - 'native.notification.audioRecording.recording': 'Εγγραφή ήχου, πατήστε για επιστροφή στην εφαρμογή', - 'native.notification.music.waiting': 'Αναμονή αναπαραγωγής', - 'native.notification.music.previous': 'Προηγούμενο', - 'native.notification.music.next': 'Επόμενο', - 'native.notification.music.play': 'Αναπαραγωγή', - 'native.notification.music.pause': 'Παύση', - 'native.notification.qqMusic.playing': 'Αναπαραγωγή μουσικής', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Πλοήγηση σε εξέλιξη', + 'native.notification.navigation.keepRunning': + 'Πλοήγηση σε εξέλιξη, διατηρήστε την εφαρμογή ανοιχτή', + 'native.notification.bleAgent.running': 'Ο φωνητικός βοηθός εκτελείται', + 'native.notification.audioRecording.recording': + 'Εγγραφή ήχου, πατήστε για επιστροφή στην εφαρμογή', + 'native.notification.music.waiting': 'Αναμονή αναπαραγωγής', + 'native.notification.music.previous': 'Προηγούμενο', + 'native.notification.music.next': 'Επόμενο', + 'native.notification.music.play': 'Αναπαραγωγή', + 'native.notification.music.pause': 'Παύση', + 'native.notification.qqMusic.playing': 'Αναπαραγωγή μουσικής', // 版本更新 'newVersionFound': 'Βρέθηκε νέα έκδοση', // 版本更新对话框标题 @@ -1345,27 +1429,27 @@ const Map elGR = { 'bleConnectionFailed': 'Αποτυχία σύνδεσης BLE', 'deviceAuthorizationFailedCheckCode': 'Αποτυχία εξουσιοδότησης συσκευής, ελέγξτε τον κωδικό εξουσιοδότησης', - 'bluetoothGuideTitle': 'Manual Bluetooth Activation Required', // 需要手动开启蓝牙 - 'bluetoothGuideSteps': 'Please follow these steps:', // 请按照以下步骤操作: + 'bluetoothGuideTitle': 'Απαιτείται χειροκίνητη ενεργοποίηση Bluetooth', // 需要手动开启蓝牙 + 'bluetoothGuideSteps': 'Ακολουθήστε τα παρακάτω βήματα:', // 请按照以下步骤操作: 'bluetoothGuideStep1': - 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 + 'Ενεργοποίηση Bluetooth: Ρυθμίσεις → Bluetooth → Ενεργοποίηση', // 开启蓝牙:设置 → 蓝牙 → 开启 'bluetoothGuideStep2': - 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 + 'Σύνδεση συσκευής: Βρείτε τη συσκευή σας στις "Οι συσκευές μου" και πατήστε για σύνδεση', // 连接设备:在"我的设备"中找到您的设备并点击连接 'bluetoothGuideStep3': - 'Return to app to continue pairing process', // 返回应用继续配对流程 + 'Επιστρέψτε στην εφαρμογή για να συνεχίσετε τη διαδικασία σύζευξης', // 返回应用继续配对流程 'bluetoothGuideTip': - 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 - 'iKnow': 'I Know', // 我知道了 + 'Συμβουλή: Μπορείτε επίσης να πατήσετε παρατεταμένα το εικονίδιο Bluetooth στο Κέντρο ελέγχου για γρήγορη πρόσβαση στις ρυθμίσεις Bluetooth', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 + 'iKnow': 'Κατάλαβα', // 我知道了 // 配对模块 - 绑定奖励 - "firstBindRewardTitle": "Welcome Reward", - "firstBindRewardDesc": "You've received binding rewards.", - "vipLevelLabel": "VIP Level:", - "expiryLabel": "Expiration:", - "notActivated": "Not activated", - "aiChatCreditsLabel": "AI Chat Credits:", - "translationCreditsLabel": "Translation Credits:", - "meetingCreditsLabel": "Meeting Credits:", + "firstBindRewardTitle": "Ανταμοιβή καλωσορίσματος", + "firstBindRewardDesc": "Λάβατε ανταμοιβές σύνδεσης.", + "vipLevelLabel": "Επίπεδο VIP:", + "expiryLabel": "Λήξη:", + "notActivated": "Δεν έχει ενεργοποιηθεί", + "aiChatCreditsLabel": "Πόντοι συνομιλίας AI:", + "translationCreditsLabel": "Πόντοι μετάφρασης:", + "meetingCreditsLabel": "Πόντοι συνάντησης:", "ok": "OK", // 用户反馈模块 @@ -1394,13 +1478,13 @@ const Map elGR = { "connectionFailed": "Αποτυχία σύνδεσης", "retryConnection": "Επανάληψη σύνδεσης", "ota_updateNow": "Ενημέρωση τώρα", - "otaVersionInfoFailed": "Failed to get version info. Please try again later.", + "otaVersionInfoFailed": "Αποτυχία λήψης πληροφοριών έκδοσης. Δοκιμάστε ξανά αργότερα.", "otaDeviceInfoUnavailable": - "Unable to get device info. Please check the connection and retry.", + "Αδυναμία λήψης πληροφοριών συσκευής. Ελέγξτε τη σύνδεση και δοκιμάστε ξανά.", "otaProductInfoUnavailable": - "Unable to identify the device. Please reconnect and retry.", + "Αδυναμία αναγνώρισης της συσκευής. Επανασυνδέστε και δοκιμάστε ξανά.", "otaFirmwareVersionInvalid": - "Firmware version is abnormal. Please reconnect and retry.", + "Η έκδοση firmware είναι μη κανονική. Επανασυνδέστε και δοκιμάστε ξανά.", "keepConnectedDontClose": "Διατηρήστε τη συσκευή συνδεδεμένη, μην κλείσετε την εφαρμογή", "doNotDisconnect": "Μην αποσυνδέσετε", @@ -1409,6 +1493,59 @@ const Map elGR = { "removeEarbudsEnsureBattery": "Αφαιρέστε και τα δύο ακουστικά και βεβαιωθείτε ότι η μπαταρία και των δύο είναι πάνω από 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Βρέθηκε νέα έκδοση @version', + 'otaConfirmUpdateNow': 'Ενημέρωση τώρα;', + 'otaUpdate': 'Ενημέρωση', + 'otaUpgradeSuccess': 'Επιτυχής αναβάθμιση', + 'otaUpgradeCompleteRepair': + 'Η αναβάθμιση firmware ολοκληρώθηκε!\n\nΗ συσκευή χρειάζεται εκ νέου σύζευξη για σωστή λειτουργία. Μετάβαση στη σελίδα σύζευξης τώρα;', + 'otaPairLater': 'Σύζευξη αργότερα', + 'otaPairNow': 'Σύζευξη τώρα', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Σφάλμα ελέγχου σύνδεσης BLE: @error', + 'otaBleNotConnected': 'Η συσκευή BLE δεν είναι συνδεδεμένη', + 'otaBleNeedConnection': + 'Η αναβάθμιση firmware απαιτεί σύνδεση συσκευής BLE\nΒεβαιωθείτε ότι η συσκευή είναι σωστά συνδεδεμένη και δοκιμάστε ξανά', + 'otaDeviceInfoUnavailableTitle': 'Πληροφορίες συσκευής μη διαθέσιμες', + 'otaCannotGetDeviceInfo': + 'Αδυναμία λήψης πληροφοριών συσκευής\nΕπανασυνδέστε τη συσκευή ή δοκιμάστε αργότερα', + 'otaBleCheckFailed': 'Αποτυχία ελέγχου σύνδεσης BLE', + 'otaCannotGetDeviceInfoCheckConnection': + 'Αδυναμία λήψης πληροφοριών συσκευής, ελέγξτε τη σύνδεση συσκευής', + 'otaCannotGetProductInfoWithName': + 'Αδυναμία λήψης πληροφοριών προϊόντος, όνομα συσκευής: @deviceName', + 'otaCannotGetBatteryInfo': 'Αδυναμία λήψης έγκυρων πληροφοριών μπαταρίας', + 'otaLowBattery': 'Χαμηλή μπαταρία', + 'otaSingleBatteryLow': + 'Η μπαταρία της συσκευής είναι πολύ χαμηλή για αναβάθμιση firmware\nΑπαίτηση: η μπαταρία πρέπει να είναι πάνω από 20%\nΤρέχον: @ear @battery%\nΦορτίστε και δοκιμάστε ξανά', + 'otaDoubleBatteryLow': + 'Η μπαταρία της συσκευής είναι πολύ χαμηλή για αναβάθμιση firmware\nΑπαίτηση: και τα δύο ακουστικά πρέπει να είναι πάνω από 20%\nΤρέχον: Αριστερό @left%, Δεξί @right%\nΦορτίστε και δοκιμάστε ξανά', + 'otaBatteryCheckFailed': 'Αποτυχία ελέγχου μπαταρίας', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'Αυτή η ενημέρωση περιλαμβάνει βελτιστοποιήσεις απόδοσης και διορθώσεις σφαλμάτων.', + 'otaGetLatestVersionFailed': 'Αποτυχία λήψης πληροφοριών τελευταίας έκδοσης', + 'otaGetVersionInfoFailed': 'Αποτυχία λήψης πληροφοριών έκδοσης', + 'otaCheckingDeviceStatus': 'Έλεγχος κατάστασης συσκευής...', + 'otaDownloadFailedCheckNetwork': + 'Αποτυχία λήψης, ελέγξτε τη σύνδεση δικτύου', + 'otaDownloadFailed': 'Αποτυχία λήψης', + 'otaPreparingConnection': 'Προετοιμασία σύνδεσης συσκευής...', + 'otaConnectingDevice': 'Σύνδεση στη συσκευή...', + 'otaUpgradeStarted': 'Η αναβάθμιση OTA ξεκίνησε...', + 'otaUpgradeProgressWithPercent': 'Πρόοδος αναβάθμισης: @percent%', + 'otaUpgradeSuccessComplete': 'Η αναβάθμιση ολοκληρώθηκε επιτυχώς', + 'otaUpgradeFailedWithCode': 'Αποτυχία αναβάθμισης, κωδικός σφάλματος: @code', + 'otaUpgradeFailedTitle': 'Αποτυχία αναβάθμισης', + 'otaUpgradeFailedDesc': + 'Ελέγξτε τη σύνδεση συσκευής ή το πακέτο ενημέρωσης, κωδικός σφάλματος: @code', + 'otaDeviceDisconnected': 'Η συσκευή αποσυνδέθηκε', + 'otaDeviceConnected': 'Η συσκευή συνδέθηκε', + // 音乐模块 "noMusic": "Δεν υπάρχει μουσική", // 暂无音乐 "noPlayingMusic": "Δεν παίζει μουσική", // 暂无播放音乐 diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index cb2923627..0f8570890 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -1,5 +1,4 @@ const Map enUS = { - // 通用 'continue': 'Continue', 'confirm': 'Confirm', @@ -129,7 +128,8 @@ const Map enUS = { "aiAssistant": "AI Assistant", "aiAssistantInfo": "24/7 personal consultant for questions and advice", "interpretation": "Translation", - "simultaneousInterpretationInfo": "Real-time translation for multiple languages", + "simultaneousInterpretationInfo": + "Real-time translation for multiple languages", "aiCompanion": "Parent-child bonding", "aiCompanionInfo": "Understands you and provides warm companionship", "homeSlogan": "Connect the World, Beyond Sound", @@ -166,6 +166,29 @@ const Map enUS = { 'right': 'Right', 'checkConnectionStatusFailed': 'Failed to check connection status', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth initialization failed: @error', + 'needBluetoothAndLocationPermission': + 'Bluetooth and location permissions are required to scan devices', + 'permissionRequestFailedWithError': 'Permission request failed: @error', + 'needPermission': 'Permission Required', + 'blePermissionDialogContent': + 'This app requires Bluetooth and location permissions to scan devices. Please enable them in Settings.', + 'needEnableBluetooth': 'Enable Bluetooth', + 'enableBluetoothDialogContent': + 'Please enable Bluetooth to scan and connect devices.', + 'bleScanFailedWithError': 'Scan failed: @error', + 'bleConnectionSuccess': 'Connection Successful', + 'bleConnectedToDevice': 'Connected to @device', + 'bleConnectionFailedWithError': 'Connection failed: @error', + 'bleDisconnected': 'Disconnected', + 'bleDeviceDisconnected': 'Device disconnected', + 'bleDisconnectFailedWithError': 'Disconnect failed: @error', + 'signalStrong': 'Strong', + 'signalMedium': 'Medium', + 'signalWeak': 'Weak', + 'signalVeryWeak': 'Very Weak', + // 发现页 "searchAi": "Search AI features...", "exploreSlogan": "Smart Earbuds, Infinite Possibilities", @@ -726,7 +749,8 @@ const Map enUS = { 'playerNotReady': 'Audio player is not ready, please wait', 'playFailed': 'Playback failed', 'audioFileNotFound': 'Audio file not found', - 'fetchingAudio': 'Fetching audio from cloud...', // Prompt shown when local audio file is missing and downloading from cloud + 'fetchingAudio': + 'Fetching audio from cloud...', // Prompt shown when local audio file is missing and downloading from cloud 'playerLoadFailed': 'Audio player failed to load', // 设置页 @@ -890,6 +914,13 @@ const Map enUS = { 'We want to know the reason for your report, you can describe the problem you encountered.', 'generatedByAi': 'Generated by AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Here are some recommended music:', 'playList': 'Playlist', @@ -912,6 +943,29 @@ const Map enUS = { // Agent模块 - 天气卡片 'weatherQuery': 'Weather Query:', + + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Failed to start navigation', + 'cannotPlayMusicListRetryLater': + 'Cannot play music list, please try again later', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Error opening map', + 'pleaseInstallAmapApp': 'Please install the Amap app first', + 'pleaseInstallBaiduMapApp': 'Please install the Baidu Maps app first', + 'appleMapStartFailed': 'Apple Maps failed to start', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Error opening Apple Maps', 'highest': 'High', 'lowest': 'Low', 'futureForecast': 'Future Forecast', @@ -982,7 +1036,18 @@ const Map enUS = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + "inputTextToTranslate": "Please enter the text to translate", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Disable Floating Window', + 'enableFloatingWindow': 'Enable Floating Window', + 'permissionTip': 'Permission Tip', + 'micPermissionRequiredForRecording': + 'Microphone permission is required for recording', + 'deleteTranslationRecordError': 'Error deleting translation record: @error', "translationFailed": "Translation failed", + "translating": "Translating", + "translate": "Translate", "pleaseInputText": "Please input text", "textTooLong": "Text too long, max 5000 characters", @@ -1402,6 +1467,59 @@ const Map enUS = { "removeEarbudsEnsureBattery": "Remove both earbuds and ensure battery level is above 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Upgrade Successful', + 'otaUpgradeCompleteRepair': + 'Firmware upgrade complete!\n\nDevice needs to be re-paired to work properly. Go to pairing page now?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': + 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': + 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': + 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', + // 音乐模块 "noMusic": "No Music", // 暂无音乐 "noPlayingMusic": "No Playing Music", // 暂无播放音乐 diff --git a/lib/core/translations/language/es_es.dart b/lib/core/translations/language/es_es.dart index 1bd49fe22..cdaad4f45 100644 --- a/lib/core/translations/language/es_es.dart +++ b/lib/core/translations/language/es_es.dart @@ -1,5 +1,4 @@ const Map esES = { - // 通用 'continue': 'Continuar', 'confirm': 'Confirmar', @@ -19,11 +18,11 @@ const Map esES = { "unknownError": "Error desconocido", "asrConnectionFailed": "La conexión con el servicio de reconocimiento de voz ha fallado. Comprueba la red o inténtalo de nuevo más tarde.", - "justNow": "Just now", - "minutesAgo": "@minutes minutes ago", - "yesterday": "Yesterday", - "daysAgo": "@days days ago", - "hoursAgo": "@hours hours ago", + "justNow": "Hace un momento", + "minutesAgo": "Hace @minutes minutos", + "yesterday": "Ayer", + "daysAgo": "Hace @days días", + "hoursAgo": "Hace @hours horas", // 启动页 "slogan": "Conectando el mundo, más allá del sonido", @@ -168,6 +167,30 @@ const Map esES = { 'right': 'Derecha', 'checkConnectionStatusFailed': 'Fallo al verificar estado de conexión', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Error al inicializar Bluetooth: @error', + 'needBluetoothAndLocationPermission': + 'Se necesitan permisos de Bluetooth y ubicacion para escanear dispositivos', + 'permissionRequestFailedWithError': + 'Error en la solicitud de permisos: @error', + 'needPermission': 'Permiso requerido', + 'blePermissionDialogContent': + 'Esta aplicacion necesita permisos de Bluetooth y ubicacion para escanear dispositivos. Por favor, activelos en Ajustes.', + 'needEnableBluetooth': 'Activar Bluetooth', + 'enableBluetoothDialogContent': + 'Por favor, active Bluetooth para escanear y conectar dispositivos.', + 'bleScanFailedWithError': 'Error en el escaneo: @error', + 'bleConnectionSuccess': 'Conexion exitosa', + 'bleConnectedToDevice': 'Conectado a @device', + 'bleConnectionFailedWithError': 'Error de conexion: @error', + 'bleDisconnected': 'Desconectado', + 'bleDeviceDisconnected': 'Dispositivo desconectado', + 'bleDisconnectFailedWithError': 'Error al desconectar: @error', + 'signalStrong': 'Fuerte', + 'signalMedium': 'Media', + 'signalWeak': 'Debil', + 'signalVeryWeak': 'Muy debil', + // 发现页 "searchAi": "Buscar funciones de IA...", "exploreSlogan": "Auriculares inteligentes, posibilidades infinitas", @@ -195,23 +218,23 @@ const Map esES = { "scene": "Escenarios", // 用量统计模块 - "aiChat": "AI Chat", - "translationStats": "Translation Statistics", - "meetingStats": "Meeting Statistics", - "today": "Today", - "thisWeek": "This Week", - "thisMonth": "This Month", - "history": "History", - "currentSessionStats": "Current Session Stats", - "translationCount": "Translation Count", - "sessionDuration": "Session Duration", - "characters": "Characters", - "recordingDuration": "Recording Duration", - "totalApiCalls": "Total API Calls", - "sessionCount": "Session Count", - "totalCharacters": "Total Characters", - "apiCallStats": "API Call Stats", - "translationApi": "Translation API", + "aiChat": "Chat de IA", + "translationStats": "Estadísticas de traducción", + "meetingStats": "Estadísticas de reuniones", + "today": "Hoy", + "thisWeek": "Esta semana", + "thisMonth": "Este mes", + "history": "Historial", + "currentSessionStats": "Estadísticas de la sesión actual", + "translationCount": "Cantidad de traducciones", + "sessionDuration": "Duración de la sesión", + "characters": "Caracteres", + "recordingDuration": "Duración de la grabación", + "totalApiCalls": "Total de llamadas API", + "sessionCount": "Número de sesiones", + "totalCharacters": "Total de caracteres", + "apiCallStats": "Estadísticas de llamadas API", + "translationApi": "API de traducción", "asr": "ASR", "tts": "TTS", "dataVolumeStats": "Data Volume Stats", @@ -228,11 +251,11 @@ const Map esES = { "mostUsedMode": "Most-used mode", "asrApiCalls": "ASR Calls", "totalAudioDuration": "Total Audio Duration", - "audioFileSize": "Audio File Size", - "transcriptBytes": "Transcript Bytes", - "loadFailed": "Load Failed", + "audioFileSize": "Tamaño del archivo de audio", + "transcriptBytes": "Bytes de transcripción", + "loadFailed": "Error al cargar", "statsLoadFailedTryLater": - "Statistics failed to load. Please try again later.", + "No se pudieron cargar las estadísticas. Inténtalo de nuevo más tarde.", "cleanupComplete": "Cleanup Complete", "cleanedOldData": "Cleaned data older than 90 days", "exportFeature": "Export Feature", @@ -244,66 +267,71 @@ const Map esES = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Pago exitoso', - 'paymentFailed': 'Pago fallido', - 'gotIt': 'Entendido', - 'paymentFailedTryAgain': 'Pago fallido. Por favor, intente de nuevo.', - 'selectPaymentMethod': 'Seleccione el método de pago', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Error al crear el pedido de WeChat', - 'alipayOrderCreateFailed': 'Error al crear el pedido de Alipay', - 'appleOrderCreateFailed': 'Error al crear el pedido de Apple', - 'googleOrderCreateFailed': 'Error al crear el pedido de Google', - 'paypalOrderCreateFailed': 'Error al crear el pedido de PayPal', - 'paymentException': 'Excepción de pago', - 'paymentLaunchFailed': 'Error al iniciar el pago', - 'paymentExceptionWithError': 'Excepción de pago: @error', - 'paymentProcessingCheckLater': 'Su pedido está siendo procesado. Por favor, verifique más tarde.', - 'paymentResultQueryException': 'Error al consultar el resultado del pago: @error', - 'orderConfirmedQuotaRefreshed': 'Pedido confirmado. Su cuota ha sido actualizada.', - 'paymentCompletedConfirming': 'Pago completado. Confirmando…', - 'paymentCancelled': 'Pago cancelado', - 'paypalOpenedCompleteInBrowser': 'PayPal abierto. Por favor, complete el pago en su navegador.', - 'paypalOpenFailed': 'No se puede abrir la página de pago de PayPal', - 'paymentTestTitle': 'Prueba de pago', - 'paymentTestOrderInfo': 'Información del pedido de prueba', - 'paymentTestProductId': 'ID del producto', - 'paymentTestProductDescription': 'Descripción del producto', - 'paymentTestWechatDescription': 'Prueba de pago con WeChat', - 'paymentTestAlipayDescription': 'Prueba de pago con Alipay', - 'paymentTestAmount': 'Monto', - 'paymentTestSelectAmount': 'Seleccione el monto de prueba', - 'paying': 'Pagando...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Estado del pago', - 'errorInfoWithMessage': 'Error: @message', - 'retest': 'Volver a probar', - 'paymentTestInstructionsTitle': 'Instrucciones', - 'paymentTestInstructionsContent': '1. Seleccione un monto de prueba (recomendado: ¥0.01)\n2. Haga clic en el botón de pago para iniciar\n3. Complete el pago en la aplicación de pago\n4. Regrese para verificar el resultado', - 'startingWechatPayment': 'Iniciando WeChat Pay...', - 'startingAlipayPayment': 'Iniciando Alipay...', - 'wechatPaymentSuccess': '¡Pago con WeChat Pay exitoso!', - 'wechatPaymentFailed': 'Fallo de WeChat Pay', - 'wechatPaymentLaunchFailed': 'Error al iniciar WeChat Pay', - 'cannotLaunchWechatPayment': 'No se puede iniciar WeChat Pay', - 'wechatPaymentException': 'Excepción de WeChat Pay', - 'wechatPaymentTestCompleted': 'Prueba de WeChat Pay completada', - 'alipayPaymentSuccess': '¡Pago con Alipay exitoso!', - 'alipayPaymentFailed': 'Fallo de Alipay', - 'alipayPaymentLaunchFailed': 'Error al iniciar Alipay', - 'cannotLaunchAlipayPayment': 'No se puede iniciar Alipay', - 'alipayPaymentException': 'Excepción de Alipay', - "insufficientIntegral": "Insufficient integral", + 'paymentSuccess': 'Pago exitoso', + 'paymentFailed': 'Pago fallido', + 'gotIt': 'Entendido', + 'paymentFailedTryAgain': 'Pago fallido. Por favor, intente de nuevo.', + 'selectPaymentMethod': 'Seleccione el método de pago', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Error al crear el pedido de WeChat', + 'alipayOrderCreateFailed': 'Error al crear el pedido de Alipay', + 'appleOrderCreateFailed': 'Error al crear el pedido de Apple', + 'googleOrderCreateFailed': 'Error al crear el pedido de Google', + 'paypalOrderCreateFailed': 'Error al crear el pedido de PayPal', + 'paymentException': 'Excepción de pago', + 'paymentLaunchFailed': 'Error al iniciar el pago', + 'paymentExceptionWithError': 'Excepción de pago: @error', + 'paymentProcessingCheckLater': + 'Su pedido está siendo procesado. Por favor, verifique más tarde.', + 'paymentResultQueryException': + 'Error al consultar el resultado del pago: @error', + 'orderConfirmedQuotaRefreshed': + 'Pedido confirmado. Su cuota ha sido actualizada.', + 'paymentCompletedConfirming': 'Pago completado. Confirmando…', + 'paymentCancelled': 'Pago cancelado', + 'paypalOpenedCompleteInBrowser': + 'PayPal abierto. Por favor, complete el pago en su navegador.', + 'paypalOpenFailed': 'No se puede abrir la página de pago de PayPal', + 'paymentTestTitle': 'Prueba de pago', + 'paymentTestOrderInfo': 'Información del pedido de prueba', + 'paymentTestProductId': 'ID del producto', + 'paymentTestProductDescription': 'Descripción del producto', + 'paymentTestWechatDescription': 'Prueba de pago con WeChat', + 'paymentTestAlipayDescription': 'Prueba de pago con Alipay', + 'paymentTestAmount': 'Monto', + 'paymentTestSelectAmount': 'Seleccione el monto de prueba', + 'paying': 'Pagando...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Estado del pago', + 'errorInfoWithMessage': 'Error: @message', + 'retest': 'Volver a probar', + 'paymentTestInstructionsTitle': 'Instrucciones', + 'paymentTestInstructionsContent': + '1. Seleccione un monto de prueba (recomendado: ¥0.01)\n2. Haga clic en el botón de pago para iniciar\n3. Complete el pago en la aplicación de pago\n4. Regrese para verificar el resultado', + 'startingWechatPayment': 'Iniciando WeChat Pay...', + 'startingAlipayPayment': 'Iniciando Alipay...', + 'wechatPaymentSuccess': '¡Pago con WeChat Pay exitoso!', + 'wechatPaymentFailed': 'Fallo de WeChat Pay', + 'wechatPaymentLaunchFailed': 'Error al iniciar WeChat Pay', + 'cannotLaunchWechatPayment': 'No se puede iniciar WeChat Pay', + 'wechatPaymentException': 'Excepción de WeChat Pay', + 'wechatPaymentTestCompleted': 'Prueba de WeChat Pay completada', + 'alipayPaymentSuccess': '¡Pago con Alipay exitoso!', + 'alipayPaymentFailed': 'Fallo de Alipay', + 'alipayPaymentLaunchFailed': 'Error al iniciar Alipay', + 'cannotLaunchAlipayPayment': 'No se puede iniciar Alipay', + 'alipayPaymentException': 'Excepción de Alipay', + "insufficientIntegral": "Puntos insuficientes", "insufficientBalanceDesc": - 'Insufficient balance, please go to the corresponding recharge page to recharge.', - "recharge": 'Go to Recharge', + 'Saldo insuficiente, ve a la página de recarga correspondiente para recargar.', + "recharge": 'Ir a recargar', "aiMemberExpiredDesc": - 'AI membership expired, please go to the membership recharge page to renew.', + 'La suscripción de IA ha caducado, ve a la página de recarga de membresía para renovarla.', // 商品模块 - AI商品页 'musicAndRecommendation': 'Music & Recommendation', @@ -331,18 +359,18 @@ const Map esES = { 'templatedMessagesAndScheduleReminders': 'Template messages and schedule reminders', 'aiDisclaimer': - 'Features depend on device permissions, service availability, and network conditions.', + 'Las funciones dependen de los permisos del dispositivo, la disponibilidad del servicio y las condiciones de la red.', // 商品模块 - 翻译商品页 'realtimeTranscription': 'Real-time Transcription', 'sceneLexicon': 'Scenario Glossary', 'subtitleDisplay': 'Subtitles', 'transHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'Interpretación simultánea en tiempo real y traducción de texto con voz de baja latencia.', 'transHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', + 'translateZhEn': 'Traducción chino–inglés', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', + 'multiLangTextTranslation': 'Traducción de texto multilingüe', 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', @@ -350,18 +378,18 @@ const Map esES = { 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', 'colorHighContrast': 'High color contrast', 'transDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'El rendimiento de la traducción depende del micrófono, la latencia de la red y el ruido ambiental.', // 商品模块 - 会议商品页 - 'meetingRecording': 'Meeting Recording', + 'meetingRecording': 'Grabación de reuniones', 'transcriptionAndSummary': 'Transcription & Summary', 'keywordSearch': 'Keyword Search', 'collaborationSharing': 'Collaboration & Sharing', 'meetingHeaderDesc1': - 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', + 'Grabación de audio, transcripción, búsqueda por palabras clave y resumen automático para mejorar la eficiencia de las reuniones.', 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', - 'meetingAutoRecording': 'Auto recording and segmentation', + 'meetingAutoRecording': 'Grabación y segmentación automática', 'meetingSpeakerTagging': 'Speaker labeling', 'meetingLongAudioTranscription': 'Long audio transcription', 'meetingKeyPointSummary': 'Key point extraction', @@ -370,7 +398,7 @@ const Map esES = { 'meetingExportSummary': 'Export minutes', 'meetingMultiPlatformShare': 'Share across platforms', 'meetingDisclaimer': - 'Use in quiet environments; performance depends on microphone and network.', + 'Úsalo en entornos silenciosos; el rendimiento depende del micrófono y la red.', // 商品模块 - VIP会员页 'benefitsOverview': 'Benefits overview', @@ -384,7 +412,7 @@ const Map esES = { 'longTermDiscountPlan': 'Long-term discount plan', 'generalPrivileges': 'General privileges', 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', + 'crossDeviceSync': 'Sincronización entre dispositivos', 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', @@ -395,18 +423,18 @@ const Map esES = { 'meet_001_name': 'Meeting Basic 100', 'meet_002_name': 'Meeting Basic 500', 'meet_003_name': 'Meeting Basic 1000', - 'trans_001_name': 'Translation Basic 100', - 'trans_002_name': 'Translation Basic 500', - 'trans_003_name': 'Translation Basic 1000', + 'trans_001_name': 'Traducción Básica 100', + 'trans_002_name': 'Traducción Básica 500', + 'trans_003_name': 'Traducción Básica 1000', 'ai_001_desc': 'Includes 100 uses. Access core AI features.', 'ai_002_desc': 'Includes 500 uses. Access core AI features.', 'ai_003_desc': 'Includes 1000 uses. Access core AI features.', - 'meet_001_desc': 'Includes 100 meeting recordings/transcriptions.', - 'meet_002_desc': 'Includes 500 meeting recordings/transcriptions.', - 'meet_003_desc': 'Includes 1000 meeting recordings/transcriptions.', - 'trans_001_desc': 'Includes 100 translations (voice/text).', - 'trans_002_desc': 'Includes 500 translations (voice/text).', - 'trans_003_desc': 'Includes 1000 translations (voice/text).', + 'meet_001_desc': 'Incluye 100 grabaciones/transcripciones de reuniones.', + 'meet_002_desc': 'Incluye 500 grabaciones/transcripciones de reuniones.', + 'meet_003_desc': 'Incluye 1000 grabaciones/transcripciones de reuniones.', + 'trans_001_desc': 'Incluye 100 traducciones (voz/texto).', + 'trans_002_desc': 'Incluye 500 traducciones (voz/texto).', + 'trans_003_desc': 'Incluye 1000 traducciones (voz/texto).', // 商品模块 - 页脚 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', @@ -462,52 +490,61 @@ const Map esES = { 'recordingDetails': 'Detalles de grabación', 'aiSummary': 'Resumen de IA', 'meetingTranscript': 'Transcripción de reunión', - 'files': 'Files', - 'mine': 'Mine', - 'connect': 'Connect', - 'allFiles': 'All Files', - 'searchInAllFiles': 'Search in all files', - 'from': 'From', - 'sortBy': 'Sort by', - 'creationTime': 'Creation Time', - 'bluetoothConnection': 'Bluetooth Connection', - 'meetingReconnect': 'Reconnect', - 'searching': 'Searching...', - 'searchFailed': 'Search failed, please check if Bluetooth is enabled', - 'aiPenNotFound': 'AI PEN device not found', - 'connectedToAiPen': 'Connected to AI PEN device', - 'checkingNewFiles': 'Checking for new files to import', + 'files': 'Archivos', + 'mine': 'Míos', + 'connect': 'Conectar', + 'allFiles': 'Todos los archivos', + 'searchInAllFiles': 'Buscar en todos los archivos', + 'from': 'Desde', + 'sortBy': 'Ordenar por', + 'creationTime': 'Hora de creación', + 'bluetoothConnection': 'Conexión Bluetooth', + 'meetingReconnect': 'Reconectar', + 'searching': 'Buscando...', + 'searchFailed': 'La búsqueda falló, comprueba si Bluetooth está activado', + 'aiPenNotFound': 'Dispositivo AI PEN no encontrado', + 'connectedToAiPen': 'Conectado al dispositivo AI PEN', + 'checkingNewFiles': 'Comprobando archivos nuevos para importar', 'startingWifi': 'Starting Wi-Fi...', 'newFilesDetected': 'New files detected, preparing to import', 'noNewFiles': 'No new files to import', - 'connectingWifi': 'Connecting to Wi-Fi...', - 'wifiConnected': 'Wi-Fi connected successfully', - 'downloadingFiles': 'Downloading files...', - 'downloadingFileProgress': 'Total {total} files, downloading file {current}', - 'downloadComplete': 'Download complete', + 'connectingWifi': 'Conectando a la red Wi‑Fi...', + 'wifiConnected': 'Conexión Wi‑Fi realizada correctamente', + 'downloadingFiles': 'Descargando archivos...', + 'downloadingFileProgress': + 'Total {total} archivos, descargando archivo {current}', + 'downloadComplete': 'Descarga completada', 'downloadCompleteInfo': - 'Download complete, {count} files in total, returning automatically in 2 seconds', + 'Descarga completada, {count} archivos en total, volviendo automáticamente en 2 segundos', // Meeting模块 - 录音功能 - 'startRecording': 'Start Recording', - 'liveRecording': 'Live Recording', - 'audioVideoRecording': 'Audio/Video Recording', - 'callRecording': 'Call Recording', + 'startRecording': 'Iniciar grabación', + 'liveRecording': 'Grabación en vivo', + 'audioVideoRecording': 'Grabación de audio/vídeo', + 'callRecording': 'Grabación de llamadas', 'importAudio': 'Import Audio', 'meetingRecordExitTitle': 'Salir de la grabación', // 退出录音 'meetingRecordExitMessage': 'Elige qué hacer antes de salir', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Finalizar y guardar', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Finalizar sin guardar', // 结束录音不保存 - 'meetingRecordContinueInBackground': 'Continuar grabando en segundo plano', // 后台继续录音 - 'meetingRecordStopTimeout': 'Se agotó el tiempo para detener la grabación. Inténtalo de nuevo.', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'No se pudo detener la grabación. Inténtalo de nuevo.', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'No se pudo guardar la grabación. Inténtalo de nuevo.', // 保存录音失败,请重试 + 'meetingRecordContinueInBackground': + 'Continuar grabando en segundo plano', // 后台继续录音 + 'meetingRecordStopTimeout': + 'Se agotó el tiempo para detener la grabación. Inténtalo de nuevo.', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'No se pudo detener la grabación. Inténtalo de nuevo.', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'No se pudo guardar la grabación. Inténtalo de nuevo.', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'Grabación en curso', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Grabando en segundo plano. Toca para volver a la aplicación.', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'Grabando en segundo plano. Toca para volver a la aplicación.', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Mostrar sobre otras apps', // 悬浮窗权限 - 'overlayPermissionTranslationDesc': 'Para mostrar los resultados de la traducción durante llamadas o traducción de audio/vídeo, necesitamos el permiso de superposición. Esto te permite ver traducciones en tiempo real mientras usas otras apps.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 - 'overlayPermissionRecordingDesc': 'Para mostrar la barra flotante de grabación (temporizador/pausa/reanudar) durante la grabación, necesitamos el permiso de superposición.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 - 'overlayPermissionOpenSettingsFailed': 'No se pueden abrir los ajustes del sistema automáticamente. Abre Ajustes y habilita manualmente el permiso de superposición.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 + 'overlayPermissionTranslationDesc': + 'Para mostrar los resultados de la traducción durante llamadas o traducción de audio/vídeo, necesitamos el permiso de superposición. Esto te permite ver traducciones en tiempo real mientras usas otras apps.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 + 'overlayPermissionRecordingDesc': + 'Para mostrar la barra flotante de grabación (temporizador/pausa/reanudar) durante la grabación, necesitamos el permiso de superposición.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 + 'overlayPermissionOpenSettingsFailed': + 'No se pueden abrir los ajustes del sistema automáticamente. Abre Ajustes y habilita manualmente el permiso de superposición.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 'transcribing': 'Transcribing...', 'summarizing': 'Summarizing...', 'analyzing': 'Analyzing...', @@ -529,69 +566,71 @@ const Map esES = { 'inputAttendees': 'Enter Attendees', // Meeting模块 - 模版与生成 - 'selectSummaryTemplate': 'Select Summary Template', - 'useThisTemplate': 'Use This Template', - 'lastUsed': 'Last Used', - 'create': 'Crear', - 'templateDetails': 'Detalles de la plantilla', - 'tag': 'Etiqueta', - 'description': 'Descripción', - 'template': 'Plantilla', - 'deleteTemplate': 'Eliminar plantilla', - 'deleteTemplateConfirm': '¿Está seguro de que desea eliminar esta plantilla?', - 'editTemplate': 'Editar plantilla', - 'createTemplate': 'Crear plantilla', - 'name': 'Nombre', - 'templateContentHint': 'Por favor, introduzca el contenido de la plantilla. Consejo: Haga clic en el botón de AI de arriba para generar rápidamente el contenido de la plantilla según el nombre y la descripción que ingresó', - 'inputNameHint': 'Por favor, introduzca el nombre', - 'inputDescHint': 'Por favor, introduzca la descripción', - 'custom': 'Personalizado', - 'pleaseEnter': 'Por favor ingrese', - 'viewAll': 'View All', - 'recordingLanguage': 'Recording Language', - 'chineseSimplified': 'Chinese Mandarin (Simplified)', - 'meetingGenerateNow': 'Generate Now', - 'keyEventsAnalyzed': 'Analyzed {count} key events.', + 'selectSummaryTemplate': 'Seleccionar plantilla de resumen', + 'useThisTemplate': 'Usar esta plantilla', + 'lastUsed': 'Último uso', + 'create': 'Crear', + 'templateDetails': 'Detalles de la plantilla', + 'tag': 'Etiqueta', + 'description': 'Descripción', + 'template': 'Plantilla', + 'deleteTemplate': 'Eliminar plantilla', + 'deleteTemplateConfirm': '¿Está seguro de que desea eliminar esta plantilla?', + 'editTemplate': 'Editar plantilla', + 'createTemplate': 'Crear plantilla', + 'name': 'Nombre', + 'templateContentHint': + 'Por favor, introduzca el contenido de la plantilla. Consejo: Haga clic en el botón de AI de arriba para generar rápidamente el contenido de la plantilla según el nombre y la descripción que ingresó', + 'inputNameHint': 'Por favor, introduzca el nombre', + 'inputDescHint': 'Por favor, introduzca la descripción', + 'custom': 'Personalizado', + 'pleaseEnter': 'Por favor ingrese', + 'viewAll': 'Ver todo', + 'recordingLanguage': 'Idioma de grabación', + 'chineseSimplified': 'Chino mandarín (simplificado)', + 'meetingGenerateNow': 'Generar ahora', + 'keyEventsAnalyzed': 'Se han analizado {count} eventos clave.', 'aiAnalysisDesc': - 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', + 'El análisis de IA identifica eventos clave en las grabaciones, lo que te permite seleccionar los más importantes para la generación por IA.', // Meeting模块 - 文件操作 - 'importing': 'Importing...', - 'batchImporting': 'Batch importing...', - 'importingLocalRecordings': 'Importing local recordings...', - 'importFailed': 'Import file failed: {filePath}, error: {error}', - 'importSuccess': 'Successfully imported {count} local recordings', - 'importError': 'Import failed: {error}', - 'pleaseSelectAudioFile': 'Please select audio file', - 'shareAudio': 'Share Meeting Audio', - 'shareComplete': 'Share complete!', - 'shareFailed': 'Share failed: {error}', - 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', + 'importing': 'Importando...', + 'batchImporting': 'Importando en lote...', + 'importingLocalRecordings': 'Importando grabaciones locales...', + 'importFailed': 'Error al importar el archivo: {filePath}, error: {error}', + 'importSuccess': 'Se han importado correctamente {count} grabaciones locales', + 'importError': 'Error de importación: {error}', + 'pleaseSelectAudioFile': 'Selecciona un archivo de audio', + 'shareAudio': 'Compartir audio de la reunión', + 'shareComplete': 'Compartido correctamente', + 'shareFailed': 'Error al compartir: {error}', + 'fileProcessingFailed': + 'Error al procesar el archivo: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Guardar mapa mental', - 'shareMindMap': 'Share Mind Map', - 'shareSuccess': 'Share Success', + 'saveMindMap': 'Guardar mapa mental', + 'shareMindMap': 'Compartir mapa mental', + 'shareSuccess': 'Compartido correctamente', // Meeting模块 - AI问答 - 'askAI': 'Ask AI ...', - 'askAIPrompt': 'What can I help you with today?', - 'continueAsk': 'Continue Asking', - 'todoList': 'To-Do List', - 'extractConclusion': 'Extract Conclusion', - 'generateKeyIndicators': 'Generate Key Indicators', + 'askAI': 'Preguntar a la IA...', + 'askAIPrompt': '¿En qué puedo ayudarte hoy?', + 'continueAsk': 'Seguir preguntando', + 'todoList': 'Lista de tareas', + 'extractConclusion': 'Extraer conclusiones', + 'generateKeyIndicators': 'Generar indicadores clave', // Meeting模块 - 分享与导出 - 'shareLink': 'Share Link', - 'copyTranscript': 'Copy Transcript', - 'copySummary': 'Copy Summary', - 'exportAudio': 'Export Audio', - 'exportTranscript': 'Export Transcript', - 'shareMeetingAudio': 'Share Meeting Audio', - 'exportSummary': 'Export Summary', - 'exportAs': 'Export As', - 'exportingPDF': 'Exporting PDF...', - 'export': 'Exportar', + 'shareLink': 'Compartir enlace', + 'copyTranscript': 'Copiar transcripción', + 'copySummary': 'Copiar resumen', + 'exportAudio': 'Exportar audio', + 'exportTranscript': 'Exportar transcripción', + 'shareMeetingAudio': 'Compartir audio de la reunión', + 'exportSummary': 'Exportar resumen', + 'exportAs': 'Exportar como', + 'exportingPDF': 'Exportando PDF...', + 'export': 'Exportar', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Aplicar a todos los párrafos de este orador', @@ -605,66 +644,67 @@ const Map esES = { 'Summary speakers will be updated automatically', // Meeting模块 - 云端同步 - 'syncToCloud': 'Sync to Cloud', + 'syncToCloud': 'Sincronizar en la nube', 'syncToCloudTip': - 'Automatically sync your recordings to the cloud, you can play, manage and share recordings through any VOITRANS APP or VOITRANS Web (web.voitrans.com).', - 'syncToVoitransApp': 'Sync VOITRANS APP', - 'transcriptionRecord': 'Transcription Record', + 'Sincroniza automáticamente tus grabaciones en la nube; puedes reproducir, gestionar y compartir grabaciones desde cualquier VOITRANS APP o VOITRANS Web (web.voitrans.com).', + 'syncToVoitransApp': 'Sincronizar VOITRANS APP', + 'transcriptionRecord': 'Registro de transcripción', // Meeting模块 - 我的页面 - 'transcriptionRecords': 'Transcription Records', - 'templateCommunity': 'Template Community', - 'comingSoon': 'Coming Soon', - 'integration': 'Integration', + 'transcriptionRecords': 'Registros de transcripción', + 'templateCommunity': 'Comunidad de plantillas', + 'comingSoon': 'Próximamente', + 'integration': 'Integración', 'voitransPrivateCloud': 'VOITRANS PRIVATE CLOUD', - 'enabled': 'Enabled', - 'disabled': 'Disabled', - 'myVoitransDevice': 'My VOITRANS Device', - 'helpAndFeedback': 'Help & Feedback', - 'aboutVoitrans': 'About VOITRANS', - 'meetingDays': 'Days', - 'meetingHours': 'Hours', - 'voitransAiMember': 'Voitrans AI Member', - 'unlockStarterMember': 'Unlock Starter Member', - 'bindDeviceToActivate': 'Bind Voitrans device to activate Starter membership', - 'unlockNow': 'Unlock Now', + 'enabled': 'Activado', + 'disabled': 'Desactivado', + 'myVoitransDevice': 'Mi dispositivo VOITRANS', + 'helpAndFeedback': 'Ayuda y comentarios', + 'aboutVoitrans': 'Acerca de VOITRANS', + 'meetingDays': 'Días', + 'meetingHours': 'Horas', + 'voitransAiMember': 'Miembro de Voitrans AI', + 'unlockStarterMember': 'Desbloquear miembro inicial', + 'bindDeviceToActivate': + 'Vincula un dispositivo Voitrans para activar la membresía Starter', + 'unlockNow': 'Desbloquear ahora', // Meeting模块 - 会员与升级 - 'comparison': 'Comparison', - 'detailedInfo': 'Detailed Information', - 'monthlyTranscriptionTime': 'Monthly Transcription Time', - 'unlimited': 'Unlimited', - 'professionalTemplates': 'Professional Templates', - 'limited': 'Limited', - 'fullTemplates': 'Full Templates', - 'professionalTerms': 'Professional Terms', - 'customTemplates': 'Custom Templates', - 'visualMindMap': 'Visual Mind Map', - 'speakerIdentification': 'Speaker Identification', - 'aiVoiceEnhancement': 'AI Voice Enhancement', - 'audioImport': 'Audio Import', - 'multipleExportFormats': 'Multiple Export Formats', - 'professionalSummaryTemplates': 'Professional Summary Templates', + 'comparison': 'Comparación', + 'detailedInfo': 'Información detallada', + 'monthlyTranscriptionTime': 'Tiempo de transcripción mensual', + 'unlimited': 'Ilimitado', + 'professionalTemplates': 'Plantillas profesionales', + 'limited': 'Limitado', + 'fullTemplates': 'Plantillas completas', + 'professionalTerms': 'Términos profesionales', + 'customTemplates': 'Plantillas personalizadas', + 'visualMindMap': 'Mapa mental visual', + 'speakerIdentification': 'Identificación de hablantes', + 'aiVoiceEnhancement': 'Mejora de voz por IA', + 'audioImport': 'Importación de audio', + 'multipleExportFormats': 'Varios formatos de exportación', + 'professionalSummaryTemplates': 'Plantillas de resumen profesionales', 'professionalTemplateDesc': - 'Professional template design to improve your work efficiency. Customized according to industry needs.', + 'Diseño de plantillas profesionales para mejorar tu eficiencia de trabajo. Personalizadas según las necesidades del sector.', 'customTemplateDesc': - 'You can customize summary prompts according to your needs and use them to generate the required summaries.', + 'Puedes personalizar indicaciones de resumen según tus necesidades y utilizarlas para generar los resúmenes necesarios.', 'askAiDesc': - 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', + 'Extrae de forma inteligente información más profunda de las grabaciones; genera tablas de datos, conclusiones clave de discusión, listas de tareas, correos de informe y otros contenidos formateados con un solo clic.', 'visualMindMapDesc': - 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', + 'Más allá de los resúmenes: organiza y visualiza los puntos clave con mapas mentales para comprender el texto completo de forma más eficaz.', 'templateCommunityDesc': - 'Discover, share, and get inspiration from the template library created by users.', + 'Descubre, comparte e inspírate en la biblioteca de plantillas creada por los usuarios.', 'speakerIdentificationDesc': - 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', + 'La transcripción de audio admitirá la identificación de hablantes, lo que restaurará de forma más intuitiva el contenido de reuniones o llamadas telefónicas y hará que el resumen sea más preciso.', 'privateCloudSyncDesc': - 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', + 'Tus grabaciones y transcripciones se almacenarán de forma segura en servidores en la nube dedicados, con cifrado completo durante la carga y descarga para garantizar la privacidad y la seguridad.', 'aiVoiceEnhancementDesc': - 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', + 'La mejora de voz por IA admite varios ajustes de reducción de ruido, elimina inteligentemente el ruido de fondo, mejora la claridad de la voz y mejora la calidad de reproducción de audio.', 'audioImportDesc': - 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', + 'Importa fácilmente archivos de audio desde aplicaciones locales o de terceros, como notas de voz, Google Drive, etc.', 'multipleExportFormatsDesc': - 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', + 'Exporta tus grabaciones de audio, textos de transcripción y resúmenes en varios formatos (TXT, PDF, JPEG) según tus necesidades.', 'upgradeMembership': 'Upgrade Your Membership', 'yearlySubscription': 'Yearly Subscription', 'monthlySubscription': 'Monthly Subscription', @@ -694,25 +734,25 @@ const Map esES = { 'purchase': 'Purchase', // Meeting模块 - 录音语言 - 'recordLanguage': 'Recording Language', + 'recordLanguage': 'Idioma de grabación', 'cantonese': 'Cantonese', 'sichuan': 'Sichuan Dialect', 'shanghai': 'Shanghai Dialect', // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Análisis fallido, por favor intente más tarde', - 'transcriptionFailed': 'Transcripción fallida, por favor intente más tarde', - 'summaryFailed': 'Resumen fallido, por favor intente más tarde', - 'summaryFailedShort': 'Resumen fallido', - 'transcriptionFailedShort': 'Transcripción fallida', + 'analysisFailed': 'Análisis fallido, por favor intente más tarde', + 'transcriptionFailed': 'Transcripción fallida, por favor intente más tarde', + 'summaryFailed': 'Resumen fallido, por favor intente más tarde', + 'summaryFailedShort': 'Resumen fallido', + 'transcriptionFailedShort': 'Transcripción fallida', // Meeting模块 - 播放器 - 'playerNotReady': 'El reproductor de audio no está listo, por favor espere', - 'playFailed': 'Reproducción fallida', - 'audioFileNotFound': 'Archivo de audio no encontrado', - 'fetchingAudio': 'Obteniendo audio desde la nube...', - 'playerLoadFailed': 'Error al cargar el reproductor de audio', + 'playerNotReady': 'El reproductor de audio no está listo, por favor espere', + 'playFailed': 'Reproducción fallida', + 'audioFileNotFound': 'Archivo de audio no encontrado', + 'fetchingAudio': 'Obteniendo audio desde la nube...', + 'playerLoadFailed': 'Error al cargar el reproductor de audio', // 设置页 "systemSettings": "Configuración del sistema", @@ -721,10 +761,10 @@ const Map esES = { "translationRecharge": "Recarga de traducción", "meetingAssistantRecharge": "Recarga de asistente de reunión", "cloudSync": "Recarga de sincronización en la nube", - "memberService": "Member Service", - "bindRewardTitle": "Rewards", + "memberService": "Servicio para miembros", + "bindRewardTitle": "Recompensas", "bindRewardSimpleDesc": - "First bind device reward has been issued. Tap OK to close.", + "Se ha emitido la recompensa por vincular el dispositivo por primera vez. Toca OK para cerrar.", "joinDevice": "Dispositivo conectado:", "accountId": "ID de cuenta:", "systemSetting": "Configuración del sistema", @@ -775,20 +815,20 @@ const Map esES = { "loading": "Cargando...", // 设备管理模块 - "deviceTypeUnknown": "Unknown Device", - "deviceTypeClassicBluetoothHeadset": "Classic Bluetooth Headset", - "deviceTypeBleBluetoothHeadset": "BLE Bluetooth Headset", - "deviceTypeSmartVoiceRecorder": "Smart Voice Recorder", - "deviceTypeSmartEye": "Smart Glasses", + "deviceTypeUnknown": "Dispositivo desconocido", + "deviceTypeClassicBluetoothHeadset": "Auriculares Bluetooth clásicos", + "deviceTypeBleBluetoothHeadset": "Auriculares Bluetooth BLE", + "deviceTypeSmartVoiceRecorder": "Grabadora de voz inteligente", + "deviceTypeSmartEye": "Gafas inteligentes", "unbind": "Desvincular", - "noDevicesBound": "No devices bound yet", - "pleaseBindDeviceFirst": "Please bind a device first to manage", - "noMacAddress": "No MAC Address", - "licenseCode": "License Code", - "confirmUnbind": "Confirm Unbind", + "noDevicesBound": "Aún no hay dispositivos vinculados", + "pleaseBindDeviceFirst": "Vincula primero un dispositivo para gestionarlo", + "noMacAddress": "Sin dirección MAC", + "licenseCode": "Código de licencia", + "confirmUnbind": "Confirmar desvinculación", "confirmUnbindMessage": - "Are you sure you want to unbind device \"{deviceName}\"?", - "confirmUnbindAction": "Confirm Unbind", + "¿Seguro que quieres desvincular el dispositivo \"{deviceName}\"?", + "confirmUnbindAction": "Confirmar desvinculación", // Agent模块 - 主界面 "Lily": "Lily", @@ -818,21 +858,22 @@ const Map esES = { "loadMoreMessages": "Cargar más mensajes...", "loadFailedClickRetry": "Carga fallida, haz clic para reintentar", "swipeUpForMore": "Desliza hacia arriba para más", - "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! + "callingTool": "Estoy ayudándote, por favor espera.", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Cuando está activado: La IA no será interrumpida por tu voz mientras habla y solo podrá manejar una ronda de conversación a la vez. Para iniciar una nueva ronda, simplemente di la palabra de activación.', + 'voice_interrupt_tip': + 'Cuando está activado: La IA no será interrumpida por tu voz mientras habla y solo podrá manejar una ronda de conversación a la vez. Para iniciar una nueva ronda, simplemente di la palabra de activación.', // Agent模块 - 预设提示词 - "presetMusic": "Play some music", // 来点音乐 - "presetNavigation": "Navigation to", // 导航 - "presetWeather": "Today's weather", // 今日天气 - "presetNews": "Today's news", // 今日新闻 - "presetFood": "Nearby food", // 美食 - "playSomeMusic": "Play some popular music", // 播放一些流行音乐 - "navigationTo": "Please help me navigate to", // 导航到 - "todayWeather": "How's the weather today?", // 今日天气 - "todayNews": "What's the news today?", // 今日新闻 - "nearbyFood": "What delicious food is nearby?", // 美食 + "presetMusic": "Pon algo de música", // 来点音乐 + "presetNavigation": "Navegar a", // 导航 + "presetWeather": "El tiempo de hoy", // 今日天气 + "presetNews": "Noticias de hoy", // 今日新闻 + "presetFood": "Comida cercana", // 美食 + "playSomeMusic": "Pon algo de música popular", // 播放一些流行音乐 + "navigationTo": "Ayúdame a navegar a", // 导航到 + "todayWeather": "¿Qué tiempo hace hoy?", // 今日天气 + "todayNews": "¿Qué noticias hay hoy?", // 今日新闻 + "nearbyFood": "¿Qué comida rica hay cerca?", // 美食 // Agent模块 - 欢迎消息与权限 'welcomeMessage': '¡Hola! Soy **Lily**, puedo ayudarte con:\n\n' @@ -877,6 +918,14 @@ const Map esES = { 'Queremos conocer la razón de tu reporte, puedes describir el problema que encontraste.', 'generatedByAi': 'Generado por IA', + // Agent模块 - 工具调用 + 'toolCall': 'Llamada de herramienta', + 'noResult': 'Sin resultado', + 'noToolCallContentToCopy': + 'No hay contenido de llamada de herramienta para copiar', + 'toolCallDetails': 'Detalles de la llamada de herramienta:', + 'toolCallContentCopied': 'Contenido de la llamada copiado al portapapeles', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Aquí tienes algunas músicas recomendadas:', 'playList': 'Lista de reproducción', @@ -897,6 +946,30 @@ const Map esES = { "bicycling": "Ciclismo", "tsransit": "Transporte público", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Seleccionar aplicacion de navegacion', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navegar con Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navegar con Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navegar con Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navegar con Apple Maps', + 'builtInNavigation': 'Navegacion integrada', + 'useBuiltInNavigation': 'Navegar con mapa integrado', + 'navigationStartFailed': 'Error al iniciar la navegacion', + 'cannotPlayMusicListRetryLater': + 'No se puede reproducir la lista de musica, intentelo mas tarde', + 'cannotPlaySong': 'No se puede reproducir la cancion', + 'openMapError': 'Error al abrir el mapa', + 'pleaseInstallAmapApp': 'Por favor, instale primero la aplicacion Amap', + 'pleaseInstallBaiduMapApp': + 'Por favor, instale primero la aplicacion Baidu Maps', + 'appleMapStartFailed': 'Error al iniciar Apple Maps', + 'appleMapUnavailable': 'Apple Maps no disponible', + 'openAppleMapError': 'Error al abrir Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Consulta del clima:', 'highest': 'Máxima', @@ -950,8 +1023,8 @@ const Map esES = { "strongWind": "Viento fuerte", // 翻译模块 - 中间层 - "pictureTranslation": "Picture Translation", - "textTranslation": "Text Translation", + "pictureTranslation": "Traducción de imágenes", + "textTranslation": "Traducción de texto", // 翻译模块 - 主页 "translationHistory": "Historial de traducción", @@ -961,22 +1034,34 @@ const Map esES = { "phoneUser": "Usuario de teléfono", "selectSourceLanguage": "Seleccionar idioma origen", "selectTargetLanguage": "Seleccionar idioma destino", - "me": "Me", - "counterPart": "Counterpart", + "me": "Yo", + "counterPart": "Interlocutor", "bluetoothCallStateError": - "Please make sure the Bluetooth headset is connected to the phone and in a call state", - "autoDetect": "Auto Detect", // 自动检测 + "Asegúrate de que los auriculares Bluetooth estén conectados al teléfono y en una llamada", + "autoDetect": "Detección automática", // 自动检测 // 翻译模块 - 文本翻译 - "languageDetectionFailed": "Language detection failed", - "translationFailed": "Translation failed", - "pleaseInputText": "Please input text", - "textTooLong": "Text too long, max 5000 characters", + "languageDetectionFailed": "Error en la detección de idioma", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Desactivar ventana flotante', + 'enableFloatingWindow': 'Activar ventana flotante', + 'permissionTip': 'Aviso de permiso', + 'micPermissionRequiredForRecording': + 'Se necesita permiso de microfono para grabar', + 'deleteTranslationRecordError': + 'Error al eliminar el registro de traduccion: @error', + "translationFailed": "La traducción ha fallado", + "translating": "Traduciendo", + "translate": "Traducir", + "pleaseInputText": "Introduce texto", + "inputTextToTranslate": "Por favor, introduzca el texto a traducir", + "textTooLong": "El texto es demasiado largo, máximo 5000 caracteres", // 翻译模块 - 历史记录 "noTranslationHistory": "Sin historial de traducción", - "historyRecords": "History Records", - "clearResults": "Clear Results", + "historyRecords": "Registros históricos", + "clearResults": "Borrar resultados", "clearHistory": "Limpiar historial", "clearHistoryConfirm": "¿Estás seguro de que quieres limpiar todo el historial de traducción? Esta operación no se puede deshacer.", @@ -986,55 +1071,57 @@ const Map esES = { "¿Estás seguro de que quieres eliminar todos los registros de traducción de esta sesión? Esta operación no se puede deshacer.", // 翻译模块 - 图片翻译 - "selectImageSource": "Select Image Source", - "imagePreview": "Image Preview", - "translationResult": "Translation Result", - "recognitionResult": "Recognition Result", - "translatedImagePreview": "Translated Image Preview", - "translatedImageLoadFailed": "Failed to load translated image", - "pleaseSelectImage": "Please select an image", - "imageLoadFailed": "Image load failed", - "imageQuality": "Image Quality", - "maxSize": "Max Size", - "close": "Close", - "setImageQuality": "Set Image Quality", - "currentQuality": "Current quality: @value%", - "setMaxSize": "Set Max Size", - "currentMaxSize": "Current: @pxpx", - "waitingForAction": "Waiting for action", - "pleaseSelectImageToStart": "Please select an image to start", - "chooseImage": "Choose Image", - "openingCamera": "Opening camera...", - "openingPhotoAlbum": "Opening photo album...", - "cancelled": "Cancelled", - "userCancelledSelection": "User cancelled selection", - "translatingImage": "Translating Image", - "callingImageTranslateService": "Calling image translation service...", - "savingRecord": "Saving Record", - "savingTranslationResult": "Saving translation result...", - "translationCompleted": "Translation Completed", - "allStepsCompleted": "All steps completed", - "processingFailed": "Processing Failed", + "selectImageSource": "Seleccionar origen de la imagen", + "imagePreview": "Vista previa de la imagen", + "translationResult": "Resultado de la traducción", + "recognitionResult": "Resultado del reconocimiento", + "translatedImagePreview": "Vista previa de la imagen traducida", + "translatedImageLoadFailed": "Error al cargar la imagen traducida", + "pleaseSelectImage": "Selecciona una imagen", + "imageLoadFailed": "Error al cargar la imagen", + "imageQuality": "Calidad de imagen", + "maxSize": "Tamaño máximo", + "close": "Cerrar", + "setImageQuality": "Configurar calidad de imagen", + "currentQuality": "Calidad actual: @value%", + "setMaxSize": "Configurar tamaño máximo", + "currentMaxSize": "Actual: @pxpx", + "waitingForAction": "Esperando acción", + "pleaseSelectImageToStart": "Selecciona una imagen para comenzar", + "chooseImage": "Elegir imagen", + "openingCamera": "Abriendo cámara...", + "openingPhotoAlbum": "Abriendo álbum de fotos...", + "cancelled": "Cancelado", + "userCancelledSelection": "El usuario canceló la selección", + "translatingImage": "Traduciendo imagen", + "callingImageTranslateService": + "Llamando al servicio de traducción de imágenes...", + "savingRecord": "Guardando registro", + "savingTranslationResult": "Guardando resultado de la traducción...", + "translationCompleted": "Traducción completada", + "allStepsCompleted": "Todos los pasos completados", + "processingFailed": "El procesamiento ha fallado", "imageProcessingOrTranslationFailed": - "Image processing or translation failed. Please retry.\nError: {error}", + "El procesamiento de la imagen o la traducción ha fallado. Inténtalo de nuevo.\nError: {error}", "imageTooLarge": "Image size exceeds 4MB limit", "imageTooLargeHint": "Image size exceeds 4MB. Reduce quality or dimensions and retry", - "emptyTranslationResult": "Image translation API returned empty result", + "emptyTranslationResult": + "La API de traducción de imágenes devolvió un resultado vacío", "imageTranslationFailedTryLater": - "Image translation failed. Network issue or rate limit. Please try later", + "La traducción de la imagen ha fallado. Problema de red o límite de frecuencia. Inténtalo más tarde", "imageTranslationApiException": - "Image translation API exception. Check network and retry", - "permissionRequired": "Permission Required", - "cameraPermissionRequired": "Camera permission required to take photos", + "Excepción de la API de traducción de imágenes. Comprueba la red e inténtalo de nuevo", + "permissionRequired": "Permiso requerido", + "cameraPermissionRequired": "Se necesita permiso de cámara para hacer fotos", "photoAlbumPermissionRequired": - "Photo album permission required to pick images", - "translationDetails": "Translation Details", - "originalImage": "Original Image", - "sourceLanguage": "Source Language", - "targetLanguage": "Target Language", - "translationTime": "Translation Time", - "shareInDevelopment": "Sharing feature under development", + "Se necesita permiso del álbum de fotos para seleccionar imágenes", + "translationDetails": "Detalles de la traducción", + "originalImage": "Imagen original", + "sourceLanguage": "Idioma origen", + "targetLanguage": "Idioma destino", + "translationTime": "Tiempo de traducción", + "shareInDevelopment": "La función de compartir está en desarrollo", // 翻译模块 - 录音文件 "translateAudioFiles": "Traducir archivos de audio", @@ -1131,18 +1218,18 @@ const Map esES = { 'AccountService inicializado', // AccountService 已初始化 // 权限模块 - 'meetingStoragePermission': 'Storage', + 'meetingStoragePermission': 'Almacenamiento', 'meetingStoragePermissionExplanation': - 'We need access to storage permissions so you can select and upload audio files.', + 'Necesitamos permisos de almacenamiento para que puedas seleccionar y subir archivos de audio.', 'meetingStoragePermissionPermanentDenial': - 'Detected that you have permanently denied storage permission. To continue using this feature, please go to app settings to manually enable storage permission.', + 'Se ha detectado que has denegado permanentemente el permiso de almacenamiento. Para seguir usando esta función, ve a la configuración de la aplicación y habilita el permiso de almacenamiento manualmente.', 'getPermissionStatusFailed': 'Fallo al obtener estado de permisos', 'communicationPermissions': 'Permisos de comunicación', - 'bluetoothPermissions': 'Bluetooth Permissions', - 'notificationPermissions': 'Notification Permissions', - 'storagePermissions': 'Storage Permissions', - 'microphonePermissions': 'Microphone Permissions', - 'alarmPermissions': 'Alarm Permissions', + 'bluetoothPermissions': 'Permisos de Bluetooth', + 'notificationPermissions': 'Permisos de notificaciones', + 'storagePermissions': 'Permisos de almacenamiento', + 'microphonePermissions': 'Permisos de micrófono', + 'alarmPermissions': 'Permisos de alarma', 'calendarPermissions': 'Permisos de calendario', 'locationPermissions': 'Permisos de ubicación', 'phone': 'Teléfono', @@ -1156,7 +1243,7 @@ const Map esES = { 'phonePermissionDesc': 'Se usa para la función de llamadas telefónicas', 'smsPermissionDesc': 'Se usa para la función de envío de SMS', 'alarmPermissionDesc': - 'Used to set exact alarms to ensure reminders trigger on time', + 'Se usa para configurar alarmas precisas y garantizar que los recordatorios se activen a tiempo', 'calendarWritePermissionDesc': 'Se usa para crear eventos y recordatorios del calendario', 'calendarFullAccessPermissionDesc': @@ -1177,86 +1264,91 @@ const Map esES = { 'smsPermissionDetailDesc': 'La función de envío de SMS necesita permiso de SMS', 'alarmPermissionDetailDesc': - 'This permission is required to set exact alarms and ensure reminders trigger on time', + 'Este permiso es necesario para configurar alarmas precisas y garantizar que los recordatorios se activen a tiempo', 'calendarWritePermissionDetailDesc': 'La creación de eventos del calendario necesita permiso de escritura del calendario', 'calendarFullAccessPermissionDetailDesc': 'La gestión de eventos del calendario necesita permiso completo del calendario', 'locationPermissionDetailDesc': 'Obtener información de ubicación necesita permiso de ubicación', - 'contactsPermissionDesc': 'Used for accessing contact information', + 'contactsPermissionDesc': 'Se usa para acceder a la información de contactos', 'contactsPermissionDetailDesc': - 'Phone call and SMS functionality requires contacts permission to select contacts', + 'Las funciones de llamadas telefónicas y SMS necesitan permiso de contactos para seleccionar contactos', 'bluetoothPermissionDesc': - 'Used for connecting and managing Bluetooth devices', + 'Se usa para conectar y gestionar dispositivos Bluetooth', 'bluetoothPermissionDetailDesc': - 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', - 'bluetoothScanPermissionDesc': 'Used for scanning nearby Bluetooth devices', + 'La conexión a auriculares Bluetooth y otros dispositivos requiere permiso de Bluetooth', + 'bluetoothScanPermissionDesc': + 'Se usa para escanear dispositivos Bluetooth cercanos', 'bluetoothScanPermissionDetailDesc': - 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', - 'bluetoothConnectPermissionDesc': 'Used for connecting to Bluetooth devices', + 'El escaneo de dispositivos Bluetooth cercanos requiere permiso de escaneo Bluetooth', + 'bluetoothConnectPermissionDesc': + 'Se usa para conectarse a dispositivos Bluetooth', 'bluetoothConnectPermissionDetailDesc': - 'Connecting to Bluetooth devices requires Bluetooth connect permission', - 'notificationPermissionDesc': 'Used for sending notification messages', + 'Conectarse a dispositivos Bluetooth requiere permiso de conexión Bluetooth', + 'notificationPermissionDesc': 'Se usa para enviar mensajes de notificación', 'notificationPermissionDetailDesc': - 'App needs notification permission to send you important alerts and messages', + 'La aplicación necesita permiso de notificaciones para enviarte alertas y mensajes importantes', 'appNeedsPermissionForFullFunction': 'La aplicación necesita este permiso para proporcionar funcionalidad completa', 'permanentDenialText': 'Has denegado permanentemente el permiso {permission}, ve a la configuración de la aplicación para habilitarlo', 'goToSettings': 'Ir a configuración', - 'bluetoothScan': 'Bluetooth Scan', - 'bluetoothConnect': 'Bluetooth Connect', + 'bluetoothScan': 'Escaneo Bluetooth', + 'bluetoothConnect': 'Conexión Bluetooth', 'bluetoothScanExplanation': - 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', + 'La aplicación necesita permiso de escaneo Bluetooth para detectar dispositivos Bluetooth cercanos.', 'bluetoothConnectExplanation': - 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', + 'La aplicación necesita permiso de conexión Bluetooth para conectarse a dispositivos Bluetooth.', 'locationForBluetoothExplanation': - 'The app needs location permission to scan Bluetooth devices.', + 'La aplicación necesita permiso de ubicación para escanear dispositivos Bluetooth.', 'bluetoothScanPermanentDenial': - 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', + 'El permiso de escaneo Bluetooth se ha denegado permanentemente; ve a los ajustes para habilitarlo manualmente.', 'bluetoothConnectPermanentDenial': - 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', + 'El permiso de conexión Bluetooth se ha denegado permanentemente; ve a los ajustes para habilitarlo manualmente.', 'locationPermanentDenial': - 'Location permission has been permanently denied, please go to settings to enable it manually.', - 'notificationPermission': 'Notification', - 'locationPermission': 'Location', + 'El permiso de ubicación se ha denegado permanentemente; ve a los ajustes para habilitarlo manualmente.', + 'notificationPermission': 'Notificaciones', + 'locationPermission': 'Ubicación', 'notificationPermissionExplanation': - 'Notification permission is required to display music playback status.', + 'Se necesita permiso de notificaciones para mostrar el estado de reproducción de música.', 'locationPermissionExplanation': - 'Location permission is required to get current location.', + 'Se necesita permiso de ubicación para obtener la ubicación actual.', 'notificationPermissionPermanentDenial': - 'You have permanently denied notification permission, please go to settings to enable it.', + 'Has denegado permanentemente el permiso de notificaciones; ve a los ajustes para habilitarlo.', 'locationPermissionPermanentDenial': - 'You have permanently denied location permission, please go to settings to enable it.', - 'storagePermission': 'Storage', + 'Has denegado permanentemente el permiso de ubicación; ve a los ajustes para habilitarlo.', + 'storagePermission': 'Almacenamiento', 'microphonePermissionExplanation': - 'We need microphone permission to record audio content.', + 'Necesitamos permiso de micrófono para grabar contenido de audio.', 'storagePermissionExplanation': - 'We need storage permission so you can select and upload audio files.', + 'Necesitamos permiso de almacenamiento para que puedas seleccionar y subir archivos de audio.', 'microphonePermissionPermanentDenial': - 'Microphone permission has been permanently denied. To continue using this feature, please go to app settings to manually enable microphone permission.', + 'El permiso de micrófono se ha denegado permanentemente. Para seguir usando esta función, ve a la configuración de la aplicación y habilita el permiso de micrófono manualmente.', 'storagePermissionPermanentDenial': - 'Storage permission has been permanently denied. To continue using this feature, please go to app settings to manually enable storage permission.', - 'permissionUtilNeed': 'Need ', - 'permissionUtilPermission': ' Permission', - 'permissionUtilRestricted': ' Permission Restricted', + 'El permiso de almacenamiento se ha denegado permanentemente. Para seguir usando esta función, ve a la configuración de la aplicación y habilita el permiso de almacenamiento manualmente.', + 'permissionUtilNeed': 'Necesita ', + 'permissionUtilPermission': ' permiso', + 'permissionUtilRestricted': ' permiso restringido', 'permissionUtilRestrictedMessage': - 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', + 'Esta función no está disponible o está restringida en el dispositivo actual; comprueba los ajustes del dispositivo o las restricciones del sistema', 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navegación en curso', - 'native.notification.navigation.keepRunning': 'Navegando, mantenga la aplicación en ejecución', - 'native.notification.bleAgent.running': 'El asistente de voz está en funcionamiento', - 'native.notification.audioRecording.recording': 'Grabando audio, toque para volver a la aplicación', - 'native.notification.music.waiting': 'Esperando para reproducir', - 'native.notification.music.previous': 'Anterior', - 'native.notification.music.next': 'Siguiente', - 'native.notification.music.play': 'Reproducir', - 'native.notification.music.pause': 'Pausa', - 'native.notification.qqMusic.playing': 'Reproduciendo música', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navegación en curso', + 'native.notification.navigation.keepRunning': + 'Navegando, mantenga la aplicación en ejecución', + 'native.notification.bleAgent.running': + 'El asistente de voz está en funcionamiento', + 'native.notification.audioRecording.recording': + 'Grabando audio, toque para volver a la aplicación', + 'native.notification.music.waiting': 'Esperando para reproducir', + 'native.notification.music.previous': 'Anterior', + 'native.notification.music.next': 'Siguiente', + 'native.notification.music.play': 'Reproducir', + 'native.notification.music.pause': 'Pausa', + 'native.notification.qqMusic.playing': 'Reproduciendo música', // 版本更新 'newVersionFound': 'Nueva versión encontrada', // 版本更新对话框标题 @@ -1332,17 +1424,18 @@ const Map esES = { 'bleConnectionFailed': 'Fallo en la conexión BLE', 'deviceAuthorizationFailedCheckCode': 'Fallo en la autorización del dispositivo, verifica el código de autorización', - 'bluetoothGuideTitle': 'Manual Bluetooth Activation Required', // 需要手动开启蓝牙 - 'bluetoothGuideSteps': 'Please follow these steps:', // 请按照以下步骤操作: + 'bluetoothGuideTitle': + 'Es necesario activar Bluetooth manualmente', // 需要手动开启蓝牙 + 'bluetoothGuideSteps': 'Sigue estos pasos:', // 请按照以下步骤操作: 'bluetoothGuideStep1': - 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 + 'Activa Bluetooth: Ajustes → Bluetooth → Activar', // 开启蓝牙:设置 → 蓝牙 → 开启 'bluetoothGuideStep2': - 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 + 'Conecta el dispositivo: busca tu dispositivo en "Mis dispositivos" y tócala para conectar', // 连接设备:在"我的设备"中找到您的设备并点击连接 'bluetoothGuideStep3': - 'Return to app to continue pairing process', // 返回应用继续配对流程 + 'Vuelve a la aplicación para continuar el proceso de emparejamiento', // 返回应用继续配对流程 'bluetoothGuideTip': - 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 - 'iKnow': 'I Know', // 我知道了 + 'Consejo: también puedes mantener pulsado el icono de Bluetooth en el Centro de control para acceder rápidamente a los ajustes de Bluetooth', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 + 'iKnow': 'Entendido', // 我知道了 // 配对模块 - 绑定奖励 "firstBindRewardTitle": "Welcome Reward", @@ -1382,13 +1475,14 @@ const Map esES = { "connectionFailed": "Fallo de conexión", "retryConnection": "Reintentar conexión", "ota_updateNow": "Actualizar ahora", - "otaVersionInfoFailed": "Failed to get version info. Please try again later.", + "otaVersionInfoFailed": + "No se pudo obtener la información de la versión. Inténtalo de nuevo más tarde.", "otaDeviceInfoUnavailable": - "Unable to get device info. Please check the connection and retry.", + "No se pudo obtener la información del dispositivo. Comprueba la conexión e inténtalo de nuevo.", "otaProductInfoUnavailable": - "Unable to identify the device. Please reconnect and retry.", + "No se pudo identificar el dispositivo. Vuelve a conectarlo e inténtalo de nuevo.", "otaFirmwareVersionInvalid": - "Firmware version is abnormal. Please reconnect and retry.", + "La versión del firmware es anómala. Vuelve a conectar el dispositivo e inténtalo de nuevo.", "keepConnectedDontClose": "Mantén el dispositivo conectado, no cierres la aplicación", "doNotDisconnect": "No desconectes", @@ -1397,6 +1491,60 @@ const Map esES = { "removeEarbudsEnsureBattery": "Retira ambos auriculares y asegúrate de que la batería de ambos esté por encima del 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Nueva version @version encontrada', + 'otaConfirmUpdateNow': 'Actualizar ahora?', + 'otaUpdate': 'Actualizar', + 'otaUpgradeSuccess': 'Actualizacion exitosa', + 'otaUpgradeCompleteRepair': + 'Actualizacion completada!\n\nEl dispositivo necesita reemparejarse. Ir a la pagina de emparejamiento?', + 'otaPairLater': 'Emparejar despues', + 'otaPairNow': 'Emparejar ahora', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error al verificar la conexion BLE: @error', + 'otaBleNotConnected': 'Dispositivo BLE no conectado', + 'otaBleNeedConnection': + 'Se requiere conexion BLE\nAsegurese de que el dispositivo este conectado e intente de nuevo', + 'otaDeviceInfoUnavailableTitle': 'Informacion del dispositivo no disponible', + 'otaCannotGetDeviceInfo': + 'No se puede obtener información del dispositivo\nVuelve a conectar el dispositivo o inténtalo de nuevo más tarde', + 'otaBleCheckFailed': 'Verificacion de conexion BLE fallida', + 'otaCannotGetDeviceInfoCheckConnection': + 'No se puede obtener informacion del dispositivo, verifique la conexion', + 'otaCannotGetProductInfoWithName': + 'No se puede obtener informacion del producto, nombre: @deviceName', + 'otaCannotGetBatteryInfo': + 'No se puede obtener informacion de bateria valida', + 'otaLowBattery': 'Bateria baja', + 'otaSingleBatteryLow': + 'Bateria demasiado baja\nRequisito: superior al 20%\nActual: @ear @battery%\nCargue e intente de nuevo', + 'otaDoubleBatteryLow': + 'Bateria demasiado baja\nRequisito: ambos auriculares por encima del 20%\nActual: Izquierdo @left%, Derecho @right%\nCargue e intente de nuevo', + 'otaBatteryCheckFailed': 'Verificacion de bateria fallida', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'Esta actualizacion incluye optimizaciones de rendimiento y correcciones de errores.', + 'otaGetLatestVersionFailed': 'Error al obtener la ultima version', + 'otaGetVersionInfoFailed': 'Error al obtener informacion de version', + 'otaCheckingDeviceStatus': 'Verificando estado del dispositivo...', + 'otaDownloadFailedCheckNetwork': + 'Descarga fallida, verifique la conexion de red', + 'otaDownloadFailed': 'Descarga fallida', + 'otaPreparingConnection': 'Preparando conexion del dispositivo...', + 'otaConnectingDevice': 'Conectando al dispositivo...', + 'otaUpgradeStarted': 'Actualizacion OTA iniciada...', + 'otaUpgradeProgressWithPercent': 'Progreso: @percent%', + 'otaUpgradeSuccessComplete': 'Actualizacion completada exitosamente', + 'otaUpgradeFailedWithCode': 'Actualizacion fallida, codigo de error: @code', + 'otaUpgradeFailedTitle': 'Actualizacion fallida', + 'otaUpgradeFailedDesc': + 'Verifique la conexion o el paquete de actualizacion, codigo: @code', + 'otaDeviceDisconnected': 'Dispositivo desconectado', + 'otaDeviceConnected': 'Dispositivo conectado', + // 音乐模块 "noMusic": "Sin música", // 暂无音乐 "noPlayingMusic": "Sin música reproduciéndose", // 暂无播放音乐 diff --git a/lib/core/translations/language/et_ee.dart b/lib/core/translations/language/et_ee.dart index 6462b3fea..a8417cc3e 100644 --- a/lib/core/translations/language/et_ee.dart +++ b/lib/core/translations/language/et_ee.dart @@ -1,5 +1,4 @@ const Map etEE = { - // 通用 'continue': 'Jätka', 'confirm': 'Kinnita', @@ -164,6 +163,29 @@ const Map etEE = { 'right': 'Parem', 'checkConnectionStatusFailed': 'Ühenduse oleku kontrollimine ebaõnnestus', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth initialization failed: @error', + 'needBluetoothAndLocationPermission': + 'Bluetooth and location permissions are required to scan devices', + 'permissionRequestFailedWithError': 'Permission request failed: @error', + 'needPermission': 'Permission Required', + 'blePermissionDialogContent': + 'This app requires Bluetooth and location permissions to scan devices. Please enable them in Settings.', + 'needEnableBluetooth': 'Enable Bluetooth', + 'enableBluetoothDialogContent': + 'Please enable Bluetooth to scan and connect devices.', + 'bleScanFailedWithError': 'Scan failed: @error', + 'bleConnectionSuccess': 'Connection Successful', + 'bleConnectedToDevice': 'Connected to @device', + 'bleConnectionFailedWithError': 'Connection failed: @error', + 'bleDisconnected': 'Disconnected', + 'bleDeviceDisconnected': 'Device disconnected', + 'bleDisconnectFailedWithError': 'Disconnect failed: @error', + 'signalStrong': 'Strong', + 'signalMedium': 'Medium', + 'signalWeak': 'Weak', + 'signalVeryWeak': 'Very Weak', + // 发现页 "searchAi": "Otsi AI funktsioone...", "exploreSlogan": "Nutikad kõrvaklapid, lõputud võimalused", @@ -239,60 +261,64 @@ const Map etEE = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Makse edukas', - 'paymentFailed': 'Makse ebaõnnestus', - 'gotIt': 'Selge', - 'paymentFailedTryAgain': 'Makse ebaõnnestus. Palun proovi uuesti.', - 'selectPaymentMethod': 'Vali makseviis', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'WeChat Pay tellimuse loomine ebaõnnestus', - 'alipayOrderCreateFailed': 'Alipay tellimuse loomine ebaõnnestus', - 'appleOrderCreateFailed': 'Apple tellimuse loomine ebaõnnestus', - 'googleOrderCreateFailed': 'Google tellimuse loomine ebaõnnestus', - 'paypalOrderCreateFailed': 'PayPal tellimuse loomine ebaõnnestus', - 'paymentException': 'Makse erand', - 'paymentLaunchFailed': 'Makse käivitamine ebaõnnestus', - 'paymentExceptionWithError': 'Makse erand: @error', - 'paymentProcessingCheckLater': 'Sinu tellimust töödeldakse. Palun kontrolli hiljem.', - 'paymentResultQueryException': 'Makse tulemuse päring ebaõnnestus: @error', - 'orderConfirmedQuotaRefreshed': 'Tellimus kinnitatud. Sinu kvoot on värskendatud.', - 'paymentCompletedConfirming': 'Makse sooritatud. Kinnitamine…', - 'paymentCancelled': 'Makse tühistatud', - 'paypalOpenedCompleteInBrowser': 'PayPal avatud. Palun vii makse lõpule brauseris.', - 'paypalOpenFailed': 'PayPal makseleht ei ava', - 'paymentTestTitle': 'Makse test', - 'paymentTestOrderInfo': 'Testtellimuse info', - 'paymentTestProductId': 'Toote ID', - 'paymentTestProductDescription': 'Toote kirjeldus', - 'paymentTestWechatDescription': 'WeChat Pay makse test', - 'paymentTestAlipayDescription': 'Alipay makse test', - 'paymentTestAmount': 'Summa', - 'paymentTestSelectAmount': 'Vali testisumma', - 'paying': 'Maksmine...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Makse olek', - 'errorInfoWithMessage': 'Viga: @message', - 'retest': 'Kordustest', - 'paymentTestInstructionsTitle': 'Juhised', - 'paymentTestInstructionsContent': '1. Vali testisumma (soovitatud: ¥0,01)\n2. Klõpsa maksenupul alustamiseks\n3. Vii makse lõpule makserakenduses\n4. Naase tulemuse kontrollimiseks', - 'startingWechatPayment': 'WeChat Pay käivitamine...', - 'startingAlipayPayment': 'Alipay käivitamine...', - 'wechatPaymentSuccess': 'WeChat Pay edukas!', - 'wechatPaymentFailed': 'WeChat Pay ebaõnnestus', - 'wechatPaymentLaunchFailed': 'WeChat Pay käivitamine ebaõnnestus', - 'cannotLaunchWechatPayment': 'WeChat Pay käivitamine ei õnnestu', - 'wechatPaymentException': 'WeChat Pay erand', - 'wechatPaymentTestCompleted': 'WeChat Pay test lõpetatud', - 'alipayPaymentSuccess': 'Alipay edukas!', - 'alipayPaymentFailed': 'Alipay ebaõnnestus', - 'alipayPaymentLaunchFailed': 'Alipay käivitamine ebaõnnestus', - 'cannotLaunchAlipayPayment': 'Alipay käivitamine ei õnnestu', - 'alipayPaymentException': 'Alipay erand', + 'paymentSuccess': 'Makse edukas', + 'paymentFailed': 'Makse ebaõnnestus', + 'gotIt': 'Selge', + 'paymentFailedTryAgain': 'Makse ebaõnnestus. Palun proovi uuesti.', + 'selectPaymentMethod': 'Vali makseviis', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'WeChat Pay tellimuse loomine ebaõnnestus', + 'alipayOrderCreateFailed': 'Alipay tellimuse loomine ebaõnnestus', + 'appleOrderCreateFailed': 'Apple tellimuse loomine ebaõnnestus', + 'googleOrderCreateFailed': 'Google tellimuse loomine ebaõnnestus', + 'paypalOrderCreateFailed': 'PayPal tellimuse loomine ebaõnnestus', + 'paymentException': 'Makse erand', + 'paymentLaunchFailed': 'Makse käivitamine ebaõnnestus', + 'paymentExceptionWithError': 'Makse erand: @error', + 'paymentProcessingCheckLater': + 'Sinu tellimust töödeldakse. Palun kontrolli hiljem.', + 'paymentResultQueryException': 'Makse tulemuse päring ebaõnnestus: @error', + 'orderConfirmedQuotaRefreshed': + 'Tellimus kinnitatud. Sinu kvoot on värskendatud.', + 'paymentCompletedConfirming': 'Makse sooritatud. Kinnitamine…', + 'paymentCancelled': 'Makse tühistatud', + 'paypalOpenedCompleteInBrowser': + 'PayPal avatud. Palun vii makse lõpule brauseris.', + 'paypalOpenFailed': 'PayPal makseleht ei ava', + 'paymentTestTitle': 'Makse test', + 'paymentTestOrderInfo': 'Testtellimuse info', + 'paymentTestProductId': 'Toote ID', + 'paymentTestProductDescription': 'Toote kirjeldus', + 'paymentTestWechatDescription': 'WeChat Pay makse test', + 'paymentTestAlipayDescription': 'Alipay makse test', + 'paymentTestAmount': 'Summa', + 'paymentTestSelectAmount': 'Vali testisumma', + 'paying': 'Maksmine...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Makse olek', + 'errorInfoWithMessage': 'Viga: @message', + 'retest': 'Kordustest', + 'paymentTestInstructionsTitle': 'Juhised', + 'paymentTestInstructionsContent': + '1. Vali testisumma (soovitatud: ¥0,01)\n2. Klõpsa maksenupul alustamiseks\n3. Vii makse lõpule makserakenduses\n4. Naase tulemuse kontrollimiseks', + 'startingWechatPayment': 'WeChat Pay käivitamine...', + 'startingAlipayPayment': 'Alipay käivitamine...', + 'wechatPaymentSuccess': 'WeChat Pay edukas!', + 'wechatPaymentFailed': 'WeChat Pay ebaõnnestus', + 'wechatPaymentLaunchFailed': 'WeChat Pay käivitamine ebaõnnestus', + 'cannotLaunchWechatPayment': 'WeChat Pay käivitamine ei õnnestu', + 'wechatPaymentException': 'WeChat Pay erand', + 'wechatPaymentTestCompleted': 'WeChat Pay test lõpetatud', + 'alipayPaymentSuccess': 'Alipay edukas!', + 'alipayPaymentFailed': 'Alipay ebaõnnestus', + 'alipayPaymentLaunchFailed': 'Alipay käivitamine ebaõnnestus', + 'cannotLaunchAlipayPayment': 'Alipay käivitamine ei õnnestu', + 'alipayPaymentException': 'Alipay erand', "insufficientIntegral": "Insufficient integral", "insufficientBalanceDesc": 'Insufficient balance, please go to the corresponding recharge page to recharge.', @@ -534,21 +560,22 @@ const Map etEE = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Loo', - 'templateDetails': 'Malli üksikasjad', - 'tag': 'Silt', - 'description': 'Kirjeldus', - 'template': 'Mall', - 'deleteTemplate': 'Kustuta mall', - 'deleteTemplateConfirm': 'Kas oled kindel, et soovid selle malli kustutada?', - 'editTemplate': 'Muuda malli', - 'createTemplate': 'Loo mall', - 'name': 'Nimi', - 'templateContentHint': 'Palun sisesta malli sisu! Vihje: Klõpsa ülaloleval AI nupul, et kiiresti genereerida malli sisu sisestatud nime ja kirjelduse põhjal', - 'inputNameHint': 'Palun sisesta nimi', - 'inputDescHint': 'Palun sisesta kirjeldus', - 'custom': 'Kohandatud', - 'pleaseEnter': 'Palun sisestage', + 'create': 'Loo', + 'templateDetails': 'Malli üksikasjad', + 'tag': 'Silt', + 'description': 'Kirjeldus', + 'template': 'Mall', + 'deleteTemplate': 'Kustuta mall', + 'deleteTemplateConfirm': 'Kas oled kindel, et soovid selle malli kustutada?', + 'editTemplate': 'Muuda malli', + 'createTemplate': 'Loo mall', + 'name': 'Nimi', + 'templateContentHint': + 'Palun sisesta malli sisu! Vihje: Klõpsa ülaloleval AI nupul, et kiiresti genereerida malli sisu sisestatud nime ja kirjelduse põhjal', + 'inputNameHint': 'Palun sisesta nimi', + 'inputDescHint': 'Palun sisesta kirjeldus', + 'custom': 'Kohandatud', + 'pleaseEnter': 'Palun sisestage', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', @@ -571,7 +598,7 @@ const Map etEE = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Salvesta mõttekaart', + 'saveMindMap': 'Salvesta mõttekaart', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -593,7 +620,7 @@ const Map etEE = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Ekspordi', + 'export': 'Ekspordi', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Rakenda selle kõneleja kõigile lõikudele', @@ -703,18 +730,18 @@ const Map etEE = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Analüüs ebaõnnestus, proovi hiljem uuesti', - 'transcriptionFailed': 'Transkriptsioon ebaõnnestus, proovi hiljem uuesti', - 'summaryFailed': 'Kokkuvõte ebaõnnestus, proovi hiljem uuesti', - 'summaryFailedShort': 'Kokkuvõte ebaõnnestus', - 'transcriptionFailedShort': 'Transkriptsioon ebaõnnestus', + 'analysisFailed': 'Analüüs ebaõnnestus, proovi hiljem uuesti', + 'transcriptionFailed': 'Transkriptsioon ebaõnnestus, proovi hiljem uuesti', + 'summaryFailed': 'Kokkuvõte ebaõnnestus, proovi hiljem uuesti', + 'summaryFailedShort': 'Kokkuvõte ebaõnnestus', + 'transcriptionFailedShort': 'Transkriptsioon ebaõnnestus', // Meeting模块 - 播放器 - 'playerNotReady': 'Helipleier pole valmis, palun oota', - 'playFailed': 'Esitamine ebaõnnestus', - 'audioFileNotFound': 'Helifaili ei leitud', - 'fetchingAudio': 'Helifaili tõmbamine pilvest...', - 'playerLoadFailed': 'Helipleieri laadimine ebaõnnestus', + 'playerNotReady': 'Helipleier pole valmis, palun oota', + 'playFailed': 'Esitamine ebaõnnestus', + 'audioFileNotFound': 'Helifaili ei leitud', + 'fetchingAudio': 'Helifaili tõmbamine pilvest...', + 'playerLoadFailed': 'Helipleieri laadimine ebaõnnestus', // 设置页 "systemSettings": "Süsteemi seaded", @@ -820,7 +847,8 @@ const Map etEE = { "swipeUpForMore": "Libista üles rohkema jaoks", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Kui lubatud: AI-d ei katkesta sinu hääl rääkimise ajal ja see saab korraga käsitleda ainult ühte vestlusvooru. Uue vooru alustamiseks ütle lihtsalt äratussõna.', + 'voice_interrupt_tip': + 'Kui lubatud: AI-d ei katkesta sinu hääl rääkimise ajal ja see saab korraga käsitleda ainult ühte vestlusvooru. Uue vooru alustamiseks ütle lihtsalt äratussõna.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -876,6 +904,13 @@ const Map etEE = { 'Tahame teada teate põhjust, võid kirjeldada probleemi, millega kokku puutusid.', 'generatedByAi': 'AI poolt genereeritud', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Siin on mõned soovitatud muusikad:', 'playList': 'Esitusloend', @@ -896,6 +931,29 @@ const Map etEE = { "bicycling": "Jalgrattasõit", "tsransit": "Ühistransport", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Failed to start navigation', + 'cannotPlayMusicListRetryLater': + 'Cannot play music list, please try again later', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Error opening map', + 'pleaseInstallAmapApp': 'Please install the Amap app first', + 'pleaseInstallBaiduMapApp': 'Please install the Baidu Maps app first', + 'appleMapStartFailed': 'Apple Maps failed to start', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Error opening Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Ilma päring:', 'highest': 'Kõrgeim', @@ -966,8 +1024,19 @@ const Map etEE = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Disable Floating Window', + 'enableFloatingWindow': 'Enable Floating Window', + 'permissionTip': 'Permission Tip', + 'micPermissionRequiredForRecording': + 'Microphone permission is required for recording', + 'deleteTranslationRecordError': 'Error deleting translation record: @error', "translationFailed": "Translation failed", + "translating": "Translating", + "translate": "Translate", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Palun sisestage tõlgitav tekst", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1236,17 +1305,19 @@ const Map etEE = { 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigeerimine käib', - 'native.notification.navigation.keepRunning': 'Navigeerimine, hoia rakendust avatuna', - 'native.notification.bleAgent.running': 'Hääleassistendi agent töötab', - 'native.notification.audioRecording.recording': 'Heli salvestamine, puuduta rakendusse naasmiseks', - 'native.notification.music.waiting': 'Ootab esitamist', - 'native.notification.music.previous': 'Eelmine', - 'native.notification.music.next': 'Järgmine', - 'native.notification.music.play': 'Esita', - 'native.notification.music.pause': 'Paus', - 'native.notification.qqMusic.playing': 'Muusika esitamine', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigeerimine käib', + 'native.notification.navigation.keepRunning': + 'Navigeerimine, hoia rakendust avatuna', + 'native.notification.bleAgent.running': 'Hääleassistendi agent töötab', + 'native.notification.audioRecording.recording': + 'Heli salvestamine, puuduta rakendusse naasmiseks', + 'native.notification.music.waiting': 'Ootab esitamist', + 'native.notification.music.previous': 'Eelmine', + 'native.notification.music.next': 'Järgmine', + 'native.notification.music.play': 'Esita', + 'native.notification.music.pause': 'Paus', + 'native.notification.qqMusic.playing': 'Muusika esitamine', // 版本更新 'newVersionFound': 'Leitud uus versioon', // 版本更新对话框标题 @@ -1380,6 +1451,59 @@ const Map etEE = { "removeEarbudsEnsureBattery": "Võta mõlemad kõrvaklapid välja ja veendu, et mõlema aku on üle 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Upgrade Successful', + 'otaUpgradeCompleteRepair': + 'Firmware upgrade complete!\n\nDevice needs to be re-paired to work properly. Go to pairing page now?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': + 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': + 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': + 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', + // 音乐模块 "noMusic": "Muusikat pole", // 暂无音乐 "noPlayingMusic": "Muusikat ei esitata", // 暂无播放音乐 diff --git a/lib/core/translations/language/fa_ir.dart b/lib/core/translations/language/fa_ir.dart index 6b3e318ad..3ab580e1f 100644 --- a/lib/core/translations/language/fa_ir.dart +++ b/lib/core/translations/language/fa_ir.dart @@ -1,5 +1,4 @@ const Map faIR = { - // 通用 'continue': 'ادامه', 'confirm': 'تأیید', @@ -166,6 +165,29 @@ const Map faIR = { 'right': 'راست', 'checkConnectionStatusFailed': 'بررسی وضعیت اتصال ناموفق بود', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'راه‌اندازی بلوتوث ناموفق بود: @error', + 'needBluetoothAndLocationPermission': + 'برای اسکن دستگاه‌ها به مجوزهای بلوتوث و موقعیت مکانی نیاز است', + 'permissionRequestFailedWithError': 'درخواست مجوز ناموفق بود: @error', + 'needPermission': 'مجوز مورد نیاز', + 'blePermissionDialogContent': + 'این برنامه برای اسکن دستگاه‌ها به مجوزهای بلوتوث و موقعیت مکانی نیاز دارد. لطفاً آن‌ها را در تنظیمات فعال کنید.', + 'needEnableBluetooth': 'فعال کردن بلوتوث', + 'enableBluetoothDialogContent': + 'لطفاً برای اسکن و اتصال دستگاه‌ها بلوتوث را فعال کنید.', + 'bleScanFailedWithError': 'اسکن ناموفق بود: @error', + 'bleConnectionSuccess': 'اتصال موفقیت‌آمیز', + 'bleConnectedToDevice': 'متصل به @device', + 'bleConnectionFailedWithError': 'اتصال ناموفق بود: @error', + 'bleDisconnected': 'قطع شد', + 'bleDeviceDisconnected': 'دستگاه قطع شد', + 'bleDisconnectFailedWithError': 'قطع اتصال ناموفق بود: @error', + 'signalStrong': 'قوی', + 'signalMedium': 'متوسط', + 'signalWeak': 'ضعیف', + 'signalVeryWeak': 'بسیار ضعیف', + // 发现页 "searchAi": "جستجوی ویژگی‌های هوش مصنوعی...", "exploreSlogan": "ایربادهای هوشمند، امکانات بی‌پایان", @@ -191,260 +213,260 @@ const Map faIR = { "scene": "سناریوها", // 用量统计模块 - "aiChat": "AI Chat", - "translationStats": "Translation Statistics", - "meetingStats": "Meeting Statistics", - "today": "Today", - "thisWeek": "This Week", - "thisMonth": "This Month", - "history": "History", - "currentSessionStats": "Current Session Stats", - "translationCount": "Translation Count", - "sessionDuration": "Session Duration", - "characters": "Characters", - "recordingDuration": "Recording Duration", - "totalApiCalls": "Total API Calls", - "sessionCount": "Session Count", - "totalCharacters": "Total Characters", - "apiCallStats": "API Call Stats", - "translationApi": "Translation API", - "asr": "ASR", - "tts": "TTS", - "dataVolumeStats": "Data Volume Stats", - "sourceTextCharacters": "Source Text Characters", - "ttsTextCharacters": "TTS Text Characters", - "effectiveAudioDuration": "Effective Audio Duration", - "totalSessionDuration": "Total Session Duration", - "costStats": "Cost Stats", - "estimatedCost": "Estimated Cost", - "dailyCostThreshold": "Daily Cost Threshold", - "monthlyCostThreshold": "Monthly Cost Threshold", - "usageBehaviorStats": "Usage Behavior Stats", - "mostUsedLanguagePair": "Most-used language pair", - "mostUsedMode": "Most-used mode", - "asrApiCalls": "ASR Calls", - "totalAudioDuration": "Total Audio Duration", - "audioFileSize": "Audio File Size", - "transcriptBytes": "Transcript Bytes", - "loadFailed": "Load Failed", + "aiChat": "چت هوش مصنوعی", + "translationStats": "آمار ترجمه", + "meetingStats": "آمار جلسات", + "today": "امروز", + "thisWeek": "این هفته", + "thisMonth": "این ماه", + "history": "تاریخچه", + "currentSessionStats": "آمار جلسه فعلی", + "translationCount": "تعداد ترجمه‌ها", + "sessionDuration": "مدت جلسه", + "characters": "کاراکترها", + "recordingDuration": "مدت ضبط", + "totalApiCalls": "مجموع فراخوانی‌های API", + "sessionCount": "تعداد جلسات", + "totalCharacters": "مجموع کاراکترها", + "apiCallStats": "آمار فراخوانی API", + "translationApi": "API ترجمه", + "asr": "تشخیص گفتار", + "tts": "تبدیل متن به گفتار", + "dataVolumeStats": "آمار حجم داده", + "sourceTextCharacters": "کاراکترهای متن مبدأ", + "ttsTextCharacters": "کاراکترهای متن تبدیل به گفتار", + "effectiveAudioDuration": "مدت صوتی مؤثر", + "totalSessionDuration": "مجموع مدت جلسات", + "costStats": "آمار هزینه", + "estimatedCost": "هزینه تخمینی", + "dailyCostThreshold": "سقف هزینه روزانه", + "monthlyCostThreshold": "سقف هزینه ماهانه", + "usageBehaviorStats": "آمار رفتار استفاده", + "mostUsedLanguagePair": "پرکاربردترین جفت زبانی", + "mostUsedMode": "پرکاربردترین حالت", + "asrApiCalls": "فراخوانی‌های تشخیص گفتار", + "totalAudioDuration": "مجموع مدت صوتی", + "audioFileSize": "حجم فایل صوتی", + "transcriptBytes": "حجم متن رونویسی", + "loadFailed": "بارگذاری ناموفق", "statsLoadFailedTryLater": - "Statistics failed to load. Please try again later.", - "cleanupComplete": "Cleanup Complete", - "cleanedOldData": "Cleaned data older than 90 days", - "exportFeature": "Export Feature", - "exportInDevelopment": "Data export is under development", + "بارگذاری آمار ناموفق بود. لطفاً بعداً دوباره تلاش کنید.", + "cleanupComplete": "پاکسازی کامل شد", + "cleanedOldData": "داده‌های قدیمی‌تر از ۹۰ روز پاک شد", + "exportFeature": "قابلیت خروجی", + "exportInDevelopment": "خروجی داده‌ها در حال توسعه است", // 商品模块 - 通用 - 'availablePackages': 'Available Packages', - 'remainingQuota': 'Remaining Quota', - 'totalQuota': 'Total Quota', - 'remaining': 'Remaining', - 'featureDescription': 'Feature Description', - 'paymentSuccess': 'پرداخت موفق', - 'paymentFailed': 'پرداخت ناموفق', - 'gotIt': 'متوجه شدم', - 'paymentFailedTryAgain': 'پرداخت ناموفق بود. لطفاً دوباره تلاش کنید.', - 'selectPaymentMethod': 'روش پرداخت را انتخاب کنید', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'ایجاد سفارش WeChat Pay ناموفق بود', - 'alipayOrderCreateFailed': 'ایجاد سفارش Alipay ناموفق بود', - 'appleOrderCreateFailed': 'ایجاد سفارش Apple ناموفق بود', - 'googleOrderCreateFailed': 'ایجاد سفارش Google ناموفق بود', - 'paypalOrderCreateFailed': 'ایجاد سفارش PayPal ناموفق بود', - 'paymentException': 'استثنای پرداخت', - 'paymentLaunchFailed': 'راه‌اندازی پرداخت ناموفق بود', - 'paymentExceptionWithError': 'استثنای پرداخت: @error', - 'paymentProcessingCheckLater': 'سفارش شما در حال پردازش است. لطفاً بعداً بررسی کنید.', - 'paymentResultQueryException': 'استعلام نتیجه پرداخت ناموفق بود: @error', - 'orderConfirmedQuotaRefreshed': 'سفارش تأیید شد. سهمیه شما به‌روزرسانی شد.', - 'paymentCompletedConfirming': 'پرداخت انجام شد. در حال تأیید…', - 'paymentCancelled': 'پرداخت لغو شد', - 'paypalOpenedCompleteInBrowser': 'PayPal باز شد. لطفاً پرداخت را در مرورگر خود تکمیل کنید.', - 'paypalOpenFailed': 'امکان باز کردن صفحه پرداخت PayPal وجود ندارد', - 'paymentTestTitle': 'تست پرداخت', - 'paymentTestOrderInfo': 'اطلاعات سفارش آزمایشی', - 'paymentTestProductId': 'شناسه محصول', - 'paymentTestProductDescription': 'توضیحات محصول', - 'paymentTestWechatDescription': 'تست پرداخت WeChat Pay', - 'paymentTestAlipayDescription': 'تست پرداخت Alipay', - 'paymentTestAmount': 'مبلغ', - 'paymentTestSelectAmount': 'مبلغ آزمایشی را انتخاب کنید', - 'paying': 'در حال پرداخت...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'وضعیت پرداخت', - 'errorInfoWithMessage': 'خطا: @message', - 'retest': 'آزمایش مجدد', - 'paymentTestInstructionsTitle': 'راهنما', - 'paymentTestInstructionsContent': '1. یک مبلغ تست انتخاب کنید (پیشنهاد: ¥0.01)\n2. برای شروع روی دکمه پرداخت کلیک کنید\n3. پرداخت را در اپلیکیشن پرداخت تکمیل کنید\n4. برای بررسی نتیجه بازگردید', - 'startingWechatPayment': 'در حال راه‌اندازی WeChat Pay...', - 'startingAlipayPayment': 'در حال راه‌اندازی Alipay...', - 'wechatPaymentSuccess': 'WeChat Pay موفق بود!', - 'wechatPaymentFailed': 'WeChat Pay ناموفق بود', - 'wechatPaymentLaunchFailed': 'راه‌اندازی WeChat Pay ناموفق بود', - 'cannotLaunchWechatPayment': 'امکان راه‌اندازی WeChat Pay وجود ندارد', - 'wechatPaymentException': 'استثنای WeChat Pay', - 'wechatPaymentTestCompleted': 'تست WeChat Pay تکمیل شد', - 'alipayPaymentSuccess': 'Alipay موفق بود!', - 'alipayPaymentFailed': 'Alipay ناموفق بود', - 'alipayPaymentLaunchFailed': 'راه‌اندازی Alipay ناموفق بود', - 'cannotLaunchAlipayPayment': 'امکان راه‌اندازی Alipay وجود ندارد', - 'alipayPaymentException': 'استثنای Alipay', - "insufficientIntegral": "Insufficient integral", + 'availablePackages': 'بسته‌های موجود', + 'remainingQuota': 'سهمیه باقی‌مانده', + 'totalQuota': 'سهمیه کل', + 'remaining': 'باقی‌مانده', + 'featureDescription': 'توضیحات ویژگی', + 'paymentSuccess': 'پرداخت موفق', + 'paymentFailed': 'پرداخت ناموفق', + 'gotIt': 'متوجه شدم', + 'paymentFailedTryAgain': 'پرداخت ناموفق بود. لطفاً دوباره تلاش کنید.', + 'selectPaymentMethod': 'روش پرداخت را انتخاب کنید', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'ایجاد سفارش WeChat Pay ناموفق بود', + 'alipayOrderCreateFailed': 'ایجاد سفارش Alipay ناموفق بود', + 'appleOrderCreateFailed': 'ایجاد سفارش Apple ناموفق بود', + 'googleOrderCreateFailed': 'ایجاد سفارش Google ناموفق بود', + 'paypalOrderCreateFailed': 'ایجاد سفارش PayPal ناموفق بود', + 'paymentException': 'استثنای پرداخت', + 'paymentLaunchFailed': 'راه‌اندازی پرداخت ناموفق بود', + 'paymentExceptionWithError': 'استثنای پرداخت: @error', + 'paymentProcessingCheckLater': + 'سفارش شما در حال پردازش است. لطفاً بعداً بررسی کنید.', + 'paymentResultQueryException': 'استعلام نتیجه پرداخت ناموفق بود: @error', + 'orderConfirmedQuotaRefreshed': 'سفارش تأیید شد. سهمیه شما به‌روزرسانی شد.', + 'paymentCompletedConfirming': 'پرداخت انجام شد. در حال تأیید…', + 'paymentCancelled': 'پرداخت لغو شد', + 'paypalOpenedCompleteInBrowser': + 'PayPal باز شد. لطفاً پرداخت را در مرورگر خود تکمیل کنید.', + 'paypalOpenFailed': 'امکان باز کردن صفحه پرداخت PayPal وجود ندارد', + 'paymentTestTitle': 'تست پرداخت', + 'paymentTestOrderInfo': 'اطلاعات سفارش آزمایشی', + 'paymentTestProductId': 'شناسه محصول', + 'paymentTestProductDescription': 'توضیحات محصول', + 'paymentTestWechatDescription': 'تست پرداخت WeChat Pay', + 'paymentTestAlipayDescription': 'تست پرداخت Alipay', + 'paymentTestAmount': 'مبلغ', + 'paymentTestSelectAmount': 'مبلغ آزمایشی را انتخاب کنید', + 'paying': 'در حال پرداخت...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'وضعیت پرداخت', + 'errorInfoWithMessage': 'خطا: @message', + 'retest': 'آزمایش مجدد', + 'paymentTestInstructionsTitle': 'راهنما', + 'paymentTestInstructionsContent': + '1. یک مبلغ تست انتخاب کنید (پیشنهاد: ¥0.01)\n2. برای شروع روی دکمه پرداخت کلیک کنید\n3. پرداخت را در اپلیکیشن پرداخت تکمیل کنید\n4. برای بررسی نتیجه بازگردید', + 'startingWechatPayment': 'در حال راه‌اندازی WeChat Pay...', + 'startingAlipayPayment': 'در حال راه‌اندازی Alipay...', + 'wechatPaymentSuccess': 'WeChat Pay موفق بود!', + 'wechatPaymentFailed': 'WeChat Pay ناموفق بود', + 'wechatPaymentLaunchFailed': 'راه‌اندازی WeChat Pay ناموفق بود', + 'cannotLaunchWechatPayment': 'امکان راه‌اندازی WeChat Pay وجود ندارد', + 'wechatPaymentException': 'استثنای WeChat Pay', + 'wechatPaymentTestCompleted': 'تست WeChat Pay تکمیل شد', + 'alipayPaymentSuccess': 'Alipay موفق بود!', + 'alipayPaymentFailed': 'Alipay ناموفق بود', + 'alipayPaymentLaunchFailed': 'راه‌اندازی Alipay ناموفق بود', + 'cannotLaunchAlipayPayment': 'امکان راه‌اندازی Alipay وجود ندارد', + 'alipayPaymentException': 'استثنای Alipay', + "insufficientIntegral": "اعتبار ناکافی", "insufficientBalanceDesc": - 'Insufficient balance, please go to the corresponding recharge page to recharge.', - "recharge": 'Go to Recharge', + 'موجودی ناکافی است، لطفاً به صفحه شارژ مربوطه بروید و شارژ کنید.', + "recharge": 'رفتن به شارژ', "aiMemberExpiredDesc": - 'AI membership expired, please go to the membership recharge page to renew.', + 'عضویت هوش مصنوعی منقضی شده است، لطفاً به صفحه شارژ عضویت بروید و تمدید کنید.', // 商品模块 - AI商品页 - 'musicAndRecommendation': 'Music & Recommendation', - 'navigationAndRoutes': 'Navigation & Routes', - 'nearbySearch': 'Nearby Search', - 'newsInformation': 'News', - 'communicationAssistant': 'Communication Assistant', + 'musicAndRecommendation': 'موسیقی و توصیه‌ها', + 'navigationAndRoutes': 'مسیریابی و مسیرها', + 'nearbySearch': 'جستجوی نزدیک', + 'newsInformation': 'اخبار', + 'communicationAssistant': 'دستیار ارتباطی', 'aiHeaderDesc1': - 'Longer conversation quota, more tool calls, extended context length.', - 'aiHeaderDesc2': - 'Suitable for agent Q&A, summarization, analysis, and task execution.', - 'musicSearchPlaybackControl': 'Music library search and playback control', + 'سهمیه مکالمه بیشتر، فراخوانی ابزار بیشتر، طول متن گسترده‌تر.', + 'aiHeaderDesc2': 'مناسب برای پرسش و پاسخ، خلاصه‌سازی، تحلیل و اجرای وظایف.', + 'musicSearchPlaybackControl': 'جستجوی کتابخانه موسیقی و کنترل پخش', 'smartPlaylistAndSimilarRecommendations': - 'Smart playlist and similar song recommendations', - 'routePlanningAndCongestionAvoidance': - 'Route planning and congestion avoidance', - 'voiceBroadcastAndWaypoints': 'Voice broadcast and waypoint settings', - 'realTimeWeatherForecast': 'Real-time weather and forecast', - 'clothingAdviceAndTravelReminders': 'Clothing advice and travel reminders', - 'poiSearchFoodGasParking': 'POI search: dining / gas / parking', - 'ratingsHoursAndDirectRoutes': 'Ratings, business hours, and direct routing', - 'hotNewsAndTopicOverview': 'Hot news and topic overview', - 'longArticleSummariesAndKeyPoints': 'Long-article summaries and key points', - 'helpCallAndSMS': 'Help with calls and SMS', - 'templatedMessagesAndScheduleReminders': - 'Template messages and schedule reminders', + 'لیست پخش هوشمند و توصیه آهنگ‌های مشابه', + 'routePlanningAndCongestionAvoidance': 'برنامه‌ریزی مسیر و اجتناب از ترافیک', + 'voiceBroadcastAndWaypoints': 'راهنمای صوتی و تنظیمات نقاط مسیر', + 'realTimeWeatherForecast': 'آب و هوای بلادرنگ و پیش‌بینی', + 'clothingAdviceAndTravelReminders': 'توصیه پوشاک و یادآوری‌های سفر', + 'poiSearchFoodGasParking': 'جستجوی مکان: غذا / پمپ بنزین / پارکینگ', + 'ratingsHoursAndDirectRoutes': 'امتیازات، ساعات کاری و مسیریابی مستقیم', + 'hotNewsAndTopicOverview': 'اخبار داغ و مرور موضوعات', + 'longArticleSummariesAndKeyPoints': 'خلاصه مقالات طولانی و نکات کلیدی', + 'helpCallAndSMS': 'کمک در تماس و پیامک', + 'templatedMessagesAndScheduleReminders': 'پیام‌های الگو و یادآوری‌های برنامه', 'aiDisclaimer': - 'Features depend on device permissions, service availability, and network conditions.', + 'ویژگی‌ها به مجوزهای دستگاه، در دسترس بودن سرویس و شرایط شبکه بستگی دارند.', // 商品模块 - 翻译商品页 - 'realtimeTranscription': 'Real-time Transcription', - 'sceneLexicon': 'Scenario Glossary', - 'subtitleDisplay': 'Subtitles', - 'transHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'transHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', - 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': - 'Terminology optimization and context preservation', - 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', - 'personalVocabularyMemory': 'Personal vocabulary memory', - 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', - 'colorHighContrast': 'High color contrast', + 'realtimeTranscription': 'رونویسی بلادرنگ', + 'sceneLexicon': 'واژه‌نامه سناریویی', + 'subtitleDisplay': 'زیرنویس‌ها', + 'transHeaderDesc1': 'ترجمه همزمان بلادرنگ و ترجمه متن با صدای کم‌تأخیر.', + 'transHeaderDesc2': 'مناسب برای سفر، تجارت، سخنرانی و آموزش.', + 'translateZhEn': 'ترجمه چینی-انگلیسی', + 'lowLatencyVoiceBroadcast': 'پخش صوتی کم‌تأخیر', + 'multiLangTextTranslation': 'ترجمه متن چندزبانه', + 'termOptimizationContextPreserve': 'بهینه‌سازی اصطلاحات و حفظ زمینه', + 'lexiconTourBusinessLife': 'واژه‌نامه‌های سفر/تجارت/زندگی', + 'personalVocabularyMemory': 'حافظه واژگان شخصی', + 'conversationSubtitleLargeText': 'زیرنویس مکالمه / حالت متن بزرگ', + 'colorHighContrast': 'کنتراست رنگ بالا', 'transDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'عملکرد ترجمه به میکروفون، تأخیر شبکه و نویز محیط بستگی دارد.', // 商品模块 - 会议商品页 - 'meetingRecording': 'Meeting Recording', - 'transcriptionAndSummary': 'Transcription & Summary', - 'keywordSearch': 'Keyword Search', - 'collaborationSharing': 'Collaboration & Sharing', + 'meetingRecording': 'ضبط جلسه', + 'transcriptionAndSummary': 'رونویسی و خلاصه', + 'keywordSearch': 'جستجوی کلمات کلیدی', + 'collaborationSharing': 'همکاری و اشتراک‌گذاری', 'meetingHeaderDesc1': - 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', + 'ضبط صدا، رونویسی، جستجوی کلمات کلیدی و خلاصه خودکار برای افزایش بهره‌وری جلسات.', 'meetingHeaderDesc2': - 'Suitable for business meetings, class notes, and interview minutes.', - 'meetingAutoRecording': 'Auto recording and segmentation', - 'meetingSpeakerTagging': 'Speaker labeling', - 'meetingLongAudioTranscription': 'Long audio transcription', - 'meetingKeyPointSummary': 'Key point extraction', - 'meetingTopicNameSearch': 'Search by topic/name', - 'meetingTimelineJump': 'Timeline jump', - 'meetingExportSummary': 'Export minutes', - 'meetingMultiPlatformShare': 'Share across platforms', + 'مناسب برای جلسات کاری، یادداشت کلاس و صورت‌جلسه مصاحبه.', + 'meetingAutoRecording': 'ضبط خودکار و بخش‌بندی', + 'meetingSpeakerTagging': 'برچسب‌گذاری گوینده', + 'meetingLongAudioTranscription': 'رونویسی صوتی طولانی', + 'meetingKeyPointSummary': 'استخراج نکات کلیدی', + 'meetingTopicNameSearch': 'جستجو بر اساس موضوع/نام', + 'meetingTimelineJump': 'پرش در خط زمانی', + 'meetingExportSummary': 'خروجی صورت‌جلسه', + 'meetingMultiPlatformShare': 'اشتراک‌گذاری بین پلتفرم‌ها', 'meetingDisclaimer': - 'Use in quiet environments; performance depends on microphone and network.', + 'در محیط آرام استفاده کنید؛ عملکرد به میکروفون و شبکه بستگی دارد.', // 商品模块 - VIP会员页 - 'benefitsOverview': 'Benefits overview', - 'higherQuota': 'Higher usage quota', - 'lowerUnitPrice': 'Lower unit price', - 'priorityService': 'Priority service', - 'exclusiveSupportChannel': 'Dedicated support channel', - 'fastResponse': 'Fast issue response', - 'eventsAndDiscounts': 'Events and discounts', - 'memberExclusiveEvents': 'Member-exclusive events', - 'longTermDiscountPlan': 'Long-term discount plan', - 'generalPrivileges': 'General privileges', - 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', + 'benefitsOverview': 'مرور مزایا', + 'higherQuota': 'سهمیه استفاده بیشتر', + 'lowerUnitPrice': 'قیمت واحد کمتر', + 'priorityService': 'خدمات اولویت‌دار', + 'exclusiveSupportChannel': 'کانال پشتیبانی اختصاصی', + 'fastResponse': 'پاسخ سریع به مشکلات', + 'eventsAndDiscounts': 'رویدادها و تخفیف‌ها', + 'memberExclusiveEvents': 'رویدادهای ویژه اعضا', + 'longTermDiscountPlan': 'طرح تخفیف بلندمدت', + 'generalPrivileges': 'امتیازات عمومی', + 'earlyAccessNewFeatures': 'دسترسی زودهنگام به ویژگی‌های جدید', + 'crossDeviceSync': 'همگام‌سازی بین دستگاه‌ها', 'vipDisclaimer': - 'Actual benefits depend on the package details and may change with versions.', + 'مزایای واقعی به جزئیات بسته بستگی دارد و ممکن است با نسخه‌ها تغییر کند.', // 商品模块 - 商品名称与描述 - 'ai_001_name': 'AI Basic 100', - 'ai_002_name': 'AI Basic 500', - 'ai_003_name': 'AI Basic 1000', - 'meet_001_name': 'Meeting Basic 100', - 'meet_002_name': 'Meeting Basic 500', - 'meet_003_name': 'Meeting Basic 1000', - 'trans_001_name': 'Translation Basic 100', - 'trans_002_name': 'Translation Basic 500', - 'trans_003_name': 'Translation Basic 1000', - 'ai_001_desc': 'Includes 100 uses. Access core AI features.', - 'ai_002_desc': 'Includes 500 uses. Access core AI features.', - 'ai_003_desc': 'Includes 1000 uses. Access core AI features.', - 'meet_001_desc': 'Includes 100 meeting recordings/transcriptions.', - 'meet_002_desc': 'Includes 500 meeting recordings/transcriptions.', - 'meet_003_desc': 'Includes 1000 meeting recordings/transcriptions.', - 'trans_001_desc': 'Includes 100 translations (voice/text).', - 'trans_002_desc': 'Includes 500 translations (voice/text).', - 'trans_003_desc': 'Includes 1000 translations (voice/text).', + 'ai_001_name': 'هوش مصنوعی پایه ۱۰۰', + 'ai_002_name': 'هوش مصنوعی پایه ۵۰۰', + 'ai_003_name': 'هوش مصنوعی پایه ۱۰۰۰', + 'meet_001_name': 'جلسه پایه ۱۰۰', + 'meet_002_name': 'جلسه پایه ۵۰۰', + 'meet_003_name': 'جلسه پایه ۱۰۰۰', + 'trans_001_name': 'ترجمه پایه ۱۰۰', + 'trans_002_name': 'ترجمه پایه ۵۰۰', + 'trans_003_name': 'ترجمه پایه ۱۰۰۰', + 'ai_001_desc': 'شامل ۱۰۰ بار استفاده. دسترسی به ویژگی‌های اصلی هوش مصنوعی.', + 'ai_002_desc': 'شامل ۵۰۰ بار استفاده. دسترسی به ویژگی‌های اصلی هوش مصنوعی.', + 'ai_003_desc': 'شامل ۱۰۰۰ بار استفاده. دسترسی به ویژگی‌های اصلی هوش مصنوعی.', + 'meet_001_desc': 'شامل ۱۰۰ ضبط/رونویسی جلسه.', + 'meet_002_desc': 'شامل ۵۰۰ ضبط/رونویسی جلسه.', + 'meet_003_desc': 'شامل ۱۰۰۰ ضبط/رونویسی جلسه.', + 'trans_001_desc': 'شامل ۱۰۰ ترجمه (صوتی/متنی).', + 'trans_002_desc': 'شامل ۵۰۰ ترجمه (صوتی/متنی).', + 'trans_003_desc': 'شامل ۱۰۰۰ ترجمه (صوتی/متنی).', // 商品模块 - 页脚 - 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', - 'iapCustomerServiceQQLabel': 'IAP customer service QQ: @qq', - 'copyrightVoitrans': '© 2025 Voitrans Technologies', + 'appNameProvider': 'برنامه: VoiTrans · ارائه‌دهنده: VoiTrans', + 'iapCustomerServiceQQLabel': 'خدمات مشتری IAP QQ: @qq', + 'copyrightVoitrans': '© ۲۰۲۵ Voitrans Technologies', // 新手引导 'skip': "رد کردن", - 'next': 'Next', - 'sayLilyHint': 'Say "Lily Lily" to the mic', - 'imHere': 'I’m here~', - 'guideWelcomeWakeAI': 'Welcome to Voitrans! First, wake your AI “Lily”.', - 'aiReplyCompleted': 'Lily has finished the reply!', - 'aiThinking': 'Lily is thinking…', - 'guideAwakenSuccess': 'Great! Lily is awake—ask it to help.', - 'confirmInput': 'Confirm Input', - 'guideClickSendPrefix': 'Tap send, ', - 'guideWeatherStart': 'Tell Lily: “What’s the weather today?”', - 'guideWeatherInput': 'What’s the weather today?', - 'guideWeatherSend': 'Lily will report the weather in real time', - 'guideWeatherEnd': 'Lily can report weather live—try other commands', - 'guideMusicStart': 'Tell Lily: “Play some rock music”', - 'guideMusicInput': 'Play some rock music', - 'guideMusicSend': 'Lily will find music for you', - 'guideMusicEnd': 'Lily found music—try other commands', - 'guideNavStart': 'Tell Lily: “Navigate to Shenzhen Airport”', - 'guideNavInput': 'Navigate to Shenzhen Airport', - 'guideNavSend': 'Lily will plan the route', - 'guideNavEnd': 'Navigation set—try other commands', + 'next': 'بعدی', + 'sayLilyHint': 'به میکروفون بگویید «لیلی لیلی»', + 'imHere': ' من اینجا هستم~', + 'guideWelcomeWakeAI': + 'به Voitrans خوش آمدید! ابتدا هوش مصنوعی «لیلی» را بیدار کنید.', + 'aiReplyCompleted': 'لیلی پاسخ را تمام کرد!', + 'aiThinking': 'لیلی در حال فکر کردن است…', + 'guideAwakenSuccess': 'عالی! لیلی بیدار شد—از او کمک بخواهید.', + 'confirmInput': 'تأیید ورودی', + 'guideClickSendPrefix': 'روی ارسال ضربه بزنید، ', + 'guideWeatherStart': 'به لیلی بگویید: «آب و هوای امروز چطور است؟»', + 'guideWeatherInput': 'آب و هوای امروز چطور است؟', + 'guideWeatherSend': 'لیلی آب و هوا را به صورت بلادرنگ گزارش می‌دهد', + 'guideWeatherEnd': + 'لیلی می‌تواند آب و هوا را گزارش دهد—دستورات دیگر را امتحان کنید', + 'guideMusicStart': 'به لیلی بگویید: «کمی موسیقی راک پخش کن»', + 'guideMusicInput': 'کمی موسیقی راک پخش کن', + 'guideMusicSend': 'لیلی برای شما موسیقی پیدا می‌کند', + 'guideMusicEnd': 'لیلی موسیقی پیدا کرد—دستورات دیگر را امتحان کنید', + 'guideNavStart': 'به لیلی بگویید: «مسیریابی به فرودگاه شنژن»', + 'guideNavInput': 'مسیریابی به فرودگاه شنژن', + 'guideNavSend': 'لیلی مسیر را برنامه‌ریزی می‌کند', + 'guideNavEnd': 'مسیریابی تنظیم شد—دستورات دیگر را امتحان کنید', 'guideMeetingStart': - 'Tell Lily: “Create a meeting reminder for 3pm tomorrow”', - 'guideMeetingInput': 'Create a meeting reminder for 3pm tomorrow', - 'guideMeetingSend': 'Lily will create a meeting reminder', - 'guideMeetingEnd': 'Reminder created—try other commands', - 'guidePhoneStart': 'Tell Lily: “Call Mom”', - 'guidePhoneInput': 'Call Mom', - 'guidePhoneSend': 'Lily will make the call', - 'guidePhoneEnd': 'Call placed—try other commands', - 'guideSmsStart': 'Tell Lily: “Send Dad a text: I’ll be home for dinner”', - 'guideSmsInput': 'Text Dad: I’ll be home for dinner', - 'guideSmsSend': 'Lily will send the message', - 'guideSmsEnd': 'Message sent—voice control is convenient', + 'به لیلی بگویید: «یک یادآوری جلسه برای ساعت ۳ فردا ایجاد کن»', + 'guideMeetingInput': 'یک یادآوری جلسه برای ساعت ۳ فردا ایجاد کن', + 'guideMeetingSend': 'لیلی یک یادآوری جلسه ایجاد می‌کند', + 'guideMeetingEnd': 'یادآوری ایجاد شد—دستورات دیگر را امتحان کنید', + 'guidePhoneStart': 'به لیلی بگویید: «به مادر زنگ بزن»', + 'guidePhoneInput': 'به مادر زنگ بزن', + 'guidePhoneSend': 'لیلی تماس می‌گیرد', + 'guidePhoneEnd': 'تماس برقرار شد—دستورات دیگر را امتحان کنید', + 'guideSmsStart': 'به لیلی بگویید: «به پدر پیامک بفرست: برای شام خانه هستم»', + 'guideSmsInput': 'به پدر پیامک بفرست: برای شام خانه هستم', + 'guideSmsSend': 'لیلی پیام را ارسال می‌کند', + 'guideSmsEnd': 'پیام ارسال شد—کنترل صوتی راحت است', // Meeting模块 - 首页与导航 "startMeeting": "شروع جلسه", @@ -537,21 +559,22 @@ const Map faIR = { 'selectSummaryTemplate': 'انتخاب الگوی خلاصه', 'useThisTemplate': 'استفاده از این الگو', 'lastUsed': 'آخرین استفاده‌شده', - 'create': 'ایجاد', - 'templateDetails': 'جزئیات قالب', - 'tag': 'برچسب', - 'description': 'توضیحات', - 'template': 'قالب', - 'deleteTemplate': 'حذف قالب', - 'deleteTemplateConfirm': 'آیا مطمئن هستید که می‌خواهید این قالب را حذف کنید؟', - 'editTemplate': 'ویرایش قالب', - 'createTemplate': 'ایجاد قالب', - 'name': 'نام', - 'templateContentHint': 'لطفاً محتوای قالب را وارد کنید! نکته: برای تولید سریع محتوای قالب بر اساس نام و توضیحاتی که وارد کرده‌اید، روی دکمه AI بالا کلیک کنید', - 'inputNameHint': 'لطفاً نام را وارد کنید', - 'inputDescHint': 'لطفاً توضیحات را وارد کنید', - 'custom': 'سفارشی', - 'pleaseEnter': 'لطفا وارد کنید', + 'create': 'ایجاد', + 'templateDetails': 'جزئیات قالب', + 'tag': 'برچسب', + 'description': 'توضیحات', + 'template': 'قالب', + 'deleteTemplate': 'حذف قالب', + 'deleteTemplateConfirm': 'آیا مطمئن هستید که می‌خواهید این قالب را حذف کنید؟', + 'editTemplate': 'ویرایش قالب', + 'createTemplate': 'ایجاد قالب', + 'name': 'نام', + 'templateContentHint': + 'لطفاً محتوای قالب را وارد کنید! نکته: برای تولید سریع محتوای قالب بر اساس نام و توضیحاتی که وارد کرده‌اید، روی دکمه AI بالا کلیک کنید', + 'inputNameHint': 'لطفاً نام را وارد کنید', + 'inputDescHint': 'لطفاً توضیحات را وارد کنید', + 'custom': 'سفارشی', + 'pleaseEnter': 'لطفا وارد کنید', 'viewAll': 'مشاهده همه', 'recordingLanguage': 'زبان ضبط', 'chineseSimplified': 'چینی ماندارین (ساده‌شده)', @@ -574,7 +597,7 @@ const Map faIR = { 'fileProcessingFailed': 'پردازش فایل ناموفق بود: {filePath}, خطا: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'ذخیره نقشه ذهنی', + 'saveMindMap': 'ذخیره نقشه ذهنی', 'shareMindMap': 'اشتراک‌گذاری نقشه ذهنی', 'shareSuccess': 'اشتراک‌گذاری موفقیت‌آمیز بود', @@ -596,7 +619,7 @@ const Map faIR = { 'exportSummary': 'خروجی خلاصه', 'exportAs': 'خروجی به عنوان', 'exportingPDF': 'در حال خروجی گرفتن PDF...', - 'export': 'صادر کردن', + 'export': 'صادر کردن', // Meeting模块 - 发言者 'applyToAllParagraphs': 'اعمال روی همه پاراگراف‌های این گوینده', @@ -708,18 +731,18 @@ const Map faIR = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'زبان ناشناخته', - 'analysisFailed': 'تحلیل ناموفق بود، لطفاً بعداً دوباره تلاش کنید', - 'transcriptionFailed': 'رونویسی ناموفق بود، لطفاً بعداً دوباره تلاش کنید', - 'summaryFailed': 'خلاصه‌سازی ناموفق بود، لطفاً بعداً دوباره تلاش کنید', - 'summaryFailedShort': 'خلاصه‌سازی ناموفق', - 'transcriptionFailedShort': 'رونویسی ناموفق', + 'analysisFailed': 'تحلیل ناموفق بود، لطفاً بعداً دوباره تلاش کنید', + 'transcriptionFailed': 'رونویسی ناموفق بود، لطفاً بعداً دوباره تلاش کنید', + 'summaryFailed': 'خلاصه‌سازی ناموفق بود، لطفاً بعداً دوباره تلاش کنید', + 'summaryFailedShort': 'خلاصه‌سازی ناموفق', + 'transcriptionFailedShort': 'رونویسی ناموفق', // Meeting模块 - 播放器 - 'playerNotReady': 'پخش‌کننده صدا آماده نیست، لطفاً صبر کنید', - 'playFailed': 'پخش ناموفق بود', - 'audioFileNotFound': 'فایل صوتی یافت نشد', - 'fetchingAudio': 'در حال دریافت صدا از فضای ابری...', - 'playerLoadFailed': 'بارگذاری پخش‌کننده صدا ناموفق بود', + 'playerNotReady': 'پخش‌کننده صدا آماده نیست، لطفاً صبر کنید', + 'playFailed': 'پخش ناموفق بود', + 'audioFileNotFound': 'فایل صوتی یافت نشد', + 'fetchingAudio': 'در حال دریافت صدا از فضای ابری...', + 'playerLoadFailed': 'بارگذاری پخش‌کننده صدا ناموفق بود', // 设置页 "systemSettings": "تنظیمات سیستم", @@ -728,10 +751,10 @@ const Map faIR = { "translationRecharge": "شارژ ترجمه", "meetingAssistantRecharge": "شارژ کمک‌کننده جلسه", "cloudSync": "شارژ همگام‌سازی ابری", - "memberService": "Member Service", - "bindRewardTitle": "Rewards", + "memberService": "خدمات عضویت", + "bindRewardTitle": "جوایز", "bindRewardSimpleDesc": - "First bind device reward has been issued. Tap OK to close.", + "جایزه اولین اتصال دستگاه صادر شد. برای بستن روی تأیید ضربه بزنید.", "joinDevice": "دستگاه متصل:", "accountId": "شناسه حساب:", "systemSetting": "تنظیمات سیستم", @@ -822,8 +845,9 @@ const Map faIR = { "loadFailedClickRetry": "بارگیری ناموفق بود، برای تلاش مجدد کلیک کنید", "swipeUpForMore": "برای مشاهده بیشتر به بالا بکشید", "callingTool": "در حال کمک به شما هستم، لطفاً صبر کنید!", // 正在帮您,请稍等! - "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'وقتی فعال است: هوش مصنوعی هنگام صحبت کردن توسط صدای شما قطع نمی‌شود و فقط می‌تواند یک دور مکالمه را در هر بار پردازش کند. برای شروع دور جدید، کافی است کلمه بیدارسازی را بگویید.', + "voice_interrupt": "قطع صدا", // 语音打断 + 'voice_interrupt_tip': + 'وقتی فعال است: هوش مصنوعی هنگام صحبت کردن توسط صدای شما قطع نمی‌شود و فقط می‌تواند یک دور مکالمه را در هر بار پردازش کند. برای شروع دور جدید، کافی است کلمه بیدارسازی را بگویید.', // Agent模块 - 预设提示词 "presetMusic": "پخش موسیقی", // 来点音乐 @@ -878,6 +902,13 @@ const Map faIR = { 'ما می‌خواهیم دلیل گزارش شما را بدانیم، می‌توانید مشکلی را که با آن مواجه شدید توصیف کنید.', 'generatedByAi': 'تولید شده توسط هوش مصنوعی', + // Agent模块 - 工具调用 + 'toolCall': 'فراخوانی ابزار', + 'noResult': 'نتیجه‌ای یافت نشد', + 'noToolCallContentToCopy': 'محتوای فراخوانی ابزار برای کپی وجود ندارد', + 'toolCallDetails': 'جزئیات فراخوانی ابزار:', + 'toolCallContentCopied': 'محتوای فراخوانی ابزار در کلیپ‌بورد کپی شد', + // Agent模块 - 音乐卡片 'recommendedMusic': 'در اینجا چند موسیقی توصیه‌شده وجود دارد:', 'playList': 'لیست پخش', @@ -898,6 +929,29 @@ const Map faIR = { "bicycling": "دوچرخه‌سواری", "tsransit": "حمل و نقل عمومی", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'انتخاب برنامه مسیریابی', + 'amapMap': 'نقشه Amap', + 'useAmapNavigation': 'مسیریابی با Amap', + 'baiduMap': 'نقشه بایدو', + 'useBaiduNavigation': 'مسیریابی با نقشه بایدو', + 'googleMap': 'نقشه گوگل', + 'useGoogleNavigation': 'مسیریابی با نقشه گوگل', + 'appleMap': 'نقشه اپل', + 'useAppleNavigation': 'مسیریابی با نقشه اپل', + 'builtInNavigation': 'مسیریابی داخلی', + 'useBuiltInNavigation': 'مسیریابی با نقشه داخلی', + 'navigationStartFailed': 'شروع مسیریابی ناموفق بود', + 'cannotPlayMusicListRetryLater': + 'امکان پخش لیست موسیقی نیست، لطفاً بعداً دوباره تلاش کنید', + 'cannotPlaySong': 'امکان پخش آهنگ نیست', + 'openMapError': 'خطا در باز کردن نقشه', + 'pleaseInstallAmapApp': 'لطفاً ابتدا برنامه Amap را نصب کنید', + 'pleaseInstallBaiduMapApp': 'لطفاً ابتدا برنامه نقشه بایدو را نصب کنید', + 'appleMapStartFailed': 'شروع نقشه اپل ناموفق بود', + 'appleMapUnavailable': 'نقشه اپل در دسترس نیست', + 'openAppleMapError': 'خطا در باز کردن نقشه اپل', + // Agent模块 - 天气卡片 'weatherQuery': 'استعلام آب و هوا:', 'highest': 'حداکثر', @@ -965,19 +1019,29 @@ const Map faIR = { "me": "من", "counterPart": "طرف مقابل", "bluetoothCallStateError": - "Please make sure the Bluetooth headset is connected to the phone and in a call state", + "لطفاً مطمئن شوید هدست بلوتوث به تلفن متصل و در حالت تماس است", "autoDetect": "تشخیص خودکار", // 自动检测 // 翻译模块 - 文本翻译 - "languageDetectionFailed": "Language detection failed", - "translationFailed": "Translation failed", - "pleaseInputText": "Please input text", - "textTooLong": "Text too long, max 5000 characters", + "languageDetectionFailed": "تشخیص زبان ناموفق بود", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'غیرفعال کردن پنجره شناور', + 'enableFloatingWindow': 'فعال کردن پنجره شناور', + 'permissionTip': 'نکته مجوز', + 'micPermissionRequiredForRecording': 'مجوز میکروفون برای ضبط الزامی است', + 'deleteTranslationRecordError': 'خطا در حذف سابقه ترجمه: @error', + "translationFailed": "ترجمه ناموفق بود", + "translating": "در حال ترجمه", + "translate": "ترجمه", + "pleaseInputText": "لطفاً متن را وارد کنید", + "inputTextToTranslate": "لطفاً متن مورد نظر برای ترجمه را وارد کنید", + "textTooLong": "متن بیش از حد طولانی است، حداکثر ۵۰۰۰ کاراکتر", // 翻译模块 - 历史记录 "noTranslationHistory": "تاریخچه ترجمه وجود ندارد", - "historyRecords": "History Records", - "clearResults": "Clear Results", + "historyRecords": "سوابق تاریخچه", + "clearResults": "پاک کردن نتایج", "clearHistory": "پاک کردن تاریخچه", "clearHistoryConfirm": "آیا مطمئن هستید که می‌خواهید تمام تاریخچه ترجمه را پاک کنید؟ این عمل قابل بازگشت نیست.", @@ -987,28 +1051,28 @@ const Map faIR = { "آیا مطمئن هستید که می‌خواهید تمام سوابق ترجمه این جلسه را حذف کنید؟ این عمل قابل بازگشت نیست.", // 翻译模块 - 图片翻译 - "selectImageSource": "Select Image Source", - "imagePreview": "Image Preview", - "translationResult": "Translation Result", - "recognitionResult": "Recognition Result", - "translatedImagePreview": "Translated Image Preview", - "translatedImageLoadFailed": "Failed to load translated image", - "pleaseSelectImage": "Please select an image", - "imageLoadFailed": "Image load failed", - "imageQuality": "Image Quality", - "maxSize": "Max Size", - "close": "Close", - "setImageQuality": "Set Image Quality", - "currentQuality": "Current quality: @value%", - "setMaxSize": "Set Max Size", - "currentMaxSize": "Current: @pxpx", - "waitingForAction": "Waiting for action", - "pleaseSelectImageToStart": "Please select an image to start", - "chooseImage": "Choose Image", - "openingCamera": "Opening camera...", - "openingPhotoAlbum": "Opening photo album...", - "cancelled": "Cancelled", - "userCancelledSelection": "User cancelled selection", + "selectImageSource": "انتخاب منبع تصویر", + "imagePreview": "پیش‌نمایش تصویر", + "translationResult": "نتیجه ترجمه", + "recognitionResult": "نتیجه تشخیص", + "translatedImagePreview": "پیش‌نمایش تصویر ترجمه‌شده", + "translatedImageLoadFailed": "بارگذاری تصویر ترجمه‌شده ناموفق بود", + "pleaseSelectImage": "لطفاً یک تصویر انتخاب کنید", + "imageLoadFailed": "بارگذاری تصویر ناموفق بود", + "imageQuality": "کیفیت تصویر", + "maxSize": "حداکثر اندازه", + "close": "بستن", + "setImageQuality": "تنظیم کیفیت تصویر", + "currentQuality": "کیفیت فعلی: @value%", + "setMaxSize": "تنظیم حداکثر اندازه", + "currentMaxSize": "فعلی: @pxpx", + "waitingForAction": "در انتظار اقدام", + "pleaseSelectImageToStart": "لطفاً برای شروع یک تصویر انتخاب کنید", + "chooseImage": "انتخاب تصویر", + "openingCamera": "در حال باز کردن دوربین...", + "openingPhotoAlbum": "در حال باز کردن آلبوم عکس...", + "cancelled": "لغو شد", + "userCancelledSelection": "کاربر انتخاب را لغو کرد", "translatingImage": "Translating Image", "callingImageTranslateService": "Calling image translation service...", "savingRecord": "Saving Record", @@ -1243,17 +1307,19 @@ const Map faIR = { 'permissionUtilConfirm': 'تأیید', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'مسیریابی در جریان است', - 'native.notification.navigation.keepRunning': 'در حال مسیریابی، اپلیکیشن را باز نگه دارید', - 'native.notification.bleAgent.running': 'دستیار صوتی در حال اجراست', - 'native.notification.audioRecording.recording': 'در حال ضبط صدا، برای بازگشت به اپلیکیشن ضربه بزنید', - 'native.notification.music.waiting': 'در انتظار پخش', - 'native.notification.music.previous': 'قبلی', - 'native.notification.music.next': 'بعدی', - 'native.notification.music.play': 'پخش', - 'native.notification.music.pause': 'توقف', - 'native.notification.qqMusic.playing': 'در حال پخش موسیقی', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'مسیریابی در جریان است', + 'native.notification.navigation.keepRunning': + 'در حال مسیریابی، اپلیکیشن را باز نگه دارید', + 'native.notification.bleAgent.running': 'دستیار صوتی در حال اجراست', + 'native.notification.audioRecording.recording': + 'در حال ضبط صدا، برای بازگشت به اپلیکیشن ضربه بزنید', + 'native.notification.music.waiting': 'در انتظار پخش', + 'native.notification.music.previous': 'قبلی', + 'native.notification.music.next': 'بعدی', + 'native.notification.music.play': 'پخش', + 'native.notification.music.pause': 'توقف', + 'native.notification.qqMusic.playing': 'در حال پخش موسیقی', // 版本更新 'newVersionFound': 'نسخه جدید یافت شد', // 版本更新对话框标题 @@ -1391,6 +1457,59 @@ const Map faIR = { "removeEarbudsEnsureBattery": "هر دو ایرباد را بردارید و اطمینان حاصل کنید که سطح باتری بالای ۲۰٪ است", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Upgrade Successful', + 'otaUpgradeCompleteRepair': + 'Firmware upgrade complete!\n\nDevice needs to be re-paired to work properly. Go to pairing page now?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': + 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': + 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': + 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', + // 音乐模块 "noMusic": "بدون موسیقی", // 暂无音乐 "noPlayingMusic": "موسیقی در حال پخش نیست", // 暂无播放音乐 diff --git a/lib/core/translations/language/fi_fi.dart b/lib/core/translations/language/fi_fi.dart index 22d5e90a9..ac9ba0ca2 100644 --- a/lib/core/translations/language/fi_fi.dart +++ b/lib/core/translations/language/fi_fi.dart @@ -169,6 +169,26 @@ const Map fiFI = { 'right': 'Oikea', 'checkConnectionStatusFailed': 'Yhteyden tilan tarkistus epäonnistui', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth-alustus epäonnistui: @error', + 'needBluetoothAndLocationPermission': 'Bluetooth- ja sijaintiluvat tarvitaan laitteiden etsimiseen', + 'permissionRequestFailedWithError': 'Lupapyyntö epäonnistui: @error', + 'needPermission': 'Lupa vaaditaan', + 'blePermissionDialogContent': 'Sovellus tarvitsee Bluetooth- ja sijaintiluvat laitteiden etsimiseen. Ota ne käyttöön Asetuksissa.', + 'needEnableBluetooth': 'Ota Bluetooth käyttöön', + 'enableBluetoothDialogContent': 'Ota Bluetooth käyttöön laitteiden etsimistä ja yhdistämistä varten.', + 'bleScanFailedWithError': 'Etsintä epäonnistui: @error', + 'bleConnectionSuccess': 'Yhdistäminen onnistui', + 'bleConnectedToDevice': 'Yhdistetty laitteeseen @device', + 'bleConnectionFailedWithError': 'Yhdistäminen epäonnistui: @error', + 'bleDisconnected': 'Yhteys katkaistu', + 'bleDeviceDisconnected': 'Laitteen yhteys katkaistu', + 'bleDisconnectFailedWithError': 'Yhteyden katkaisu epäonnistui: @error', + 'signalStrong': 'Vahva signaali', + 'signalMedium': 'Keskitason signaali', + 'signalWeak': 'Heikko signaali', + 'signalVeryWeak': 'Erittäin heikko signaali', + // 发现页 "searchAi": "Etsi AI-toimintoja...", "exploreSlogan": "Älykkäät kuulokkeet, loputtomat mahdollisuudet", @@ -876,6 +896,13 @@ const Map fiFI = { 'Haluamme tietää, miksi ilmoitat, voit kuvailla kohtaamaasi ongelmaa.', 'generatedByAi': 'AI:n luoma', + // Agent模块 - 工具调用 + 'toolCall': 'Työkalukutsu', + 'noResult': 'Ei tulosta', + 'noToolCallContentToCopy': 'Ei työkalukutsua kopioitavaksi', + 'toolCallDetails': 'Työkalukutsun tiedot:', + 'toolCallContentCopied': 'Työkalukutsu kopioitu leikepöydälle', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Tässä on joitain suositeltuja kappaleita:', 'playList': 'Soittolista', @@ -896,6 +923,28 @@ const Map fiFI = { "bicycling": 'Pyörällä', "tsransit": 'Julkinen liikenne', + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Valitse navigointisovellus', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigoi Amapilla', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigoi Baidu Mapsilla', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigoi Google Mapsilla', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigoi Apple Mapsilla', + 'builtInNavigation': 'Sisäänrakennettu navigointi', + 'useBuiltInNavigation': 'Navigoi sisäänrakennetulla kartalla', + 'navigationStartFailed': 'Navigoinnin käynnistys epäonnistui', + 'cannotPlayMusicListRetryLater': 'Musiikkilistaa ei voi toistaa, yritä myöhemmin', + 'cannotPlaySong': 'Kappaletta ei voi toistaa', + 'openMapError': 'Virhe kartan avaamisessa', + 'pleaseInstallAmapApp': 'Asenna Amap-sovellus ensin', + 'pleaseInstallBaiduMapApp': 'Asenna Baidu Maps -sovellus ensin', + 'appleMapStartFailed': 'Apple Maps ei käynnistynyt', + 'appleMapUnavailable': 'Apple Maps ei ole käytettävissä', + 'openAppleMapError': 'Virhe Apple Mapsin avaamisessa', + // Agent模块 - 天气卡片 'weatherQuery': 'Säätietojen kysely:', 'highest': 'Korkein', @@ -966,8 +1015,18 @@ const Map fiFI = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Poista kelluva ikkuna käytöstä', + 'enableFloatingWindow': 'Ota kelluva ikkuna käyttöön', + 'permissionTip': 'Lupavihje', + 'micPermissionRequiredForRecording': 'Mikrofonilupa vaaditaan äänitystä varten', + 'deleteTranslationRecordError': 'Virhe käännöstietueen poistamisessa: @error', "translationFailed": "Translation failed", + "translating": "Käännetään", + "translate": "Käännä", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Syötä käännettävä teksti", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1389,6 +1448,49 @@ const Map fiFI = { "removeEarbudsEnsureBattery": "Poista molemmat kuulokkeet ja varmista, että molempien akun varaus on yli 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Uusi versio @version löytyi', + 'otaConfirmUpdateNow': 'Päivitä nyt?', + 'otaUpdate': 'Päivitä', + 'otaUpgradeSuccess': 'Päivitys onnistui', + 'otaUpgradeCompleteRepair': 'Laiteohjelmiston päivitys valmis!\n\nLaite täytyy parittaa uudelleen. Siirry paritussivulle?', + 'otaPairLater': 'Parita myöhemmin', + 'otaPairNow': 'Parita nyt', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Virhe BLE-tarkistuksessa: @error', + 'otaBleNotConnected': 'BLE-laite ei yhdistetty', + 'otaBleNeedConnection': 'Päivitys vaatii BLE-yhteyden\nVarmista että laite on yhdistetty ja yritä uudelleen', + 'otaDeviceInfoUnavailableTitle': 'Laitteen tiedot eivät saatavilla', + 'otaCannotGetDeviceInfo': 'Laitteen tietoja ei voi hakea\nYhdistä laite uudelleen tai yritä myöhemmin', + 'otaBleCheckFailed': 'BLE-tarkistus epäonnistui', + 'otaCannotGetDeviceInfoCheckConnection': 'Laitteen tietoja ei voi hakea, tarkista yhteys', + 'otaCannotGetProductInfoWithName': 'Tuotetietoja ei voi hakea, laitteen nimi: @deviceName', + 'otaCannotGetBatteryInfo': 'Akkutietoja ei voi hakea', + 'otaLowBattery': 'Akku vähissä', + 'otaSingleBatteryLow': 'Akku liian vähissä päivitykseen\nVaatimus: akku yli 20%\nNykyinen: @ear @battery%\nLataa ja yritä uudelleen', + 'otaDoubleBatteryLow': 'Akku liian vähissä päivitykseen\nVaatimus: molemmat kuulokkeet yli 20%\nNykyinen: Vasen @left%, Oikea @right%\nLataa ja yritä uudelleen', + 'otaBatteryCheckFailed': 'Akkutarkistus epäonnistui', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': 'Päivitys sisältää suorituskykyparannuksia ja virhekorjauksia.', + 'otaGetLatestVersionFailed': 'Uusimman version haku epäonnistui', + 'otaGetVersionInfoFailed': 'Versiotietojen haku epäonnistui', + 'otaCheckingDeviceStatus': 'Tarkistetaan laitteen tilaa...', + 'otaDownloadFailedCheckNetwork': 'Lataus epäonnistui, tarkista verkkoyhteys', + 'otaDownloadFailed': 'Lataus epäonnistui', + 'otaPreparingConnection': 'Valmistellaan yhteyttä...', + 'otaConnectingDevice': 'Yhdistetään laitteeseen...', + 'otaUpgradeStarted': 'OTA-päivitys aloitettu...', + 'otaUpgradeProgressWithPercent': 'Päivityksen edistyminen: @percent%', + 'otaUpgradeSuccessComplete': 'Päivitys onnistui', + 'otaUpgradeFailedWithCode': 'Päivitys epäonnistui, virhekoodi: @code', + 'otaUpgradeFailedTitle': 'Päivitys epäonnistui', + 'otaUpgradeFailedDesc': 'Tarkista yhteys tai päivityspaketti, virhekoodi: @code', + 'otaDeviceDisconnected': 'Laitteen yhteys katkaistu', + 'otaDeviceConnected': 'Laite yhdistetty', + // 音乐模块 "noMusic": "Ei musiikkia", // 暂无音乐 "noPlayingMusic": "Ei soitettavaa musiikkia", // 暂无播放音乐 diff --git a/lib/core/translations/language/fr_fr.dart b/lib/core/translations/language/fr_fr.dart index 66abdf03f..d76baeb12 100644 --- a/lib/core/translations/language/fr_fr.dart +++ b/lib/core/translations/language/fr_fr.dart @@ -1,5 +1,4 @@ const Map frFR = { - // 通用 'continue': 'Continuer', 'confirm': 'Confirmer', @@ -19,11 +18,11 @@ const Map frFR = { "unknownError": "Erreur inconnue", "asrConnectionFailed": "La connexion au service de reconnaissance vocale a échoué. Vérifiez votre connexion réseau ou réessayez plus tard.", - "justNow": "Just now", - "minutesAgo": "@minutes minutes ago", - "yesterday": "Yesterday", - "daysAgo": "@days days ago", - "hoursAgo": "@hours hours ago", + "justNow": "À l’instant", + "minutesAgo": "Il y a @minutes minutes", + "yesterday": "Hier", + "daysAgo": "Il y a @days jours", + "hoursAgo": "Il y a @hours heures", // 启动页 "slogan": "Connecter le monde, au-delà de la voix", @@ -172,6 +171,30 @@ const Map frFR = { 'checkConnectionStatusFailed': 'Échec de la vérification de l\'état de la connexion', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Echec de l initialisation Bluetooth : @error', + 'needBluetoothAndLocationPermission': + 'Les autorisations Bluetooth et de localisation sont requises pour scanner', + 'permissionRequestFailedWithError': + 'Echec de la demande d autorisation : @error', + 'needPermission': 'Autorisation requise', + 'blePermissionDialogContent': + 'Cette application necessite les autorisations Bluetooth et de localisation pour scanner les appareils. Veuillez les activer dans les parametres.', + 'needEnableBluetooth': 'Activer le Bluetooth', + 'enableBluetoothDialogContent': + 'Veuillez activer le Bluetooth pour scanner et connecter les appareils.', + 'bleScanFailedWithError': 'Echec du scan : @error', + 'bleConnectionSuccess': 'Connexion reussie', + 'bleConnectedToDevice': 'Connecte a @device', + 'bleConnectionFailedWithError': 'Echec de la connexion : @error', + 'bleDisconnected': 'Deconnecte', + 'bleDeviceDisconnected': 'Appareil deconnecte', + 'bleDisconnectFailedWithError': 'Echec de la deconnexion : @error', + 'signalStrong': 'Fort', + 'signalMedium': 'Moyen', + 'signalWeak': 'Faible', + 'signalVeryWeak': 'Tres faible', + // 发现页 "searchAi": "Rechercher des fonctions IA...", "exploreSlogan": "Écouteurs intelligents, possibilités infinies", @@ -198,44 +221,44 @@ const Map frFR = { "scene": "Scénarios", // 用量统计模块 - "aiChat": "AI Chat", - "translationStats": "Translation Statistics", - "meetingStats": "Meeting Statistics", - "today": "Today", - "thisWeek": "This Week", - "thisMonth": "This Month", - "history": "History", - "currentSessionStats": "Current Session Stats", - "translationCount": "Translation Count", - "sessionDuration": "Session Duration", - "characters": "Characters", - "recordingDuration": "Recording Duration", - "totalApiCalls": "Total API Calls", - "sessionCount": "Session Count", - "totalCharacters": "Total Characters", - "apiCallStats": "API Call Stats", - "translationApi": "Translation API", + "aiChat": "Chat IA", + "translationStats": "Statistiques de traduction", + "meetingStats": "Statistiques de réunion", + "today": "Aujourd’hui", + "thisWeek": "Cette semaine", + "thisMonth": "Ce mois-ci", + "history": "Historique", + "currentSessionStats": "Statistiques de la session en cours", + "translationCount": "Nombre de traductions", + "sessionDuration": "Durée de la session", + "characters": "Caractères", + "recordingDuration": "Durée d’enregistrement", + "totalApiCalls": "Nombre total d’appels API", + "sessionCount": "Nombre de sessions", + "totalCharacters": "Nombre total de caractères", + "apiCallStats": "Statistiques des appels API", + "translationApi": "API de traduction", "asr": "ASR", "tts": "TTS", - "dataVolumeStats": "Data Volume Stats", - "sourceTextCharacters": "Source Text Characters", - "ttsTextCharacters": "TTS Text Characters", - "effectiveAudioDuration": "Effective Audio Duration", - "totalSessionDuration": "Total Session Duration", - "costStats": "Cost Stats", - "estimatedCost": "Estimated Cost", - "dailyCostThreshold": "Daily Cost Threshold", - "monthlyCostThreshold": "Monthly Cost Threshold", - "usageBehaviorStats": "Usage Behavior Stats", - "mostUsedLanguagePair": "Most-used language pair", - "mostUsedMode": "Most-used mode", - "asrApiCalls": "ASR Calls", - "totalAudioDuration": "Total Audio Duration", - "audioFileSize": "Audio File Size", - "transcriptBytes": "Transcript Bytes", - "loadFailed": "Load Failed", + "dataVolumeStats": "Statistiques de volume de données", + "sourceTextCharacters": "Caractères du texte source", + "ttsTextCharacters": "Caractères du texte TTS", + "effectiveAudioDuration": "Durée audio effective", + "totalSessionDuration": "Durée totale des sessions", + "costStats": "Statistiques de coût", + "estimatedCost": "Coût estimé", + "dailyCostThreshold": "Seuil de coût quotidien", + "monthlyCostThreshold": "Seuil de coût mensuel", + "usageBehaviorStats": "Statistiques de comportement d’usage", + "mostUsedLanguagePair": "Paire de langues la plus utilisée", + "mostUsedMode": "Mode le plus utilisé", + "asrApiCalls": "Appels ASR", + "totalAudioDuration": "Durée audio totale", + "audioFileSize": "Taille du fichier audio", + "transcriptBytes": "Octets de transcription", + "loadFailed": "Échec du chargement", "statsLoadFailedTryLater": - "Statistics failed to load. Please try again later.", + "Échec du chargement des statistiques. Veuillez réessayer plus tard.", "cleanupComplete": "Cleanup Complete", "cleanedOldData": "Cleaned data older than 90 days", "exportFeature": "Export Feature", @@ -247,66 +270,71 @@ const Map frFR = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Paiement réussi', - 'paymentFailed': 'Échec du paiement', - 'gotIt': 'Compris', - 'paymentFailedTryAgain': 'Échec du paiement. Veuillez réessayer.', - 'selectPaymentMethod': 'Sélectionnez le mode de paiement', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Échec de la création de la commande WeChat', - 'alipayOrderCreateFailed': 'Échec de la création de la commande Alipay', - 'appleOrderCreateFailed': 'Échec de la création de la commande Apple', - 'googleOrderCreateFailed': 'Échec de la création de la commande Google', - 'paypalOrderCreateFailed': 'Échec de la création de la commande PayPal', - 'paymentException': 'Exception de paiement', - 'paymentLaunchFailed': 'Échec du lancement du paiement', - 'paymentExceptionWithError': 'Exception de paiement : @error', - 'paymentProcessingCheckLater': 'Votre commande est en cours de traitement. Veuillez vérifier plus tard.', - 'paymentResultQueryException': 'Échec de la requête du résultat de paiement : @error', - 'orderConfirmedQuotaRefreshed': 'Commande confirmée. Votre quota a été actualisé.', - 'paymentCompletedConfirming': 'Paiement effectué. Confirmation en cours…', - 'paymentCancelled': 'Paiement annulé', - 'paypalOpenedCompleteInBrowser': 'PayPal ouvert. Veuillez effectuer le paiement dans votre navigateur.', - 'paypalOpenFailed': "Impossible d'ouvrir la page de paiement PayPal", - 'paymentTestTitle': 'Test de paiement', - 'paymentTestOrderInfo': 'Informations de la commande de test', - 'paymentTestProductId': 'ID du produit', - 'paymentTestProductDescription': 'Description du produit', - 'paymentTestWechatDescription': 'Test de paiement WeChat Pay', - 'paymentTestAlipayDescription': 'Test de paiement Alipay', - 'paymentTestAmount': 'Montant', - 'paymentTestSelectAmount': 'Sélectionnez le montant du test', - 'paying': 'Paiement en cours...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Statut du paiement', - 'errorInfoWithMessage': 'Erreur : @message', - 'retest': 'Retester', - 'paymentTestInstructionsTitle': 'Instructions', - 'paymentTestInstructionsContent': "1. Sélectionnez un montant de test (recommandé : ¥0.01)\n2. Cliquez sur le bouton de paiement pour commencer\n3. Effectuez le paiement dans l'application de paiement\n4. Revenez vérifier le résultat", - 'startingWechatPayment': 'Lancement de WeChat Pay...', - 'startingAlipayPayment': "Lancement d'Alipay...", - 'wechatPaymentSuccess': 'Paiement WeChat Pay réussi !', - 'wechatPaymentFailed': 'Échec du paiement WeChat Pay', - 'wechatPaymentLaunchFailed': 'Échec du lancement de WeChat Pay', - 'cannotLaunchWechatPayment': 'Impossible de lancer WeChat Pay', - 'wechatPaymentException': 'Exception WeChat Pay', - 'wechatPaymentTestCompleted': 'Test de paiement WeChat Pay terminé', - 'alipayPaymentSuccess': 'Paiement Alipay réussi !', - 'alipayPaymentFailed': 'Échec du paiement Alipay', - 'alipayPaymentLaunchFailed': "Échec du lancement d'Alipay", - 'cannotLaunchAlipayPayment': 'Impossible de lancer Alipay', - 'alipayPaymentException': 'Exception Alipay', - "insufficientIntegral": "Insufficient integral", + 'paymentSuccess': 'Paiement réussi', + 'paymentFailed': 'Échec du paiement', + 'gotIt': 'Compris', + 'paymentFailedTryAgain': 'Échec du paiement. Veuillez réessayer.', + 'selectPaymentMethod': 'Sélectionnez le mode de paiement', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Échec de la création de la commande WeChat', + 'alipayOrderCreateFailed': 'Échec de la création de la commande Alipay', + 'appleOrderCreateFailed': 'Échec de la création de la commande Apple', + 'googleOrderCreateFailed': 'Échec de la création de la commande Google', + 'paypalOrderCreateFailed': 'Échec de la création de la commande PayPal', + 'paymentException': 'Exception de paiement', + 'paymentLaunchFailed': 'Échec du lancement du paiement', + 'paymentExceptionWithError': 'Exception de paiement : @error', + 'paymentProcessingCheckLater': + 'Votre commande est en cours de traitement. Veuillez vérifier plus tard.', + 'paymentResultQueryException': + 'Échec de la requête du résultat de paiement : @error', + 'orderConfirmedQuotaRefreshed': + 'Commande confirmée. Votre quota a été actualisé.', + 'paymentCompletedConfirming': 'Paiement effectué. Confirmation en cours…', + 'paymentCancelled': 'Paiement annulé', + 'paypalOpenedCompleteInBrowser': + 'PayPal ouvert. Veuillez effectuer le paiement dans votre navigateur.', + 'paypalOpenFailed': "Impossible d'ouvrir la page de paiement PayPal", + 'paymentTestTitle': 'Test de paiement', + 'paymentTestOrderInfo': 'Informations de la commande de test', + 'paymentTestProductId': 'ID du produit', + 'paymentTestProductDescription': 'Description du produit', + 'paymentTestWechatDescription': 'Test de paiement WeChat Pay', + 'paymentTestAlipayDescription': 'Test de paiement Alipay', + 'paymentTestAmount': 'Montant', + 'paymentTestSelectAmount': 'Sélectionnez le montant du test', + 'paying': 'Paiement en cours...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Statut du paiement', + 'errorInfoWithMessage': 'Erreur : @message', + 'retest': 'Retester', + 'paymentTestInstructionsTitle': 'Instructions', + 'paymentTestInstructionsContent': + "1. Sélectionnez un montant de test (recommandé : ¥0.01)\n2. Cliquez sur le bouton de paiement pour commencer\n3. Effectuez le paiement dans l'application de paiement\n4. Revenez vérifier le résultat", + 'startingWechatPayment': 'Lancement de WeChat Pay...', + 'startingAlipayPayment': "Lancement d'Alipay...", + 'wechatPaymentSuccess': 'Paiement WeChat Pay réussi !', + 'wechatPaymentFailed': 'Échec du paiement WeChat Pay', + 'wechatPaymentLaunchFailed': 'Échec du lancement de WeChat Pay', + 'cannotLaunchWechatPayment': 'Impossible de lancer WeChat Pay', + 'wechatPaymentException': 'Exception WeChat Pay', + 'wechatPaymentTestCompleted': 'Test de paiement WeChat Pay terminé', + 'alipayPaymentSuccess': 'Paiement Alipay réussi !', + 'alipayPaymentFailed': 'Échec du paiement Alipay', + 'alipayPaymentLaunchFailed': "Échec du lancement d'Alipay", + 'cannotLaunchAlipayPayment': 'Impossible de lancer Alipay', + 'alipayPaymentException': 'Exception Alipay', + "insufficientIntegral": "Points insuffisants", "insufficientBalanceDesc": - 'Insufficient balance, please go to the corresponding recharge page to recharge.', - "recharge": 'Go to Recharge', + 'Solde insuffisant, veuillez aller à la page de recharge correspondante pour recharger.', + "recharge": 'Aller recharger', "aiMemberExpiredDesc": - 'AI membership expired, please go to the membership recharge page to renew.', + 'Votre abonnement IA a expiré, veuillez aller à la page de recharge pour le renouveler.', // 商品模块 - AI商品页 'musicAndRecommendation': 'Music & Recommendation', @@ -315,9 +343,9 @@ const Map frFR = { 'newsInformation': 'News', 'communicationAssistant': 'Communication Assistant', 'aiHeaderDesc1': - 'Longer conversation quota, more tool calls, extended context length.', + 'Quota de conversation plus élevé, plus d’appels d’outils, contexte étendu.', 'aiHeaderDesc2': - 'Suitable for agent Q&A, summarization, analysis, and task execution.', + 'Adapté aux questions-réponses avec l’agent, aux résumés, aux analyses et à l’exécution de tâches.', 'musicSearchPlaybackControl': 'Music library search and playback control', 'smartPlaylistAndSimilarRecommendations': 'Smart playlist and similar song recommendations', @@ -334,18 +362,19 @@ const Map frFR = { 'templatedMessagesAndScheduleReminders': 'Template messages and schedule reminders', 'aiDisclaimer': - 'Features depend on device permissions, service availability, and network conditions.', + 'Les fonctionnalités dépendent des autorisations de l’appareil, de la disponibilité du service et des conditions réseau.', // 商品模块 - 翻译商品页 'realtimeTranscription': 'Real-time Transcription', 'sceneLexicon': 'Scenario Glossary', 'subtitleDisplay': 'Subtitles', 'transHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'transHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', - 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', + 'Interprétation simultanée en temps réel et traduction de texte avec voix à faible latence.', + 'transHeaderDesc2': + 'Adapté aux voyages, aux affaires, aux discours et à l’enseignement.', + 'translateZhEn': 'Traduction chinois–anglais', + 'lowLatencyVoiceBroadcast': 'Diffusion vocale à faible latence', + 'multiLangTextTranslation': 'Traduction de texte multilingue', 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', @@ -353,18 +382,18 @@ const Map frFR = { 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', 'colorHighContrast': 'High color contrast', 'transDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'Les performances de traduction dépendent du microphone, de la latence réseau et du bruit ambiant.', // 商品模块 - 会议商品页 - 'meetingRecording': 'Meeting Recording', + 'meetingRecording': 'Enregistrement de réunion', 'transcriptionAndSummary': 'Transcription & Summary', 'keywordSearch': 'Keyword Search', 'collaborationSharing': 'Collaboration & Sharing', 'meetingHeaderDesc1': - 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', + 'Enregistrement audio, transcription, recherche par mots-clés et résumé automatique pour améliorer l’efficacité des réunions.', 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', - 'meetingAutoRecording': 'Auto recording and segmentation', + 'meetingAutoRecording': 'Enregistrement automatique et segmentation', 'meetingSpeakerTagging': 'Speaker labeling', 'meetingLongAudioTranscription': 'Long audio transcription', 'meetingKeyPointSummary': 'Key point extraction', @@ -373,7 +402,7 @@ const Map frFR = { 'meetingExportSummary': 'Export minutes', 'meetingMultiPlatformShare': 'Share across platforms', 'meetingDisclaimer': - 'Use in quiet environments; performance depends on microphone and network.', + 'À utiliser dans des environnements calmes ; les performances dépendent du microphone et du réseau.', // 商品模块 - VIP会员页 'benefitsOverview': 'Benefits overview', @@ -387,29 +416,30 @@ const Map frFR = { 'longTermDiscountPlan': 'Long-term discount plan', 'generalPrivileges': 'General privileges', 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', + 'crossDeviceSync': 'Synchronisation multi‑appareils', 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', // 商品模块 - 商品名称与描述 - 'ai_001_name': 'AI Basic 100', - 'ai_002_name': 'AI Basic 500', - 'ai_003_name': 'AI Basic 1000', - 'meet_001_name': 'Meeting Basic 100', - 'meet_002_name': 'Meeting Basic 500', - 'meet_003_name': 'Meeting Basic 1000', - 'trans_001_name': 'Translation Basic 100', - 'trans_002_name': 'Translation Basic 500', - 'trans_003_name': 'Translation Basic 1000', - 'ai_001_desc': 'Includes 100 uses. Access core AI features.', - 'ai_002_desc': 'Includes 500 uses. Access core AI features.', - 'ai_003_desc': 'Includes 1000 uses. Access core AI features.', - 'meet_001_desc': 'Includes 100 meeting recordings/transcriptions.', - 'meet_002_desc': 'Includes 500 meeting recordings/transcriptions.', - 'meet_003_desc': 'Includes 1000 meeting recordings/transcriptions.', - 'trans_001_desc': 'Includes 100 translations (voice/text).', - 'trans_002_desc': 'Includes 500 translations (voice/text).', - 'trans_003_desc': 'Includes 1000 translations (voice/text).', + 'ai_001_name': 'IA Basique 100', + 'ai_002_name': 'IA Basique 500', + 'ai_003_name': 'IA Basique 1000', + 'meet_001_name': 'Réunion Basique 100', + 'meet_002_name': 'Réunion Basique 500', + 'meet_003_name': 'Réunion Basique 1000', + 'trans_001_name': 'Traduction Basique 100', + 'trans_002_name': 'Traduction Basique 500', + 'trans_003_name': 'Traduction Basique 1000', + 'ai_001_desc': 'Inclut 100 utilisations. Accès aux fonctions IA principales.', + 'ai_002_desc': 'Inclut 500 utilisations. Accès aux fonctions IA principales.', + 'ai_003_desc': + 'Inclut 1000 utilisations. Accès aux fonctions IA principales.', + 'meet_001_desc': 'Inclut 100 enregistrements/transcriptions de réunions.', + 'meet_002_desc': 'Inclut 500 enregistrements/transcriptions de réunions.', + 'meet_003_desc': 'Inclut 1000 enregistrements/transcriptions de réunions.', + 'trans_001_desc': 'Inclut 100 traductions (voix/texte).', + 'trans_002_desc': 'Inclut 500 traductions (voix/texte).', + 'trans_003_desc': 'Inclut 1000 traductions (voix/texte).', // 商品模块 - 页脚 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', @@ -465,38 +495,41 @@ const Map frFR = { 'recordingDetails': 'Détails de l\'enregistrement', 'aiSummary': 'Résumé IA', 'meetingTranscript': 'Transcription de la réunion', - 'files': 'Files', - 'mine': 'Mine', - 'connect': 'Connect', - 'allFiles': 'All Files', - 'searchInAllFiles': 'Search in all files', - 'from': 'From', - 'sortBy': 'Sort by', - 'creationTime': 'Creation Time', - 'bluetoothConnection': 'Bluetooth Connection', - 'meetingReconnect': 'Reconnect', - 'searching': 'Searching...', - 'searchFailed': 'Search failed, please check if Bluetooth is enabled', - 'aiPenNotFound': 'AI PEN device not found', - 'connectedToAiPen': 'Connected to AI PEN device', - 'checkingNewFiles': 'Checking for new files to import', - 'startingWifi': 'Starting Wi-Fi...', - 'newFilesDetected': 'New files detected, preparing to import', - 'noNewFiles': 'No new files to import', - 'connectingWifi': 'Connecting to Wi-Fi...', - 'wifiConnected': 'Wi-Fi connected successfully', - 'downloadingFiles': 'Downloading files...', - 'downloadingFileProgress': 'Total {total} files, downloading file {current}', - 'downloadComplete': 'Download complete', + 'files': 'Fichiers', + 'mine': 'Les miens', + 'connect': 'Connecter', + 'allFiles': 'Tous les fichiers', + 'searchInAllFiles': 'Rechercher dans tous les fichiers', + 'from': 'De', + 'sortBy': 'Trier par', + 'creationTime': 'Date de création', + 'bluetoothConnection': 'Connexion Bluetooth', + 'meetingReconnect': 'Reconnecter', + 'searching': 'Recherche en cours...', + 'searchFailed': + 'Échec de la recherche, veuillez vérifier si le Bluetooth est activé', + 'aiPenNotFound': 'Appareil AI PEN introuvable', + 'connectedToAiPen': 'Connecté à l’appareil AI PEN', + 'checkingNewFiles': 'Vérification des nouveaux fichiers à importer', + 'startingWifi': 'Démarrage du Wi‑Fi...', + 'newFilesDetected': + 'Nouveaux fichiers détectés, préparation de l’importation', + 'noNewFiles': 'Aucun nouveau fichier à importer', + 'connectingWifi': 'Connexion au Wi‑Fi...', + 'wifiConnected': 'Connexion Wi‑Fi réussie', + 'downloadingFiles': 'Téléchargement des fichiers...', + 'downloadingFileProgress': + 'Total {total} fichiers, téléchargement du fichier {current}', + 'downloadComplete': 'Téléchargement terminé', 'downloadCompleteInfo': - 'Download complete, {count} files in total, returning automatically in 2 seconds', + 'Téléchargement terminé, {count} fichiers au total, retour automatique dans 2 secondes', // Meeting模块 - 录音功能 - 'startRecording': 'Start Recording', - 'liveRecording': 'Live Recording', - 'audioVideoRecording': 'Audio/Video Recording', - 'callRecording': 'Call Recording', - 'importAudio': 'Import Audio', + 'startRecording': 'Commencer l’enregistrement', + 'liveRecording': 'Enregistrement en direct', + 'audioVideoRecording': 'Enregistrement audio/vidéo', + 'callRecording': 'Enregistrement d’appel', + 'importAudio': 'Importer un audio', 'meetingRecordExitTitle': 'Quitter l\'enregistrement', // 退出录音 'meetingRecordExitMessage': 'Choisissez quoi faire avant de quitter', // 请选择离开后的操作 @@ -520,163 +553,167 @@ const Map frFR = { 'Pour afficher la barre flottante d\'enregistrement (minuteur/pause/reprendre) pendant l\'enregistrement, nous avons besoin de l\'autorisation d\'affichage par-dessus les autres applis.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 'overlayPermissionOpenSettingsFailed': 'Impossible d\'ouvrir automatiquement les réglages système. Ouvrez Réglages et activez manuellement l\'autorisation d\'affichage par-dessus les autres applis.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 - 'transcribing': 'Transcribing...', - 'summarizing': 'Summarizing...', - 'analyzing': 'Analyzing...', - 'summaryComplete': 'Summary Complete', - 'generate': 'Generate', - 'overview': 'Overview', + 'transcribing': 'Transcription en cours...', + 'summarizing': 'Résumé en cours...', + 'analyzing': 'Analyse en cours...', + 'summaryComplete': 'Résumé terminé', + 'generate': 'Générer', + 'overview': 'Vue d’ensemble', 'transcription': 'Transcription', - 'summary': 'Summary', - 'mindMap': 'Mind Map', - 'editSpeaker': 'Edit', - 'nameSpeaker': 'Name Speaker', + 'summary': 'Résumé', + 'mindMap': 'Carte mentale', + 'editSpeaker': 'Modifier', + 'nameSpeaker': 'Nommer l’intervenant', // Meeting模块 - 转写与总结 - 'reSummarize': 'Re-summarize', - 'dateAndTime': 'Date & Time', - 'location': 'Location', - 'attendees': 'Attendees', - 'inputLocation': 'Enter Location', - 'inputAttendees': 'Enter Attendees', + 'reSummarize': 'Résumer à nouveau', + 'dateAndTime': 'Date et heure', + 'location': 'Lieu', + 'attendees': 'Participants', + 'inputLocation': 'Saisir le lieu', + 'inputAttendees': 'Saisir les participants', // Meeting模块 - 模版与生成 - 'selectSummaryTemplate': 'Select Summary Template', - 'useThisTemplate': 'Use This Template', - 'lastUsed': 'Last Used', - 'create': 'Créer', - 'templateDetails': 'Détails du modèle', - 'tag': 'Étiquette', - 'description': 'Description', - 'template': 'Modèle', - 'deleteTemplate': 'Supprimer le modèle', - 'deleteTemplateConfirm': 'Êtes-vous sûr de vouloir supprimer ce modèle ?', - 'editTemplate': 'Modifier le modèle', - 'createTemplate': 'Créer un modèle', - 'name': 'Nom', - 'templateContentHint': 'Veuillez saisir le contenu du modèle ! Astuce : Cliquez sur le bouton IA ci-dessus pour générer rapidement le contenu du modèle à partir du nom et de la description saisis', - 'inputNameHint': 'Veuillez saisir un nom', - 'inputDescHint': 'Veuillez saisir une description', - 'custom': 'Personnalisé', - 'pleaseEnter': 'Veuillez saisir', - 'viewAll': 'View All', - 'recordingLanguage': 'Recording Language', - 'chineseSimplified': 'Chinese Mandarin (Simplified)', - 'meetingGenerateNow': 'Generate Now', - 'keyEventsAnalyzed': 'Analyzed {count} key events.', + 'selectSummaryTemplate': 'Sélectionner un modèle de résumé', + 'useThisTemplate': 'Utiliser ce modèle', + 'lastUsed': 'Dernière utilisation', + 'create': 'Créer', + 'templateDetails': 'Détails du modèle', + 'tag': 'Étiquette', + 'description': 'Description', + 'template': 'Modèle', + 'deleteTemplate': 'Supprimer le modèle', + 'deleteTemplateConfirm': 'Êtes-vous sûr de vouloir supprimer ce modèle ?', + 'editTemplate': 'Modifier le modèle', + 'createTemplate': 'Créer un modèle', + 'name': 'Nom', + 'templateContentHint': + 'Veuillez saisir le contenu du modèle ! Astuce : Cliquez sur le bouton IA ci-dessus pour générer rapidement le contenu du modèle à partir du nom et de la description saisis', + 'inputNameHint': 'Veuillez saisir un nom', + 'inputDescHint': 'Veuillez saisir une description', + 'custom': 'Personnalisé', + 'pleaseEnter': 'Veuillez saisir', + 'viewAll': 'Tout voir', + 'recordingLanguage': 'Langue d’enregistrement', + 'chineseSimplified': 'Mandarin chinois (simplifié)', + 'meetingGenerateNow': 'Générer maintenant', + 'keyEventsAnalyzed': '{count} événements clés analysés.', 'aiAnalysisDesc': - 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', + 'L’analyse IA identifie les événements clés dans les enregistrements, ce qui vous permet de sélectionner les plus importants pour la génération IA.', // Meeting模块 - 文件操作 - 'importing': 'Importing...', - 'batchImporting': 'Batch importing...', - 'importingLocalRecordings': 'Importing local recordings...', - 'importFailed': 'Import file failed: {filePath}, error: {error}', - 'importSuccess': 'Successfully imported {count} local recordings', - 'importError': 'Import failed: {error}', - 'pleaseSelectAudioFile': 'Please select audio file', - 'shareAudio': 'Share Meeting Audio', - 'shareComplete': 'Share complete!', - 'shareFailed': 'Share failed: {error}', - 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', + 'importing': 'Importation en cours...', + 'batchImporting': 'Importation par lot...', + 'importingLocalRecordings': 'Importation des enregistrements locaux...', + 'importFailed': + 'Échec de l’importation du fichier : {filePath}, erreur : {error}', + 'importSuccess': 'Importation réussie de {count} enregistrements locaux', + 'importError': 'Échec de l’importation : {error}', + 'pleaseSelectAudioFile': 'Veuillez sélectionner un fichier audio', + 'shareAudio': 'Partager l’audio de la réunion', + 'shareComplete': 'Partage terminé', + 'shareFailed': 'Échec du partage : {error}', + 'fileProcessingFailed': + 'Échec du traitement du fichier : {filePath}, erreur : {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Enregistrer la carte mentale', - 'shareMindMap': 'Share Mind Map', - 'shareSuccess': 'Share Success', + 'saveMindMap': 'Enregistrer la carte mentale', + 'shareMindMap': 'Partager la carte mentale', + 'shareSuccess': 'Partage réussi', // Meeting模块 - AI问答 - 'askAI': 'Ask AI ...', - 'askAIPrompt': 'What can I help you with today?', - 'continueAsk': 'Continue Asking', - 'todoList': 'To-Do List', - 'extractConclusion': 'Extract Conclusion', - 'generateKeyIndicators': 'Generate Key Indicators', + 'askAI': 'Demander à l’IA...', + 'askAIPrompt': 'En quoi puis-je vous aider aujourd’hui ?', + 'continueAsk': 'Continuer à demander', + 'todoList': 'Liste de tâches', + 'extractConclusion': 'Extraire les conclusions', + 'generateKeyIndicators': 'Générer des indicateurs clés', // Meeting模块 - 分享与导出 - 'shareLink': 'Share Link', - 'copyTranscript': 'Copy Transcript', - 'copySummary': 'Copy Summary', - 'exportAudio': 'Export Audio', - 'exportTranscript': 'Export Transcript', - 'shareMeetingAudio': 'Share Meeting Audio', - 'exportSummary': 'Export Summary', - 'exportAs': 'Export As', - 'exportingPDF': 'Exporting PDF...', - 'export': 'Exporter', + 'shareLink': 'Partager le lien', + 'copyTranscript': 'Copier la transcription', + 'copySummary': 'Copier le résumé', + 'exportAudio': 'Exporter l’audio', + 'exportTranscript': 'Exporter la transcription', + 'shareMeetingAudio': 'Partager l’audio de la réunion', + 'exportSummary': 'Exporter le résumé', + 'exportAs': 'Exporter en tant que', + 'exportingPDF': 'Exportation du PDF...', + 'export': 'Exporter', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Appliquer à tous les paragraphes de cet intervenant', 'summaryWillBeUpdatedAutomatically': 'Le résumé sera mis à jour automatiquement selon le modèle', - 'nameCurrentSpeaker': 'Name Current Speaker', - 'recentlyUsedNames': 'Recently Used Names', - 'applyToCurrentParagraph': 'Apply to Current Paragraph', - 'totalTime': 'Total Time', + 'nameCurrentSpeaker': 'Nommer l’intervenant actuel', + 'recentlyUsedNames': 'Noms récemment utilisés', + 'applyToCurrentParagraph': 'Appliquer au paragraphe actuel', + 'totalTime': 'Durée totale', 'summarySpeakerWillBeUpdatedAutomatically': - 'Summary speakers will be updated automatically', + 'Les intervenants du résumé seront mis à jour automatiquement', // Meeting模块 - 云端同步 - 'syncToCloud': 'Sync to Cloud', + 'syncToCloud': 'Synchroniser vers le cloud', 'syncToCloudTip': - 'Automatically sync your recordings to the cloud, you can play, manage and share recordings through any VOITRANS APP or VOITRANS Web (web.voitrans.com).', - 'syncToVoitransApp': 'Sync VOITRANS APP', - 'transcriptionRecord': 'Transcription Record', + 'Synchronisez automatiquement vos enregistrements vers le cloud ; vous pouvez lire, gérer et partager les enregistrements via VOITRANS APP ou VOITRANS Web (web.voitrans.com).', + 'syncToVoitransApp': 'Synchroniser VOITRANS APP', + 'transcriptionRecord': 'Enregistrement de transcription', // Meeting模块 - 我的页面 - 'transcriptionRecords': 'Transcription Records', - 'templateCommunity': 'Template Community', - 'comingSoon': 'Coming Soon', - 'integration': 'Integration', + 'transcriptionRecords': 'Enregistrements de transcription', + 'templateCommunity': 'Communauté de modèles', + 'comingSoon': 'Bientôt disponible', + 'integration': 'Intégration', 'voitransPrivateCloud': 'VOITRANS PRIVATE CLOUD', - 'enabled': 'Enabled', - 'disabled': 'Disabled', - 'myVoitransDevice': 'My VOITRANS Device', - 'helpAndFeedback': 'Help & Feedback', - 'aboutVoitrans': 'About VOITRANS', - 'meetingDays': 'Days', - 'meetingHours': 'Hours', - 'voitransAiMember': 'Voitrans AI Member', - 'unlockStarterMember': 'Unlock Starter Member', - 'bindDeviceToActivate': 'Bind Voitrans device to activate Starter membership', - 'unlockNow': 'Unlock Now', + 'enabled': 'Activé', + 'disabled': 'Désactivé', + 'myVoitransDevice': 'Mon appareil VOITRANS', + 'helpAndFeedback': 'Aide et commentaires', + 'aboutVoitrans': 'À propos de VOITRANS', + 'meetingDays': 'Jours', + 'meetingHours': 'Heures', + 'voitransAiMember': 'Membre Voitrans IA', + 'unlockStarterMember': 'Débloquer l’abonnement Starter', + 'bindDeviceToActivate': + 'Associez un appareil Voitrans pour activer l’abonnement Starter', + 'unlockNow': 'Débloquer maintenant', // Meeting模块 - 会员与升级 - 'comparison': 'Comparison', - 'detailedInfo': 'Detailed Information', - 'monthlyTranscriptionTime': 'Monthly Transcription Time', - 'unlimited': 'Unlimited', - 'professionalTemplates': 'Professional Templates', - 'limited': 'Limited', - 'fullTemplates': 'Full Templates', - 'professionalTerms': 'Professional Terms', - 'customTemplates': 'Custom Templates', - 'visualMindMap': 'Visual Mind Map', - 'speakerIdentification': 'Speaker Identification', - 'aiVoiceEnhancement': 'AI Voice Enhancement', - 'audioImport': 'Audio Import', - 'multipleExportFormats': 'Multiple Export Formats', - 'professionalSummaryTemplates': 'Professional Summary Templates', + 'comparison': 'Comparaison', + 'detailedInfo': 'Informations détaillées', + 'monthlyTranscriptionTime': 'Temps de transcription mensuel', + 'unlimited': 'Illimité', + 'professionalTemplates': 'Modèles professionnels', + 'limited': 'Limité', + 'fullTemplates': 'Modèles complets', + 'professionalTerms': 'Termes professionnels', + 'customTemplates': 'Modèles personnalisés', + 'visualMindMap': 'Carte mentale visuelle', + 'speakerIdentification': 'Identification des intervenants', + 'aiVoiceEnhancement': 'Amélioration vocale IA', + 'audioImport': 'Importation audio', + 'multipleExportFormats': 'Formats d’exportation multiples', + 'professionalSummaryTemplates': 'Modèles de résumé professionnels', 'professionalTemplateDesc': - 'Professional template design to improve your work efficiency. Customized according to industry needs.', + 'Modèles professionnels conçus pour améliorer votre efficacité. Personnalisés selon les besoins de votre secteur.', 'customTemplateDesc': - 'You can customize summary prompts according to your needs and use them to generate the required summaries.', + 'Vous pouvez personnaliser les invites de résumé selon vos besoins et les utiliser pour générer les résumés souhaités.', 'askAiDesc': - 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', + 'Extrayez intelligemment des informations plus approfondies à partir des enregistrements ; générez tableaux de données, conclusions clés, listes de tâches, e‑mails de rapport et autres contenus formatés en un clic.', 'visualMindMapDesc': - 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', + 'Au‑delà des résumés : organisez et visualisez les points clés avec des cartes mentales pour mieux comprendre l’ensemble du texte.', 'templateCommunityDesc': - 'Discover, share, and get inspiration from the template library created by users.', + 'Découvrez, partagez et trouvez l’inspiration dans la bibliothèque de modèles créée par les utilisateurs.', 'speakerIdentificationDesc': - 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', + 'La transcription audio prend en charge l’identification des intervenants pour restituer plus intuitivement le contenu des réunions ou des appels, tout en rendant le résumé plus précis.', 'privateCloudSyncDesc': - 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', + 'Vos enregistrements et transcriptions sont stockés de manière sécurisée sur des serveurs cloud dédiés, avec chiffrement complet lors du téléversement et du téléchargement pour garantir confidentialité et sécurité.', 'aiVoiceEnhancementDesc': - 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', + 'L’amélioration vocale IA propose plusieurs niveaux de réduction de bruit, élimine intelligemment les bruits de fond, améliore la clarté de la voix et la qualité audio.', 'audioImportDesc': - 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', + 'Importez facilement des fichiers audio depuis le stockage local ou des applications tierces, comme les mémos vocaux, Google Drive, etc.', 'multipleExportFormatsDesc': - 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', + 'Exportez vos enregistrements audio, textes de transcription et résumés dans différents formats (TXT, PDF, JPEG) selon vos besoins.', 'upgradeMembership': 'Upgrade Your Membership', 'yearlySubscription': 'Yearly Subscription', 'monthlySubscription': 'Monthly Subscription', @@ -695,7 +732,7 @@ const Map frFR = { 'unlimitedMonthlyPrice': '¥198/month', 'upgradeNote': '*After upgrading subscription, the remaining days of the original subscription will be automatically calculated and refunded to your payment account', - 'buyMoreTranscriptionTime': 'Buy More Transcription Time', + 'buyMoreTranscriptionTime': 'Acheter plus de temps de transcription', 'sixThousandMinutes': '6,000 minutes', 'threeThousandMinutes': '3,000 minutes', 'sixHundredMinutes': '600 minutes', @@ -706,25 +743,26 @@ const Map frFR = { 'purchase': 'Purchase', // Meeting模块 - 录音语言 - 'recordLanguage': 'Recording Language', + 'recordLanguage': 'Langue d’enregistrement', 'cantonese': 'Cantonese', 'sichuan': 'Sichuan Dialect', 'shanghai': 'Shanghai Dialect', // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': "Échec de l'analyse, veuillez réessayer plus tard", - 'transcriptionFailed': 'Échec de la transcription, veuillez réessayer plus tard', - 'summaryFailed': 'Échec du résumé, veuillez réessayer plus tard', - 'summaryFailedShort': 'Échec du résumé', - 'transcriptionFailedShort': 'Échec de la transcription', + 'analysisFailed': "Échec de l'analyse, veuillez réessayer plus tard", + 'transcriptionFailed': + 'Échec de la transcription, veuillez réessayer plus tard', + 'summaryFailed': 'Échec du résumé, veuillez réessayer plus tard', + 'summaryFailedShort': 'Échec du résumé', + 'transcriptionFailedShort': 'Échec de la transcription', // Meeting模块 - 播放器 - 'playerNotReady': "Le lecteur audio n'est pas prêt, veuillez patienter", - 'playFailed': 'Échec de la lecture', - 'audioFileNotFound': 'Fichier audio introuvable', - 'fetchingAudio': "Récupération de l'audio depuis le cloud...", - 'playerLoadFailed': 'Échec du chargement du lecteur audio', + 'playerNotReady': "Le lecteur audio n'est pas prêt, veuillez patienter", + 'playFailed': 'Échec de la lecture', + 'audioFileNotFound': 'Fichier audio introuvable', + 'fetchingAudio': "Récupération de l'audio depuis le cloud...", + 'playerLoadFailed': 'Échec du chargement du lecteur audio', // 设置页 "systemSettings": "Paramètres système", @@ -733,10 +771,10 @@ const Map frFR = { "translationRecharge": "Recharge de traduction", "meetingAssistantRecharge": "Recharge de l'assistant de réunion", "cloudSync": "Recharge de synchronisation cloud", - "memberService": "Member Service", - "bindRewardTitle": "Rewards", + "memberService": "Service membre", + "bindRewardTitle": "Récompenses", "bindRewardSimpleDesc": - "First bind device reward has been issued. Tap OK to close.", + "La récompense de première association d’appareil a été accordée. Touchez OK pour fermer.", "joinDevice": "Appareil connecté :", "accountId": "ID du compte :", "systemSetting": "Paramètres système", @@ -787,20 +825,21 @@ const Map frFR = { "loading": 'Chargement...', // 设备管理模块 - "deviceTypeUnknown": "Unknown Device", - "deviceTypeClassicBluetoothHeadset": "Classic Bluetooth Headset", - "deviceTypeBleBluetoothHeadset": "BLE Bluetooth Headset", - "deviceTypeSmartVoiceRecorder": "Smart Voice Recorder", - "deviceTypeSmartEye": "Smart Glasses", + "deviceTypeUnknown": "Appareil inconnu", + "deviceTypeClassicBluetoothHeadset": "Casque Bluetooth classique", + "deviceTypeBleBluetoothHeadset": "Casque Bluetooth BLE", + "deviceTypeSmartVoiceRecorder": "Enregistreur vocal intelligent", + "deviceTypeSmartEye": "Lunettes intelligentes", "unbind": "Délier", - "noDevicesBound": "No devices bound yet", - "pleaseBindDeviceFirst": "Please bind a device first to manage", - "noMacAddress": "No MAC Address", - "licenseCode": "License Code", - "confirmUnbind": "Confirm Unbind", + "noDevicesBound": "Aucun appareil associé pour le moment", + "pleaseBindDeviceFirst": + "Veuillez d’abord associer un appareil pour le gérer", + "noMacAddress": "Pas d’adresse MAC", + "licenseCode": "Code de licence", + "confirmUnbind": "Confirmer la dissociation", "confirmUnbindMessage": - "Are you sure you want to unbind device \"{deviceName}\"?", - "confirmUnbindAction": "Confirm Unbind", + "Voulez-vous vraiment dissocier l’appareil « {deviceName} » ?", + "confirmUnbindAction": "Confirmer la dissociation", // Agent模块 - 主界面 "Lily": "Lily", @@ -831,21 +870,22 @@ const Map frFR = { "loadMoreMessages": "Charger plus de messages...", "loadFailedClickRetry": "Échec du chargement, cliquer pour réessayer", "swipeUpForMore": "Glisser vers le haut pour plus", - "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! + "callingTool": "Je vous aide, veuillez patienter…", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': "Lorsque cette option est activée : l'IA ne sera pas interrompue par votre voix lorsqu'elle parle et ne pourra traiter qu'un seul tour de conversation à la fois. Pour commencer un nouveau tour, il suffit de prononcer le mot de réveil.", + 'voice_interrupt_tip': + "Lorsque cette option est activée : l'IA ne sera pas interrompue par votre voix lorsqu'elle parle et ne pourra traiter qu'un seul tour de conversation à la fois. Pour commencer un nouveau tour, il suffit de prononcer le mot de réveil.", // Agent模块 - 预设提示词 - "presetMusic": "Play some music", // 来点音乐 - "presetNavigation": "Navigation to", // 导航 - "presetWeather": "Today's weather", // 今日天气 - "presetNews": "Today's news", // 今日新闻 - "presetFood": "Nearby food", // 美食 - "playSomeMusic": "Play some popular music", // 播放一些流行音乐 - "navigationTo": "Please help me navigate to", // 导航到 - "todayWeather": "How's the weather today?", // 今日天气 - "todayNews": "What's the news today?", // 今日新闻 - "nearbyFood": "What delicious food is nearby?", // 美食 + "presetMusic": "Mettre un peu de musique", // 来点音乐 + "presetNavigation": "Navigation vers", // 导航 + "presetWeather": "Météo du jour", // 今日天气 + "presetNews": "Actualités du jour", // 今日新闻 + "presetFood": "Restaurants à proximité", // 美食 + "playSomeMusic": "Lance une musique populaire", // 播放一些流行音乐 + "navigationTo": "Aide‑moi à naviguer vers", // 导航到 + "todayWeather": "Quel temps fait‑il aujourd’hui ?", // 今日天气 + "todayNews": "Quelles sont les nouvelles aujourd’hui ?", // 今日新闻 + "nearbyFood": "Quels bons restaurants y a‑t‑il à proximité ?", // 美食 // Agent模块 - 欢迎消息与权限 'welcomeMessage': 'Bonjour ! Je suis **Lily**, je peux vous aider avec :\n\n' @@ -890,6 +930,14 @@ const Map frFR = { 'Nous aimerions connaître la raison de votre signalement, vous pouvez décrire le problème que vous avez rencontré.', 'generatedByAi': 'Généré par IA', + // Agent模块 - 工具调用 + 'toolCall': 'Appel d outil', + 'noResult': 'Aucun resultat', + 'noToolCallContentToCopy': 'Aucun contenu d appel d outil a copier', + 'toolCallDetails': 'Details de l appel d outil :', + 'toolCallContentCopied': + 'Contenu de l appel d outil copie dans le presse-papiers', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Voici quelques musiques recommandées :', 'playList': 'Liste de lecture', @@ -910,6 +958,30 @@ const Map frFR = { "bicycling": "Vélo", "tsransit": "Transit", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Choisir une application de navigation', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Naviguer avec Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Naviguer avec Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Naviguer avec Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Naviguer avec Apple Maps', + 'builtInNavigation': 'Navigation integree', + 'useBuiltInNavigation': 'Naviguer avec la carte integree', + 'navigationStartFailed': 'Echec du demarrage de la navigation', + 'cannotPlayMusicListRetryLater': + 'Impossible de lire la liste de musique, veuillez reessayer plus tard', + 'cannotPlaySong': 'Impossible de lire la chanson', + 'openMapError': 'Erreur lors de l ouverture de la carte', + 'pleaseInstallAmapApp': 'Veuillez d abord installer l application Amap', + 'pleaseInstallBaiduMapApp': + 'Veuillez d abord installer l application Baidu Maps', + 'appleMapStartFailed': 'Echec du demarrage d Apple Maps', + 'appleMapUnavailable': 'Apple Maps non disponible', + 'openAppleMapError': 'Erreur lors de l ouverture d Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Requête météo :', 'highest': 'Maximum', @@ -963,8 +1035,8 @@ const Map frFR = { "strongWind": "Vent fort", // 翻译模块 - 中间层 - "pictureTranslation": "Picture Translation", - "textTranslation": "Text Translation", + "pictureTranslation": "Traduction d’images", + "textTranslation": "Traduction de texte", // 翻译模块 - 主页 "translationHistory": "Historique de traduction", @@ -974,22 +1046,34 @@ const Map frFR = { "phoneUser": "Utilisateur de téléphone", "selectSourceLanguage": "Sélectionner la langue source", "selectTargetLanguage": "Sélectionner la langue cible", - "me": "Me", - "counterPart": "Counterpart", + "me": "Moi", + "counterPart": "Interlocuteur", "bluetoothCallStateError": - "Please make sure the Bluetooth headset is connected to the phone and in a call state", - "autoDetect": "Auto Detect", // 自动检测 + "Assurez‑vous que le casque Bluetooth est connecté au téléphone et en cours d’appel", + "autoDetect": "Détection auto", // 自动检测 // 翻译模块 - 文本翻译 - "languageDetectionFailed": "Language detection failed", - "translationFailed": "Translation failed", - "pleaseInputText": "Please input text", - "textTooLong": "Text too long, max 5000 characters", + "languageDetectionFailed": "Échec de la détection de la langue", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Desactiver la fenetre flottante', + 'enableFloatingWindow': 'Activer la fenetre flottante', + 'permissionTip': 'Conseil d autorisation', + 'micPermissionRequiredForRecording': + 'L autorisation du microphone est requise pour l enregistrement', + 'deleteTranslationRecordError': + 'Erreur lors de la suppression de l enregistrement de traduction : @error', + "translationFailed": "Échec de la traduction", + "translating": "Traduction en cours", + "translate": "Traduire", + "pleaseInputText": "Veuillez saisir du texte", + "inputTextToTranslate": "Veuillez saisir le texte à traduire", + "textTooLong": "Texte trop long, 5000 caractères maximum", // 翻译模块 - 历史记录 "noTranslationHistory": "Aucun historique de traduction", - "historyRecords": "History Records", - "clearResults": "Clear Results", + "historyRecords": "Historique", + "clearResults": "Effacer les résultats", "clearHistory": "Effacer l'historique", "clearHistoryConfirm": "Êtes-vous sûr de vouloir effacer tout l'historique de traduction ? Cette action ne peut pas être annulée.", @@ -999,55 +1083,57 @@ const Map frFR = { "Êtes-vous sûr de vouloir supprimer tous les enregistrements de traduction pour cette session ? Cette action ne peut pas être annulée.", // 翻译模块 - 图片翻译 - "selectImageSource": "Select Image Source", - "imagePreview": "Image Preview", - "translationResult": "Translation Result", - "recognitionResult": "Recognition Result", - "translatedImagePreview": "Translated Image Preview", - "translatedImageLoadFailed": "Failed to load translated image", - "pleaseSelectImage": "Please select an image", - "imageLoadFailed": "Image load failed", - "imageQuality": "Image Quality", - "maxSize": "Max Size", - "close": "Close", - "setImageQuality": "Set Image Quality", - "currentQuality": "Current quality: @value%", - "setMaxSize": "Set Max Size", - "currentMaxSize": "Current: @pxpx", - "waitingForAction": "Waiting for action", - "pleaseSelectImageToStart": "Please select an image to start", - "chooseImage": "Choose Image", - "openingCamera": "Opening camera...", - "openingPhotoAlbum": "Opening photo album...", - "cancelled": "Cancelled", - "userCancelledSelection": "User cancelled selection", - "translatingImage": "Translating Image", - "callingImageTranslateService": "Calling image translation service...", - "savingRecord": "Saving Record", - "savingTranslationResult": "Saving translation result...", - "translationCompleted": "Translation Completed", - "allStepsCompleted": "All steps completed", - "processingFailed": "Processing Failed", + "selectImageSource": "Sélectionner la source de l’image", + "imagePreview": "Aperçu de l’image", + "translationResult": "Résultat de la traduction", + "recognitionResult": "Résultat de la reconnaissance", + "translatedImagePreview": "Aperçu de l’image traduite", + "translatedImageLoadFailed": "Échec du chargement de l’image traduite", + "pleaseSelectImage": "Veuillez sélectionner une image", + "imageLoadFailed": "Échec du chargement de l’image", + "imageQuality": "Qualité de l’image", + "maxSize": "Taille maximale", + "close": "Fermer", + "setImageQuality": "Définir la qualité de l’image", + "currentQuality": "Qualité actuelle : @value%", + "setMaxSize": "Définir la taille maximale", + "currentMaxSize": "Actuel : @pxpx", + "waitingForAction": "En attente d’une action", + "pleaseSelectImageToStart": "Veuillez sélectionner une image pour commencer", + "chooseImage": "Choisir une image", + "openingCamera": "Ouverture de la caméra...", + "openingPhotoAlbum": "Ouverture de l’album photo...", + "cancelled": "Annulé", + "userCancelledSelection": "L’utilisateur a annulé la sélection", + "translatingImage": "Traduction de l’image", + "callingImageTranslateService": "Appel du service de traduction d’images...", + "savingRecord": "Enregistrement en cours", + "savingTranslationResult": "Enregistrement du résultat de la traduction...", + "translationCompleted": "Traduction terminée", + "allStepsCompleted": "Toutes les étapes sont terminées", + "processingFailed": "Échec du traitement", "imageProcessingOrTranslationFailed": - "Image processing or translation failed. Please retry.\nError: {error}", + "Le traitement de l’image ou la traduction a échoué. Veuillez réessayer.\nErreur : {error}", "imageTooLarge": "Image size exceeds 4MB limit", "imageTooLargeHint": "Image size exceeds 4MB. Reduce quality or dimensions and retry", - "emptyTranslationResult": "Image translation API returned empty result", + "emptyTranslationResult": + "L’API de traduction d’images a renvoyé un résultat vide", "imageTranslationFailedTryLater": - "Image translation failed. Network issue or rate limit. Please try later", + "La traduction de l’image a échoué. Problème réseau ou limite de débit. Veuillez réessayer plus tard", "imageTranslationApiException": - "Image translation API exception. Check network and retry", - "permissionRequired": "Permission Required", - "cameraPermissionRequired": "Camera permission required to take photos", + "Exception de l’API de traduction d’images. Vérifiez le réseau et réessayez", + "permissionRequired": "Autorisation requise", + "cameraPermissionRequired": + "L’autorisation de la caméra est requise pour prendre des photos", "photoAlbumPermissionRequired": - "Photo album permission required to pick images", - "translationDetails": "Translation Details", - "originalImage": "Original Image", - "sourceLanguage": "Source Language", - "targetLanguage": "Target Language", - "translationTime": "Translation Time", - "shareInDevelopment": "Sharing feature under development", + "L’autorisation d’accès à l’album photo est requise pour sélectionner des images", + "translationDetails": "Détails de la traduction", + "originalImage": "Image originale", + "sourceLanguage": "Langue source", + "targetLanguage": "Langue cible", + "translationTime": "Temps de traduction", + "shareInDevelopment": "Fonction de partage en cours de développement", // 翻译模块 - 录音文件 "translateAudioFiles": "Traduire les fichiers audio", @@ -1099,8 +1185,8 @@ const Map frFR = { 'deleteAccount': 'Supprimer le compte', 'deleteAccountTips': 'Êtes-vous sûr de vouloir supprimer définitivement votre compte ? Cette action ne peut pas être annulée.', - 'clean': 'Clear Cache', - 'cleanTips': 'Are you sure you want to clear personal cache?', + 'clean': 'Vider le cache', + 'cleanTips': 'Êtes‑vous sûr de vouloir effacer le cache personnel ?', 'networkConnectionFailed': 'Échec de la connexion réseau, veuillez vérifier les paramètres réseau et réessayer', 'serverTemporarilyUnavailable': @@ -1146,19 +1232,19 @@ const Map frFR = { 'AccountService initialisé', // AccountService 已初始化 // 权限模块 - 'meetingStoragePermission': 'Storage', + 'meetingStoragePermission': 'Stockage', 'meetingStoragePermissionExplanation': - 'We need access to storage permissions so you can select and upload audio files.', + 'Nous avons besoin de l’autorisation de stockage pour que vous puissiez sélectionner et téléverser des fichiers audio.', 'meetingStoragePermissionPermanentDenial': - 'Detected that you have permanently denied storage permission. To continue using this feature, please go to app settings to manually enable storage permission.', + 'Nous avons détecté que vous avez définitivement refusé l’autorisation de stockage. Pour continuer à utiliser cette fonction, veuillez l’activer manuellement dans les paramètres de l’application.', 'getPermissionStatusFailed': 'Échec de l\'obtention du statut d\'autorisation', 'communicationPermissions': 'Autorisations de communication', - 'bluetoothPermissions': 'Bluetooth Permissions', - 'notificationPermissions': 'Notification Permissions', - 'storagePermissions': 'Storage Permissions', - 'microphonePermissions': 'Microphone Permissions', - 'alarmPermissions': 'Alarm Permissions', + 'bluetoothPermissions': 'Autorisations Bluetooth', + 'notificationPermissions': 'Autorisations de notification', + 'storagePermissions': 'Autorisations de stockage', + 'microphonePermissions': 'Autorisations du microphone', + 'alarmPermissions': 'Autorisations d’alarme', 'calendarPermissions': 'Autorisations de calendrier', 'locationPermissions': 'Autorisations de localisation', 'phone': 'Téléphone', @@ -1172,7 +1258,7 @@ const Map frFR = { 'phonePermissionDesc': 'Utilisé pour les fonctions d\'appel', 'smsPermissionDesc': 'Utilisé pour les fonctions SMS', 'alarmPermissionDesc': - 'Used to set exact alarms to ensure reminders trigger on time', + 'Utilisée pour régler des alarmes précises et garantir l’activation des rappels à l’heure', 'calendarWritePermissionDesc': 'Utilisé pour créer des événements de calendrier et des rappels', 'calendarFullAccessPermissionDesc': @@ -1191,72 +1277,76 @@ const Map frFR = { 'La fonction d\'appel nécessite l\'autorisation téléphone', 'smsPermissionDetailDesc': 'La fonction SMS nécessite l\'autorisation SMS', 'alarmPermissionDetailDesc': - 'This permission is required to set exact alarms and ensure reminders trigger on time', + 'Cette autorisation est nécessaire pour régler des alarmes précises et garantir l’activation ponctuelle des rappels', 'calendarWritePermissionDetailDesc': 'La création d\'événements de calendrier nécessite l\'autorisation d\'écriture calendrier', 'calendarFullAccessPermissionDetailDesc': 'La gestion des événements de calendrier nécessite l\'autorisation complète du calendrier', 'locationPermissionDetailDesc': 'L\'obtention d\'informations de localisation nécessite l\'autorisation de localisation', - 'contactsPermissionDesc': 'Used for accessing contact information', + 'contactsPermissionDesc': + 'Utilisée pour accéder aux informations de contacts', 'contactsPermissionDetailDesc': - 'Phone call and SMS functionality requires contacts permission to select contacts', + 'Les fonctions d’appel et de SMS nécessitent l’autorisation Contacts pour sélectionner des contacts', 'bluetoothPermissionDesc': - 'Used for connecting and managing Bluetooth devices', + 'Utilisée pour connecter et gérer les appareils Bluetooth', 'bluetoothPermissionDetailDesc': - 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', - 'bluetoothScanPermissionDesc': 'Used for scanning nearby Bluetooth devices', + 'La connexion à des casques et autres appareils Bluetooth nécessite l’autorisation Bluetooth', + 'bluetoothScanPermissionDesc': + 'Utilisée pour scanner les appareils Bluetooth à proximité', 'bluetoothScanPermissionDetailDesc': - 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', - 'bluetoothConnectPermissionDesc': 'Used for connecting to Bluetooth devices', + 'Le scan des appareils Bluetooth à proximité nécessite l’autorisation de scan Bluetooth', + 'bluetoothConnectPermissionDesc': + 'Utilisée pour se connecter à des appareils Bluetooth', 'bluetoothConnectPermissionDetailDesc': - 'Connecting to Bluetooth devices requires Bluetooth connect permission', - 'notificationPermissionDesc': 'Used for sending notification messages', + 'La connexion à des appareils Bluetooth nécessite l’autorisation de connexion Bluetooth', + 'notificationPermissionDesc': + 'Utilisée pour envoyer des messages de notification', 'notificationPermissionDetailDesc': - 'App needs notification permission to send you important alerts and messages', + 'L’application a besoin de l’autorisation de notification pour vous envoyer des alertes et messages importants', 'appNeedsPermissionForFullFunction': 'L\'application a besoin de cette autorisation pour une fonctionnalité complète', 'permanentDenialText': 'Vous avez refusé définitivement l\'autorisation {permission}, veuillez aller dans les paramètres de l\'application pour l\'activer', 'goToSettings': 'Aller aux paramètres', - 'bluetoothScan': 'Bluetooth Scan', - 'bluetoothConnect': 'Bluetooth Connect', + 'bluetoothScan': 'Scan Bluetooth', + 'bluetoothConnect': 'Connexion Bluetooth', 'bluetoothScanExplanation': - 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', + 'L’application a besoin de l’autorisation de scan Bluetooth pour détecter les appareils Bluetooth à proximité.', 'bluetoothConnectExplanation': - 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', + 'L’application a besoin de l’autorisation de connexion Bluetooth pour se connecter à des appareils Bluetooth.', 'locationForBluetoothExplanation': - 'The app needs location permission to scan Bluetooth devices.', + 'L’application a besoin de l’autorisation de localisation pour scanner les appareils Bluetooth.', 'bluetoothScanPermanentDenial': - 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', + 'L’autorisation de scan Bluetooth a été définitivement refusée, veuillez l’activer manuellement dans les paramètres.', 'bluetoothConnectPermanentDenial': - 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', + 'L’autorisation de connexion Bluetooth a été définitivement refusée, veuillez l’activer manuellement dans les paramètres.', 'locationPermanentDenial': - 'Location permission has been permanently denied, please go to settings to enable it manually.', + 'L’autorisation de localisation a été définitivement refusée, veuillez l’activer manuellement dans les paramètres.', 'notificationPermission': 'Notification', - 'locationPermission': 'Location', + 'locationPermission': 'Localisation', 'notificationPermissionExplanation': - 'Notification permission is required to display music playback status.', + 'L’autorisation de notification est requise pour afficher l’état de lecture de la musique.', 'locationPermissionExplanation': - 'Location permission is required to get current location.', + 'L’autorisation de localisation est requise pour obtenir la position actuelle.', 'notificationPermissionPermanentDenial': - 'You have permanently denied notification permission, please go to settings to enable it.', + 'Vous avez définitivement refusé l’autorisation de notification, veuillez l’activer dans les paramètres.', 'locationPermissionPermanentDenial': - 'You have permanently denied location permission, please go to settings to enable it.', - 'storagePermission': 'Storage', + 'Vous avez définitivement refusé l’autorisation de localisation, veuillez l’activer dans les paramètres.', + 'storagePermission': 'Stockage', 'microphonePermissionExplanation': - 'We need microphone permission to record audio content.', + 'Nous avons besoin de l’autorisation du microphone pour enregistrer du contenu audio.', 'storagePermissionExplanation': - 'We need storage permission so you can select and upload audio files.', + 'Nous avons besoin de l’autorisation de stockage pour que vous puissiez sélectionner et téléverser des fichiers audio.', 'microphonePermissionPermanentDenial': - 'Microphone permission has been permanently denied. To continue using this feature, please go to app settings to manually enable microphone permission.', + 'L’autorisation du microphone a été définitivement refusée. Pour continuer à utiliser cette fonction, veuillez l’activer manuellement dans les paramètres de l’application.', 'storagePermissionPermanentDenial': - 'Storage permission has been permanently denied. To continue using this feature, please go to app settings to manually enable storage permission.', - 'permissionUtilNeed': 'Need ', - 'permissionUtilPermission': ' Permission', - 'permissionUtilRestricted': ' Permission Restricted', + 'L’autorisation de stockage a été définitivement refusée. Pour continuer à utiliser cette fonction, veuillez l’activer manuellement dans les paramètres de l’application.', + 'permissionUtilNeed': 'Nécessite ', + 'permissionUtilPermission': ' autorisation', + 'permissionUtilRestricted': ' autorisation restreinte', 'permissionUtilRestrictedMessage': - 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', + 'Cette fonctionnalité est indisponible ou restreinte sur cet appareil, veuillez vérifier les paramètres ou les restrictions du système', 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) @@ -1353,17 +1443,17 @@ const Map frFR = { 'bleConnectionFailed': 'Échec de la connexion BLE', 'deviceAuthorizationFailedCheckCode': 'Échec de l\'autorisation d\'appareil, veuillez vérifier le code d\'autorisation', - 'bluetoothGuideTitle': 'Manual Bluetooth Activation Required', // 需要手动开启蓝牙 - 'bluetoothGuideSteps': 'Please follow these steps:', // 请按照以下步骤操作: + 'bluetoothGuideTitle': 'Activation manuelle du Bluetooth requise', // 需要手动开启蓝牙 + 'bluetoothGuideSteps': 'Veuillez suivre les étapes suivantes :', // 请按照以下步骤操作: 'bluetoothGuideStep1': - 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 + 'Activer le Bluetooth : Réglages → Bluetooth → Activer', // 开启蓝牙:设置 → 蓝牙 → 开启 'bluetoothGuideStep2': - 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 + 'Connecter l’appareil : trouvez votre appareil dans « Mes appareils » et touchez pour vous connecter', // 连接设备:在"我的设备"中找到您的设备并点击连接 'bluetoothGuideStep3': - 'Return to app to continue pairing process', // 返回应用继续配对流程 + 'Revenir à l’application pour poursuivre le processus d’appairage', // 返回应用继续配对流程 'bluetoothGuideTip': - 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 - 'iKnow': 'I Know', // 我知道了 + 'Astuce : vous pouvez aussi maintenir le doigt sur l’icône Bluetooth dans le Centre de contrôle pour accéder rapidement aux réglages Bluetooth', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 + 'iKnow': 'Je comprends', // 我知道了 // 配对模块 - 绑定奖励 "firstBindRewardTitle": "Welcome Reward", @@ -1403,13 +1493,14 @@ const Map frFR = { "connectionFailed": "Échec de la connexion", "retryConnection": "Réessayer la connexion", "ota_updateNow": "Mettre à jour maintenant", - "otaVersionInfoFailed": "Failed to get version info. Please try again later.", + "otaVersionInfoFailed": + "Impossible d’obtenir les informations de version. Veuillez réessayer plus tard.", "otaDeviceInfoUnavailable": - "Unable to get device info. Please check the connection and retry.", + "Impossible d’obtenir les informations de l’appareil. Vérifiez la connexion et réessayez.", "otaProductInfoUnavailable": - "Unable to identify the device. Please reconnect and retry.", + "Impossible d’identifier l’appareil. Veuillez le reconnecter et réessayer.", "otaFirmwareVersionInvalid": - "Firmware version is abnormal. Please reconnect and retry.", + "Version du firmware anormale. Veuillez reconnecter l’appareil et réessayer.", "keepConnectedDontClose": "Veuillez maintenir l'appareil connecté, ne fermez pas l'application", "doNotDisconnect": "Ne pas déconnecter", @@ -1418,6 +1509,63 @@ const Map frFR = { "removeEarbudsEnsureBattery": "Retirez les deux écouteurs et assurez-vous que le niveau de batterie est supérieur à 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Nouvelle version @version trouvee', + 'otaConfirmUpdateNow': 'Mettre a jour maintenant ?', + 'otaUpdate': 'Mettre a jour', + 'otaUpgradeSuccess': 'Mise a niveau reussie', + 'otaUpgradeCompleteRepair': + 'Mise a jour terminee !\n\nReassociez l appareil pour continuer. Page d appairage ?', + 'otaPairLater': 'Appairer plus tard', + 'otaPairNow': 'Appairer maintenant', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': + 'Erreur lors de la verification de la connexion BLE : @error', + 'otaBleNotConnected': 'Appareil BLE non connecte', + 'otaBleNeedConnection': + 'Connexion BLE requise pour la mise a jour\nVerifiez la connexion et reessayez', + 'otaDeviceInfoUnavailableTitle': 'Informations appareil indisponibles', + 'otaCannotGetDeviceInfo': + 'Impossible d’obtenir les informations de l’appareil\nVeuillez reconnecter l’appareil ou réessayer plus tard', + 'otaBleCheckFailed': 'Echec de la verification BLE', + 'otaCannotGetDeviceInfoCheckConnection': + 'Impossible d obtenir les informations, verifiez la connexion', + 'otaCannotGetProductInfoWithName': + 'Impossible d obtenir les informations produit, nom : @deviceName', + 'otaCannotGetBatteryInfo': + 'Impossible d obtenir les informations de batterie valides', + 'otaLowBattery': 'Batterie faible', + 'otaSingleBatteryLow': + 'Batterie trop faible\nCondition : superieure a 20%\nActuel : @ear @battery%\nChargez et reessayez', + 'otaDoubleBatteryLow': + 'Batterie trop faible\nCondition : les deux ecouteurs au-dessus de 20%\nActuel : Gauche @left%, Droite @right%\nChargez et reessayez', + 'otaBatteryCheckFailed': 'Echec de la verification de batterie', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'Cette mise a jour comprend des optimisations de performances et des corrections de bugs.', + 'otaGetLatestVersionFailed': + 'Echec de la recuperation de la derniere version', + 'otaGetVersionInfoFailed': + 'Echec de la recuperation des informations de version', + 'otaCheckingDeviceStatus': 'Verification du statut de l appareil...', + 'otaDownloadFailedCheckNetwork': + 'Echec du telechargement, verifiez la connexion reseau', + 'otaDownloadFailed': 'Echec du telechargement', + 'otaPreparingConnection': 'Preparation de la connexion...', + 'otaConnectingDevice': 'Connexion a l appareil...', + 'otaUpgradeStarted': 'Mise a niveau OTA demarree...', + 'otaUpgradeProgressWithPercent': 'Progression : @percent%', + 'otaUpgradeSuccessComplete': 'Mise a niveau terminee avec succes', + 'otaUpgradeFailedWithCode': 'Mise a niveau echouee, code erreur : @code', + 'otaUpgradeFailedTitle': 'Mise a niveau echouee', + 'otaUpgradeFailedDesc': + 'Verifiez la connexion ou le paquet de mise a jour, code erreur : @code', + 'otaDeviceDisconnected': 'Appareil deconnecte', + 'otaDeviceConnected': 'Appareil connecte', + // 音乐模块 "noMusic": "Aucune musique", // 暂无音乐 "noPlayingMusic": "Aucune musique en cours de lecture", // 暂无播放音乐 diff --git a/lib/core/translations/language/hi_in.dart b/lib/core/translations/language/hi_in.dart index fd36e19d9..07f0bd037 100644 --- a/lib/core/translations/language/hi_in.dart +++ b/lib/core/translations/language/hi_in.dart @@ -1,5 +1,4 @@ const Map hiIN = { - // 通用 'continue': 'जारी रखें', 'confirm': 'पुष्टि करें', @@ -167,6 +166,29 @@ const Map hiIN = { 'right': 'दायां', 'checkConnectionStatusFailed': 'कनेक्शन स्थिति की जाँच करने में विफल', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth initialization failed: @error', + 'needBluetoothAndLocationPermission': + 'Bluetooth and location permissions are required to scan devices', + 'permissionRequestFailedWithError': 'Permission request failed: @error', + 'needPermission': 'Permission Required', + 'blePermissionDialogContent': + 'This app requires Bluetooth and location permissions to scan devices. Please enable them in Settings.', + 'needEnableBluetooth': 'Enable Bluetooth', + 'enableBluetoothDialogContent': + 'Please enable Bluetooth to scan and connect devices.', + 'bleScanFailedWithError': 'Scan failed: @error', + 'bleConnectionSuccess': 'Connection Successful', + 'bleConnectedToDevice': 'Connected to @device', + 'bleConnectionFailedWithError': 'Connection failed: @error', + 'bleDisconnected': 'Disconnected', + 'bleDeviceDisconnected': 'Device disconnected', + 'bleDisconnectFailedWithError': 'Disconnect failed: @error', + 'signalStrong': 'Strong', + 'signalMedium': 'Medium', + 'signalWeak': 'Weak', + 'signalVeryWeak': 'Very Weak', + // 发现页 "searchAi": "एआई फ़ंक्शन खोजें...", "exploreSlogan": "स्मार्ट ईयरफोन, अनंत संभावनाएं", @@ -242,60 +264,64 @@ const Map hiIN = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'भुगतान सफल', - 'paymentFailed': 'भुगतान विफल', - 'gotIt': 'समझ गया', - 'paymentFailedTryAgain': 'भुगतान विफल। कृपया पुनः प्रयास करें।', - 'selectPaymentMethod': 'भुगतान विधि चुनें', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'WeChat ऑर्डर बनाने में विफल', - 'alipayOrderCreateFailed': 'Alipay ऑर्डर बनाने में विफल', - 'appleOrderCreateFailed': 'Apple ऑर्डर बनाने में विफल', - 'googleOrderCreateFailed': 'Google ऑर्डर बनाने में विफल', - 'paypalOrderCreateFailed': 'PayPal ऑर्डर बनाने में विफल', - 'paymentException': 'भुगतान में समस्या', - 'paymentLaunchFailed': 'भुगतान शुरू करने में विफल', - 'paymentExceptionWithError': 'भुगतान में समस्या: @error', - 'paymentProcessingCheckLater': 'आपका ऑर्डर प्रोसेस हो रहा है। कृपया बाद में जाँचें।', - 'paymentResultQueryException': 'भुगतान परिणाम की जाँच विफल: @error', - 'orderConfirmedQuotaRefreshed': 'ऑर्डर की पुष्टि हो गई। आपका कोटा रीफ़्रेश हो गया है।', - 'paymentCompletedConfirming': 'भुगतान पूरा हुआ। पुष्टि हो रही है…', - 'paymentCancelled': 'भुगतान रद्द किया गया', - 'paypalOpenedCompleteInBrowser': 'PayPal खुल गया है। कृपया ब्राउज़र में भुगतान पूरा करें।', - 'paypalOpenFailed': 'PayPal भुगतान पृष्ठ नहीं खोल सकते', - 'paymentTestTitle': 'भुगतान परीक्षण', - 'paymentTestOrderInfo': 'परीक्षण ऑर्डर जानकारी', - 'paymentTestProductId': 'उत्पाद ID', - 'paymentTestProductDescription': 'उत्पाद विवरण', - 'paymentTestWechatDescription': 'WeChat भुगतान परीक्षण', - 'paymentTestAlipayDescription': 'Alipay भुगतान परीक्षण', - 'paymentTestAmount': 'राशि', - 'paymentTestSelectAmount': 'परीक्षण राशि चुनें', - 'paying': 'भुगतान हो रहा है...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'भुगतान स्थिति', - 'errorInfoWithMessage': 'त्रुटि: @message', - 'retest': 'पुनः परीक्षण', - 'paymentTestInstructionsTitle': 'निर्देश', - 'paymentTestInstructionsContent': '1. परीक्षण राशि चुनें (अनुशंसित: ¥0.01)\n2. शुरू करने के लिए भुगतान बटन दबाएँ\n3. भुगतान ऐप में भुगतान पूरा करें\n4. परिणाम जाँचने के लिए वापस आएँ', - 'startingWechatPayment': 'WeChat Pay खोल रहे हैं...', - 'startingAlipayPayment': 'Alipay खोल रहे हैं...', - 'wechatPaymentSuccess': 'WeChat Pay भुगतान सफल!', - 'wechatPaymentFailed': 'WeChat Pay भुगतान विफल', - 'wechatPaymentLaunchFailed': 'WeChat Pay खोलने में विफल', - 'cannotLaunchWechatPayment': 'WeChat Pay नहीं खोल सकते', - 'wechatPaymentException': 'WeChat Pay में समस्या', - 'wechatPaymentTestCompleted': 'WeChat Pay भुगतान परीक्षण पूरा', - 'alipayPaymentSuccess': 'Alipay भुगतान सफल!', - 'alipayPaymentFailed': 'Alipay भुगतान विफल', - 'alipayPaymentLaunchFailed': 'Alipay खोलने में विफल', - 'cannotLaunchAlipayPayment': 'Alipay नहीं खोल सकते', - 'alipayPaymentException': 'Alipay में समस्या', + 'paymentSuccess': 'भुगतान सफल', + 'paymentFailed': 'भुगतान विफल', + 'gotIt': 'समझ गया', + 'paymentFailedTryAgain': 'भुगतान विफल। कृपया पुनः प्रयास करें।', + 'selectPaymentMethod': 'भुगतान विधि चुनें', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'WeChat ऑर्डर बनाने में विफल', + 'alipayOrderCreateFailed': 'Alipay ऑर्डर बनाने में विफल', + 'appleOrderCreateFailed': 'Apple ऑर्डर बनाने में विफल', + 'googleOrderCreateFailed': 'Google ऑर्डर बनाने में विफल', + 'paypalOrderCreateFailed': 'PayPal ऑर्डर बनाने में विफल', + 'paymentException': 'भुगतान में समस्या', + 'paymentLaunchFailed': 'भुगतान शुरू करने में विफल', + 'paymentExceptionWithError': 'भुगतान में समस्या: @error', + 'paymentProcessingCheckLater': + 'आपका ऑर्डर प्रोसेस हो रहा है। कृपया बाद में जाँचें।', + 'paymentResultQueryException': 'भुगतान परिणाम की जाँच विफल: @error', + 'orderConfirmedQuotaRefreshed': + 'ऑर्डर की पुष्टि हो गई। आपका कोटा रीफ़्रेश हो गया है।', + 'paymentCompletedConfirming': 'भुगतान पूरा हुआ। पुष्टि हो रही है…', + 'paymentCancelled': 'भुगतान रद्द किया गया', + 'paypalOpenedCompleteInBrowser': + 'PayPal खुल गया है। कृपया ब्राउज़र में भुगतान पूरा करें।', + 'paypalOpenFailed': 'PayPal भुगतान पृष्ठ नहीं खोल सकते', + 'paymentTestTitle': 'भुगतान परीक्षण', + 'paymentTestOrderInfo': 'परीक्षण ऑर्डर जानकारी', + 'paymentTestProductId': 'उत्पाद ID', + 'paymentTestProductDescription': 'उत्पाद विवरण', + 'paymentTestWechatDescription': 'WeChat भुगतान परीक्षण', + 'paymentTestAlipayDescription': 'Alipay भुगतान परीक्षण', + 'paymentTestAmount': 'राशि', + 'paymentTestSelectAmount': 'परीक्षण राशि चुनें', + 'paying': 'भुगतान हो रहा है...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'भुगतान स्थिति', + 'errorInfoWithMessage': 'त्रुटि: @message', + 'retest': 'पुनः परीक्षण', + 'paymentTestInstructionsTitle': 'निर्देश', + 'paymentTestInstructionsContent': + '1. परीक्षण राशि चुनें (अनुशंसित: ¥0.01)\n2. शुरू करने के लिए भुगतान बटन दबाएँ\n3. भुगतान ऐप में भुगतान पूरा करें\n4. परिणाम जाँचने के लिए वापस आएँ', + 'startingWechatPayment': 'WeChat Pay खोल रहे हैं...', + 'startingAlipayPayment': 'Alipay खोल रहे हैं...', + 'wechatPaymentSuccess': 'WeChat Pay भुगतान सफल!', + 'wechatPaymentFailed': 'WeChat Pay भुगतान विफल', + 'wechatPaymentLaunchFailed': 'WeChat Pay खोलने में विफल', + 'cannotLaunchWechatPayment': 'WeChat Pay नहीं खोल सकते', + 'wechatPaymentException': 'WeChat Pay में समस्या', + 'wechatPaymentTestCompleted': 'WeChat Pay भुगतान परीक्षण पूरा', + 'alipayPaymentSuccess': 'Alipay भुगतान सफल!', + 'alipayPaymentFailed': 'Alipay भुगतान विफल', + 'alipayPaymentLaunchFailed': 'Alipay खोलने में विफल', + 'cannotLaunchAlipayPayment': 'Alipay नहीं खोल सकते', + 'alipayPaymentException': 'Alipay में समस्या', "insufficientIntegral": "Insufficient integral", "insufficientBalanceDesc": 'Insufficient balance, please go to the corresponding recharge page to recharge.', @@ -493,19 +519,28 @@ const Map hiIN = { 'callRecording': 'Call Recording', 'importAudio': 'Import Audio', 'meetingRecordExitTitle': 'रिकॉर्डिंग से बाहर निकलें', // 退出录音 - 'meetingRecordExitMessage': 'बाहर निकलने से पहले क्या करना है चुनें', // 请选择离开后的操作 + 'meetingRecordExitMessage': + 'बाहर निकलने से पहले क्या करना है चुनें', // 请选择离开后的操作 'meetingRecordEndAndSave': 'रिकॉर्डिंग समाप्त करें और सहेजें', // 结束录音并保存 'meetingRecordEndWithoutSave': 'बिना सहेजे रिकॉर्डिंग समाप्त करें', // 结束录音不保存 - 'meetingRecordContinueInBackground': 'बैकग्राउंड में रिकॉर्डिंग जारी रखें', // 后台继续录音 - 'meetingRecordStopTimeout': 'रिकॉर्डिंग रोकने का समय समाप्त हो गया। कृपया फिर से प्रयास करें।', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'रिकॉर्डिंग रोकने में विफल। कृपया फिर से प्रयास करें।', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'रिकॉर्डिंग सहेजने में विफल। कृपया फिर से प्रयास करें।', // 保存录音失败,请重试 + 'meetingRecordContinueInBackground': + 'बैकग्राउंड में रिकॉर्डिंग जारी रखें', // 后台继续录音 + 'meetingRecordStopTimeout': + 'रिकॉर्डिंग रोकने का समय समाप्त हो गया। कृपया फिर से प्रयास करें।', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'रिकॉर्डिंग रोकने में विफल। कृपया फिर से प्रयास करें।', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'रिकॉर्डिंग सहेजने में विफल। कृपया फिर से प्रयास करें।', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'रिकॉर्डिंग चल रही है', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'बैकग्राउंड में रिकॉर्डिंग हो रही है। ऐप पर लौटने के लिए टैप करें।', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'बैकग्राउंड में रिकॉर्डिंग हो रही है। ऐप पर लौटने के लिए टैप करें।', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'अन्य ऐप्स के ऊपर दिखाएँ', // 悬浮窗权限 - 'overlayPermissionTranslationDesc': 'कॉल या ऑडियो/वीडियो अनुवाद के दौरान अनुवाद परिणाम दिखाने के लिए हमें ओवरले अनुमति चाहिए। इससे आप अन्य ऐप्स का उपयोग करते समय भी रीयल-टाइम अनुवाद देख सकते हैं।', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 - 'overlayPermissionRecordingDesc': 'रिकॉर्डिंग के दौरान रिकॉर्डिंग फ्लोटिंग बार (टाइमर/पॉज़/जारी) दिखाने के लिए हमें ओवरले अनुमति चाहिए।', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 - 'overlayPermissionOpenSettingsFailed': 'सिस्टम सेटिंग्स अपने आप नहीं खुल सकीं। कृपया सेटिंग्स खोलें और ओवरले अनुमति मैन्युअल रूप से सक्षम करें।', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 + 'overlayPermissionTranslationDesc': + 'कॉल या ऑडियो/वीडियो अनुवाद के दौरान अनुवाद परिणाम दिखाने के लिए हमें ओवरले अनुमति चाहिए। इससे आप अन्य ऐप्स का उपयोग करते समय भी रीयल-टाइम अनुवाद देख सकते हैं।', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 + 'overlayPermissionRecordingDesc': + 'रिकॉर्डिंग के दौरान रिकॉर्डिंग फ्लोटिंग बार (टाइमर/पॉज़/जारी) दिखाने के लिए हमें ओवरले अनुमति चाहिए।', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 + 'overlayPermissionOpenSettingsFailed': + 'सिस्टम सेटिंग्स अपने आप नहीं खुल सकीं। कृपया सेटिंग्स खोलें और ओवरले अनुमति मैन्युअल रूप से सक्षम करें।', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 'transcribing': 'Transcribing...', 'summarizing': 'Summarizing...', 'analyzing': 'Analyzing...', @@ -530,21 +565,22 @@ const Map hiIN = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'बनाएँ', - 'templateDetails': 'टेम्पलेट विवरण', - 'tag': 'टैग', - 'description': 'विवरण', - 'template': 'टेम्पलेट', - 'deleteTemplate': 'टेम्पलेट हटाएँ', - 'deleteTemplateConfirm': 'क्या आप वाकई इस टेम्पलेट को हटाना चाहते हैं?', - 'editTemplate': 'टेम्पलेट संपादित करें', - 'createTemplate': 'टेम्पलेट बनाएँ', - 'name': 'नाम', - 'templateContentHint': 'कृपया टेम्पलेट सामग्री दर्ज करें! सुझाव: आपने जो नाम और विवरण दर्ज किया है उसके आधार पर टेम्पलेट सामग्री तेज़ी से बनाने के लिए ऊपर AI बटन दबाएँ', - 'inputNameHint': 'कृपया नाम दर्ज करें', - 'inputDescHint': 'कृपया विवरण दर्ज करें', - 'custom': 'कस्टम', - 'pleaseEnter': 'कृपया दर्ज करें', + 'create': 'बनाएँ', + 'templateDetails': 'टेम्पलेट विवरण', + 'tag': 'टैग', + 'description': 'विवरण', + 'template': 'टेम्पलेट', + 'deleteTemplate': 'टेम्पलेट हटाएँ', + 'deleteTemplateConfirm': 'क्या आप वाकई इस टेम्पलेट को हटाना चाहते हैं?', + 'editTemplate': 'टेम्पलेट संपादित करें', + 'createTemplate': 'टेम्पलेट बनाएँ', + 'name': 'नाम', + 'templateContentHint': + 'कृपया टेम्पलेट सामग्री दर्ज करें! सुझाव: आपने जो नाम और विवरण दर्ज किया है उसके आधार पर टेम्पलेट सामग्री तेज़ी से बनाने के लिए ऊपर AI बटन दबाएँ', + 'inputNameHint': 'कृपया नाम दर्ज करें', + 'inputDescHint': 'कृपया विवरण दर्ज करें', + 'custom': 'कस्टम', + 'pleaseEnter': 'कृपया दर्ज करें', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', @@ -567,7 +603,7 @@ const Map hiIN = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'माइंड मैप सहेजें', + 'saveMindMap': 'माइंड मैप सहेजें', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -589,7 +625,7 @@ const Map hiIN = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'निर्यात', + 'export': 'निर्यात', // Meeting模块 - 发言者 'applyToAllParagraphs': 'इस वक्ता के सभी अनुच्छेदों पर लागू करें', @@ -699,18 +735,18 @@ const Map hiIN = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'विश्लेषण विफल, कृपया बाद में पुनः प्रयास करें', - 'transcriptionFailed': 'ट्रांसक्रिप्शन विफल, कृपया बाद में पुनः प्रयास करें', - 'summaryFailed': 'सारांश विफल, कृपया बाद में पुनः प्रयास करें', - 'summaryFailedShort': 'सारांश विफल', - 'transcriptionFailedShort': 'ट्रांसक्रिप्शन विफल', + 'analysisFailed': 'विश्लेषण विफल, कृपया बाद में पुनः प्रयास करें', + 'transcriptionFailed': 'ट्रांसक्रिप्शन विफल, कृपया बाद में पुनः प्रयास करें', + 'summaryFailed': 'सारांश विफल, कृपया बाद में पुनः प्रयास करें', + 'summaryFailedShort': 'सारांश विफल', + 'transcriptionFailedShort': 'ट्रांसक्रिप्शन विफल', // Meeting模块 - 播放器 - 'playerNotReady': 'ऑडियो प्लेयर तैयार नहीं है, कृपया प्रतीक्षा करें', - 'playFailed': 'चलाने में विफल', - 'audioFileNotFound': 'ऑडियो फ़ाइल नहीं मिली', - 'fetchingAudio': 'क्लाउड से ऑडियो प्राप्त कर रहे हैं...', - 'playerLoadFailed': 'ऑडियो प्लेयर लोड होने में विफल', + 'playerNotReady': 'ऑडियो प्लेयर तैयार नहीं है, कृपया प्रतीक्षा करें', + 'playFailed': 'चलाने में विफल', + 'audioFileNotFound': 'ऑडियो फ़ाइल नहीं मिली', + 'fetchingAudio': 'क्लाउड से ऑडियो प्राप्त कर रहे हैं...', + 'playerLoadFailed': 'ऑडियो प्लेयर लोड होने में विफल', // 设置页 "systemSettings": "सिस्टम सेटिंग्स", @@ -817,7 +853,8 @@ const Map hiIN = { "swipeUpForMore": "अधिक के लिए ऊपर स्वाइप करें", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'सक्षम होने पर: बोलते समय AI आपकी आवाज़ से बाधित नहीं होगा और एक समय में केवल एक वार्तालाप चरण संभाल सकता है। नया चरण शुरू करने के लिए, बस वेक-अप शब्द बोलें।', + 'voice_interrupt_tip': + 'सक्षम होने पर: बोलते समय AI आपकी आवाज़ से बाधित नहीं होगा और एक समय में केवल एक वार्तालाप चरण संभाल सकता है। नया चरण शुरू करने के लिए, बस वेक-अप शब्द बोलें।', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -873,6 +910,13 @@ const Map hiIN = { 'हम जानना चाहते हैं कि आप क्यों रिपोर्ट कर रहे हैं, आप जिस समस्या का सामना कर रहे हैं उसका वर्णन कर सकते हैं।', 'generatedByAi': 'एआई द्वारा उत्पन्न', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'यहां कुछ अनुशंसित संगीत हैं:', 'playList': 'प्लेलिस्ट', @@ -893,6 +937,29 @@ const Map hiIN = { "bicycling": "साइकिल चलाना", "tsransit": "पारगमन", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Failed to start navigation', + 'cannotPlayMusicListRetryLater': + 'Cannot play music list, please try again later', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Error opening map', + 'pleaseInstallAmapApp': 'Please install the Amap app first', + 'pleaseInstallBaiduMapApp': 'Please install the Baidu Maps app first', + 'appleMapStartFailed': 'Apple Maps failed to start', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Error opening Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'मौसम की स्थिति की पूछताछ:', 'highest': 'उच्चतम', @@ -964,8 +1031,19 @@ const Map hiIN = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Disable Floating Window', + 'enableFloatingWindow': 'Enable Floating Window', + 'permissionTip': 'Permission Tip', + 'micPermissionRequiredForRecording': + 'Microphone permission is required for recording', + 'deleteTranslationRecordError': 'Error deleting translation record: @error', "translationFailed": "Translation failed", + "translating": "Translating", + "translate": "Translate", "pleaseInputText": "Please input text", + "inputTextToTranslate": "कृपया अनुवाद करने के लिए पाठ दर्ज करें", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1241,17 +1319,19 @@ const Map hiIN = { 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'नेविगेशन जारी है', - 'native.notification.navigation.keepRunning': 'नेविगेट कर रहे हैं, ऐप चालू रखें', - 'native.notification.bleAgent.running': 'वॉयस असिस्टेंट एजेंट चल रहा है', - 'native.notification.audioRecording.recording': 'ऑडियो रिकॉर्ड हो रहा है, ऐप पर वापस जाने के लिए टैप करें', - 'native.notification.music.waiting': 'चलाने की प्रतीक्षा में', - 'native.notification.music.previous': 'पिछला', - 'native.notification.music.next': 'अगला', - 'native.notification.music.play': 'चलाएँ', - 'native.notification.music.pause': 'रोकें', - 'native.notification.qqMusic.playing': 'संगीत चल रहा है', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'नेविगेशन जारी है', + 'native.notification.navigation.keepRunning': + 'नेविगेट कर रहे हैं, ऐप चालू रखें', + 'native.notification.bleAgent.running': 'वॉयस असिस्टेंट एजेंट चल रहा है', + 'native.notification.audioRecording.recording': + 'ऑडियो रिकॉर्ड हो रहा है, ऐप पर वापस जाने के लिए टैप करें', + 'native.notification.music.waiting': 'चलाने की प्रतीक्षा में', + 'native.notification.music.previous': 'पिछला', + 'native.notification.music.next': 'अगला', + 'native.notification.music.play': 'चलाएँ', + 'native.notification.music.pause': 'रोकें', + 'native.notification.qqMusic.playing': 'संगीत चल रहा है', // 版本更新 'newVersionFound': 'नया संस्करण मिला', // 版本更新对话框标题 @@ -1391,6 +1471,59 @@ const Map hiIN = { "removeEarbudsEnsureBattery": "दोनों ईयरबड निकालें, और सुनिश्चित करें कि दोनों की बैटरी 20% से ऊपर है", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Upgrade Successful', + 'otaUpgradeCompleteRepair': + 'Firmware upgrade complete!\n\nDevice needs to be re-paired to work properly. Go to pairing page now?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': + 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': + 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': + 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', + // 音乐模块 "noMusic": "कोई संगीत नहीं", // 暂无音乐 "noPlayingMusic": "कोई संगीत नहीं चल रहा है", // 暂无播放音乐 diff --git a/lib/core/translations/language/hr_hr.dart b/lib/core/translations/language/hr_hr.dart index cf1deb6d2..92a87a562 100644 --- a/lib/core/translations/language/hr_hr.dart +++ b/lib/core/translations/language/hr_hr.dart @@ -1,5 +1,4 @@ const Map hrHR = { - // 通用 'continue': 'Nastavi', 'confirm': 'Potvrdi', @@ -170,6 +169,29 @@ const Map hrHR = { 'right': 'Desno', 'checkConnectionStatusFailed': 'Provjera statusa veze nije uspjela', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth initialization failed: @error', + 'needBluetoothAndLocationPermission': + 'Bluetooth and location permissions are required to scan devices', + 'permissionRequestFailedWithError': 'Permission request failed: @error', + 'needPermission': 'Permission Required', + 'blePermissionDialogContent': + 'This app requires Bluetooth and location permissions to scan devices. Please enable them in Settings.', + 'needEnableBluetooth': 'Enable Bluetooth', + 'enableBluetoothDialogContent': + 'Please enable Bluetooth to scan and connect devices.', + 'bleScanFailedWithError': 'Scan failed: @error', + 'bleConnectionSuccess': 'Connection Successful', + 'bleConnectedToDevice': 'Connected to @device', + 'bleConnectionFailedWithError': 'Connection failed: @error', + 'bleDisconnected': 'Disconnected', + 'bleDeviceDisconnected': 'Device disconnected', + 'bleDisconnectFailedWithError': 'Disconnect failed: @error', + 'signalStrong': 'Strong', + 'signalMedium': 'Medium', + 'signalWeak': 'Weak', + 'signalVeryWeak': 'Very Weak', + // 发现页 "searchAi": "Traži AI funkcije...", "exploreSlogan": "Pametne slušalice, beskonačne mogućnosti", @@ -246,60 +268,65 @@ const Map hrHR = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Plaćanje uspješno', - 'paymentFailed': 'Plaćanje nije uspjelo', - 'gotIt': 'Razumijem', - 'paymentFailedTryAgain': 'Plaćanje nije uspjelo. Pokušajte ponovno.', - 'selectPaymentMethod': 'Odaberite način plaćanja', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Stvaranje WeChat narudžbe nije uspjelo', - 'alipayOrderCreateFailed': 'Stvaranje Alipay narudžbe nije uspjelo', - 'appleOrderCreateFailed': 'Stvaranje Apple narudžbe nije uspjelo', - 'googleOrderCreateFailed': 'Stvaranje Google narudžbe nije uspjelo', - 'paypalOrderCreateFailed': 'Stvaranje PayPal narudžbe nije uspjelo', - 'paymentException': 'Iznimka pri plaćanju', - 'paymentLaunchFailed': 'Pokretanje plaćanja nije uspjelo', - 'paymentExceptionWithError': 'Iznimka pri plaćanju: @error', - 'paymentProcessingCheckLater': 'Vaša narudžba se obrađuje. Provjerite kasnije.', - 'paymentResultQueryException': 'Neuspješno dohvaćanje rezultata plaćanja: @error', - 'orderConfirmedQuotaRefreshed': 'Narudžba je potvrđena. Vaša kvota je osvježena.', - 'paymentCompletedConfirming': 'Plaćanje je završeno. Potvrđivanje…', - 'paymentCancelled': 'Plaćanje je otkazano', - 'paypalOpenedCompleteInBrowser': 'PayPal je otvoren. Molimo dovršite plaćanje u pregledniku.', - 'paypalOpenFailed': 'Nije moguće otvoriti PayPal stranicu za plaćanje', - 'paymentTestTitle': 'Test plaćanja', - 'paymentTestOrderInfo': 'Informacije o testnoj narudžbi', - 'paymentTestProductId': 'ID proizvoda', - 'paymentTestProductDescription': 'Opis proizvoda', - 'paymentTestWechatDescription': 'Test WeChat plaćanja', - 'paymentTestAlipayDescription': 'Test Alipay plaćanja', - 'paymentTestAmount': 'Iznos', - 'paymentTestSelectAmount': 'Odaberite testni iznos', - 'paying': 'Plaćanje...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Status plaćanja', - 'errorInfoWithMessage': 'Greška: @message', - 'retest': 'Ponovo testiraj', - 'paymentTestInstructionsTitle': 'Upute', - 'paymentTestInstructionsContent': '1. Odaberite testni iznos (preporučeno: ¥0.01)\n2. Kliknite gumb za plaćanje za početak\n3. Dovršite plaćanje u aplikaciji za plaćanje\n4. Vratite se da provjerite rezultat', - 'startingWechatPayment': 'Pokretanje WeChat Pay-a...', - 'startingAlipayPayment': 'Pokretanje Alipay-a...', - 'wechatPaymentSuccess': 'WeChat Pay plaćanje uspješno!', - 'wechatPaymentFailed': 'WeChat Pay plaćanje nije uspjelo', - 'wechatPaymentLaunchFailed': 'Pokretanje WeChat Pay-a nije uspjelo', - 'cannotLaunchWechatPayment': 'Nije moguće pokrenuti WeChat Pay', - 'wechatPaymentException': 'WeChat Pay iznimka', - 'wechatPaymentTestCompleted': 'Test WeChat Pay plaćanja je završen', - 'alipayPaymentSuccess': 'Alipay plaćanje uspješno!', - 'alipayPaymentFailed': 'Alipay plaćanje nije uspjelo', - 'alipayPaymentLaunchFailed': 'Pokretanje Alipay-a nije uspjelo', - 'cannotLaunchAlipayPayment': 'Nije moguće pokrenuti Alipay', - 'alipayPaymentException': 'Alipay iznimka', + 'paymentSuccess': 'Plaćanje uspješno', + 'paymentFailed': 'Plaćanje nije uspjelo', + 'gotIt': 'Razumijem', + 'paymentFailedTryAgain': 'Plaćanje nije uspjelo. Pokušajte ponovno.', + 'selectPaymentMethod': 'Odaberite način plaćanja', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Stvaranje WeChat narudžbe nije uspjelo', + 'alipayOrderCreateFailed': 'Stvaranje Alipay narudžbe nije uspjelo', + 'appleOrderCreateFailed': 'Stvaranje Apple narudžbe nije uspjelo', + 'googleOrderCreateFailed': 'Stvaranje Google narudžbe nije uspjelo', + 'paypalOrderCreateFailed': 'Stvaranje PayPal narudžbe nije uspjelo', + 'paymentException': 'Iznimka pri plaćanju', + 'paymentLaunchFailed': 'Pokretanje plaćanja nije uspjelo', + 'paymentExceptionWithError': 'Iznimka pri plaćanju: @error', + 'paymentProcessingCheckLater': + 'Vaša narudžba se obrađuje. Provjerite kasnije.', + 'paymentResultQueryException': + 'Neuspješno dohvaćanje rezultata plaćanja: @error', + 'orderConfirmedQuotaRefreshed': + 'Narudžba je potvrđena. Vaša kvota je osvježena.', + 'paymentCompletedConfirming': 'Plaćanje je završeno. Potvrđivanje…', + 'paymentCancelled': 'Plaćanje je otkazano', + 'paypalOpenedCompleteInBrowser': + 'PayPal je otvoren. Molimo dovršite plaćanje u pregledniku.', + 'paypalOpenFailed': 'Nije moguće otvoriti PayPal stranicu za plaćanje', + 'paymentTestTitle': 'Test plaćanja', + 'paymentTestOrderInfo': 'Informacije o testnoj narudžbi', + 'paymentTestProductId': 'ID proizvoda', + 'paymentTestProductDescription': 'Opis proizvoda', + 'paymentTestWechatDescription': 'Test WeChat plaćanja', + 'paymentTestAlipayDescription': 'Test Alipay plaćanja', + 'paymentTestAmount': 'Iznos', + 'paymentTestSelectAmount': 'Odaberite testni iznos', + 'paying': 'Plaćanje...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Status plaćanja', + 'errorInfoWithMessage': 'Greška: @message', + 'retest': 'Ponovo testiraj', + 'paymentTestInstructionsTitle': 'Upute', + 'paymentTestInstructionsContent': + '1. Odaberite testni iznos (preporučeno: ¥0.01)\n2. Kliknite gumb za plaćanje za početak\n3. Dovršite plaćanje u aplikaciji za plaćanje\n4. Vratite se da provjerite rezultat', + 'startingWechatPayment': 'Pokretanje WeChat Pay-a...', + 'startingAlipayPayment': 'Pokretanje Alipay-a...', + 'wechatPaymentSuccess': 'WeChat Pay plaćanje uspješno!', + 'wechatPaymentFailed': 'WeChat Pay plaćanje nije uspjelo', + 'wechatPaymentLaunchFailed': 'Pokretanje WeChat Pay-a nije uspjelo', + 'cannotLaunchWechatPayment': 'Nije moguće pokrenuti WeChat Pay', + 'wechatPaymentException': 'WeChat Pay iznimka', + 'wechatPaymentTestCompleted': 'Test WeChat Pay plaćanja je završen', + 'alipayPaymentSuccess': 'Alipay plaćanje uspješno!', + 'alipayPaymentFailed': 'Alipay plaćanje nije uspjelo', + 'alipayPaymentLaunchFailed': 'Pokretanje Alipay-a nije uspjelo', + 'cannotLaunchAlipayPayment': 'Nije moguće pokrenuti Alipay', + 'alipayPaymentException': 'Alipay iznimka', "insufficientIntegral": "Insufficient integral", "insufficientBalanceDesc": 'Insufficient balance, please go to the corresponding recharge page to recharge.', @@ -497,19 +524,27 @@ const Map hrHR = { 'callRecording': 'Call Recording', 'importAudio': 'Import Audio', 'meetingRecordExitTitle': 'Izađi iz snimanja', // 退出录音 - 'meetingRecordExitMessage': 'Odaberite što učiniti prije izlaska', // 请选择离开后的操作 + 'meetingRecordExitMessage': + 'Odaberite što učiniti prije izlaska', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Završi i spremi', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Završi bez spremanja', // 结束录音不保存 'meetingRecordContinueInBackground': 'Nastavi snimanje u pozadini', // 后台继续录音 - 'meetingRecordStopTimeout': 'Isteklo je vrijeme za zaustavljanje snimanja. Pokušajte ponovno.', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'Neuspjelo zaustavljanje snimanja. Pokušajte ponovno.', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'Neuspjelo spremanje snimke. Pokušajte ponovno.', // 保存录音失败,请重试 + 'meetingRecordStopTimeout': + 'Isteklo je vrijeme za zaustavljanje snimanja. Pokušajte ponovno.', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'Neuspjelo zaustavljanje snimanja. Pokušajte ponovno.', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'Neuspjelo spremanje snimke. Pokušajte ponovno.', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'Snimanje je u tijeku', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Snimanje u pozadini. Dodirnite za povratak u aplikaciju.', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'Snimanje u pozadini. Dodirnite za povratak u aplikaciju.', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Prikaz preko drugih aplikacija', // 悬浮窗权限 - 'overlayPermissionTranslationDesc': 'Za prikaz rezultata prijevoda tijekom poziva ili prijevoda zvuka/videa potrebna je dozvola za prikaz preko drugih aplikacija. Tako možete vidjeti prijevod u stvarnom vremenu dok koristite druge aplikacije.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 - 'overlayPermissionRecordingDesc': 'Za prikaz plutajuće trake snimanja (mjerač vremena/pauza/nastavi) tijekom snimanja potrebna je dozvola za prikaz preko drugih aplikacija.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 - 'overlayPermissionOpenSettingsFailed': 'Nije moguće automatski otvoriti postavke sustava. Otvorite Postavke i ručno omogućite dozvolu za prikaz preko drugih aplikacija.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 + 'overlayPermissionTranslationDesc': + 'Za prikaz rezultata prijevoda tijekom poziva ili prijevoda zvuka/videa potrebna je dozvola za prikaz preko drugih aplikacija. Tako možete vidjeti prijevod u stvarnom vremenu dok koristite druge aplikacije.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 + 'overlayPermissionRecordingDesc': + 'Za prikaz plutajuće trake snimanja (mjerač vremena/pauza/nastavi) tijekom snimanja potrebna je dozvola za prikaz preko drugih aplikacija.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 + 'overlayPermissionOpenSettingsFailed': + 'Nije moguće automatski otvoriti postavke sustava. Otvorite Postavke i ručno omogućite dozvolu za prikaz preko drugih aplikacija.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 'transcribing': 'Transcribing...', 'summarizing': 'Summarizing...', 'analyzing': 'Analyzing...', @@ -534,21 +569,23 @@ const Map hrHR = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Stvori', - 'templateDetails': 'Pojedinosti predloška', - 'tag': 'Oznaka', - 'description': 'Opis', - 'template': 'Predložak', - 'deleteTemplate': 'Obriši predložak', - 'deleteTemplateConfirm': 'Jeste li sigurni da želite obrisati ovaj predložak?', - 'editTemplate': 'Uredi predložak', - 'createTemplate': 'Stvori predložak', - 'name': 'Naziv', - 'templateContentHint': 'Molimo unesite sadržaj predloška! Savjet: Kliknite na AI gumb iznad za brzo generiranje sadržaja predloška na temelju naziva i opisa koje ste unijeli', - 'inputNameHint': 'Molimo unesite naziv', - 'inputDescHint': 'Molimo unesite opis', - 'custom': 'Prilagođeno', - 'pleaseEnter': 'Molimo unesite', + 'create': 'Stvori', + 'templateDetails': 'Pojedinosti predloška', + 'tag': 'Oznaka', + 'description': 'Opis', + 'template': 'Predložak', + 'deleteTemplate': 'Obriši predložak', + 'deleteTemplateConfirm': + 'Jeste li sigurni da želite obrisati ovaj predložak?', + 'editTemplate': 'Uredi predložak', + 'createTemplate': 'Stvori predložak', + 'name': 'Naziv', + 'templateContentHint': + 'Molimo unesite sadržaj predloška! Savjet: Kliknite na AI gumb iznad za brzo generiranje sadržaja predloška na temelju naziva i opisa koje ste unijeli', + 'inputNameHint': 'Molimo unesite naziv', + 'inputDescHint': 'Molimo unesite opis', + 'custom': 'Prilagođeno', + 'pleaseEnter': 'Molimo unesite', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', @@ -571,7 +608,7 @@ const Map hrHR = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Spremi mentalnu mapu', + 'saveMindMap': 'Spremi mentalnu mapu', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -593,7 +630,7 @@ const Map hrHR = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Izvoz', + 'export': 'Izvoz', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Primijeni na sve odlomke ovog govornika', @@ -703,18 +740,19 @@ const Map hrHR = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Analiza nije uspjela, pokušajte ponovno kasnije', - 'transcriptionFailed': 'Transkripcija nije uspjela, pokušajte ponovno kasnije', - 'summaryFailed': 'Sažetak nije uspio, pokušajte ponovno kasnije', - 'summaryFailedShort': 'Sažetak nije uspio', - 'transcriptionFailedShort': 'Transkripcija nije uspjela', + 'analysisFailed': 'Analiza nije uspjela, pokušajte ponovno kasnije', + 'transcriptionFailed': + 'Transkripcija nije uspjela, pokušajte ponovno kasnije', + 'summaryFailed': 'Sažetak nije uspio, pokušajte ponovno kasnije', + 'summaryFailedShort': 'Sažetak nije uspio', + 'transcriptionFailedShort': 'Transkripcija nije uspjela', // Meeting模块 - 播放器 - 'playerNotReady': 'Audio reproduktor nije spreman, molimo pričekajte', - 'playFailed': 'Reprodukcija nije uspjela', - 'audioFileNotFound': 'Audio datoteka nije pronađena', - 'fetchingAudio': 'Dohvaćanje audio zapisa iz oblaka...', - 'playerLoadFailed': 'Audio reproduktor se nije uspio učitati', + 'playerNotReady': 'Audio reproduktor nije spreman, molimo pričekajte', + 'playFailed': 'Reprodukcija nije uspjela', + 'audioFileNotFound': 'Audio datoteka nije pronađena', + 'fetchingAudio': 'Dohvaćanje audio zapisa iz oblaka...', + 'playerLoadFailed': 'Audio reproduktor se nije uspio učitati', // 设置页 "systemSettings": "Postavke sustava", @@ -821,7 +859,8 @@ const Map hrHR = { "swipeUpForMore": "Prijeđite prstom prema gore za više", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Kada je uključeno: AI neće biti prekinut vašim glasom dok govori i može obraditi samo jedan krug razgovora odjednom. Za početak novog kruga, samo izgovorite riječ za buđenje.', + 'voice_interrupt_tip': + 'Kada je uključeno: AI neće biti prekinut vašim glasom dok govori i može obraditi samo jedan krug razgovora odjednom. Za početak novog kruga, samo izgovorite riječ za buđenje.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -877,6 +916,13 @@ const Map hrHR = { 'Želimo znati razlog vaše prijave, možete opisati problem s kojim ste se suočili.', 'generatedByAi': 'Generirano od strane AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Evo nekoliko preporučenih pjesama:', 'playList': 'Popis pjesama', @@ -897,6 +943,29 @@ const Map hrHR = { "bicycling": "Biciklizam", "tsransit": "Javni prijevoz", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Failed to start navigation', + 'cannotPlayMusicListRetryLater': + 'Cannot play music list, please try again later', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Error opening map', + 'pleaseInstallAmapApp': 'Please install the Amap app first', + 'pleaseInstallBaiduMapApp': 'Please install the Baidu Maps app first', + 'appleMapStartFailed': 'Apple Maps failed to start', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Error opening Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Upit o vremenskim uvjetima:', 'highest': 'Najviša', @@ -968,8 +1037,19 @@ const Map hrHR = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Disable Floating Window', + 'enableFloatingWindow': 'Enable Floating Window', + 'permissionTip': 'Permission Tip', + 'micPermissionRequiredForRecording': + 'Microphone permission is required for recording', + 'deleteTranslationRecordError': 'Error deleting translation record: @error', "translationFailed": "Translation failed", + "translating": "Translating", + "translate": "Translate", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Unesite tekst za prijevod", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1244,17 +1324,19 @@ const Map hrHR = { 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigacija u tijeku', - 'native.notification.navigation.keepRunning': 'Navigacija, držite aplikaciju pokrenutom', - 'native.notification.bleAgent.running': 'Glasovni asistent je pokrenut', - 'native.notification.audioRecording.recording': 'Snimanje zvuka, dodirnite za povratak u aplikaciju', - 'native.notification.music.waiting': 'Čekanje na reprodukciju', - 'native.notification.music.previous': 'Prethodna', - 'native.notification.music.next': 'Sljedeća', - 'native.notification.music.play': 'Reproduciraj', - 'native.notification.music.pause': 'Pauza', - 'native.notification.qqMusic.playing': 'Reprodukcija glazbe', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigacija u tijeku', + 'native.notification.navigation.keepRunning': + 'Navigacija, držite aplikaciju pokrenutom', + 'native.notification.bleAgent.running': 'Glasovni asistent je pokrenut', + 'native.notification.audioRecording.recording': + 'Snimanje zvuka, dodirnite za povratak u aplikaciju', + 'native.notification.music.waiting': 'Čekanje na reprodukciju', + 'native.notification.music.previous': 'Prethodna', + 'native.notification.music.next': 'Sljedeća', + 'native.notification.music.play': 'Reproduciraj', + 'native.notification.music.pause': 'Pauza', + 'native.notification.qqMusic.playing': 'Reprodukcija glazbe', // 版本更新 'newVersionFound': 'Pronađena nova verzija', // 版本更新对话框标题 @@ -1396,6 +1478,59 @@ const Map hrHR = { "removeEarbudsEnsureBattery": "Izvadite obje slušalice i provjerite je li baterija obje iznad 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Upgrade Successful', + 'otaUpgradeCompleteRepair': + 'Firmware upgrade complete!\n\nDevice needs to be re-paired to work properly. Go to pairing page now?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': + 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': + 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': + 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', + // 音乐模块 "noMusic": "Nema glazbe", // 暂无音乐 "noPlayingMusic": "Nema glazbe koja se reproducira", // 暂无播放音乐 diff --git a/lib/core/translations/language/hu_hu.dart b/lib/core/translations/language/hu_hu.dart index 82fcdec4a..79a3ab658 100644 --- a/lib/core/translations/language/hu_hu.dart +++ b/lib/core/translations/language/hu_hu.dart @@ -1,5 +1,4 @@ const Map huHU = { - // 通用 'continue': 'Folytatás', 'confirm': 'Megerősítés', @@ -172,6 +171,29 @@ const Map huHU = { 'checkConnectionStatusFailed': 'A kapcsolat állapotának ellenőrzése sikertelen', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth initialization failed: @error', + 'needBluetoothAndLocationPermission': + 'Bluetooth and location permissions are required to scan devices', + 'permissionRequestFailedWithError': 'Permission request failed: @error', + 'needPermission': 'Permission Required', + 'blePermissionDialogContent': + 'This app requires Bluetooth and location permissions to scan devices. Please enable them in Settings.', + 'needEnableBluetooth': 'Enable Bluetooth', + 'enableBluetoothDialogContent': + 'Please enable Bluetooth to scan and connect devices.', + 'bleScanFailedWithError': 'Scan failed: @error', + 'bleConnectionSuccess': 'Connection Successful', + 'bleConnectedToDevice': 'Connected to @device', + 'bleConnectionFailedWithError': 'Connection failed: @error', + 'bleDisconnected': 'Disconnected', + 'bleDeviceDisconnected': 'Device disconnected', + 'bleDisconnectFailedWithError': 'Disconnect failed: @error', + 'signalStrong': 'Strong', + 'signalMedium': 'Medium', + 'signalWeak': 'Weak', + 'signalVeryWeak': 'Very Weak', + // 发现页 "searchAi": "AI funkciók keresése...", "exploreSlogan": "Okos fülhallgatók, végtelen lehetőségek", @@ -246,60 +268,64 @@ const Map huHU = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Fizetés sikeres', - 'paymentFailed': 'Fizetés sikertelen', - 'gotIt': 'Értem', - 'paymentFailedTryAgain': 'Fizetés sikertelen. Kérjük, próbálja újra.', - 'selectPaymentMethod': 'Fizetési mód kiválasztása', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'WeChat Pay rendelés létrehozása sikertelen', - 'alipayOrderCreateFailed': 'Alipay rendelés létrehozása sikertelen', - 'appleOrderCreateFailed': 'Apple rendelés létrehozása sikertelen', - 'googleOrderCreateFailed': 'Google rendelés létrehozása sikertelen', - 'paypalOrderCreateFailed': 'PayPal rendelés létrehozása sikertelen', - 'paymentException': 'Fizetési kivétel', - 'paymentLaunchFailed': 'Fizetés indítása sikertelen', - 'paymentExceptionWithError': 'Fizetési kivétel: @error', - 'paymentProcessingCheckLater': 'A rendelése feldolgozás alatt áll. Kérjük, ellenőrizze később.', - 'paymentResultQueryException': 'Nem sikerült lekérdezni a fizetés eredményét: @error', - 'orderConfirmedQuotaRefreshed': 'Rendelés megerősítve. A kvótája frissült.', - 'paymentCompletedConfirming': 'Fizetés befejezve. Megerősítés folyamatban…', - 'paymentCancelled': 'Fizetés megszakítva', - 'paypalOpenedCompleteInBrowser': 'PayPal megnyitva. Kérjük, fejezze be a fizetést a böngészőben.', - 'paypalOpenFailed': 'Nem sikerült megnyitni a PayPal fizetési oldalt', - 'paymentTestTitle': 'Fizetési teszt', - 'paymentTestOrderInfo': 'Teszt rendelési információ', - 'paymentTestProductId': 'Termékazonosító', - 'paymentTestProductDescription': 'Termékleírás', - 'paymentTestWechatDescription': 'WeChat Pay fizetési teszt', - 'paymentTestAlipayDescription': 'Alipay fizetési teszt', - 'paymentTestAmount': 'Összeg', - 'paymentTestSelectAmount': 'Válassza ki a teszt összeget', - 'paying': 'Fizetés...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Fizetés állapota', - 'errorInfoWithMessage': 'Hiba: @message', - 'retest': 'Újratesztelés', - 'paymentTestInstructionsTitle': 'Útmutató', - 'paymentTestInstructionsContent': '1. Válasszon egy teszt összeget (ajánlott: ¥0,01)\n2. Kattintson a fizetés gombra az indításhoz\n3. Fejezze be a fizetést a fizetési alkalmazásban\n4. Térjen vissza az eredmény ellenőrzéséhez', - 'startingWechatPayment': 'WeChat Pay indítása...', - 'startingAlipayPayment': 'Alipay indítása...', - 'wechatPaymentSuccess': 'WeChat Pay sikeres!', - 'wechatPaymentFailed': 'WeChat Pay sikertelen', - 'wechatPaymentLaunchFailed': 'WeChat Pay indítása sikertelen', - 'cannotLaunchWechatPayment': 'Nem sikerült elindítani a WeChat Pay-t', - 'wechatPaymentException': 'WeChat Pay kivétel', - 'wechatPaymentTestCompleted': 'WeChat Pay teszt befejezve', - 'alipayPaymentSuccess': 'Alipay sikeres!', - 'alipayPaymentFailed': 'Alipay sikertelen', - 'alipayPaymentLaunchFailed': 'Alipay indítása sikertelen', - 'cannotLaunchAlipayPayment': 'Nem sikerült elindítani az Alipay-t', - 'alipayPaymentException': 'Alipay kivétel', + 'paymentSuccess': 'Fizetés sikeres', + 'paymentFailed': 'Fizetés sikertelen', + 'gotIt': 'Értem', + 'paymentFailedTryAgain': 'Fizetés sikertelen. Kérjük, próbálja újra.', + 'selectPaymentMethod': 'Fizetési mód kiválasztása', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'WeChat Pay rendelés létrehozása sikertelen', + 'alipayOrderCreateFailed': 'Alipay rendelés létrehozása sikertelen', + 'appleOrderCreateFailed': 'Apple rendelés létrehozása sikertelen', + 'googleOrderCreateFailed': 'Google rendelés létrehozása sikertelen', + 'paypalOrderCreateFailed': 'PayPal rendelés létrehozása sikertelen', + 'paymentException': 'Fizetési kivétel', + 'paymentLaunchFailed': 'Fizetés indítása sikertelen', + 'paymentExceptionWithError': 'Fizetési kivétel: @error', + 'paymentProcessingCheckLater': + 'A rendelése feldolgozás alatt áll. Kérjük, ellenőrizze később.', + 'paymentResultQueryException': + 'Nem sikerült lekérdezni a fizetés eredményét: @error', + 'orderConfirmedQuotaRefreshed': 'Rendelés megerősítve. A kvótája frissült.', + 'paymentCompletedConfirming': 'Fizetés befejezve. Megerősítés folyamatban…', + 'paymentCancelled': 'Fizetés megszakítva', + 'paypalOpenedCompleteInBrowser': + 'PayPal megnyitva. Kérjük, fejezze be a fizetést a böngészőben.', + 'paypalOpenFailed': 'Nem sikerült megnyitni a PayPal fizetési oldalt', + 'paymentTestTitle': 'Fizetési teszt', + 'paymentTestOrderInfo': 'Teszt rendelési információ', + 'paymentTestProductId': 'Termékazonosító', + 'paymentTestProductDescription': 'Termékleírás', + 'paymentTestWechatDescription': 'WeChat Pay fizetési teszt', + 'paymentTestAlipayDescription': 'Alipay fizetési teszt', + 'paymentTestAmount': 'Összeg', + 'paymentTestSelectAmount': 'Válassza ki a teszt összeget', + 'paying': 'Fizetés...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Fizetés állapota', + 'errorInfoWithMessage': 'Hiba: @message', + 'retest': 'Újratesztelés', + 'paymentTestInstructionsTitle': 'Útmutató', + 'paymentTestInstructionsContent': + '1. Válasszon egy teszt összeget (ajánlott: ¥0,01)\n2. Kattintson a fizetés gombra az indításhoz\n3. Fejezze be a fizetést a fizetési alkalmazásban\n4. Térjen vissza az eredmény ellenőrzéséhez', + 'startingWechatPayment': 'WeChat Pay indítása...', + 'startingAlipayPayment': 'Alipay indítása...', + 'wechatPaymentSuccess': 'WeChat Pay sikeres!', + 'wechatPaymentFailed': 'WeChat Pay sikertelen', + 'wechatPaymentLaunchFailed': 'WeChat Pay indítása sikertelen', + 'cannotLaunchWechatPayment': 'Nem sikerült elindítani a WeChat Pay-t', + 'wechatPaymentException': 'WeChat Pay kivétel', + 'wechatPaymentTestCompleted': 'WeChat Pay teszt befejezve', + 'alipayPaymentSuccess': 'Alipay sikeres!', + 'alipayPaymentFailed': 'Alipay sikertelen', + 'alipayPaymentLaunchFailed': 'Alipay indítása sikertelen', + 'cannotLaunchAlipayPayment': 'Nem sikerült elindítani az Alipay-t', + 'alipayPaymentException': 'Alipay kivétel', "insufficientIntegral": "Insufficient integral", "insufficientBalanceDesc": 'Insufficient balance, please go to the corresponding recharge page to recharge.', @@ -543,21 +569,22 @@ const Map huHU = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Létrehozás', - 'templateDetails': 'Sablon részletei', - 'tag': 'Címke', - 'description': 'Leírás', - 'template': 'Sablon', - 'deleteTemplate': 'Sablon törlése', - 'deleteTemplateConfirm': 'Biztosan törölni szeretné ezt a sablont?', - 'editTemplate': 'Sablon szerkesztése', - 'createTemplate': 'Sablon létrehozása', - 'name': 'Név', - 'templateContentHint': 'Kérjük, adja meg a sablon tartalmát! Tipp: Kattintson a fenti AI gombra, hogy gyorsan generáljon sablontartalmat a megadott név és leírás alapján', - 'inputNameHint': 'Kérjük, adjon meg nevet', - 'inputDescHint': 'Kérjük, adjon meg leírást', - 'custom': 'Egyéni', - 'pleaseEnter': 'Kérjük, adja meg', + 'create': 'Létrehozás', + 'templateDetails': 'Sablon részletei', + 'tag': 'Címke', + 'description': 'Leírás', + 'template': 'Sablon', + 'deleteTemplate': 'Sablon törlése', + 'deleteTemplateConfirm': 'Biztosan törölni szeretné ezt a sablont?', + 'editTemplate': 'Sablon szerkesztése', + 'createTemplate': 'Sablon létrehozása', + 'name': 'Név', + 'templateContentHint': + 'Kérjük, adja meg a sablon tartalmát! Tipp: Kattintson a fenti AI gombra, hogy gyorsan generáljon sablontartalmat a megadott név és leírás alapján', + 'inputNameHint': 'Kérjük, adjon meg nevet', + 'inputDescHint': 'Kérjük, adjon meg leírást', + 'custom': 'Egyéni', + 'pleaseEnter': 'Kérjük, adja meg', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', @@ -580,7 +607,7 @@ const Map huHU = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Gondolattérkép mentése', + 'saveMindMap': 'Gondolattérkép mentése', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -602,7 +629,7 @@ const Map huHU = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Exportálás', + 'export': 'Exportálás', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Alkalmazás a beszélő összes bekezdésére', @@ -712,18 +739,18 @@ const Map huHU = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Az elemzés sikertelen, kérjük, próbálja újra később', - 'transcriptionFailed': 'Az átírás sikertelen, kérjük, próbálja újra később', - 'summaryFailed': 'Az összefoglalás sikertelen, kérjük, próbálja újra később', - 'summaryFailedShort': 'Összefoglalás sikertelen', - 'transcriptionFailedShort': 'Átírás sikertelen', + 'analysisFailed': 'Az elemzés sikertelen, kérjük, próbálja újra később', + 'transcriptionFailed': 'Az átírás sikertelen, kérjük, próbálja újra később', + 'summaryFailed': 'Az összefoglalás sikertelen, kérjük, próbálja újra később', + 'summaryFailedShort': 'Összefoglalás sikertelen', + 'transcriptionFailedShort': 'Átírás sikertelen', // Meeting模块 - 播放器 - 'playerNotReady': 'A hanglejátszó nem áll készen, kérjük, várjon', - 'playFailed': 'Lejátszás sikertelen', - 'audioFileNotFound': 'Hangfájl nem található', - 'fetchingAudio': 'Hanganyag letöltése a felhőből...', - 'playerLoadFailed': 'A hanglejátszó betöltése sikertelen', + 'playerNotReady': 'A hanglejátszó nem áll készen, kérjük, várjon', + 'playFailed': 'Lejátszás sikertelen', + 'audioFileNotFound': 'Hangfájl nem található', + 'fetchingAudio': 'Hanganyag letöltése a felhőből...', + 'playerLoadFailed': 'A hanglejátszó betöltése sikertelen', // 设置页 "systemSettings": "Rendszerbeállítások", @@ -832,7 +859,8 @@ const Map huHU = { "swipeUpForMore": "Húzza felfelé a továbbiakért", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Ha engedélyezve van: Az AI nem szakítható meg a hangjával beszéd közben, és egyszerre csak egy beszélgetési kört tud kezelni. Új kör indításához mondja ki az ébresztő szót.', + 'voice_interrupt_tip': + 'Ha engedélyezve van: Az AI nem szakítható meg a hangjával beszéd közben, és egyszerre csak egy beszélgetési kört tud kezelni. Új kör indításához mondja ki az ébresztő szót.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -888,6 +916,13 @@ const Map huHU = { 'Szeretnénk tudni a jelentés okát, leírhatja a tapasztalt problémát.', 'generatedByAi': 'AI által generált', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Itt van néhány ajánlott zene:', 'playList': 'Lejátszási lista', @@ -908,6 +943,29 @@ const Map huHU = { "bicycling": "Kerékpározás", "tsransit": "Tömegközlekedés", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Failed to start navigation', + 'cannotPlayMusicListRetryLater': + 'Cannot play music list, please try again later', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Error opening map', + 'pleaseInstallAmapApp': 'Please install the Amap app first', + 'pleaseInstallBaiduMapApp': 'Please install the Baidu Maps app first', + 'appleMapStartFailed': 'Apple Maps failed to start', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Error opening Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Időjárási körülmények lekérdezése:', 'highest': 'Legmagasabb', @@ -979,8 +1037,19 @@ const Map huHU = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Disable Floating Window', + 'enableFloatingWindow': 'Enable Floating Window', + 'permissionTip': 'Permission Tip', + 'micPermissionRequiredForRecording': + 'Microphone permission is required for recording', + 'deleteTranslationRecordError': 'Error deleting translation record: @error', "translationFailed": "Translation failed", + "translating": "Translating", + "translate": "Translate", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Kérjük, adja meg a lefordítandó szöveget", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1255,17 +1324,19 @@ const Map huHU = { 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigálás folyamatban', - 'native.notification.navigation.keepRunning': 'Navigálás, tartsa nyitva az alkalmazást', - 'native.notification.bleAgent.running': 'A hangasszisztens ügynök fut', - 'native.notification.audioRecording.recording': 'Hangfelvétel folyamatban, koppintson az alkalmazásba való visszatéréshez', - 'native.notification.music.waiting': 'Lejátszásra vár', - 'native.notification.music.previous': 'Előző', - 'native.notification.music.next': 'Következő', - 'native.notification.music.play': 'Lejátszás', - 'native.notification.music.pause': 'Szünet', - 'native.notification.qqMusic.playing': 'Zene lejátszása', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigálás folyamatban', + 'native.notification.navigation.keepRunning': + 'Navigálás, tartsa nyitva az alkalmazást', + 'native.notification.bleAgent.running': 'A hangasszisztens ügynök fut', + 'native.notification.audioRecording.recording': + 'Hangfelvétel folyamatban, koppintson az alkalmazásba való visszatéréshez', + 'native.notification.music.waiting': 'Lejátszásra vár', + 'native.notification.music.previous': 'Előző', + 'native.notification.music.next': 'Következő', + 'native.notification.music.play': 'Lejátszás', + 'native.notification.music.pause': 'Szünet', + 'native.notification.qqMusic.playing': 'Zene lejátszása', // 版本更新 'newVersionFound': 'Új verzió található', // 版本更新对话框标题 @@ -1407,6 +1478,59 @@ const Map huHU = { "removeEarbudsEnsureBattery": "Vegye ki mindkét fülhallgatót, és győződjön meg róla, hogy mindkettő akkumulátora 20% felett van", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Upgrade Successful', + 'otaUpgradeCompleteRepair': + 'Firmware upgrade complete!\n\nDevice needs to be re-paired to work properly. Go to pairing page now?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': + 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': + 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': + 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', + // 音乐模块 "noMusic": "Nincs zene", // 暂无音乐 "noPlayingMusic": "Nincs lejátszott zene", // 暂无播放音乐 diff --git a/lib/core/translations/language/id_id.dart b/lib/core/translations/language/id_id.dart index 845acd9bc..07e111c38 100644 --- a/lib/core/translations/language/id_id.dart +++ b/lib/core/translations/language/id_id.dart @@ -1,5 +1,4 @@ const Map idID = { - // 通用 'continue': 'Lanjutkan', 'confirm': 'Konfirmasi', @@ -19,11 +18,11 @@ const Map idID = { "unknownError": "Kesalahan tidak diketahui", "asrConnectionFailed": "Koneksi ke layanan pengenalan suara gagal. Periksa jaringan Anda lalu coba lagi nanti.", - "justNow": "Just now", - "minutesAgo": "@minutes minutes ago", - "yesterday": "Yesterday", - "daysAgo": "@days days ago", - "hoursAgo": "@hours hours ago", + "justNow": "Baru saja", + "minutesAgo": "@minutes menit yang lalu", + "yesterday": "Kemarin", + "daysAgo": "@days hari yang lalu", + "hoursAgo": "@hours jam yang lalu", // 启动页 "slogan": "Menghubungkan dunia, melampaui suara", @@ -167,6 +166,29 @@ const Map idID = { 'right': 'Kanan', 'checkConnectionStatusFailed': 'Gagal memeriksa status koneksi', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Inisialisasi Bluetooth gagal: @error', + 'needBluetoothAndLocationPermission': + 'Izin Bluetooth dan lokasi diperlukan untuk memindai perangkat', + 'permissionRequestFailedWithError': 'Permintaan izin gagal: @error', + 'needPermission': 'Izin Diperlukan', + 'blePermissionDialogContent': + 'Aplikasi ini memerlukan izin Bluetooth dan lokasi untuk memindai perangkat. Silakan aktifkan di Pengaturan.', + 'needEnableBluetooth': 'Aktifkan Bluetooth', + 'enableBluetoothDialogContent': + 'Silakan aktifkan Bluetooth untuk memindai dan menyambungkan perangkat.', + 'bleScanFailedWithError': 'Pemindaian gagal: @error', + 'bleConnectionSuccess': 'Berhasil Terhubung', + 'bleConnectedToDevice': 'Terhubung ke @device', + 'bleConnectionFailedWithError': 'Koneksi gagal: @error', + 'bleDisconnected': 'Terputus', + 'bleDeviceDisconnected': 'Perangkat terputus', + 'bleDisconnectFailedWithError': 'Gagal memutuskan: @error', + 'signalStrong': 'Kuat', + 'signalMedium': 'Sedang', + 'signalWeak': 'Lemah', + 'signalVeryWeak': 'Sangat Lemah', + // 发现页 "searchAi": "Cari fitur AI...", "exploreSlogan": "Earphone pintar, kemungkinan tak terbatas", @@ -194,22 +216,22 @@ const Map idID = { // 用量统计模块 "aiChat": "AI Chat", - "translationStats": "Translation Statistics", + "translationStats": "Statistik Terjemahan", "meetingStats": "Meeting Statistics", "today": "Today", "thisWeek": "This Week", "thisMonth": "This Month", "history": "History", "currentSessionStats": "Current Session Stats", - "translationCount": "Translation Count", + "translationCount": "Jumlah Terjemahan", "sessionDuration": "Session Duration", "characters": "Characters", - "recordingDuration": "Recording Duration", + "recordingDuration": "Durasi Rekaman", "totalApiCalls": "Total API Calls", "sessionCount": "Session Count", "totalCharacters": "Total Characters", "apiCallStats": "API Call Stats", - "translationApi": "Translation API", + "translationApi": "API Terjemahan", "asr": "ASR", "tts": "TTS", "dataVolumeStats": "Data Volume Stats", @@ -228,9 +250,8 @@ const Map idID = { "totalAudioDuration": "Total Audio Duration", "audioFileSize": "Audio File Size", "transcriptBytes": "Transcript Bytes", - "loadFailed": "Load Failed", - "statsLoadFailedTryLater": - "Statistics failed to load. Please try again later.", + "loadFailed": "Gagal Memuat", + "statsLoadFailedTryLater": "Statistik gagal dimuat. Silakan coba lagi nanti.", "cleanupComplete": "Cleanup Complete", "cleanedOldData": "Cleaned data older than 90 days", "exportFeature": "Export Feature", @@ -242,66 +263,70 @@ const Map idID = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Pembayaran berhasil', - 'paymentFailed': 'Pembayaran gagal', - 'gotIt': 'Mengerti', - 'paymentFailedTryAgain': 'Pembayaran gagal. Silakan coba lagi.', - 'selectPaymentMethod': 'Pilih metode pembayaran', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Gagal membuat pesanan WeChat', - 'alipayOrderCreateFailed': 'Gagal membuat pesanan Alipay', - 'appleOrderCreateFailed': 'Gagal membuat pesanan Apple', - 'googleOrderCreateFailed': 'Gagal membuat pesanan Google', - 'paypalOrderCreateFailed': 'Gagal membuat pesanan PayPal', - 'paymentException': 'Pembayaran bermasalah', - 'paymentLaunchFailed': 'Gagal membuka pembayaran', - 'paymentExceptionWithError': 'Pembayaran bermasalah: @error', - 'paymentProcessingCheckLater': 'Pesanan Anda sedang diproses. Silakan periksa nanti.', - 'paymentResultQueryException': 'Gagal memeriksa hasil pembayaran: @error', - 'orderConfirmedQuotaRefreshed': 'Pesanan dikonfirmasi. Kuota Anda telah diperbarui.', - 'paymentCompletedConfirming': 'Pembayaran selesai. Sedang mengonfirmasi…', - 'paymentCancelled': 'Pembayaran dibatalkan', - 'paypalOpenedCompleteInBrowser': 'PayPal telah dibuka. Silakan selesaikan pembayaran di browser.', - 'paypalOpenFailed': 'Tidak dapat membuka halaman pembayaran PayPal', - 'paymentTestTitle': 'Uji Pembayaran', - 'paymentTestOrderInfo': 'Info Pesanan Uji', - 'paymentTestProductId': 'ID Produk', - 'paymentTestProductDescription': 'Deskripsi produk', - 'paymentTestWechatDescription': 'Uji pembayaran WeChat', - 'paymentTestAlipayDescription': 'Uji pembayaran Alipay', - 'paymentTestAmount': 'Jumlah', - 'paymentTestSelectAmount': 'Pilih jumlah uji', - 'paying': 'Sedang membayar...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Status pembayaran', - 'errorInfoWithMessage': 'Kesalahan: @message', - 'retest': 'Uji ulang', - 'paymentTestInstructionsTitle': 'Petunjuk', - 'paymentTestInstructionsContent': '1. Pilih jumlah uji (disarankan: ¥0.01)\n2. Klik tombol pembayaran untuk memulai\n3. Selesaikan pembayaran di aplikasi pembayaran\n4. Kembali untuk memeriksa hasilnya', - 'startingWechatPayment': 'Membuka WeChat Pay...', - 'startingAlipayPayment': 'Membuka Alipay...', - 'wechatPaymentSuccess': 'Pembayaran WeChat Pay berhasil!', - 'wechatPaymentFailed': 'Pembayaran WeChat Pay gagal', - 'wechatPaymentLaunchFailed': 'Gagal membuka WeChat Pay', - 'cannotLaunchWechatPayment': 'Tidak dapat membuka WeChat Pay', - 'wechatPaymentException': 'WeChat Pay bermasalah', - 'wechatPaymentTestCompleted': 'Uji pembayaran WeChat Pay selesai', - 'alipayPaymentSuccess': 'Pembayaran Alipay berhasil!', - 'alipayPaymentFailed': 'Pembayaran Alipay gagal', - 'alipayPaymentLaunchFailed': 'Gagal membuka Alipay', - 'cannotLaunchAlipayPayment': 'Tidak dapat membuka Alipay', - 'alipayPaymentException': 'Alipay bermasalah', - "insufficientIntegral": "Insufficient integral", + 'paymentSuccess': 'Pembayaran berhasil', + 'paymentFailed': 'Pembayaran gagal', + 'gotIt': 'Mengerti', + 'paymentFailedTryAgain': 'Pembayaran gagal. Silakan coba lagi.', + 'selectPaymentMethod': 'Pilih metode pembayaran', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Gagal membuat pesanan WeChat', + 'alipayOrderCreateFailed': 'Gagal membuat pesanan Alipay', + 'appleOrderCreateFailed': 'Gagal membuat pesanan Apple', + 'googleOrderCreateFailed': 'Gagal membuat pesanan Google', + 'paypalOrderCreateFailed': 'Gagal membuat pesanan PayPal', + 'paymentException': 'Pembayaran bermasalah', + 'paymentLaunchFailed': 'Gagal membuka pembayaran', + 'paymentExceptionWithError': 'Pembayaran bermasalah: @error', + 'paymentProcessingCheckLater': + 'Pesanan Anda sedang diproses. Silakan periksa nanti.', + 'paymentResultQueryException': 'Gagal memeriksa hasil pembayaran: @error', + 'orderConfirmedQuotaRefreshed': + 'Pesanan dikonfirmasi. Kuota Anda telah diperbarui.', + 'paymentCompletedConfirming': 'Pembayaran selesai. Sedang mengonfirmasi…', + 'paymentCancelled': 'Pembayaran dibatalkan', + 'paypalOpenedCompleteInBrowser': + 'PayPal telah dibuka. Silakan selesaikan pembayaran di browser.', + 'paypalOpenFailed': 'Tidak dapat membuka halaman pembayaran PayPal', + 'paymentTestTitle': 'Uji Pembayaran', + 'paymentTestOrderInfo': 'Info Pesanan Uji', + 'paymentTestProductId': 'ID Produk', + 'paymentTestProductDescription': 'Deskripsi produk', + 'paymentTestWechatDescription': 'Uji pembayaran WeChat', + 'paymentTestAlipayDescription': 'Uji pembayaran Alipay', + 'paymentTestAmount': 'Jumlah', + 'paymentTestSelectAmount': 'Pilih jumlah uji', + 'paying': 'Sedang membayar...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Status pembayaran', + 'errorInfoWithMessage': 'Kesalahan: @message', + 'retest': 'Uji ulang', + 'paymentTestInstructionsTitle': 'Petunjuk', + 'paymentTestInstructionsContent': + '1. Pilih jumlah uji (disarankan: ¥0.01)\n2. Klik tombol pembayaran untuk memulai\n3. Selesaikan pembayaran di aplikasi pembayaran\n4. Kembali untuk memeriksa hasilnya', + 'startingWechatPayment': 'Membuka WeChat Pay...', + 'startingAlipayPayment': 'Membuka Alipay...', + 'wechatPaymentSuccess': 'Pembayaran WeChat Pay berhasil!', + 'wechatPaymentFailed': 'Pembayaran WeChat Pay gagal', + 'wechatPaymentLaunchFailed': 'Gagal membuka WeChat Pay', + 'cannotLaunchWechatPayment': 'Tidak dapat membuka WeChat Pay', + 'wechatPaymentException': 'WeChat Pay bermasalah', + 'wechatPaymentTestCompleted': 'Uji pembayaran WeChat Pay selesai', + 'alipayPaymentSuccess': 'Pembayaran Alipay berhasil!', + 'alipayPaymentFailed': 'Pembayaran Alipay gagal', + 'alipayPaymentLaunchFailed': 'Gagal membuka Alipay', + 'cannotLaunchAlipayPayment': 'Tidak dapat membuka Alipay', + 'alipayPaymentException': 'Alipay bermasalah', + "insufficientIntegral": "Poin tidak mencukupi", "insufficientBalanceDesc": - 'Insufficient balance, please go to the corresponding recharge page to recharge.', - "recharge": 'Go to Recharge', + 'Saldo tidak mencukupi, silakan buka halaman isi ulang terkait untuk mengisi saldo.', + "recharge": 'Isi ulang', "aiMemberExpiredDesc": - 'AI membership expired, please go to the membership recharge page to renew.', + 'Keanggotaan AI telah kedaluwarsa, silakan buka halaman perpanjangan keanggotaan untuk memperbarui.', // 商品模块 - AI商品页 'musicAndRecommendation': 'Music & Recommendation', @@ -329,18 +354,18 @@ const Map idID = { 'templatedMessagesAndScheduleReminders': 'Template messages and schedule reminders', 'aiDisclaimer': - 'Features depend on device permissions, service availability, and network conditions.', + 'Fitur bergantung pada izin perangkat, ketersediaan layanan, dan kondisi jaringan.', // 商品模块 - 翻译商品页 'realtimeTranscription': 'Real-time Transcription', 'sceneLexicon': 'Scenario Glossary', 'subtitleDisplay': 'Subtitles', 'transHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'Interpretasi simultan waktu nyata dan terjemahan teks dengan suara latensi rendah.', 'transHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', + 'translateZhEn': 'Terjemahan Mandarin-Inggris', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', + 'multiLangTextTranslation': 'Terjemahan teks multibahasa', 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', @@ -348,18 +373,18 @@ const Map idID = { 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', 'colorHighContrast': 'High color contrast', 'transDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'Kinerja terjemahan bergantung pada mikrofon, latensi jaringan, dan kebisingan sekitar.', // 商品模块 - 会议商品页 - 'meetingRecording': 'Meeting Recording', + 'meetingRecording': 'Rekaman Rapat', 'transcriptionAndSummary': 'Transcription & Summary', 'keywordSearch': 'Keyword Search', 'collaborationSharing': 'Collaboration & Sharing', 'meetingHeaderDesc1': - 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', + 'Perekaman audio, transkripsi, pencarian kata kunci, dan ringkasan otomatis untuk meningkatkan efisiensi rapat.', 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', - 'meetingAutoRecording': 'Auto recording and segmentation', + 'meetingAutoRecording': 'Perekaman otomatis dan segmentasi', 'meetingSpeakerTagging': 'Speaker labeling', 'meetingLongAudioTranscription': 'Long audio transcription', 'meetingKeyPointSummary': 'Key point extraction', @@ -368,7 +393,7 @@ const Map idID = { 'meetingExportSummary': 'Export minutes', 'meetingMultiPlatformShare': 'Share across platforms', 'meetingDisclaimer': - 'Use in quiet environments; performance depends on microphone and network.', + 'Gunakan di lingkungan yang tenang; kinerja bergantung pada mikrofon dan jaringan.', // 商品模块 - VIP会员页 'benefitsOverview': 'Benefits overview', @@ -382,7 +407,7 @@ const Map idID = { 'longTermDiscountPlan': 'Long-term discount plan', 'generalPrivileges': 'General privileges', 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', + 'crossDeviceSync': 'Sinkronisasi lintas perangkat', 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', @@ -393,18 +418,18 @@ const Map idID = { 'meet_001_name': 'Meeting Basic 100', 'meet_002_name': 'Meeting Basic 500', 'meet_003_name': 'Meeting Basic 1000', - 'trans_001_name': 'Translation Basic 100', - 'trans_002_name': 'Translation Basic 500', - 'trans_003_name': 'Translation Basic 1000', + 'trans_001_name': 'Terjemahan Dasar 100', + 'trans_002_name': 'Terjemahan Dasar 500', + 'trans_003_name': 'Terjemahan Dasar 1000', 'ai_001_desc': 'Includes 100 uses. Access core AI features.', 'ai_002_desc': 'Includes 500 uses. Access core AI features.', 'ai_003_desc': 'Includes 1000 uses. Access core AI features.', - 'meet_001_desc': 'Includes 100 meeting recordings/transcriptions.', - 'meet_002_desc': 'Includes 500 meeting recordings/transcriptions.', - 'meet_003_desc': 'Includes 1000 meeting recordings/transcriptions.', - 'trans_001_desc': 'Includes 100 translations (voice/text).', - 'trans_002_desc': 'Includes 500 translations (voice/text).', - 'trans_003_desc': 'Includes 1000 translations (voice/text).', + 'meet_001_desc': 'Termasuk 100 rekaman/transkripsi rapat.', + 'meet_002_desc': 'Termasuk 500 rekaman/transkripsi rapat.', + 'meet_003_desc': 'Termasuk 1000 rekaman/transkripsi rapat.', + 'trans_001_desc': 'Termasuk 100 terjemahan (suara/teks).', + 'trans_002_desc': 'Termasuk 500 terjemahan (suara/teks).', + 'trans_003_desc': 'Termasuk 1000 terjemahan (suara/teks).', // 商品模块 - 页脚 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', @@ -460,52 +485,62 @@ const Map idID = { 'recordingDetails': 'Detail Rekaman', 'aiSummary': 'Ringkasan AI', 'meetingTranscript': 'Transkrip Rapat', - 'files': 'Files', - 'mine': 'Mine', - 'connect': 'Connect', - 'allFiles': 'All Files', - 'searchInAllFiles': 'Search in all files', - 'from': 'From', - 'sortBy': 'Sort by', - 'creationTime': 'Creation Time', - 'bluetoothConnection': 'Bluetooth Connection', - 'meetingReconnect': 'Reconnect', - 'searching': 'Searching...', - 'searchFailed': 'Search failed, please check if Bluetooth is enabled', - 'aiPenNotFound': 'AI PEN device not found', - 'connectedToAiPen': 'Connected to AI PEN device', - 'checkingNewFiles': 'Checking for new files to import', + 'files': 'Berkas', + 'mine': 'Milik Saya', + 'connect': 'Hubungkan', + 'allFiles': 'Semua Berkas', + 'searchInAllFiles': 'Cari di semua berkas', + 'from': 'Dari', + 'sortBy': 'Urutkan berdasarkan', + 'creationTime': 'Waktu dibuat', + 'bluetoothConnection': 'Koneksi Bluetooth', + 'meetingReconnect': 'Sambungkan kembali', + 'searching': 'Mencari...', + 'searchFailed': 'Pencarian gagal, harap periksa apakah Bluetooth diaktifkan', + 'aiPenNotFound': 'Perangkat AI PEN tidak ditemukan', + 'connectedToAiPen': 'Terhubung ke perangkat AI PEN', + 'checkingNewFiles': 'Memeriksa file baru untuk diimpor', 'startingWifi': 'Starting Wi-Fi...', 'newFilesDetected': 'New files detected, preparing to import', 'noNewFiles': 'No new files to import', - 'connectingWifi': 'Connecting to Wi-Fi...', - 'wifiConnected': 'Wi-Fi connected successfully', - 'downloadingFiles': 'Downloading files...', - 'downloadingFileProgress': 'Total {total} files, downloading file {current}', - 'downloadComplete': 'Download complete', + 'connectingWifi': 'Menyambungkan ke Wi‑Fi...', + 'wifiConnected': 'Wi‑Fi berhasil terhubung', + 'downloadingFiles': 'Mengunduh file...', + 'downloadingFileProgress': 'Total {total} file, mengunduh file {current}', + 'downloadComplete': 'Unduhan selesai', 'downloadCompleteInfo': - 'Download complete, {count} files in total, returning automatically in 2 seconds', + 'Unduhan selesai, total {count} file, kembali otomatis dalam 2 detik', // Meeting模块 - 录音功能 - 'startRecording': 'Start Recording', - 'liveRecording': 'Live Recording', - 'audioVideoRecording': 'Audio/Video Recording', - 'callRecording': 'Call Recording', + 'startRecording': 'Mulai Merekam', + 'liveRecording': 'Rekaman Langsung', + 'audioVideoRecording': 'Rekaman Audio/Video', + 'callRecording': 'Rekaman Panggilan', 'importAudio': 'Import Audio', 'meetingRecordExitTitle': 'Keluar dari perekaman', // 退出录音 - 'meetingRecordExitMessage': 'Pilih apa yang akan dilakukan sebelum keluar', // 请选择离开后的操作 + 'meetingRecordExitMessage': + 'Pilih apa yang akan dilakukan sebelum keluar', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Akhiri dan simpan', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Akhiri tanpa menyimpan', // 结束录音不保存 - 'meetingRecordContinueInBackground': 'Lanjutkan merekam di latar belakang', // 后台继续录音 - 'meetingRecordStopTimeout': 'Waktu untuk menghentikan perekaman habis. Silakan coba lagi.', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'Gagal menghentikan perekaman. Silakan coba lagi.', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'Gagal menyimpan rekaman. Silakan coba lagi.', // 保存录音失败,请重试 - 'meetingRecordRecordingNotificationTitle': 'Perekaman sedang berlangsung', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Merekam di latar belakang. Ketuk untuk kembali ke aplikasi.', // 正在后台录音,点击返回应用 + 'meetingRecordContinueInBackground': + 'Lanjutkan merekam di latar belakang', // 后台继续录音 + 'meetingRecordStopTimeout': + 'Waktu untuk menghentikan perekaman habis. Silakan coba lagi.', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'Gagal menghentikan perekaman. Silakan coba lagi.', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'Gagal menyimpan rekaman. Silakan coba lagi.', // 保存录音失败,请重试 + 'meetingRecordRecordingNotificationTitle': + 'Perekaman sedang berlangsung', // 录音进行中 + 'meetingRecordRecordingNotificationBody': + 'Merekam di latar belakang. Ketuk untuk kembali ke aplikasi.', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Tampilkan di atas aplikasi lain', // 悬浮窗权限 - 'overlayPermissionTranslationDesc': 'Untuk menampilkan hasil terjemahan saat panggilan atau terjemahan audio/video, kami memerlukan izin overlay. Ini memungkinkan Anda melihat terjemahan real-time saat menggunakan aplikasi lain.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 - 'overlayPermissionRecordingDesc': 'Untuk menampilkan bilah mengambang perekaman (timer/jeda/lanjut) saat merekam, kami memerlukan izin overlay.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 - 'overlayPermissionOpenSettingsFailed': 'Tidak dapat membuka pengaturan sistem secara otomatis. Silakan buka Pengaturan dan aktifkan izin overlay secara manual.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 + 'overlayPermissionTranslationDesc': + 'Untuk menampilkan hasil terjemahan saat panggilan atau terjemahan audio/video, kami memerlukan izin overlay. Ini memungkinkan Anda melihat terjemahan real-time saat menggunakan aplikasi lain.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 + 'overlayPermissionRecordingDesc': + 'Untuk menampilkan bilah mengambang perekaman (timer/jeda/lanjut) saat merekam, kami memerlukan izin overlay.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 + 'overlayPermissionOpenSettingsFailed': + 'Tidak dapat membuka pengaturan sistem secara otomatis. Silakan buka Pengaturan dan aktifkan izin overlay secara manual.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 'transcribing': 'Transcribing...', 'summarizing': 'Summarizing...', 'analyzing': 'Analyzing...', @@ -530,46 +565,48 @@ const Map idID = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Buat', - 'templateDetails': 'Detail Template', - 'tag': 'Tag', - 'description': 'Deskripsi', - 'template': 'Template', - 'deleteTemplate': 'Hapus Template', - 'deleteTemplateConfirm': 'Apakah Anda yakin ingin menghapus template ini?', - 'editTemplate': 'Edit Template', - 'createTemplate': 'Buat Template', - 'name': 'Nama', - 'templateContentHint': 'Silakan masukkan konten template! Tips: Klik tombol AI di atas untuk membuat konten template secara cepat berdasarkan nama dan deskripsi yang Anda masukkan', - 'inputNameHint': 'Silakan masukkan nama', - 'inputDescHint': 'Silakan masukkan deskripsi', - 'custom': 'Kustom', - 'pleaseEnter': 'Silakan masukkan', - 'viewAll': 'View All', - 'recordingLanguage': 'Recording Language', + 'create': 'Buat', + 'templateDetails': 'Detail Template', + 'tag': 'Tag', + 'description': 'Deskripsi', + 'template': 'Template', + 'deleteTemplate': 'Hapus Template', + 'deleteTemplateConfirm': 'Apakah Anda yakin ingin menghapus template ini?', + 'editTemplate': 'Edit Template', + 'createTemplate': 'Buat Template', + 'name': 'Nama', + 'templateContentHint': + 'Silakan masukkan konten template! Tips: Klik tombol AI di atas untuk membuat konten template secara cepat berdasarkan nama dan deskripsi yang Anda masukkan', + 'inputNameHint': 'Silakan masukkan nama', + 'inputDescHint': 'Silakan masukkan deskripsi', + 'custom': 'Kustom', + 'pleaseEnter': 'Silakan masukkan', + 'viewAll': 'Lihat semua', + 'recordingLanguage': 'Bahasa Rekaman', 'chineseSimplified': 'Chinese Mandarin (Simplified)', - 'meetingGenerateNow': 'Generate Now', - 'keyEventsAnalyzed': 'Analyzed {count} key events.', + 'meetingGenerateNow': 'Buat sekarang', + 'keyEventsAnalyzed': 'Menganalisis {count} peristiwa penting.', 'aiAnalysisDesc': - 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', + 'Analisis AI mengidentifikasi peristiwa penting dalam rekaman, sehingga Anda dapat memilih peristiwa penting untuk pembuatan AI.', // Meeting模块 - 文件操作 'importing': 'Importing...', 'batchImporting': 'Batch importing...', - 'importingLocalRecordings': 'Importing local recordings...', - 'importFailed': 'Import file failed: {filePath}, error: {error}', - 'importSuccess': 'Successfully imported {count} local recordings', - 'importError': 'Import failed: {error}', - 'pleaseSelectAudioFile': 'Please select audio file', + 'importingLocalRecordings': 'Mengimpor rekaman lokal...', + 'importFailed': 'Gagal mengimpor file: {filePath}, kesalahan: {error}', + 'importSuccess': 'Berhasil mengimpor {count} rekaman lokal', + 'importError': 'Impor gagal: {error}', + 'pleaseSelectAudioFile': 'Silakan pilih file audio', 'shareAudio': 'Share Meeting Audio', 'shareComplete': 'Share complete!', - 'shareFailed': 'Share failed: {error}', - 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', + 'shareFailed': 'Berbagi gagal: {error}', + 'fileProcessingFailed': + 'Pemrosesan file gagal: {filePath}, kesalahan: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Simpan Peta Pikiran', + 'saveMindMap': 'Simpan Peta Pikiran', 'shareMindMap': 'Share Mind Map', - 'shareSuccess': 'Share Success', + 'shareSuccess': 'Berbagi Berhasil', // Meeting模块 - AI问答 'askAI': 'Ask AI ...', @@ -589,7 +626,7 @@ const Map idID = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Ekspor', + 'export': 'Ekspor', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Terapkan ke semua paragraf pembicara ini', @@ -605,26 +642,27 @@ const Map idID = { // Meeting模块 - 云端同步 'syncToCloud': 'Sync to Cloud', 'syncToCloudTip': - 'Automatically sync your recordings to the cloud, you can play, manage and share recordings through any VOITRANS APP or VOITRANS Web (web.voitrans.com).', + 'Sinkronkan rekaman Anda ke cloud secara otomatis; Anda dapat memutar, mengelola, dan membagikan rekaman melalui VOITRANS APP atau VOITRANS Web (web.voitrans.com).', 'syncToVoitransApp': 'Sync VOITRANS APP', - 'transcriptionRecord': 'Transcription Record', + 'transcriptionRecord': 'Catatan Transkripsi', // Meeting模块 - 我的页面 - 'transcriptionRecords': 'Transcription Records', + 'transcriptionRecords': 'Catatan Transkripsi', 'templateCommunity': 'Template Community', 'comingSoon': 'Coming Soon', 'integration': 'Integration', 'voitransPrivateCloud': 'VOITRANS PRIVATE CLOUD', - 'enabled': 'Enabled', - 'disabled': 'Disabled', - 'myVoitransDevice': 'My VOITRANS Device', + 'enabled': 'Diaktifkan', + 'disabled': 'Dinonaktifkan', + 'myVoitransDevice': 'Perangkat VOITRANS Saya', 'helpAndFeedback': 'Help & Feedback', 'aboutVoitrans': 'About VOITRANS', 'meetingDays': 'Days', 'meetingHours': 'Hours', 'voitransAiMember': 'Voitrans AI Member', 'unlockStarterMember': 'Unlock Starter Member', - 'bindDeviceToActivate': 'Bind Voitrans device to activate Starter membership', + 'bindDeviceToActivate': + 'Ikat perangkat Voitrans untuk mengaktifkan keanggotaan Starter', 'unlockNow': 'Unlock Now', // Meeting模块 - 会员与升级 @@ -648,7 +686,7 @@ const Map idID = { 'customTemplateDesc': 'You can customize summary prompts according to your needs and use them to generate the required summaries.', 'askAiDesc': - 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', + 'Ekstrak informasi lebih dalam dari rekaman secara cerdas; buat tabel data, kesimpulan diskusi utama, daftar tugas, email laporan, dan konten berformat lainnya dengan sekali klik.', 'visualMindMapDesc': 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', 'templateCommunityDesc': @@ -656,13 +694,13 @@ const Map idID = { 'speakerIdentificationDesc': 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', 'privateCloudSyncDesc': - 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', + 'Rekaman dan transkripsi Anda akan disimpan dengan aman di server cloud khusus, dengan enkripsi penuh saat unggah dan unduh untuk memastikan privasi dan keamanan.', 'aiVoiceEnhancementDesc': 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', 'audioImportDesc': 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', 'multipleExportFormatsDesc': - 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', + 'Ekspor rekaman audio, teks transkripsi, dan ringkasan Anda dalam berbagai format (TXT, PDF, JPEG) sesuai kebutuhan.', 'upgradeMembership': 'Upgrade Your Membership', 'yearlySubscription': 'Yearly Subscription', 'monthlySubscription': 'Monthly Subscription', @@ -692,25 +730,25 @@ const Map idID = { 'purchase': 'Purchase', // Meeting模块 - 录音语言 - 'recordLanguage': 'Recording Language', + 'recordLanguage': 'Bahasa Rekaman', 'cantonese': 'Cantonese', 'sichuan': 'Sichuan Dialect', 'shanghai': 'Shanghai Dialect', // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Analisis gagal, silakan coba lagi nanti', - 'transcriptionFailed': 'Transkripsi gagal, silakan coba lagi nanti', - 'summaryFailed': 'Ringkasan gagal, silakan coba lagi nanti', - 'summaryFailedShort': 'Ringkasan gagal', - 'transcriptionFailedShort': 'Transkripsi gagal', + 'analysisFailed': 'Analisis gagal, silakan coba lagi nanti', + 'transcriptionFailed': 'Transkripsi gagal, silakan coba lagi nanti', + 'summaryFailed': 'Ringkasan gagal, silakan coba lagi nanti', + 'summaryFailedShort': 'Ringkasan gagal', + 'transcriptionFailedShort': 'Transkripsi gagal', // Meeting模块 - 播放器 - 'playerNotReady': 'Pemutar audio belum siap, silakan tunggu', - 'playFailed': 'Gagal memutar', - 'audioFileNotFound': 'File audio tidak ditemukan', - 'fetchingAudio': 'Mengambil audio dari cloud...', - 'playerLoadFailed': 'Pemutar audio gagal dimuat', + 'playerNotReady': 'Pemutar audio belum siap, silakan tunggu', + 'playFailed': 'Gagal memutar', + 'audioFileNotFound': 'File audio tidak ditemukan', + 'fetchingAudio': 'Mengambil audio dari cloud...', + 'playerLoadFailed': 'Pemutar audio gagal dimuat', // 设置页 "systemSettings": "Pengaturan Sistem", @@ -719,10 +757,10 @@ const Map idID = { "translationRecharge": "Pembayaran Terjemahan", "meetingAssistantRecharge": "Pembayaran Asisten Rapat", "cloudSync": "Pembayaran Sinkronisasi awan", - "memberService": "Member Service", - "bindRewardTitle": "Rewards", + "memberService": "Layanan Anggota", + "bindRewardTitle": "Hadiah", "bindRewardSimpleDesc": - "First bind device reward has been issued. Tap OK to close.", + "Hadiah pengikatan perangkat pertama telah diberikan. Ketuk OK untuk menutup.", "joinDevice": "Perangkat terhubung:", "accountId": "ID Akun:", "systemSetting": "Pengaturan Sistem", @@ -771,19 +809,20 @@ const Map idID = { "loading": "Memuat...", // 设备管理模块 - "deviceTypeUnknown": "Unknown Device", - "deviceTypeClassicBluetoothHeadset": "Classic Bluetooth Headset", - "deviceTypeBleBluetoothHeadset": "BLE Bluetooth Headset", - "deviceTypeSmartVoiceRecorder": "Smart Voice Recorder", - "deviceTypeSmartEye": "Smart Glasses", + "deviceTypeUnknown": "Perangkat Tidak Dikenal", + "deviceTypeClassicBluetoothHeadset": "Headset Bluetooth Klasik", + "deviceTypeBleBluetoothHeadset": "Headset Bluetooth BLE", + "deviceTypeSmartVoiceRecorder": "Perekam Suara Cerdas", + "deviceTypeSmartEye": "Kacamata Pintar", "unbind": "Putuskan Ikatan", - "noDevicesBound": "No devices bound yet", - "pleaseBindDeviceFirst": "Please bind a device first to manage", + "noDevicesBound": "Belum ada perangkat yang terikat", + "pleaseBindDeviceFirst": + "Silakan ikat perangkat terlebih dahulu untuk dikelola", "noMacAddress": "No MAC Address", "licenseCode": "License Code", "confirmUnbind": "Confirm Unbind", "confirmUnbindMessage": - "Are you sure you want to unbind device \"{deviceName}\"?", + "Apakah Anda yakin ingin melepas ikatan perangkat \"{deviceName}\"?", "confirmUnbindAction": "Confirm Unbind", // Agent模块 - 主界面 @@ -815,9 +854,10 @@ const Map idID = { "loadMoreMessages": "Muat lebih banyak pesan...", "loadFailedClickRetry": "Gagal memuat, klik untuk mencoba lagi", "swipeUpForMore": "Geser ke atas untuk lebih banyak", - "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! + "callingTool": "Saya sedang membantu Anda, harap tunggu!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Saat diaktifkan: AI tidak akan terganggu oleh suara Anda saat berbicara dan hanya dapat menangani satu putaran percakapan. Untuk memulai putaran baru, cukup ucapkan kata bangun.', + 'voice_interrupt_tip': + 'Saat diaktifkan: AI tidak akan terganggu oleh suara Anda saat berbicara dan hanya dapat menangani satu putaran percakapan. Untuk memulai putaran baru, cukup ucapkan kata bangun.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -826,7 +866,7 @@ const Map idID = { "presetNews": "Today's news", // 今日新闻 "presetFood": "Nearby food", // 美食 "playSomeMusic": "Play some popular music", // 播放一些流行音乐 - "navigationTo": "Please help me navigate to", // 导航到 + "navigationTo": "Tolong bantu saya menavigasi ke", // 导航到 "todayWeather": "How's the weather today?", // 今日天气 "todayNews": "What's the news today?", // 今日新闻 "nearbyFood": "What delicious food is nearby?", // 美食 @@ -874,6 +914,13 @@ const Map idID = { 'Kami ingin tahu alasan Anda melaporkan, Anda dapat menjelaskan masalah yang Anda hadapi.', 'generatedByAi': 'Dihasilkan oleh AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Berikut adalah beberapa musik yang direkomendasikan:', 'playList': 'Daftar Putar', @@ -894,6 +941,30 @@ const Map idID = { "bicycling": "Bersepeda", "tsransit": "Transportasi Umum", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Pilih Aplikasi Navigasi', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigasi dengan Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigasi dengan Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigasi dengan Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigasi dengan Apple Maps', + 'builtInNavigation': 'Navigasi Bawaan', + 'useBuiltInNavigation': 'Navigasi dengan peta bawaan', + 'navigationStartFailed': 'Gagal memulai navigasi', + 'cannotPlayMusicListRetryLater': + 'Tidak dapat memutar daftar musik, silakan coba lagi nanti', + 'cannotPlaySong': 'Tidak dapat memutar lagu', + 'openMapError': 'Kesalahan saat membuka peta', + 'pleaseInstallAmapApp': 'Silakan instal aplikasi Amap terlebih dahulu', + 'pleaseInstallBaiduMapApp': + 'Silakan instal aplikasi Baidu Maps terlebih dahulu', + 'appleMapStartFailed': 'Apple Maps gagal dimulai', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Kesalahan saat membuka Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Memeriksa kondisi cuaca:', 'highest': 'Tertinggi', @@ -947,8 +1018,8 @@ const Map idID = { "strongWind": "Angin kencang", // 翻译模块 - 中间层 - "pictureTranslation": "Picture Translation", - "textTranslation": "Text Translation", + "pictureTranslation": "Terjemahan Gambar", + "textTranslation": "Terjemahan Teks", // 翻译模块 - 主页 "translationHistory": "Riwayat Terjemahan", @@ -958,22 +1029,33 @@ const Map idID = { "phoneUser": "Pengguna Telepon", "selectSourceLanguage": "Pilih bahasa sumber", "selectTargetLanguage": "Pilih bahasa target", - "me": "Me", - "counterPart": "Counterpart", + "me": "Saya", + "counterPart": "Lawan Bicara", "bluetoothCallStateError": - "Please make sure the Bluetooth headset is connected to the phone and in a call state", - "autoDetect": "Auto Detect", // 自动检测 + "Pastikan headset Bluetooth terhubung ke ponsel dan sedang dalam status panggilan", + "autoDetect": "Deteksi Otomatis", // 自动检测 // 翻译模块 - 文本翻译 - "languageDetectionFailed": "Language detection failed", - "translationFailed": "Translation failed", - "pleaseInputText": "Please input text", - "textTooLong": "Text too long, max 5000 characters", + "languageDetectionFailed": "Deteksi bahasa gagal", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Nonaktifkan Jendela Mengambang', + 'enableFloatingWindow': 'Aktifkan Jendela Mengambang', + 'permissionTip': 'Tips Izin', + 'micPermissionRequiredForRecording': 'Izin mikrofon diperlukan untuk merekam', + 'deleteTranslationRecordError': + 'Kesalahan menghapus catatan terjemahan: @error', + "translationFailed": "Terjemahan gagal", + "translating": "Sedang menerjemahkan", + "translate": "Terjemahkan", + "pleaseInputText": "Silakan masukkan teks", + "inputTextToTranslate": "Silakan masukkan teks untuk diterjemahkan", + "textTooLong": "Teks terlalu panjang, maksimal 5000 karakter", // 翻译模块 - 历史记录 "noTranslationHistory": "Belum ada riwayat", - "historyRecords": "History Records", - "clearResults": "Clear Results", + "historyRecords": "Catatan Riwayat", + "clearResults": "Hapus Hasil", "clearHistory": "Hapus Riwayat", "clearHistoryConfirm": "Apakah Anda yakin ingin menghapus semua riwayat terjemahan? Tindakan ini tidak dapat dibatalkan.", @@ -983,54 +1065,54 @@ const Map idID = { "Apakah Anda yakin ingin menghapus semua rekaman terjemahan untuk sesi ini? Tindakan ini tidak dapat dibatalkan.", // 翻译模块 - 图片翻译 - "selectImageSource": "Select Image Source", - "imagePreview": "Image Preview", - "translationResult": "Translation Result", - "recognitionResult": "Recognition Result", - "translatedImagePreview": "Translated Image Preview", - "translatedImageLoadFailed": "Failed to load translated image", - "pleaseSelectImage": "Please select an image", - "imageLoadFailed": "Image load failed", - "imageQuality": "Image Quality", - "maxSize": "Max Size", - "close": "Close", - "setImageQuality": "Set Image Quality", - "currentQuality": "Current quality: @value%", - "setMaxSize": "Set Max Size", - "currentMaxSize": "Current: @pxpx", - "waitingForAction": "Waiting for action", - "pleaseSelectImageToStart": "Please select an image to start", - "chooseImage": "Choose Image", - "openingCamera": "Opening camera...", - "openingPhotoAlbum": "Opening photo album...", - "cancelled": "Cancelled", - "userCancelledSelection": "User cancelled selection", - "translatingImage": "Translating Image", - "callingImageTranslateService": "Calling image translation service...", - "savingRecord": "Saving Record", - "savingTranslationResult": "Saving translation result...", - "translationCompleted": "Translation Completed", - "allStepsCompleted": "All steps completed", - "processingFailed": "Processing Failed", + "selectImageSource": "Pilih Sumber Gambar", + "imagePreview": "Pratinjau Gambar", + "translationResult": "Hasil Terjemahan", + "recognitionResult": "Hasil Pengenalan", + "translatedImagePreview": "Pratinjau Gambar Terjemahan", + "translatedImageLoadFailed": "Gagal memuat gambar terjemahan", + "pleaseSelectImage": "Silakan pilih gambar", + "imageLoadFailed": "Gagal memuat gambar", + "imageQuality": "Kualitas Gambar", + "maxSize": "Ukuran Maks", + "close": "Tutup", + "setImageQuality": "Atur Kualitas Gambar", + "currentQuality": "Kualitas saat ini: @value%", + "setMaxSize": "Atur Ukuran Maks", + "currentMaxSize": "Saat ini: @pxpx", + "waitingForAction": "Menunggu tindakan", + "pleaseSelectImageToStart": "Silakan pilih gambar untuk memulai", + "chooseImage": "Pilih Gambar", + "openingCamera": "Membuka kamera...", + "openingPhotoAlbum": "Membuka album foto...", + "cancelled": "Dibatalkan", + "userCancelledSelection": "Pengguna membatalkan pilihan", + "translatingImage": "Sedang menerjemahkan gambar", + "callingImageTranslateService": "Memanggil layanan terjemahan gambar...", + "savingRecord": "Menyimpan catatan", + "savingTranslationResult": "Menyimpan hasil terjemahan...", + "translationCompleted": "Terjemahan Selesai", + "allStepsCompleted": "Semua langkah selesai", + "processingFailed": "Pemrosesan Gagal", "imageProcessingOrTranslationFailed": - "Image processing or translation failed. Please retry.\nError: {error}", + "Pemrosesan gambar atau terjemahan gagal. Silakan coba lagi.\nKesalahan: {error}", "imageTooLarge": "Image size exceeds 4MB limit", "imageTooLargeHint": "Image size exceeds 4MB. Reduce quality or dimensions and retry", - "emptyTranslationResult": "Image translation API returned empty result", + "emptyTranslationResult": "API terjemahan gambar mengembalikan hasil kosong", "imageTranslationFailedTryLater": - "Image translation failed. Network issue or rate limit. Please try later", + "Terjemahan gambar gagal. Masalah jaringan atau batas laju. Silakan coba lagi nanti", "imageTranslationApiException": - "Image translation API exception. Check network and retry", - "permissionRequired": "Permission Required", - "cameraPermissionRequired": "Camera permission required to take photos", + "Pengecualian API terjemahan gambar. Periksa jaringan dan coba lagi", + "permissionRequired": "Izin Diperlukan", + "cameraPermissionRequired": "Izin kamera diperlukan untuk mengambil foto", "photoAlbumPermissionRequired": - "Photo album permission required to pick images", - "translationDetails": "Translation Details", + "Izin album foto diperlukan untuk memilih gambar", + "translationDetails": "Detail Terjemahan", "originalImage": "Original Image", "sourceLanguage": "Source Language", "targetLanguage": "Target Language", - "translationTime": "Translation Time", + "translationTime": "Waktu Terjemahan", "shareInDevelopment": "Sharing feature under development", // 翻译模块 - 录音文件 @@ -1127,16 +1209,16 @@ const Map idID = { // 权限模块 'meetingStoragePermission': 'Storage', 'meetingStoragePermissionExplanation': - 'We need access to storage permissions so you can select and upload audio files.', + 'Kami memerlukan izin penyimpanan agar Anda dapat memilih dan mengunggah file audio.', 'meetingStoragePermissionPermanentDenial': - 'Detected that you have permanently denied storage permission. To continue using this feature, please go to app settings to manually enable storage permission.', + 'Terdeteksi Anda telah menolak izin penyimpanan secara permanen. Untuk terus menggunakan fitur ini, buka pengaturan aplikasi untuk mengaktifkan izin penyimpanan secara manual.', 'getPermissionStatusFailed': 'Gagal mendapatkan status izin', 'communicationPermissions': 'Izin Komunikasi', - 'bluetoothPermissions': 'Bluetooth Permissions', - 'notificationPermissions': 'Notification Permissions', - 'storagePermissions': 'Storage Permissions', - 'microphonePermissions': 'Microphone Permissions', - 'alarmPermissions': 'Alarm Permissions', + 'bluetoothPermissions': 'Izin Bluetooth', + 'notificationPermissions': 'Izin Notifikasi', + 'storagePermissions': 'Izin Penyimpanan', + 'microphonePermissions': 'Izin Mikrofon', + 'alarmPermissions': 'Izin Alarm', 'calendarPermissions': 'Izin Kalender', 'locationPermissions': 'Izin Lokasi', 'phone': 'Telepon', @@ -1168,86 +1250,90 @@ const Map idID = { 'phonePermissionDetailDesc': 'Fungsi panggilan memerlukan izin telepon', 'smsPermissionDetailDesc': 'Fungsi mengirim SMS memerlukan izin SMS', 'alarmPermissionDetailDesc': - 'This permission is required to set exact alarms and ensure reminders trigger on time', + 'Izin ini diperlukan untuk mengatur alarm tepat waktu dan memastikan pengingat berbunyi tepat waktu', 'calendarWritePermissionDetailDesc': 'Membuat acara kalender memerlukan izin menulis kalender', 'calendarFullAccessPermissionDetailDesc': 'Mengelola acara kalender memerlukan izin penuh kalender', 'locationPermissionDetailDesc': 'Mendapatkan informasi lokasi memerlukan izin lokasi', - 'contactsPermissionDesc': 'Used for accessing contact information', + 'contactsPermissionDesc': 'Digunakan untuk mengakses informasi kontak', 'contactsPermissionDetailDesc': - 'Phone call and SMS functionality requires contacts permission to select contacts', + 'Fungsi panggilan telepon dan SMS memerlukan izin kontak untuk memilih kontak', 'bluetoothPermissionDesc': - 'Used for connecting and managing Bluetooth devices', + 'Digunakan untuk menyambungkan dan mengelola perangkat Bluetooth', 'bluetoothPermissionDetailDesc': - 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', - 'bluetoothScanPermissionDesc': 'Used for scanning nearby Bluetooth devices', + 'Menyambungkan ke headphone Bluetooth dan perangkat lain memerlukan izin Bluetooth', + 'bluetoothScanPermissionDesc': + 'Digunakan untuk memindai perangkat Bluetooth di sekitar', 'bluetoothScanPermissionDetailDesc': - 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', - 'bluetoothConnectPermissionDesc': 'Used for connecting to Bluetooth devices', + 'Memindai perangkat Bluetooth di sekitar memerlukan izin pemindaian Bluetooth', + 'bluetoothConnectPermissionDesc': + 'Digunakan untuk menyambungkan ke perangkat Bluetooth', 'bluetoothConnectPermissionDetailDesc': - 'Connecting to Bluetooth devices requires Bluetooth connect permission', + 'Menyambungkan ke perangkat Bluetooth memerlukan izin koneksi Bluetooth', 'notificationPermissionDesc': 'Used for sending notification messages', 'notificationPermissionDetailDesc': - 'App needs notification permission to send you important alerts and messages', + 'Aplikasi memerlukan izin notifikasi untuk mengirim peringatan dan pesan penting kepada Anda', 'appNeedsPermissionForFullFunction': 'Aplikasi memerlukan izin ini untuk fungsionalitas penuh', 'permanentDenialText': 'Anda telah menolak izin {permission} secara permanen, silakan buka pengaturan aplikasi untuk mengaktifkannya', 'goToSettings': 'Buka Pengaturan', 'bluetoothScan': 'Bluetooth Scan', - 'bluetoothConnect': 'Bluetooth Connect', + 'bluetoothConnect': 'Koneksi Bluetooth', 'bluetoothScanExplanation': - 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', + 'Aplikasi memerlukan izin pemindaian Bluetooth untuk memindai perangkat Bluetooth di sekitar.', 'bluetoothConnectExplanation': - 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', + 'Aplikasi memerlukan izin koneksi Bluetooth untuk menyambungkan ke perangkat Bluetooth.', 'locationForBluetoothExplanation': - 'The app needs location permission to scan Bluetooth devices.', + 'Aplikasi memerlukan izin lokasi untuk memindai perangkat Bluetooth.', 'bluetoothScanPermanentDenial': - 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', + 'Izin pemindaian Bluetooth telah ditolak secara permanen, silakan buka pengaturan untuk mengaktifkannya secara manual.', 'bluetoothConnectPermanentDenial': - 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', + 'Izin koneksi Bluetooth telah ditolak secara permanen, silakan buka pengaturan untuk mengaktifkannya secara manual.', 'locationPermanentDenial': - 'Location permission has been permanently denied, please go to settings to enable it manually.', + 'Izin lokasi telah ditolak secara permanen, silakan buka pengaturan untuk mengaktifkannya secara manual.', 'notificationPermission': 'Notification', 'locationPermission': 'Location', 'notificationPermissionExplanation': - 'Notification permission is required to display music playback status.', + 'Izin notifikasi diperlukan untuk menampilkan status pemutaran musik.', 'locationPermissionExplanation': - 'Location permission is required to get current location.', + 'Izin lokasi diperlukan untuk mendapatkan lokasi saat ini.', 'notificationPermissionPermanentDenial': - 'You have permanently denied notification permission, please go to settings to enable it.', + 'Anda telah menolak izin notifikasi secara permanen, silakan buka pengaturan untuk mengaktifkannya.', 'locationPermissionPermanentDenial': - 'You have permanently denied location permission, please go to settings to enable it.', + 'Anda telah menolak izin lokasi secara permanen, silakan buka pengaturan untuk mengaktifkannya.', 'storagePermission': 'Storage', 'microphonePermissionExplanation': - 'We need microphone permission to record audio content.', + 'Kami memerlukan izin mikrofon untuk merekam konten audio.', 'storagePermissionExplanation': - 'We need storage permission so you can select and upload audio files.', + 'Kami memerlukan izin penyimpanan agar Anda dapat memilih dan mengunggah file audio.', 'microphonePermissionPermanentDenial': - 'Microphone permission has been permanently denied. To continue using this feature, please go to app settings to manually enable microphone permission.', + 'Izin mikrofon telah ditolak secara permanen. Untuk terus menggunakan fitur ini, buka pengaturan aplikasi untuk mengaktifkan izin mikrofon secara manual.', 'storagePermissionPermanentDenial': - 'Storage permission has been permanently denied. To continue using this feature, please go to app settings to manually enable storage permission.', - 'permissionUtilNeed': 'Need ', - 'permissionUtilPermission': ' Permission', - 'permissionUtilRestricted': ' Permission Restricted', + 'Izin penyimpanan telah ditolak secara permanen. Untuk terus menggunakan fitur ini, buka pengaturan aplikasi untuk mengaktifkan izin penyimpanan secara manual.', + 'permissionUtilNeed': 'Perlu ', + 'permissionUtilPermission': ' Izin', + 'permissionUtilRestricted': ' Izin Dibatasi', 'permissionUtilRestrictedMessage': - 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', + 'Fitur ini tidak tersedia atau dibatasi pada perangkat saat ini, silakan periksa pengaturan perangkat atau pembatasan sistem', 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigasi sedang berlangsung', - 'native.notification.navigation.keepRunning': 'Sedang menavigasi, biarkan aplikasi tetap berjalan', - 'native.notification.bleAgent.running': 'Agen asisten suara sedang berjalan', - 'native.notification.audioRecording.recording': 'Sedang merekam audio, ketuk untuk kembali ke aplikasi', - 'native.notification.music.waiting': 'Menunggu untuk diputar', - 'native.notification.music.previous': 'Sebelumnya', - 'native.notification.music.next': 'Berikutnya', - 'native.notification.music.play': 'Putar', - 'native.notification.music.pause': 'Jeda', - 'native.notification.qqMusic.playing': 'Sedang memutar musik', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigasi sedang berlangsung', + 'native.notification.navigation.keepRunning': + 'Sedang menavigasi, biarkan aplikasi tetap berjalan', + 'native.notification.bleAgent.running': 'Agen asisten suara sedang berjalan', + 'native.notification.audioRecording.recording': + 'Sedang merekam audio, ketuk untuk kembali ke aplikasi', + 'native.notification.music.waiting': 'Menunggu untuk diputar', + 'native.notification.music.previous': 'Sebelumnya', + 'native.notification.music.next': 'Berikutnya', + 'native.notification.music.play': 'Putar', + 'native.notification.music.pause': 'Jeda', + 'native.notification.qqMusic.playing': 'Sedang memutar musik', // 版本更新 'newVersionFound': 'Versi Baru Ditemukan', // 版本更新对话框标题 @@ -1319,17 +1405,18 @@ const Map idID = { 'bleConnectionFailed': 'Koneksi BLE gagal', 'deviceAuthorizationFailedCheckCode': 'Otorisasi perangkat gagal, harap periksa kode otorisasi', - 'bluetoothGuideTitle': 'Manual Bluetooth Activation Required', // 需要手动开启蓝牙 - 'bluetoothGuideSteps': 'Please follow these steps:', // 请按照以下步骤操作: + 'bluetoothGuideTitle': + 'Perlu Mengaktifkan Bluetooth Secara Manual', // 需要手动开启蓝牙 + 'bluetoothGuideSteps': 'Silakan ikuti langkah-langkah berikut:', // 请按照以下步骤操作: 'bluetoothGuideStep1': - 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 + 'Aktifkan Bluetooth: Pengaturan → Bluetooth → Nyalakan', // 开启蓝牙:设置 → 蓝牙 → 开启 'bluetoothGuideStep2': - 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 + 'Hubungkan Perangkat: Temukan perangkat Anda di "Perangkat Saya" lalu ketuk untuk menghubungkan', // 连接设备:在"我的设备"中找到您的设备并点击连接 'bluetoothGuideStep3': - 'Return to app to continue pairing process', // 返回应用继续配对流程 + 'Kembali ke aplikasi untuk melanjutkan proses pemasangan', // 返回应用继续配对流程 'bluetoothGuideTip': - 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 - 'iKnow': 'I Know', // 我知道了 + 'Tip: Anda juga dapat menekan lama ikon Bluetooth di Pusat Kontrol untuk cepat membuka pengaturan Bluetooth', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 + 'iKnow': 'Saya Mengerti', // 我知道了 // 配对模块 - 绑定奖励 "firstBindRewardTitle": "Welcome Reward", @@ -1370,13 +1457,14 @@ const Map idID = { "connectionFailed": "Koneksi Gagal", "retryConnection": "Coba Sambungkan Kembali", "ota_updateNow": "Perbarui Sekarang", - "otaVersionInfoFailed": "Failed to get version info. Please try again later.", + "otaVersionInfoFailed": + "Gagal mendapatkan info versi. Silakan coba lagi nanti.", "otaDeviceInfoUnavailable": - "Unable to get device info. Please check the connection and retry.", + "Tidak dapat memperoleh info perangkat. Periksa koneksi lalu coba lagi.", "otaProductInfoUnavailable": - "Unable to identify the device. Please reconnect and retry.", + "Tidak dapat mengidentifikasi perangkat. Sambungkan kembali lalu coba lagi.", "otaFirmwareVersionInvalid": - "Firmware version is abnormal. Please reconnect and retry.", + "Versi firmware tidak normal. Sambungkan kembali lalu coba lagi.", "keepConnectedDontClose": "Jaga agar perangkat tetap terhubung, jangan tutup aplikasi", "doNotDisconnect": "Jangan putuskan sambungan", @@ -1385,6 +1473,58 @@ const Map idID = { "removeEarbudsEnsureBattery": "Keluarkan kedua earbud, dan pastikan baterai keduanya di atas 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Versi baru @version ditemukan', + 'otaConfirmUpdateNow': 'Perbarui sekarang?', + 'otaUpdate': 'Perbarui', + 'otaUpgradeSuccess': 'Pembaruan Berhasil', + 'otaUpgradeCompleteRepair': + 'Pembaruan firmware selesai!\n\nPerangkat perlu dipasangkan ulang agar berfungsi dengan baik. Buka halaman pemasangan sekarang?', + 'otaPairLater': 'Pasangkan Nanti', + 'otaPairNow': 'Pasangkan Sekarang', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Kesalahan saat memeriksa koneksi BLE: @error', + 'otaBleNotConnected': 'Perangkat BLE Tidak Terhubung', + 'otaBleNeedConnection': + 'Pembaruan firmware memerlukan koneksi perangkat BLE\nPastikan perangkat terhubung dengan benar lalu coba lagi', + 'otaDeviceInfoUnavailableTitle': 'Info Perangkat Tidak Tersedia', + 'otaCannotGetDeviceInfo': + 'Tidak dapat memperoleh info perangkat\nSilakan sambungkan kembali perangkat atau coba lagi nanti', + 'otaBleCheckFailed': 'Pemeriksaan Koneksi BLE Gagal', + 'otaCannotGetDeviceInfoCheckConnection': + 'Tidak dapat memperoleh info perangkat, periksa koneksi perangkat', + 'otaCannotGetProductInfoWithName': + 'Tidak dapat memperoleh info produk, nama perangkat: @deviceName', + 'otaCannotGetBatteryInfo': 'Tidak dapat memperoleh info baterai yang valid', + 'otaLowBattery': 'Baterai Lemah', + 'otaSingleBatteryLow': + 'Baterai perangkat terlalu rendah untuk pembaruan firmware\nSyarat: baterai harus di atas 20%\nSaat ini: @ear @battery%\nSilakan isi daya lalu coba lagi', + 'otaDoubleBatteryLow': + 'Baterai perangkat terlalu rendah untuk pembaruan firmware\nSyarat: kedua earbud harus di atas 20%\nSaat ini: Kiri @left%, Kanan @right%\nSilakan isi daya lalu coba lagi', + 'otaBatteryCheckFailed': 'Pemeriksaan Baterai Gagal', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'Pembaruan ini mencakup optimasi performa dan perbaikan bug.', + 'otaGetLatestVersionFailed': 'Gagal mendapatkan info versi terbaru', + 'otaGetVersionInfoFailed': 'Gagal mendapatkan info versi', + 'otaCheckingDeviceStatus': 'Memeriksa status perangkat...', + 'otaDownloadFailedCheckNetwork': 'Unduhan gagal, periksa koneksi jaringan', + 'otaDownloadFailed': 'Unduhan Gagal', + 'otaPreparingConnection': 'Menyiapkan koneksi perangkat...', + 'otaConnectingDevice': 'Menyambungkan ke perangkat...', + 'otaUpgradeStarted': 'Pembaruan OTA dimulai...', + 'otaUpgradeProgressWithPercent': 'Progres pembaruan: @percent%', + 'otaUpgradeSuccessComplete': 'Pembaruan berhasil diselesaikan', + 'otaUpgradeFailedWithCode': 'Pembaruan gagal, kode kesalahan: @code', + 'otaUpgradeFailedTitle': 'Pembaruan Gagal', + 'otaUpgradeFailedDesc': + 'Periksa koneksi perangkat atau paket pembaruan, kode kesalahan: @code', + 'otaDeviceDisconnected': 'Perangkat terputus', + 'otaDeviceConnected': 'Perangkat terhubung', + // 音乐模块 "noMusic": "Tidak Ada Musik", // 暂无音乐 "noPlayingMusic": "Tidak ada musik yang diputar", // 暂无播放音乐 diff --git a/lib/core/translations/language/is_is.dart b/lib/core/translations/language/is_is.dart index 640487d92..0a993a6f9 100644 --- a/lib/core/translations/language/is_is.dart +++ b/lib/core/translations/language/is_is.dart @@ -169,6 +169,26 @@ const Map isIS = { 'right': 'Hægri', 'checkConnectionStatusFailed': 'Athugun á tengingarstöðu mistókst', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth ræsing mistókst: @error', + 'needBluetoothAndLocationPermission': 'Bluetooth- og staðsetningarheimildir þarf til að leita að tækjum', + 'permissionRequestFailedWithError': 'Heimildarbeiðni mistókst: @error', + 'needPermission': 'Heimild nauðsynleg', + 'blePermissionDialogContent': 'Forritið þarf Bluetooth- og staðsetningarheimildir til að leita að tækjum. Virkjaðu þær í Stillingum.', + 'needEnableBluetooth': 'Virkja Bluetooth', + 'enableBluetoothDialogContent': 'Virkjaðu Bluetooth til að leita að og tengja tæki.', + 'bleScanFailedWithError': 'Leit mistókst: @error', + 'bleConnectionSuccess': 'Tenging tókst', + 'bleConnectedToDevice': 'Tengt við @device', + 'bleConnectionFailedWithError': 'Tenging mistókst: @error', + 'bleDisconnected': 'Aftengt', + 'bleDeviceDisconnected': 'Tæki aftengt', + 'bleDisconnectFailedWithError': 'Aftenging mistókst: @error', + 'signalStrong': 'Sterkt merki', + 'signalMedium': 'Miðlungs merki', + 'signalWeak': 'Veikt merki', + 'signalVeryWeak': 'Mjög veikt merki', + // 发现页 "searchAi": "Leita að gervigreindareiginleikum...", "exploreSlogan": "Snjallheyrnartól, óendanlegir möguleikar", @@ -883,6 +903,13 @@ const Map isIS = { 'Við viljum vita hvers vegna þú ert að tilkynna, þú getur lýst vandamálinu sem þú lendir í.', 'generatedByAi': 'Myndað af gervigreind', + // Agent模块 - 工具调用 + 'toolCall': 'Verkfærakall', + 'noResult': 'Engin niðurstaða', + 'noToolCallContentToCopy': 'Ekkert verkfærakall til að afrita', + 'toolCallDetails': 'Upplýsingar um verkfærakall:', + 'toolCallContentCopied': 'Verkfærakall afritað á klippiborð', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Hér eru nokkur lög sem mælt er með:', 'playList': 'Spilunarlisti', @@ -903,6 +930,28 @@ const Map isIS = { "bicycling": 'Hjólreiðar', "tsransit": 'Almenningssamgöngur', + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Veldu leiðsögn', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Nota Amap leiðsögn', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Nota Baidu Maps leiðsögn', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Nota Google Maps leiðsögn', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Nota Apple Maps leiðsögn', + 'builtInNavigation': 'Innbyggð leiðsögn', + 'useBuiltInNavigation': 'Nota innbyggða leiðsögn', + 'navigationStartFailed': 'Ekki tókst að hefja leiðsögn', + 'cannotPlayMusicListRetryLater': 'Get ekki spilað tónlistalista, reyndu aftur síðar', + 'cannotPlaySong': 'Get ekki spilað lag', + 'openMapError': 'Villa við opnun korts', + 'pleaseInstallAmapApp': 'Settu upp Amap appið fyrst', + 'pleaseInstallBaiduMapApp': 'Settu upp Baidu Maps appið fyrst', + 'appleMapStartFailed': 'Apple Maps ræstist ekki', + 'appleMapUnavailable': 'Apple Maps er ekki tiltækt', + 'openAppleMapError': 'Villa við opnun Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Fyrirspurn um veðurskilyrði:', 'highest': 'Hæst', @@ -975,8 +1024,18 @@ const Map isIS = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Slökkva á fljótandi glugga', + 'enableFloatingWindow': 'Virkja fljótandi glugga', + 'permissionTip': 'Heimildaábending', + 'micPermissionRequiredForRecording': 'Hljóðnemaheimild þarf til upptöku', + 'deleteTranslationRecordError': 'Villa við eyðingu þýðingarfærslu: @error', "translationFailed": "Translation failed", + "translating": "Þýði", + "translate": "Þýða", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Vinsamlegast sláðu inn texta til að þýða", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1397,6 +1456,49 @@ const Map isIS = { "removeEarbudsEnsureBattery": "Taktu báðar heyrnartólin úr og gakktu úr skugga um að rafhlaðan á báðum sé yfir 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Ný útgáfa @version fannst', + 'otaConfirmUpdateNow': 'Uppfæra núna?', + 'otaUpdate': 'Uppfæra', + 'otaUpgradeSuccess': 'Uppfærsla tókst', + 'otaUpgradeCompleteRepair': 'Hugbúnaðaruppfærsla lokið!\n\nTækið þarf að para aftur. Fara á pörunarsíðu?', + 'otaPairLater': 'Para síðar', + 'otaPairNow': 'Para núna', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Villa í BLE-athugun: @error', + 'otaBleNotConnected': 'BLE-tæki ekki tengt', + 'otaBleNeedConnection': 'Uppfærsla krefst BLE-tengingar\nGakktu úr skugga um að tækið sé tengt og reyndu aftur', + 'otaDeviceInfoUnavailableTitle': 'Tækjaupplýsingar ekki tiltækar', + 'otaCannotGetDeviceInfo': 'Get ekki sótt tækjaupplýsingar\nTengdu tækið aftur eða reyndu síðar', + 'otaBleCheckFailed': 'BLE-athugun mistókst', + 'otaCannotGetDeviceInfoCheckConnection': 'Get ekki sótt tækjaupplýsingar, athugaðu tengingu', + 'otaCannotGetProductInfoWithName': 'Get ekki sótt vöruupplýsingar, tækjanafn: @deviceName', + 'otaCannotGetBatteryInfo': 'Get ekki sótt rafhlöðuupplýsingar', + 'otaLowBattery': 'Lítil rafhlaða', + 'otaSingleBatteryLow': 'Rafhlaða of lítil fyrir uppfærslu\nKrafa: rafhlaða yfir 20%\nNúverandi: @ear @battery%\nHladdu og reyndu aftur', + 'otaDoubleBatteryLow': 'Rafhlaða of lítil fyrir uppfærslu\nKrafa: báðir heyrnartólar yfir 20%\nNúverandi: Vinstri @left%, Hægri @right%\nHladdu og reyndu aftur', + 'otaBatteryCheckFailed': 'Rafhlöðuathugun mistókst', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': 'Uppfærslan inniheldur afkastabætingar og villuleiðréttingar.', + 'otaGetLatestVersionFailed': 'Ekki tókst að sækja nýjustu útgáfu', + 'otaGetVersionInfoFailed': 'Ekki tókst að sækja útgáfuupplýsingar', + 'otaCheckingDeviceStatus': 'Athuga stöðu tækis...', + 'otaDownloadFailedCheckNetwork': 'Niðurhal mistókst, athugaðu nettengingu', + 'otaDownloadFailed': 'Niðurhal mistókst', + 'otaPreparingConnection': 'Undirbý tengingu...', + 'otaConnectingDevice': 'Tengi við tæki...', + 'otaUpgradeStarted': 'OTA-uppfærsla hafin...', + 'otaUpgradeProgressWithPercent': 'Framvinda uppfærslu: @percent%', + 'otaUpgradeSuccessComplete': 'Uppfærsla lokið', + 'otaUpgradeFailedWithCode': 'Uppfærsla mistókst, villukóði: @code', + 'otaUpgradeFailedTitle': 'Uppfærsla mistókst', + 'otaUpgradeFailedDesc': 'Athugaðu tengingu eða uppfærslupakka, villukóði: @code', + 'otaDeviceDisconnected': 'Tæki aftengt', + 'otaDeviceConnected': 'Tæki tengt', + // 音乐模块 "noMusic": "Engin tónlist", // 暂无音乐 "noPlayingMusic": "Engin tónlist í spilun", // 暂无播放音乐 diff --git a/lib/core/translations/language/it_it.dart b/lib/core/translations/language/it_it.dart index 078cb22c8..433c4b2e9 100644 --- a/lib/core/translations/language/it_it.dart +++ b/lib/core/translations/language/it_it.dart @@ -1,5 +1,4 @@ const Map itIT = { - // 通用 'continue': 'Continua', 'confirm': 'Conferma', @@ -172,6 +171,29 @@ const Map itIT = { 'checkConnectionStatusFailed': 'Verifica dello stato della connessione fallita', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Inizializzazione Bluetooth fallita: @error', + 'needBluetoothAndLocationPermission': + 'Sono necessari i permessi Bluetooth e posizione per scansionare i dispositivi', + 'permissionRequestFailedWithError': 'Richiesta permessi fallita: @error', + 'needPermission': 'Permesso necessario', + 'blePermissionDialogContent': + 'Questa app necessita dei permessi Bluetooth e posizione per scansionare i dispositivi. Attivarli nelle Impostazioni.', + 'needEnableBluetooth': 'Attivare il Bluetooth', + 'enableBluetoothDialogContent': + 'Attivare il Bluetooth per scansionare e connettere i dispositivi.', + 'bleScanFailedWithError': 'Scansione fallita: @error', + 'bleConnectionSuccess': 'Connessione riuscita', + 'bleConnectedToDevice': 'Connesso a @device', + 'bleConnectionFailedWithError': 'Connessione fallita: @error', + 'bleDisconnected': 'Disconnesso', + 'bleDeviceDisconnected': 'Dispositivo disconnesso', + 'bleDisconnectFailedWithError': 'Disconnessione fallita: @error', + 'signalStrong': 'Forte', + 'signalMedium': 'Medio', + 'signalWeak': 'Debole', + 'signalVeryWeak': 'Molto debole', + // 发现页 "searchAi": "Cerca funzioni AI...", "exploreSlogan": "Auricolari intelligenti, possibilità infinite", @@ -247,60 +269,65 @@ const Map itIT = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Pagamento riuscito', - 'paymentFailed': 'Pagamento non riuscito', - 'gotIt': 'Capito', - 'paymentFailedTryAgain': 'Pagamento non riuscito. Riprova.', - 'selectPaymentMethod': 'Seleziona il metodo di pagamento', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': "Impossibile creare l'ordine WeChat", - 'alipayOrderCreateFailed': "Impossibile creare l'ordine Alipay", - 'appleOrderCreateFailed': "Impossibile creare l'ordine Apple", - 'googleOrderCreateFailed': "Impossibile creare l'ordine Google", - 'paypalOrderCreateFailed': "Impossibile creare l'ordine PayPal", - 'paymentException': 'Eccezione di pagamento', - 'paymentLaunchFailed': 'Avvio del pagamento non riuscito', - 'paymentExceptionWithError': 'Eccezione di pagamento: @error', - 'paymentProcessingCheckLater': 'Il tuo ordine è in fase di elaborazione. Controlla più tardi.', - 'paymentResultQueryException': 'Impossibile interrogare il risultato del pagamento: @error', - 'orderConfirmedQuotaRefreshed': 'Ordine confermato. La tua quota è stata aggiornata.', - 'paymentCompletedConfirming': 'Pagamento completato. Conferma in corso…', - 'paymentCancelled': 'Pagamento annullato', - 'paypalOpenedCompleteInBrowser': 'PayPal aperto. Completa il pagamento nel tuo browser.', - 'paypalOpenFailed': 'Impossibile aprire la pagina di pagamento PayPal', - 'paymentTestTitle': 'Test di pagamento', - 'paymentTestOrderInfo': 'Informazioni ordine di prova', - 'paymentTestProductId': 'ID prodotto', - 'paymentTestProductDescription': 'Descrizione del prodotto', - 'paymentTestWechatDescription': 'Test di pagamento WeChat Pay', - 'paymentTestAlipayDescription': 'Test di pagamento Alipay', - 'paymentTestAmount': 'Importo', - 'paymentTestSelectAmount': "Seleziona l'importo di prova", - 'paying': 'Pagamento in corso...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Stato del pagamento', - 'errorInfoWithMessage': 'Errore: @message', - 'retest': 'Ripeti il test', - 'paymentTestInstructionsTitle': 'Istruzioni', - 'paymentTestInstructionsContent': "1. Seleziona un importo di prova (consigliato: ¥0,01)\n2. Clicca il pulsante di pagamento per iniziare\n3. Completa il pagamento nell'app di pagamento\n4. Torna per verificare il risultato", - 'startingWechatPayment': 'Avvio di WeChat Pay...', - 'startingAlipayPayment': 'Avvio di Alipay...', - 'wechatPaymentSuccess': 'Pagamento WeChat Pay riuscito!', - 'wechatPaymentFailed': 'Pagamento WeChat Pay non riuscito', - 'wechatPaymentLaunchFailed': 'Impossibile avviare WeChat Pay', - 'cannotLaunchWechatPayment': 'Impossibile avviare WeChat Pay', - 'wechatPaymentException': 'Eccezione WeChat Pay', - 'wechatPaymentTestCompleted': 'Test di pagamento WeChat Pay completato', - 'alipayPaymentSuccess': 'Pagamento Alipay riuscito!', - 'alipayPaymentFailed': 'Pagamento Alipay non riuscito', - 'alipayPaymentLaunchFailed': 'Impossibile avviare Alipay', - 'cannotLaunchAlipayPayment': 'Impossibile avviare Alipay', - 'alipayPaymentException': 'Eccezione Alipay', + 'paymentSuccess': 'Pagamento riuscito', + 'paymentFailed': 'Pagamento non riuscito', + 'gotIt': 'Capito', + 'paymentFailedTryAgain': 'Pagamento non riuscito. Riprova.', + 'selectPaymentMethod': 'Seleziona il metodo di pagamento', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': "Impossibile creare l'ordine WeChat", + 'alipayOrderCreateFailed': "Impossibile creare l'ordine Alipay", + 'appleOrderCreateFailed': "Impossibile creare l'ordine Apple", + 'googleOrderCreateFailed': "Impossibile creare l'ordine Google", + 'paypalOrderCreateFailed': "Impossibile creare l'ordine PayPal", + 'paymentException': 'Eccezione di pagamento', + 'paymentLaunchFailed': 'Avvio del pagamento non riuscito', + 'paymentExceptionWithError': 'Eccezione di pagamento: @error', + 'paymentProcessingCheckLater': + 'Il tuo ordine è in fase di elaborazione. Controlla più tardi.', + 'paymentResultQueryException': + 'Impossibile interrogare il risultato del pagamento: @error', + 'orderConfirmedQuotaRefreshed': + 'Ordine confermato. La tua quota è stata aggiornata.', + 'paymentCompletedConfirming': 'Pagamento completato. Conferma in corso…', + 'paymentCancelled': 'Pagamento annullato', + 'paypalOpenedCompleteInBrowser': + 'PayPal aperto. Completa il pagamento nel tuo browser.', + 'paypalOpenFailed': 'Impossibile aprire la pagina di pagamento PayPal', + 'paymentTestTitle': 'Test di pagamento', + 'paymentTestOrderInfo': 'Informazioni ordine di prova', + 'paymentTestProductId': 'ID prodotto', + 'paymentTestProductDescription': 'Descrizione del prodotto', + 'paymentTestWechatDescription': 'Test di pagamento WeChat Pay', + 'paymentTestAlipayDescription': 'Test di pagamento Alipay', + 'paymentTestAmount': 'Importo', + 'paymentTestSelectAmount': "Seleziona l'importo di prova", + 'paying': 'Pagamento in corso...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Stato del pagamento', + 'errorInfoWithMessage': 'Errore: @message', + 'retest': 'Ripeti il test', + 'paymentTestInstructionsTitle': 'Istruzioni', + 'paymentTestInstructionsContent': + "1. Seleziona un importo di prova (consigliato: ¥0,01)\n2. Clicca il pulsante di pagamento per iniziare\n3. Completa il pagamento nell'app di pagamento\n4. Torna per verificare il risultato", + 'startingWechatPayment': 'Avvio di WeChat Pay...', + 'startingAlipayPayment': 'Avvio di Alipay...', + 'wechatPaymentSuccess': 'Pagamento WeChat Pay riuscito!', + 'wechatPaymentFailed': 'Pagamento WeChat Pay non riuscito', + 'wechatPaymentLaunchFailed': 'Impossibile avviare WeChat Pay', + 'cannotLaunchWechatPayment': 'Impossibile avviare WeChat Pay', + 'wechatPaymentException': 'Eccezione WeChat Pay', + 'wechatPaymentTestCompleted': 'Test di pagamento WeChat Pay completato', + 'alipayPaymentSuccess': 'Pagamento Alipay riuscito!', + 'alipayPaymentFailed': 'Pagamento Alipay non riuscito', + 'alipayPaymentLaunchFailed': 'Impossibile avviare Alipay', + 'cannotLaunchAlipayPayment': 'Impossibile avviare Alipay', + 'alipayPaymentException': 'Eccezione Alipay', "insufficientIntegral": "Insufficient integral", "insufficientBalanceDesc": 'Insufficient balance, please go to the corresponding recharge page to recharge.', @@ -502,16 +529,24 @@ const Map itIT = { 'meetingRecordExitMessage': 'Scegli cosa fare prima di uscire', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Termina e salva', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Termina senza salvare', // 结束录音不保存 - 'meetingRecordContinueInBackground': 'Continua a registrare in background', // 后台继续录音 - 'meetingRecordStopTimeout': 'Tempo scaduto durante l\'arresto della registrazione. Riprova.', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'Impossibile arrestare la registrazione. Riprova.', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'Impossibile salvare la registrazione. Riprova.', // 保存录音失败,请重试 + 'meetingRecordContinueInBackground': + 'Continua a registrare in background', // 后台继续录音 + 'meetingRecordStopTimeout': + 'Tempo scaduto durante l\'arresto della registrazione. Riprova.', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'Impossibile arrestare la registrazione. Riprova.', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'Impossibile salvare la registrazione. Riprova.', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'Registrazione in corso', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Registrazione in background. Tocca per tornare all\'app.', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'Registrazione in background. Tocca per tornare all\'app.', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Mostra sopra altre app', // 悬浮窗权限 - 'overlayPermissionTranslationDesc': 'Per mostrare i risultati della traduzione durante le chiamate o la traduzione audio/video, ci serve l\'autorizzazione di overlay. In questo modo puoi vedere le traduzioni in tempo reale mentre usi altre app.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 - 'overlayPermissionRecordingDesc': 'Per mostrare la barra fluttuante di registrazione (timer/pausa/riprendi) durante la registrazione, ci serve l\'autorizzazione di overlay.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 - 'overlayPermissionOpenSettingsFailed': 'Impossibile aprire automaticamente le impostazioni di sistema. Apri Impostazioni e abilita manualmente l\'autorizzazione di overlay.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 + 'overlayPermissionTranslationDesc': + 'Per mostrare i risultati della traduzione durante le chiamate o la traduzione audio/video, ci serve l\'autorizzazione di overlay. In questo modo puoi vedere le traduzioni in tempo reale mentre usi altre app.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 + 'overlayPermissionRecordingDesc': + 'Per mostrare la barra fluttuante di registrazione (timer/pausa/riprendi) durante la registrazione, ci serve l\'autorizzazione di overlay.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 + 'overlayPermissionOpenSettingsFailed': + 'Impossibile aprire automaticamente le impostazioni di sistema. Apri Impostazioni e abilita manualmente l\'autorizzazione di overlay.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 'transcribing': 'Transcribing...', 'summarizing': 'Summarizing...', 'analyzing': 'Analyzing...', @@ -536,21 +571,22 @@ const Map itIT = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Crea', - 'templateDetails': 'Dettagli del modello', - 'tag': 'Etichetta', - 'description': 'Descrizione', - 'template': 'Modello', - 'deleteTemplate': 'Elimina modello', - 'deleteTemplateConfirm': 'Sei sicuro di voler eliminare questo modello?', - 'editTemplate': 'Modifica modello', - 'createTemplate': 'Crea modello', - 'name': 'Nome', - 'templateContentHint': 'Inserisci il contenuto del modello! Suggerimento: Clicca il pulsante IA qui sopra per generare rapidamente il contenuto del modello in base al nome e alla descrizione inseriti', - 'inputNameHint': 'Inserisci un nome', - 'inputDescHint': 'Inserisci una descrizione', - 'custom': 'Personalizzato', - 'pleaseEnter': 'Si prega di inserire', + 'create': 'Crea', + 'templateDetails': 'Dettagli del modello', + 'tag': 'Etichetta', + 'description': 'Descrizione', + 'template': 'Modello', + 'deleteTemplate': 'Elimina modello', + 'deleteTemplateConfirm': 'Sei sicuro di voler eliminare questo modello?', + 'editTemplate': 'Modifica modello', + 'createTemplate': 'Crea modello', + 'name': 'Nome', + 'templateContentHint': + 'Inserisci il contenuto del modello! Suggerimento: Clicca il pulsante IA qui sopra per generare rapidamente il contenuto del modello in base al nome e alla descrizione inseriti', + 'inputNameHint': 'Inserisci un nome', + 'inputDescHint': 'Inserisci una descrizione', + 'custom': 'Personalizzato', + 'pleaseEnter': 'Si prega di inserire', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', @@ -573,7 +609,7 @@ const Map itIT = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Salva mappa mentale', + 'saveMindMap': 'Salva mappa mentale', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -595,7 +631,7 @@ const Map itIT = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Esporta', + 'export': 'Esporta', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Applica a tutti i paragrafi di questo relatore', @@ -705,18 +741,18 @@ const Map itIT = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Analisi non riuscita, riprova più tardi', - 'transcriptionFailed': 'Trascrizione non riuscita, riprova più tardi', - 'summaryFailed': 'Riepilogo non riuscito, riprova più tardi', - 'summaryFailedShort': 'Riepilogo non riuscito', - 'transcriptionFailedShort': 'Trascrizione non riuscita', + 'analysisFailed': 'Analisi non riuscita, riprova più tardi', + 'transcriptionFailed': 'Trascrizione non riuscita, riprova più tardi', + 'summaryFailed': 'Riepilogo non riuscito, riprova più tardi', + 'summaryFailedShort': 'Riepilogo non riuscito', + 'transcriptionFailedShort': 'Trascrizione non riuscita', // Meeting模块 - 播放器 - 'playerNotReady': 'Il lettore audio non è pronto, attendere', - 'playFailed': 'Riproduzione non riuscita', - 'audioFileNotFound': 'File audio non trovato', - 'fetchingAudio': 'Recupero audio dal cloud...', - 'playerLoadFailed': 'Caricamento del lettore audio non riuscito', + 'playerNotReady': 'Il lettore audio non è pronto, attendere', + 'playFailed': 'Riproduzione non riuscita', + 'audioFileNotFound': 'File audio non trovato', + 'fetchingAudio': 'Recupero audio dal cloud...', + 'playerLoadFailed': 'Caricamento del lettore audio non riuscito', // 设置页 "systemSettings": "Impostazioni di sistema", @@ -827,7 +863,8 @@ const Map itIT = { "swipeUpForMore": "Scorri verso l'alto per vedere di più", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': "Quando abilitato: l'IA non verrà interrotta dalla tua voce mentre parla e potrà gestire solo un turno di conversazione alla volta. Per iniziare un nuovo turno, basta pronunciare la parola di attivazione.", + 'voice_interrupt_tip': + "Quando abilitato: l'IA non verrà interrotta dalla tua voce mentre parla e potrà gestire solo un turno di conversazione alla volta. Per iniziare un nuovo turno, basta pronunciare la parola di attivazione.", // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -884,6 +921,14 @@ const Map itIT = { 'Vogliamo sapere perché stai segnalando, puoi descrivere il problema che hai riscontrato.', 'generatedByAi': 'Generato da AI', + // Agent模块 - 工具调用 + 'toolCall': 'Chiamata strumento', + 'noResult': 'Nessun risultato', + 'noToolCallContentToCopy': + 'Nessun contenuto della chiamata strumento da copiare', + 'toolCallDetails': 'Dettagli chiamata strumento:', + 'toolCallContentCopied': 'Contenuto copiato negli appunti', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Ecco alcuni brani musicali consigliati:', 'playList': 'Playlist', @@ -904,6 +949,29 @@ const Map itIT = { "bicycling": "In bicicletta", "tsransit": "Trasporto pubblico", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Seleziona app di navigazione', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Naviga con Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Naviga con Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Naviga con Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Naviga con Apple Maps', + 'builtInNavigation': 'Navigazione integrata', + 'useBuiltInNavigation': 'Naviga con mappa integrata', + 'navigationStartFailed': 'Avvio navigazione fallito', + 'cannotPlayMusicListRetryLater': + 'Impossibile riprodurre la playlist, riprovare piu tardi', + 'cannotPlaySong': 'Impossibile riprodurre il brano', + 'openMapError': 'Errore durante l apertura della mappa', + 'pleaseInstallAmapApp': 'Installare prima l app Amap', + 'pleaseInstallBaiduMapApp': 'Installare prima l app Baidu Maps', + 'appleMapStartFailed': 'Avvio Apple Maps fallito', + 'appleMapUnavailable': 'Apple Maps non disponibile', + 'openAppleMapError': 'Errore durante l apertura di Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Interrogazione delle condizioni meteorologiche:', 'highest': 'Massima', @@ -976,8 +1044,20 @@ const Map itIT = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Disattiva finestra mobile', + 'enableFloatingWindow': 'Attiva finestra mobile', + 'permissionTip': 'Suggerimento permessi', + 'micPermissionRequiredForRecording': + 'Permesso microfono necessario per la registrazione', + 'deleteTranslationRecordError': + 'Errore durante l eliminazione del record di traduzione: @error', "translationFailed": "Translation failed", + "translating": "Traduzione in corso", + "translate": "Traduci", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Inserisci il testo da tradurre", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1256,17 +1336,20 @@ const Map itIT = { 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigazione in corso', - 'native.notification.navigation.keepRunning': "Navigazione in corso, mantieni l'app attiva", - 'native.notification.bleAgent.running': "L'agente assistente vocale è in esecuzione", - 'native.notification.audioRecording.recording': "Registrazione audio in corso, tocca per tornare all'app", - 'native.notification.music.waiting': 'In attesa di riproduzione', - 'native.notification.music.previous': 'Indietro', - 'native.notification.music.next': 'Avanti', - 'native.notification.music.play': 'Riproduci', - 'native.notification.music.pause': 'Pausa', - 'native.notification.qqMusic.playing': 'Riproduzione musica in corso', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigazione in corso', + 'native.notification.navigation.keepRunning': + "Navigazione in corso, mantieni l'app attiva", + 'native.notification.bleAgent.running': + "L'agente assistente vocale è in esecuzione", + 'native.notification.audioRecording.recording': + "Registrazione audio in corso, tocca per tornare all'app", + 'native.notification.music.waiting': 'In attesa di riproduzione', + 'native.notification.music.previous': 'Indietro', + 'native.notification.music.next': 'Avanti', + 'native.notification.music.play': 'Riproduci', + 'native.notification.music.pause': 'Pausa', + 'native.notification.qqMusic.playing': 'Riproduzione musica in corso', // 版本更新 'newVersionFound': 'Nuova versione trovata', // 版本更新对话框标题 @@ -1408,6 +1491,59 @@ const Map itIT = { "removeEarbudsEnsureBattery": "Rimuovi entrambi gli auricolari e assicurati che la batteria di entrambi sia superiore al 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Nuova versione @version trovata', + 'otaConfirmUpdateNow': 'Aggiornare ora?', + 'otaUpdate': 'Aggiorna', + 'otaUpgradeSuccess': 'Aggiornamento riuscito', + 'otaUpgradeCompleteRepair': + 'Aggiornamento completato!\n\nIl dispositivo deve essere riassociato. Andare alla pagina di associazione?', + 'otaPairLater': 'Associa dopo', + 'otaPairNow': 'Associa ora', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Errore nella verifica connessione BLE: @error', + 'otaBleNotConnected': 'Dispositivo BLE non connesso', + 'otaBleNeedConnection': + 'Connessione BLE richiesta\nAssicurarsi che il dispositivo sia connesso e riprovare', + 'otaDeviceInfoUnavailableTitle': 'Info dispositivo non disponibili', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'Verifica connessione BLE fallita', + 'otaCannotGetDeviceInfoCheckConnection': + 'Impossibile ottenere info dispositivo, verificare la connessione', + 'otaCannotGetProductInfoWithName': + 'Impossibile ottenere info prodotto, nome dispositivo: @deviceName', + 'otaCannotGetBatteryInfo': 'Impossibile ottenere info batteria valide', + 'otaLowBattery': 'Batteria scarica', + 'otaSingleBatteryLow': + 'Batteria troppo scarica\nRequisito: superiore al 20%\nAttuale: @ear @battery%\nCaricare e riprovare', + 'otaDoubleBatteryLow': + 'Batteria troppo scarica\nRequisito: entrambi gli auricolari superiori al 20%\nAttuale: Sinistro @left%, Destro @right%\nCaricare e riprovare', + 'otaBatteryCheckFailed': 'Verifica batteria fallita', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'Questo aggiornamento include ottimizzazioni delle prestazioni e correzioni di bug.', + 'otaGetLatestVersionFailed': 'Impossibile ottenere la versione piu recente', + 'otaGetVersionInfoFailed': 'Impossibile ottenere le info di versione', + 'otaCheckingDeviceStatus': 'Verifica stato dispositivo...', + 'otaDownloadFailedCheckNetwork': + 'Download fallito, verificare la connessione di rete', + 'otaDownloadFailed': 'Download fallito', + 'otaPreparingConnection': 'Preparazione connessione...', + 'otaConnectingDevice': 'Connessione al dispositivo...', + 'otaUpgradeStarted': 'Aggiornamento OTA avviato...', + 'otaUpgradeProgressWithPercent': 'Progresso: @percent%', + 'otaUpgradeSuccessComplete': 'Aggiornamento completato con successo', + 'otaUpgradeFailedWithCode': 'Aggiornamento fallito, codice errore: @code', + 'otaUpgradeFailedTitle': 'Aggiornamento fallito', + 'otaUpgradeFailedDesc': + 'Verificare connessione o pacchetto di aggiornamento, codice: @code', + 'otaDeviceDisconnected': 'Dispositivo disconnesso', + 'otaDeviceConnected': 'Dispositivo connesso', + // 音乐模块 "noMusic": "Nessuna musica", // 暂无音乐 "noPlayingMusic": "Nessuna musica in riproduzione", // 暂无播放音乐 diff --git a/lib/core/translations/language/ja_jp.dart b/lib/core/translations/language/ja_jp.dart index ff3eed6d2..203ead766 100644 --- a/lib/core/translations/language/ja_jp.dart +++ b/lib/core/translations/language/ja_jp.dart @@ -1,5 +1,4 @@ const Map jaJP = { - // 通用 'continue': '続ける', 'confirm': '確認', @@ -160,6 +159,27 @@ const Map jaJP = { 'right': '右', 'checkConnectionStatusFailed': '接続状態の確認に失敗', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetoothの初期化に失敗しました: @error', + 'needBluetoothAndLocationPermission': 'デバイスをスキャンするにはBluetoothと位置情報の権限が必要です', + 'permissionRequestFailedWithError': '権限リクエストが失敗しました: @error', + 'needPermission': '権限が必要', + 'blePermissionDialogContent': + 'デバイスをスキャンするにはBluetoothと位置情報の権限が必要です。設定から有効にしてください。', + 'needEnableBluetooth': 'Bluetoothを有効にしてください', + 'enableBluetoothDialogContent': 'デバイスをスキャン・接続するにはBluetoothを有効にしてください。', + 'bleScanFailedWithError': 'スキャン失敗: @error', + 'bleConnectionSuccess': '接続成功', + 'bleConnectedToDevice': '@device に接続しました', + 'bleConnectionFailedWithError': '接続失敗: @error', + 'bleDisconnected': '切断されました', + 'bleDeviceDisconnected': 'デバイスが切断されました', + 'bleDisconnectFailedWithError': '切断失敗: @error', + 'signalStrong': '強い', + 'signalMedium': '普通', + 'signalWeak': '弱い', + 'signalVeryWeak': '非常に弱い', + // 发现页 "searchAi": "AI機能を検索...", "exploreSlogan": "スマートイヤホン、無限の可能性", @@ -234,60 +254,61 @@ const Map jaJP = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': '支払い成功', - 'paymentFailed': '支払い失敗', - 'gotIt': '了解', - 'paymentFailedTryAgain': '支払いに失敗しました。もう一度お試しください。', - 'selectPaymentMethod': '支払い方法を選択', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'WeChat Pay注文の作成に失敗しました', - 'alipayOrderCreateFailed': 'Alipay注文の作成に失敗しました', - 'appleOrderCreateFailed': 'Apple注文の作成に失敗しました', - 'googleOrderCreateFailed': 'Google注文の作成に失敗しました', - 'paypalOrderCreateFailed': 'PayPal注文の作成に失敗しました', - 'paymentException': '支払い例外', - 'paymentLaunchFailed': '支払いの起動に失敗しました', - 'paymentExceptionWithError': '支払い例外:@error', - 'paymentProcessingCheckLater': 'ご注文は処理中です。後で確認してください。', - 'paymentResultQueryException': '支払い結果の照会に失敗しました:@error', - 'orderConfirmedQuotaRefreshed': '注文が確認されました。クォータが更新されました。', - 'paymentCompletedConfirming': '支払い完了。確認中…', - 'paymentCancelled': '支払いがキャンセルされました', - 'paypalOpenedCompleteInBrowser': 'PayPalが開きました。ブラウザで支払いを完了してください。', - 'paypalOpenFailed': 'PayPal支払いページを開けません', - 'paymentTestTitle': '支払いテスト', - 'paymentTestOrderInfo': 'テスト注文情報', - 'paymentTestProductId': '商品ID', - 'paymentTestProductDescription': '商品説明', - 'paymentTestWechatDescription': 'WeChat Pay支払いテスト', - 'paymentTestAlipayDescription': 'Alipay支払いテスト', - 'paymentTestAmount': '金額', - 'paymentTestSelectAmount': 'テスト金額を選択', - 'paying': '支払い中...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': '支払い状況', - 'errorInfoWithMessage': 'エラー:@message', - 'retest': '再テスト', - 'paymentTestInstructionsTitle': '手順', - 'paymentTestInstructionsContent': '1. テスト金額を選択してください(推奨:¥0.01)\n2. 支払いボタンをクリックして開始\n3. 支払いアプリで支払いを完了\n4. 戻って結果を確認', - 'startingWechatPayment': 'WeChat Payを起動中...', - 'startingAlipayPayment': 'Alipayを起動中...', - 'wechatPaymentSuccess': 'WeChat Pay支払い成功!', - 'wechatPaymentFailed': 'WeChat Pay支払い失敗', - 'wechatPaymentLaunchFailed': 'WeChat Payの起動に失敗しました', - 'cannotLaunchWechatPayment': 'WeChat Payを起動できません', - 'wechatPaymentException': 'WeChat Pay例外', - 'wechatPaymentTestCompleted': 'WeChat Pay支払いテストが完了しました', - 'alipayPaymentSuccess': 'Alipay支払い成功!', - 'alipayPaymentFailed': 'Alipay支払い失敗', - 'alipayPaymentLaunchFailed': 'Alipayの起動に失敗しました', - 'cannotLaunchAlipayPayment': 'Alipayを起動できません', - 'alipayPaymentException': 'Alipay例外', + 'paymentSuccess': '支払い成功', + 'paymentFailed': '支払い失敗', + 'gotIt': '了解', + 'paymentFailedTryAgain': '支払いに失敗しました。もう一度お試しください。', + 'selectPaymentMethod': '支払い方法を選択', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'WeChat Pay注文の作成に失敗しました', + 'alipayOrderCreateFailed': 'Alipay注文の作成に失敗しました', + 'appleOrderCreateFailed': 'Apple注文の作成に失敗しました', + 'googleOrderCreateFailed': 'Google注文の作成に失敗しました', + 'paypalOrderCreateFailed': 'PayPal注文の作成に失敗しました', + 'paymentException': '支払い例外', + 'paymentLaunchFailed': '支払いの起動に失敗しました', + 'paymentExceptionWithError': '支払い例外:@error', + 'paymentProcessingCheckLater': 'ご注文は処理中です。後で確認してください。', + 'paymentResultQueryException': '支払い結果の照会に失敗しました:@error', + 'orderConfirmedQuotaRefreshed': '注文が確認されました。クォータが更新されました。', + 'paymentCompletedConfirming': '支払い完了。確認中…', + 'paymentCancelled': '支払いがキャンセルされました', + 'paypalOpenedCompleteInBrowser': 'PayPalが開きました。ブラウザで支払いを完了してください。', + 'paypalOpenFailed': 'PayPal支払いページを開けません', + 'paymentTestTitle': '支払いテスト', + 'paymentTestOrderInfo': 'テスト注文情報', + 'paymentTestProductId': '商品ID', + 'paymentTestProductDescription': '商品説明', + 'paymentTestWechatDescription': 'WeChat Pay支払いテスト', + 'paymentTestAlipayDescription': 'Alipay支払いテスト', + 'paymentTestAmount': '金額', + 'paymentTestSelectAmount': 'テスト金額を選択', + 'paying': '支払い中...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': '支払い状況', + 'errorInfoWithMessage': 'エラー:@message', + 'retest': '再テスト', + 'paymentTestInstructionsTitle': '手順', + 'paymentTestInstructionsContent': + '1. テスト金額を選択してください(推奨:¥0.01)\n2. 支払いボタンをクリックして開始\n3. 支払いアプリで支払いを完了\n4. 戻って結果を確認', + 'startingWechatPayment': 'WeChat Payを起動中...', + 'startingAlipayPayment': 'Alipayを起動中...', + 'wechatPaymentSuccess': 'WeChat Pay支払い成功!', + 'wechatPaymentFailed': 'WeChat Pay支払い失敗', + 'wechatPaymentLaunchFailed': 'WeChat Payの起動に失敗しました', + 'cannotLaunchWechatPayment': 'WeChat Payを起動できません', + 'wechatPaymentException': 'WeChat Pay例外', + 'wechatPaymentTestCompleted': 'WeChat Pay支払いテストが完了しました', + 'alipayPaymentSuccess': 'Alipay支払い成功!', + 'alipayPaymentFailed': 'Alipay支払い失敗', + 'alipayPaymentLaunchFailed': 'Alipayの起動に失敗しました', + 'cannotLaunchAlipayPayment': 'Alipayを起動できません', + 'alipayPaymentException': 'Alipay例外', "insufficientIntegral": "Insufficient integral", "insufficientBalanceDesc": 'Insufficient balance, please go to the corresponding recharge page to recharge.', @@ -526,21 +547,22 @@ const Map jaJP = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': '作成', - 'templateDetails': 'テンプレートの詳細', - 'tag': 'タグ', - 'description': '説明', - 'template': 'テンプレート', - 'deleteTemplate': 'テンプレートを削除', - 'deleteTemplateConfirm': 'このテンプレートを削除してもよろしいですか?', - 'editTemplate': 'テンプレートを編集', - 'createTemplate': 'テンプレートを作成', - 'name': '名前', - 'templateContentHint': 'テンプレートの内容を入力してください!ヒント:上のAIボタンをクリックすると、入力した名前と説明に基づいてテンプレートの内容をすばやく生成できます', - 'inputNameHint': '名前を入力してください', - 'inputDescHint': '説明を入力してください', - 'custom': 'カスタム', - 'pleaseEnter': '入力してください', + 'create': '作成', + 'templateDetails': 'テンプレートの詳細', + 'tag': 'タグ', + 'description': '説明', + 'template': 'テンプレート', + 'deleteTemplate': 'テンプレートを削除', + 'deleteTemplateConfirm': 'このテンプレートを削除してもよろしいですか?', + 'editTemplate': 'テンプレートを編集', + 'createTemplate': 'テンプレートを作成', + 'name': '名前', + 'templateContentHint': + 'テンプレートの内容を入力してください!ヒント:上のAIボタンをクリックすると、入力した名前と説明に基づいてテンプレートの内容をすばやく生成できます', + 'inputNameHint': '名前を入力してください', + 'inputDescHint': '説明を入力してください', + 'custom': 'カスタム', + 'pleaseEnter': '入力してください', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', @@ -563,7 +585,7 @@ const Map jaJP = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'マインドマップを保存', + 'saveMindMap': 'マインドマップを保存', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -585,7 +607,7 @@ const Map jaJP = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'エクスポート', + 'export': 'エクスポート', // Meeting模块 - 发言者 'applyToAllParagraphs': 'この話者のすべての段落に適用', @@ -694,18 +716,18 @@ const Map jaJP = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': '分析に失敗しました。後でもう一度お試しください', - 'transcriptionFailed': '文字起こしに失敗しました。後でもう一度お試しください', - 'summaryFailed': '要約に失敗しました。後でもう一度お試しください', - 'summaryFailedShort': '要約失敗', - 'transcriptionFailedShort': '文字起こし失敗', + 'analysisFailed': '分析に失敗しました。後でもう一度お試しください', + 'transcriptionFailed': '文字起こしに失敗しました。後でもう一度お試しください', + 'summaryFailed': '要約に失敗しました。後でもう一度お試しください', + 'summaryFailedShort': '要約失敗', + 'transcriptionFailedShort': '文字起こし失敗', // Meeting模块 - 播放器 - 'playerNotReady': 'オーディオプレーヤーの準備ができていません。お待ちください', - 'playFailed': '再生に失敗しました', - 'audioFileNotFound': '音声ファイルが見つかりません', - 'fetchingAudio': 'クラウドから音声を取得中...', - 'playerLoadFailed': 'オーディオプレーヤーの読み込みに失敗しました', + 'playerNotReady': 'オーディオプレーヤーの準備ができていません。お待ちください', + 'playFailed': '再生に失敗しました', + 'audioFileNotFound': '音声ファイルが見つかりません', + 'fetchingAudio': 'クラウドから音声を取得中...', + 'playerLoadFailed': 'オーディオプレーヤーの読み込みに失敗しました', // 设置页 "systemSettings": "システム設定", @@ -808,7 +830,8 @@ const Map jaJP = { "swipeUpForMore": "上にスワイプしてさらに表示", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': '有効にすると:AIが話している間はあなたの声で中断されず、一度に1つの会話ラウンドのみ処理できます。新しいラウンドを開始するには、ウェイクアップワードを言ってください。', + 'voice_interrupt_tip': + '有効にすると:AIが話している間はあなたの声で中断されず、一度に1つの会話ラウンドのみ処理できます。新しいラウンドを開始するには、ウェイクアップワードを言ってください。', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -859,6 +882,13 @@ const Map jaJP = { 'reportDescriptionHint': '報告の理由を知りたいと思います。遭遇した問題を説明してください。', 'generatedByAi': 'AIによって生成', + // Agent模块 - 工具调用 + 'toolCall': 'ツール呼び出し', + 'noResult': '結果なし', + 'noToolCallContentToCopy': 'コピーするツール呼び出し内容がありません', + 'toolCallDetails': 'ツール呼び出し詳細:', + 'toolCallContentCopied': 'ツール呼び出し内容をクリップボードにコピーしました', + // Agent模块 - 音乐卡片 'recommendedMusic': 'おすすめの音楽をご紹介します:', 'playList': 'プレイリスト', @@ -879,6 +909,28 @@ const Map jaJP = { "bicycling": "自転車", "tsransit": "Transit", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'ナビアプリを選択', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Amapでナビゲート', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Baidu Mapsでナビゲート', + 'googleMap': 'Google マップ', + 'useGoogleNavigation': 'Google マップでナビゲート', + 'appleMap': 'Apple マップ', + 'useAppleNavigation': 'Apple マップでナビゲート', + 'builtInNavigation': '内蔵ナビ', + 'useBuiltInNavigation': '内蔵地図でナビゲート', + 'navigationStartFailed': 'ナビの開始に失敗しました', + 'cannotPlayMusicListRetryLater': '音楽リストを再生できません。後でもう一度お試しください', + 'cannotPlaySong': '曲を再生できません', + 'openMapError': '地図を開く際にエラーが発生しました', + 'pleaseInstallAmapApp': 'Amapアプリをインストールしてください', + 'pleaseInstallBaiduMapApp': 'Baidu Mapsアプリをインストールしてください', + 'appleMapStartFailed': 'Apple マップの起動に失敗しました', + 'appleMapUnavailable': 'Apple マップが利用できません', + 'openAppleMapError': 'Apple マップを開く際にエラーが発生しました', + // Agent模块 - 天气卡片 'weatherQuery': '天気照会:', 'highest': '最高', @@ -940,10 +992,20 @@ const Map jaJP = { "Please make sure the Bluetooth headset is connected to the phone and in a call state", "autoDetect": "Auto Detect", // 自动检测 + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'フローティングウィンドウを無効化', + 'enableFloatingWindow': 'フローティングウィンドウを有効化', + 'permissionTip': '権限のヒント', + 'micPermissionRequiredForRecording': '録音にはマイク権限が必要です', + 'deleteTranslationRecordError': '翻訳記録の削除中にエラーが発生しました: @error', + // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", "translationFailed": "Translation failed", + "translating": "翻訳中", + "translate": "翻訳", "pleaseInputText": "Please input text", + "inputTextToTranslate": "翻訳するテキストを入力してください", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1328,6 +1390,51 @@ const Map jaJP = { "updateContent": "更新内容", "removeEarbudsEnsureBattery": "両方のイヤホンを取り出し、バッテリーレベルが20%以上であることを確認してください", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': '新バージョン @version が見つかりました', + 'otaConfirmUpdateNow': '今すぐアップデートしますか?', + 'otaUpdate': 'アップデート', + 'otaUpgradeSuccess': 'アップグレード成功', + 'otaUpgradeCompleteRepair': + 'ファームウェアのアップグレードが完了しました!\n\nデバイスを再ペアリングする必要があります。ペアリングページに移動しますか?', + 'otaPairLater': '後でペアリング', + 'otaPairNow': '今すぐペアリング', + 'okConfirm': 'OK', + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'BLE接続状態の確認中にエラーが発生しました:@error', + 'otaBleNotConnected': 'BLEデバイス未接続', + 'otaBleNeedConnection': + 'ファームウェアのアップグレードにはBLEデバイスの接続が必要です\nデバイスが正しく接続されていることを確認してください', + 'otaDeviceInfoUnavailableTitle': 'デバイス情報取得不可', + 'otaCannotGetDeviceInfo': 'デバイス情報を取得できません\nデバイスを再接続するか、後でもう一度お試しください', + 'otaBleCheckFailed': 'BLE接続確認失敗', + 'otaCannotGetDeviceInfoCheckConnection': 'デバイス情報を取得できません。接続を確認してください', + 'otaCannotGetProductInfoWithName': '製品情報を取得できません。デバイス名: @deviceName', + 'otaCannotGetBatteryInfo': '有効なバッテリー情報を取得できません', + 'otaLowBattery': 'バッテリー不足', + 'otaSingleBatteryLow': + 'バッテリー残量が不足しています\n要件:バッテリー残量が20%以上必要です\n現在:@ear @battery%\n充電してから再試行してください', + 'otaDoubleBatteryLow': + 'バッテリー残量が不足しています\n要件:左右とも20%以上必要です\n現在:左 @left%、右 @right%\n充電してから再試行してください', + 'otaBatteryCheckFailed': 'バッテリー確認失敗', + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': '本アップデートにはパフォーマンスの最適化とバグ修正が含まれています。', + 'otaGetLatestVersionFailed': '最新バージョン情報の取得に失敗しました', + 'otaGetVersionInfoFailed': 'バージョン情報の取得に失敗しました', + 'otaCheckingDeviceStatus': 'デバイスの状態を確認中...', + 'otaDownloadFailedCheckNetwork': 'ダウンロード失敗。ネットワーク接続を確認してください', + 'otaDownloadFailed': 'ダウンロード失敗', + 'otaPreparingConnection': 'デバイス接続を準備中...', + 'otaConnectingDevice': 'デバイスに接続中...', + 'otaUpgradeStarted': 'OTAアップグレード開始...', + 'otaUpgradeProgressWithPercent': 'アップグレード進捗: @percent%', + 'otaUpgradeSuccessComplete': 'アップグレードが完了しました', + 'otaUpgradeFailedWithCode': 'アップグレード失敗、エラーコード: @code', + 'otaUpgradeFailedTitle': 'アップグレード失敗', + 'otaUpgradeFailedDesc': 'デバイス接続またはアップデートパッケージを確認してください。エラーコード: @code', + 'otaDeviceDisconnected': 'デバイスが切断されました', + 'otaDeviceConnected': 'デバイスが接続されました', + // 音乐模块 "noMusic": "音楽がありません", // 暂无音乐 "noPlayingMusic": "再生中の音楽がありません", // 暂无播放音乐 diff --git a/lib/core/translations/language/ko_kr.dart b/lib/core/translations/language/ko_kr.dart index d22ad1e84..55f6fe0f3 100644 --- a/lib/core/translations/language/ko_kr.dart +++ b/lib/core/translations/language/ko_kr.dart @@ -1,5 +1,4 @@ const Map koKR = { - // 通用 'continue': '계속', 'confirm': '확인', @@ -17,13 +16,12 @@ const Map koKR = { "requestTimeout": "요청 시간 초과", "responseTimeout": "응답 시간 초과", "unknownError": "알 수 없는 오류", - "asrConnectionFailed": - "음성 인식 서비스 연결에 실패했습니다. 네트워크를 확인한 후 다시 시도해 주세요.", - "justNow": "Just now", - "minutesAgo": "@minutes minutes ago", - "yesterday": "Yesterday", - "daysAgo": "@days days ago", - "hoursAgo": "@hours hours ago", + "asrConnectionFailed": "음성 인식 서비스 연결에 실패했습니다. 네트워크를 확인한 후 다시 시도해 주세요.", + "justNow": "방금 전", + "minutesAgo": "@minutes분 전", + "yesterday": "어제", + "daysAgo": "@days일 전", + "hoursAgo": "@hours시간 전", // 启动页 "slogan": "세상을 연결하다, 소리를 넘어서", @@ -161,6 +159,26 @@ const Map koKR = { 'right': '오른쪽', 'checkConnectionStatusFailed': '연결 상태 확인 실패', + // 蓝牙扫描模块 + 'bleInitFailedWithError': '블루투스 초기화 실패: @error', + 'needBluetoothAndLocationPermission': '기기를 검색하려면 블루투스 및 위치 권한이 필요합니다', + 'permissionRequestFailedWithError': '권한 요청 실패: @error', + 'needPermission': '권한 필요', + 'blePermissionDialogContent': '기기를 검색하려면 블루투스 및 위치 권한이 필요합니다. 설정에서 활성화해 주세요.', + 'needEnableBluetooth': '블루투스를 켜주세요', + 'enableBluetoothDialogContent': '기기를 검색하고 연결하려면 블루투스를 켜주세요.', + 'bleScanFailedWithError': '검색 실패: @error', + 'bleConnectionSuccess': '연결 성공', + 'bleConnectedToDevice': '@device에 연결됨', + 'bleConnectionFailedWithError': '연결 실패: @error', + 'bleDisconnected': '연결 끊김', + 'bleDeviceDisconnected': '기기 연결이 끊겼습니다', + 'bleDisconnectFailedWithError': '연결 해제 실패: @error', + 'signalStrong': '강함', + 'signalMedium': '보통', + 'signalWeak': '약함', + 'signalVeryWeak': '매우 약함', + // 发现页 "searchAi": "AI 기능 검색...", "exploreSlogan": "스마트 이어폰, 무한한 가능성", @@ -186,148 +204,149 @@ const Map koKR = { "scene": "상황", // 用量统计模块 - "aiChat": "AI Chat", - "translationStats": "Translation Statistics", - "meetingStats": "Meeting Statistics", - "today": "Today", - "thisWeek": "This Week", - "thisMonth": "This Month", - "history": "History", - "currentSessionStats": "Current Session Stats", - "translationCount": "Translation Count", - "sessionDuration": "Session Duration", - "characters": "Characters", - "recordingDuration": "Recording Duration", - "totalApiCalls": "Total API Calls", - "sessionCount": "Session Count", - "totalCharacters": "Total Characters", - "apiCallStats": "API Call Stats", - "translationApi": "Translation API", - "asr": "ASR", - "tts": "TTS", - "dataVolumeStats": "Data Volume Stats", - "sourceTextCharacters": "Source Text Characters", - "ttsTextCharacters": "TTS Text Characters", - "effectiveAudioDuration": "Effective Audio Duration", - "totalSessionDuration": "Total Session Duration", - "costStats": "Cost Stats", - "estimatedCost": "Estimated Cost", - "dailyCostThreshold": "Daily Cost Threshold", - "monthlyCostThreshold": "Monthly Cost Threshold", - "usageBehaviorStats": "Usage Behavior Stats", - "mostUsedLanguagePair": "Most-used language pair", - "mostUsedMode": "Most-used mode", - "asrApiCalls": "ASR Calls", - "totalAudioDuration": "Total Audio Duration", - "audioFileSize": "Audio File Size", - "transcriptBytes": "Transcript Bytes", - "loadFailed": "Load Failed", + "aiChat": "AI 채팅", + "translationStats": "번역 통계", + "meetingStats": "회의 통계", + "today": "오늘", + "thisWeek": "이번 주", + "thisMonth": "이번 달", + "history": "기록", + "currentSessionStats": "현재 세션 통계", + "translationCount": "번역 횟수", + "sessionDuration": "세션 시간", + "characters": "글자 수", + "recordingDuration": "녹음 시간", + "totalApiCalls": "총 API 호출 수", + "sessionCount": "세션 수", + "totalCharacters": "총 글자 수", + "apiCallStats": "API 호출 통계", + "translationApi": "번역 API", + "asr": "음성 인식(ASR)", + "tts": "음성 합성(TTS)", + "dataVolumeStats": "데이터 용량 통계", + "sourceTextCharacters": "원본 텍스트 글자 수", + "ttsTextCharacters": "TTS 텍스트 글자 수", + "effectiveAudioDuration": "유효 오디오 시간", + "totalSessionDuration": "총 세션 시간", + "costStats": "비용 통계", + "estimatedCost": "예상 비용", + "dailyCostThreshold": "일일 비용 한도", + "monthlyCostThreshold": "월간 비용 한도", + "usageBehaviorStats": "사용 행동 통계", + "mostUsedLanguagePair": "가장 많이 사용한 언어 쌍", + "mostUsedMode": "가장 많이 사용한 모드", + "asrApiCalls": "음성 인식 호출 수", + "totalAudioDuration": "총 오디오 시간", + "audioFileSize": "오디오 파일 크기", + "transcriptBytes": "전사 바이트 수", + "loadFailed": "로드 실패", "statsLoadFailedTryLater": - "Statistics failed to load. Please try again later.", - "cleanupComplete": "Cleanup Complete", - "cleanedOldData": "Cleaned data older than 90 days", - "exportFeature": "Export Feature", - "exportInDevelopment": "Data export is under development", + "통계를 불러오지 못했습니다. 나중에 다시 시도해 주세요.", + "cleanupComplete": "정리 완료", + "cleanedOldData": "90일 이전 데이터를 정리했습니다", + "exportFeature": "내보내기 기능", + "exportInDevelopment": "데이터 내보내기 기능을 개발 중입니다", // 商品模块 - 通用 - 'availablePackages': 'Available Packages', - 'remainingQuota': 'Remaining Quota', - 'totalQuota': 'Total Quota', - 'remaining': 'Remaining', - 'featureDescription': 'Feature Description', - 'paymentSuccess': '결제 성공', - 'paymentFailed': '결제 실패', - 'gotIt': '확인', - 'paymentFailedTryAgain': '결제에 실패했습니다. 다시 시도해 주세요.', - 'selectPaymentMethod': '결제 수단 선택', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'WeChat Pay 주문 생성에 실패했습니다', - 'alipayOrderCreateFailed': 'Alipay 주문 생성에 실패했습니다', - 'appleOrderCreateFailed': 'Apple 주문 생성에 실패했습니다', - 'googleOrderCreateFailed': 'Google 주문 생성에 실패했습니다', - 'paypalOrderCreateFailed': 'PayPal 주문 생성에 실패했습니다', - 'paymentException': '결제 예외', - 'paymentLaunchFailed': '결제 실행에 실패했습니다', - 'paymentExceptionWithError': '결제 예외: @error', - 'paymentProcessingCheckLater': '주문이 처리 중입니다. 나중에 확인해 주세요.', - 'paymentResultQueryException': '결제 결과 조회에 실패했습니다: @error', - 'orderConfirmedQuotaRefreshed': '주문이 확인되었습니다. 할당량이 갱신되었습니다.', - 'paymentCompletedConfirming': '결제 완료. 확인 중…', - 'paymentCancelled': '결제가 취소되었습니다', - 'paypalOpenedCompleteInBrowser': 'PayPal이 열렸습니다. 브라우저에서 결제를 완료해 주세요.', - 'paypalOpenFailed': 'PayPal 결제 페이지를 열 수 없습니다', - 'paymentTestTitle': '결제 테스트', - 'paymentTestOrderInfo': '테스트 주문 정보', - 'paymentTestProductId': '상품 ID', - 'paymentTestProductDescription': '상품 설명', - 'paymentTestWechatDescription': 'WeChat Pay 결제 테스트', - 'paymentTestAlipayDescription': 'Alipay 결제 테스트', - 'paymentTestAmount': '금액', - 'paymentTestSelectAmount': '테스트 금액 선택', - 'paying': '결제 중...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': '결제 상태', - 'errorInfoWithMessage': '오류: @message', - 'retest': '다시 테스트', - 'paymentTestInstructionsTitle': '안내', - 'paymentTestInstructionsContent': '1. 테스트 금액을 선택하세요 (권장: ¥0.01)\n2. 결제 버튼을 클릭하여 시작\n3. 결제 앱에서 결제를 완료\n4. 돌아와서 결과를 확인', - 'startingWechatPayment': 'WeChat Pay 시작 중...', - 'startingAlipayPayment': 'Alipay 시작 중...', - 'wechatPaymentSuccess': 'WeChat Pay 결제 성공!', - 'wechatPaymentFailed': 'WeChat Pay 결제 실패', - 'wechatPaymentLaunchFailed': 'WeChat Pay 실행에 실패했습니다', - 'cannotLaunchWechatPayment': 'WeChat Pay를 실행할 수 없습니다', - 'wechatPaymentException': 'WeChat Pay 예외', - 'wechatPaymentTestCompleted': 'WeChat Pay 결제 테스트 완료', - 'alipayPaymentSuccess': 'Alipay 결제 성공!', - 'alipayPaymentFailed': 'Alipay 결제 실패', - 'alipayPaymentLaunchFailed': 'Alipay 실행에 실패했습니다', - 'cannotLaunchAlipayPayment': 'Alipay를 실행할 수 없습니다', - 'alipayPaymentException': 'Alipay 예외', - "insufficientIntegral": "Insufficient integral", + 'availablePackages': '이용 가능한 패키지', + 'remainingQuota': '잔여 한도', + 'totalQuota': '총 한도', + 'remaining': '잔여', + 'featureDescription': '기능 설명', + 'paymentSuccess': '결제 성공', + 'paymentFailed': '결제 실패', + 'gotIt': '확인', + 'paymentFailedTryAgain': '결제에 실패했습니다. 다시 시도해 주세요.', + 'selectPaymentMethod': '결제 수단 선택', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'WeChat Pay 주문 생성에 실패했습니다', + 'alipayOrderCreateFailed': 'Alipay 주문 생성에 실패했습니다', + 'appleOrderCreateFailed': 'Apple 주문 생성에 실패했습니다', + 'googleOrderCreateFailed': 'Google 주문 생성에 실패했습니다', + 'paypalOrderCreateFailed': 'PayPal 주문 생성에 실패했습니다', + 'paymentException': '결제 예외', + 'paymentLaunchFailed': '결제 실행에 실패했습니다', + 'paymentExceptionWithError': '결제 예외: @error', + 'paymentProcessingCheckLater': '주문이 처리 중입니다. 나중에 확인해 주세요.', + 'paymentResultQueryException': '결제 결과 조회에 실패했습니다: @error', + 'orderConfirmedQuotaRefreshed': '주문이 확인되었습니다. 할당량이 갱신되었습니다.', + 'paymentCompletedConfirming': '결제 완료. 확인 중…', + 'paymentCancelled': '결제가 취소되었습니다', + 'paypalOpenedCompleteInBrowser': 'PayPal이 열렸습니다. 브라우저에서 결제를 완료해 주세요.', + 'paypalOpenFailed': 'PayPal 결제 페이지를 열 수 없습니다', + 'paymentTestTitle': '결제 테스트', + 'paymentTestOrderInfo': '테스트 주문 정보', + 'paymentTestProductId': '상품 ID', + 'paymentTestProductDescription': '상품 설명', + 'paymentTestWechatDescription': 'WeChat Pay 결제 테스트', + 'paymentTestAlipayDescription': 'Alipay 결제 테스트', + 'paymentTestAmount': '금액', + 'paymentTestSelectAmount': '테스트 금액 선택', + 'paying': '결제 중...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': '결제 상태', + 'errorInfoWithMessage': '오류: @message', + 'retest': '다시 테스트', + 'paymentTestInstructionsTitle': '안내', + 'paymentTestInstructionsContent': + '1. 테스트 금액을 선택하세요 (권장: ¥0.01)\n2. 결제 버튼을 클릭하여 시작\n3. 결제 앱에서 결제를 완료\n4. 돌아와서 결과를 확인', + 'startingWechatPayment': 'WeChat Pay 시작 중...', + 'startingAlipayPayment': 'Alipay 시작 중...', + 'wechatPaymentSuccess': 'WeChat Pay 결제 성공!', + 'wechatPaymentFailed': 'WeChat Pay 결제 실패', + 'wechatPaymentLaunchFailed': 'WeChat Pay 실행에 실패했습니다', + 'cannotLaunchWechatPayment': 'WeChat Pay를 실행할 수 없습니다', + 'wechatPaymentException': 'WeChat Pay 예외', + 'wechatPaymentTestCompleted': 'WeChat Pay 결제 테스트 완료', + 'alipayPaymentSuccess': 'Alipay 결제 성공!', + 'alipayPaymentFailed': 'Alipay 결제 실패', + 'alipayPaymentLaunchFailed': 'Alipay 실행에 실패했습니다', + 'cannotLaunchAlipayPayment': 'Alipay를 실행할 수 없습니다', + 'alipayPaymentException': 'Alipay 예외', + "insufficientIntegral": "포인트 부족", "insufficientBalanceDesc": - 'Insufficient balance, please go to the corresponding recharge page to recharge.', - "recharge": 'Go to Recharge', + '잔액이 부족합니다. 해당 충전 페이지에서 충전해 주세요.', + "recharge": '충전하러 가기', "aiMemberExpiredDesc": - 'AI membership expired, please go to the membership recharge page to renew.', + 'AI 멤버십이 만료되었습니다. 멤버십 충전 페이지에서 갱신해 주세요.', // 商品模块 - AI商品页 - 'musicAndRecommendation': 'Music & Recommendation', - 'navigationAndRoutes': 'Navigation & Routes', - 'nearbySearch': 'Nearby Search', - 'newsInformation': 'News', - 'communicationAssistant': 'Communication Assistant', + 'musicAndRecommendation': '음악 및 추천', + 'navigationAndRoutes': '내비게이션 및 경로', + 'nearbySearch': '주변 검색', + 'newsInformation': '뉴스', + 'communicationAssistant': '커뮤니케이션 어시스턴트', 'aiHeaderDesc1': - 'Longer conversation quota, more tool calls, extended context length.', + '더 긴 대화 한도, 더 많은 도구 호출, 확장된 컨텍스트 길이.', 'aiHeaderDesc2': - 'Suitable for agent Q&A, summarization, analysis, and task execution.', - 'musicSearchPlaybackControl': 'Music library search and playback control', + '에이전트 Q&A, 요약, 분석 및 작업 실행에 적합합니다.', + 'musicSearchPlaybackControl': '음악 라이브러리 검색 및 재생 제어', 'smartPlaylistAndSimilarRecommendations': - 'Smart playlist and similar song recommendations', + '스마트 재생목록 및 유사 곡 추천', 'routePlanningAndCongestionAvoidance': - 'Route planning and congestion avoidance', - 'voiceBroadcastAndWaypoints': 'Voice broadcast and waypoint settings', - 'realTimeWeatherForecast': 'Real-time weather and forecast', - 'clothingAdviceAndTravelReminders': 'Clothing advice and travel reminders', - 'poiSearchFoodGasParking': 'POI search: dining / gas / parking', - 'ratingsHoursAndDirectRoutes': 'Ratings, business hours, and direct routing', - 'hotNewsAndTopicOverview': 'Hot news and topic overview', - 'longArticleSummariesAndKeyPoints': 'Long-article summaries and key points', - 'helpCallAndSMS': 'Help with calls and SMS', + '경로 계획 및 정체 구간 우회', + 'voiceBroadcastAndWaypoints': '음성 안내 및 경유지 설정', + 'realTimeWeatherForecast': '실시간 날씨 및 예보', + 'clothingAdviceAndTravelReminders': '의류 조언 및 여행 알림', + 'poiSearchFoodGasParking': 'POI 검색: 맛집 / 주유소 / 주차장', + 'ratingsHoursAndDirectRoutes': '평점, 영업 시간 및 바로 경로 안내', + 'hotNewsAndTopicOverview': '인기 뉴스 및 주제 개요', + 'longArticleSummariesAndKeyPoints': '긴 기사 요약 및 핵심 포인트', + 'helpCallAndSMS': '전화 및 문자 도움', 'templatedMessagesAndScheduleReminders': - 'Template messages and schedule reminders', + '템플릿 메시지 및 일정 알림', 'aiDisclaimer': - 'Features depend on device permissions, service availability, and network conditions.', + '기능은 기기 권한, 서비스 가용성 및 네트워크 상태에 따라 달라집니다.', // 商品模块 - 翻译商品页 - 'realtimeTranscription': 'Real-time Transcription', - 'sceneLexicon': 'Scenario Glossary', - 'subtitleDisplay': 'Subtitles', + 'realtimeTranscription': '실시간 받아쓰기', + 'sceneLexicon': '시나리오 용어집', + 'subtitleDisplay': '자막', 'transHeaderDesc1': '실시간 동시통역과 텍스트 번역, 저지연 음성 방송.', 'transHeaderDesc2': '여행, 비즈니스, 연설, 교육에 적합합니다.', 'translateZhEn': '중-영 번역', @@ -341,24 +360,24 @@ const Map koKR = { 'transDisclaimer': '번역 품질은 마이크, 네트워크 지연 및 주변 소음에 따라 달라집니다.', // 商品模块 - 会议商品页 - 'meetingRecording': 'Meeting Recording', - 'transcriptionAndSummary': 'Transcription & Summary', - 'keywordSearch': 'Keyword Search', - 'collaborationSharing': 'Collaboration & Sharing', + 'meetingRecording': '회의 녹음', + 'transcriptionAndSummary': '전사 및 요약', + 'keywordSearch': '키워드 검색', + 'collaborationSharing': '협업 및 공유', 'meetingHeaderDesc1': - 'Audio recording, transcription, keyword search, and auto summary.', + '오디오 녹음, 전사, 키워드 검색 및 자동 요약.', 'meetingHeaderDesc2': - 'Suitable for business meetings, class notes, and interview minutes.', - 'meetingAutoRecording': 'Auto recording and segmentation', - 'meetingSpeakerTagging': 'Speaker labeling', - 'meetingLongAudioTranscription': 'Long audio transcription', - 'meetingKeyPointSummary': 'Key point extraction', - 'meetingTopicNameSearch': 'Search by topic/name', - 'meetingTimelineJump': 'Timeline jump', - 'meetingExportSummary': 'Export minutes', - 'meetingMultiPlatformShare': 'Share across platforms', + '비즈니스 회의, 수업 필기 및 인터뷰 회의록에 적합합니다.', + 'meetingAutoRecording': '자동 녹음 및 분할', + 'meetingSpeakerTagging': '발언자 태깅', + 'meetingLongAudioTranscription': '장시간 오디오 전사', + 'meetingKeyPointSummary': '핵심 사항 추출', + 'meetingTopicNameSearch': '주제/이름으로 검색', + 'meetingTimelineJump': '타임라인 이동', + 'meetingExportSummary': '회의록 내보내기', + 'meetingMultiPlatformShare': '멀티 플랫폼 공유', 'meetingDisclaimer': - 'Use in quiet environments; performance depends on microphone and network.', + '조용한 환경에서 사용하세요. 성능은 마이크와 네트워크에 따라 달라집니다.', // 商品模块 - VIP会员页 'benefitsOverview': '혜택 개요', @@ -385,12 +404,12 @@ const Map koKR = { 'trans_001_name': '번역 기본 100', 'trans_002_name': '번역 기본 500', 'trans_003_name': '번역 기본 1000', - 'ai_001_desc': 'Includes 100 uses. Access core AI features.', - 'ai_002_desc': 'Includes 500 uses. Access core AI features.', - 'ai_003_desc': 'Includes 1000 uses. Access core AI features.', - 'meet_001_desc': 'Includes 100 meeting recordings/transcriptions.', - 'meet_002_desc': 'Includes 500 meeting recordings/transcriptions.', - 'meet_003_desc': 'Includes 1000 meeting recordings/transcriptions.', + 'ai_001_desc': 'AI 핵심 기능 100회 이용 포함.', + 'ai_002_desc': 'AI 핵심 기능 500회 이용 포함.', + 'ai_003_desc': 'AI 핵심 기능 1000회 이용 포함.', + 'meet_001_desc': '회의 녹음/전사 100회 포함.', + 'meet_002_desc': '회의 녹음/전사 500회 포함.', + 'meet_003_desc': '회의 녹음/전사 1000회 포함.', 'trans_001_desc': '번역 100회 포함(음성/텍스트).', 'trans_002_desc': '번역 500회 포함(음성/텍스트).', 'trans_003_desc': '번역 1000회 포함(음성/텍스트).', @@ -402,40 +421,40 @@ const Map koKR = { // 新手引导 'skip': "건너뛰기", - 'next': 'Next', - 'sayLilyHint': "Say \"Lily Lily\" to the mic", - 'imHere': "I’m here~", - 'guideWelcomeWakeAI': "Welcome to Voitrans! First, wake your AI “Lily”.", - 'aiReplyCompleted': "Lily has finished the reply!", - 'aiThinking': "Lily is thinking…", - 'guideAwakenSuccess': "Great! Lily is awake—ask it to help.", - 'confirmInput': "Confirm Input", - 'guideClickSendPrefix': "Tap send, ", - 'guideWeatherStart': "Tell Lily: “What’s the weather today?”", - 'guideWeatherInput': "What’s the weather today?", - 'guideWeatherSend': "Lily will report the weather in real time", - 'guideWeatherEnd': "Lily can report weather live—try other commands", - 'guideMusicStart': "Tell Lily: “Play some rock music”", - 'guideMusicInput': "Play some rock music", - 'guideMusicSend': "Lily will find music for you", - 'guideMusicEnd': "Lily found music—try other commands", - 'guideNavStart': "Tell Lily: “Navigate to Shenzhen Airport”", - 'guideNavInput': "Navigate to Shenzhen Airport", - 'guideNavSend': "Lily will plan the route", - 'guideNavEnd': "Navigation set—try other commands", + 'next': '다음', + 'sayLilyHint': "마이크에 \"Lily Lily\"라고 말하세요", + 'imHere': "여기 있어요~", + 'guideWelcomeWakeAI': "Voitrans에 오신 것을 환영합니다! 먼저 AI “Lily”를 깨워보세요.", + 'aiReplyCompleted': "Lily가 답변을 완료했습니다!", + 'aiThinking': "Lily가 생각 중이에요…", + 'guideAwakenSuccess': "좋아요! Lily가 깨어났습니다—도움을 요청해 보세요.", + 'confirmInput': "입력 확인", + 'guideClickSendPrefix': "보내기를 탭하세요, ", + 'guideWeatherStart': "Lily에게 말하세요: “오늘 날씨 어때?”", + 'guideWeatherInput': "오늘 날씨 어때?", + 'guideWeatherSend': "Lily가 실시간으로 날씨를 알려드릴 거예요", + 'guideWeatherEnd': "Lily가 실시간 날씨를 알려줄 수 있어요—다른 명령도 시도해 보세요", + 'guideMusicStart': "Lily에게 말하세요: “록 음악 틀어줘”", + 'guideMusicInput': "록 음악 틀어줘", + 'guideMusicSend': "Lily가 음악을 찾아드릴 거예요", + 'guideMusicEnd': "Lily가 음악을 찾았어요—다른 명령도 시도해 보세요", + 'guideNavStart': "Lily에게 말하세요: “선전 공항으로 안내해줘”", + 'guideNavInput': "선전 공항으로 안내해줘", + 'guideNavSend': "Lily가 경로를 계획할 거예요", + 'guideNavEnd': "내비게이션이 설정되었어요—다른 명령도 시도해 보세요", 'guideMeetingStart': - "Tell Lily: “Create a meeting reminder for 3pm tomorrow”", - 'guideMeetingInput': "Create a meeting reminder for 3pm tomorrow", - 'guideMeetingSend': "Lily will create a meeting reminder", - 'guideMeetingEnd': "Reminder created—try other commands", - 'guidePhoneStart': "Tell Lily: “Call Mom”", - 'guidePhoneInput': "Call Mom", - 'guidePhoneSend': "Lily will make the call", - 'guidePhoneEnd': "Call placed—try other commands", - 'guideSmsStart': "Tell Lily: “Send Dad a text: I’ll be home for dinner”", - 'guideSmsInput': "Text Dad: I’ll be home for dinner", - 'guideSmsSend': "Lily will send the message", - 'guideSmsEnd': "Message sent—voice control is convenient", + "Lily에게 말하세요: “내일 오후 3시 회의 알림 만들어줘”", + 'guideMeetingInput': "내일 오후 3시 회의 알림 만들어줘", + 'guideMeetingSend': "Lily가 회의 알림을 만들어드릴 거예요", + 'guideMeetingEnd': "알림이 생성되었어요—다른 명령도 시도해 보세요", + 'guidePhoneStart': "Lily에게 말하세요: “엄마한테 전화해줘”", + 'guidePhoneInput': "엄마한테 전화해줘", + 'guidePhoneSend': "Lily가 전화를 걸어드릴 거예요", + 'guidePhoneEnd': "전화가 걸렸어요—다른 명령도 시도해 보세요", + 'guideSmsStart': "Lily에게 말하세요: “아빠한테 문자 보내줘: 저녁에 집에 갈게요”", + 'guideSmsInput': "아빠한테 문자: 저녁에 집에 갈게요", + 'guideSmsSend': "Lily가 메시지를 보내드릴 거예요", + 'guideSmsEnd': "메시지가 전송되었어요—음성 제어가 편리하죠", // Meeting模块 - 首页与导航 "startMeeting": "회의 시작", @@ -449,38 +468,38 @@ const Map koKR = { 'recordingDetails': '녹음 상세 정보', 'aiSummary': 'AI 요약', 'meetingTranscript': '회의 원문', - 'files': 'Files', - 'mine': 'Mine', - 'connect': 'Connect', - 'allFiles': 'All Files', - 'searchInAllFiles': 'Search in all files', - 'from': 'From', - 'sortBy': 'Sort by', - 'creationTime': 'Creation Time', - 'bluetoothConnection': 'Bluetooth Connection', - 'meetingReconnect': 'Reconnect', - 'searching': 'Searching...', - 'searchFailed': 'Search failed, please check if Bluetooth is enabled', - 'aiPenNotFound': 'AI PEN device not found', - 'connectedToAiPen': 'Connected to AI PEN device', - 'checkingNewFiles': 'Checking for new files to import', - 'startingWifi': 'Starting Wi-Fi...', - 'newFilesDetected': 'New files detected, preparing to import', - 'noNewFiles': 'No new files to import', - 'connectingWifi': 'Connecting to Wi-Fi...', - 'wifiConnected': 'Wi-Fi connected successfully', - 'downloadingFiles': 'Downloading files...', - 'downloadingFileProgress': 'Total {total} files, downloading file {current}', - 'downloadComplete': 'Download complete', + 'files': '파일', + 'mine': '내 페이지', + 'connect': '연결', + 'allFiles': '모든 파일', + 'searchInAllFiles': '모든 파일에서 검색', + 'from': '보낸 사람', + 'sortBy': '정렬 기준', + 'creationTime': '생성 시간', + 'bluetoothConnection': '블루투스 연결', + 'meetingReconnect': '다시 연결', + 'searching': '검색 중...', + 'searchFailed': '검색 실패, 블루투스가 켜져 있는지 확인해 주세요', + 'aiPenNotFound': 'AI PEN 기기를 찾을 수 없습니다', + 'connectedToAiPen': 'AI PEN 기기에 연결되었습니다', + 'checkingNewFiles': '가져올 새 파일 확인 중', + 'startingWifi': 'Wi-Fi 시작 중...', + 'newFilesDetected': '새 파일 발견, 가져오기 준비 중', + 'noNewFiles': '가져올 새 파일이 없습니다', + 'connectingWifi': 'Wi-Fi에 연결 중...', + 'wifiConnected': 'Wi-Fi 연결 성공', + 'downloadingFiles': '파일 다운로드 중...', + 'downloadingFileProgress': '총 {total}개 파일 중 {current}번째 다운로드 중', + 'downloadComplete': '다운로드 완료', 'downloadCompleteInfo': - 'Download complete, {count} files in total, returning automatically in 2 seconds', + '다운로드 완료, 총 {count}개 파일, 2초 후 자동으로 돌아갑니다', // Meeting模块 - 录音功能 - 'startRecording': 'Start Recording', - 'liveRecording': 'Live Recording', - 'audioVideoRecording': 'Audio/Video Recording', - 'callRecording': 'Call Recording', - 'importAudio': 'Import Audio', + 'startRecording': '녹음 시작', + 'liveRecording': '실시간 녹음', + 'audioVideoRecording': '음성/영상 녹음', + 'callRecording': '통화 녹음', + 'importAudio': '오디오 가져오기', 'meetingRecordExitTitle': '녹음 종료', // 退出录音 'meetingRecordExitMessage': '나가기 전에 수행할 작업을 선택하세요', // 请选择离开后的操作 'meetingRecordEndAndSave': '종료하고 저장', // 结束录音并保存 @@ -490,215 +509,220 @@ const Map koKR = { 'meetingRecordStopFailed': '녹음을 중지하지 못했습니다. 다시 시도해주세요.', // 结束录音失败,请重试 'meetingRecordSaveFailed': '녹음을 저장하지 못했습니다. 다시 시도해주세요.', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': '녹음 중', // 录音进行中 - 'meetingRecordRecordingNotificationBody': '백그라운드에서 녹음 중입니다. 탭하여 앱으로 돌아가세요.', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + '백그라운드에서 녹음 중입니다. 탭하여 앱으로 돌아가세요.', // 正在后台录音,点击返回应用 'overlayPermissionTitle': '다른 앱 위에 표시', // 悬浮窗权限 - 'overlayPermissionTranslationDesc': '통화 중 또는 오디오/비디오 번역 중 번역 결과를 표시하려면 오버레이 권한이 필요합니다. 이를 통해 다른 앱을 사용하는 동안에도 실시간 번역을 볼 수 있습니다.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 - 'overlayPermissionRecordingDesc': '녹음 중 녹음 플로팅 바(타이머/일시정지/계속)를 표시하려면 오버레이 권한이 필요합니다.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 - 'overlayPermissionOpenSettingsFailed': '시스템 설정을 자동으로 열 수 없습니다. 설정을 열고 오버레이 권한을 수동으로 허용해주세요.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 - 'transcribing': 'Transcribing...', - 'summarizing': 'Summarizing...', - 'analyzing': 'Analyzing...', - 'summaryComplete': 'Summary Complete', - 'generate': 'Generate', - 'overview': 'Overview', - 'transcription': 'Transcription', - 'summary': 'Summary', - 'mindMap': 'Mind Map', - 'editSpeaker': 'Edit', - 'nameSpeaker': 'Name Speaker', + 'overlayPermissionTranslationDesc': + '통화 중 또는 오디오/비디오 번역 중 번역 결과를 표시하려면 오버레이 권한이 필요합니다. 이를 통해 다른 앱을 사용하는 동안에도 실시간 번역을 볼 수 있습니다.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 + 'overlayPermissionRecordingDesc': + '녹음 중 녹음 플로팅 바(타이머/일시정지/계속)를 표시하려면 오버레이 권한이 필요합니다.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 + 'overlayPermissionOpenSettingsFailed': + '시스템 설정을 자동으로 열 수 없습니다. 설정을 열고 오버레이 권한을 수동으로 허용해주세요.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 + 'transcribing': '전사 중...', + 'summarizing': '요약 중...', + 'analyzing': '분석 중...', + 'summaryComplete': '요약 완료', + 'generate': '생성', + 'overview': '개요', + 'transcription': '전사', + 'summary': '요약', + 'mindMap': '마인드맵', + 'editSpeaker': '수정', + 'nameSpeaker': '발언자 이름 지정', // Meeting模块 - 转写与总结 - 'reSummarize': 'Re-summarize', - 'dateAndTime': 'Date & Time', - 'location': 'Location', - 'attendees': 'Attendees', - 'inputLocation': 'Enter Location', - 'inputAttendees': 'Enter Attendees', + 'reSummarize': '다시 요약', + 'dateAndTime': '날짜 및 시간', + 'location': '장소', + 'attendees': '참석자', + 'inputLocation': '장소 입력', + 'inputAttendees': '참석자 입력', // Meeting模块 - 模版与生成 - 'selectSummaryTemplate': 'Select Summary Template', - 'useThisTemplate': 'Use This Template', - 'lastUsed': 'Last Used', - 'create': '생성', - 'templateDetails': '템플릿 상세', - 'tag': '태그', - 'description': '설명', - 'template': '템플릿', - 'deleteTemplate': '템플릿 삭제', - 'deleteTemplateConfirm': '이 템플릿을 삭제하시겠습니까?', - 'editTemplate': '템플릿 편집', - 'createTemplate': '템플릿 생성', - 'name': '이름', - 'templateContentHint': '템플릿 내용을 입력해 주세요! 팁: 위의 AI 버튼을 클릭하면 입력한 이름과 설명을 기반으로 템플릿 내용을 빠르게 생성할 수 있습니다', - 'inputNameHint': '이름을 입력해 주세요', - 'inputDescHint': '설명을 입력해 주세요', - 'custom': '사용자 정의', - 'pleaseEnter': '입력해 주세요', - 'viewAll': 'View All', - 'recordingLanguage': 'Recording Language', - 'chineseSimplified': 'Chinese Mandarin (Simplified)', - 'meetingGenerateNow': 'Generate Now', - 'keyEventsAnalyzed': 'Analyzed {count} key events.', + 'selectSummaryTemplate': '요약 템플릿 선택', + 'useThisTemplate': '이 템플릿 사용', + 'lastUsed': '최근 사용', + 'create': '생성', + 'templateDetails': '템플릿 상세', + 'tag': '태그', + 'description': '설명', + 'template': '템플릿', + 'deleteTemplate': '템플릿 삭제', + 'deleteTemplateConfirm': '이 템플릿을 삭제하시겠습니까?', + 'editTemplate': '템플릿 편집', + 'createTemplate': '템플릿 생성', + 'name': '이름', + 'templateContentHint': + '템플릿 내용을 입력해 주세요! 팁: 위의 AI 버튼을 클릭하면 입력한 이름과 설명을 기반으로 템플릿 내용을 빠르게 생성할 수 있습니다', + 'inputNameHint': '이름을 입력해 주세요', + 'inputDescHint': '설명을 입력해 주세요', + 'custom': '사용자 정의', + 'pleaseEnter': '입력해 주세요', + 'viewAll': '전체 보기', + 'recordingLanguage': '녹음 언어', + 'chineseSimplified': '중국어 보통화(간체)', + 'meetingGenerateNow': '지금 생성', + 'keyEventsAnalyzed': '{count}개의 주요 이벤트를 분석했습니다.', 'aiAnalysisDesc': - 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', + 'AI 분석으로 녹음에서 주요 이벤트를 식별하고, 중요한 이벤트를 선택하여 AI로 생성할 수 있습니다.', // Meeting模块 - 文件操作 - 'importing': 'Importing...', - 'batchImporting': 'Batch importing...', - 'importingLocalRecordings': 'Importing local recordings...', - 'importFailed': 'Import file failed: {filePath}, error: {error}', - 'importSuccess': 'Successfully imported {count} local recordings', - 'importError': 'Import failed: {error}', - 'pleaseSelectAudioFile': 'Please select audio file', - 'shareAudio': 'Share Meeting Audio', - 'shareComplete': 'Share complete!', - 'shareFailed': 'Share failed: {error}', - 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', + 'importing': '가져오는 중...', + 'batchImporting': '일괄 가져오기 중...', + 'importingLocalRecordings': '로컬 녹음 파일 가져오는 중...', + 'importFailed': '파일 가져오기 실패: {filePath}, 오류: {error}', + 'importSuccess': '{count}개의 로컬 녹음 파일을 가져왔습니다', + 'importError': '가져오기 실패: {error}', + 'pleaseSelectAudioFile': '오디오 파일을 선택해 주세요', + 'shareAudio': '회의 오디오 공유', + 'shareComplete': '공유 완료!', + 'shareFailed': '공유 실패: {error}', + 'fileProcessingFailed': '파일 처리 실패: {filePath}, 오류: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': '마인드맵 저장', - 'shareMindMap': 'Share Mind Map', - 'shareSuccess': 'Share Success', + 'saveMindMap': '마인드맵 저장', + 'shareMindMap': '마인드맵 공유', + 'shareSuccess': '공유 성공', // Meeting模块 - AI问答 - 'askAI': 'Ask AI ...', - 'askAIPrompt': 'What can I help you with today?', - 'continueAsk': 'Continue Asking', - 'todoList': 'To-Do List', - 'extractConclusion': 'Extract Conclusion', - 'generateKeyIndicators': 'Generate Key Indicators', + 'askAI': 'AI에게 질문...', + 'askAIPrompt': '오늘 무엇을 도와드릴까요?', + 'continueAsk': '계속 질문하기', + 'todoList': '할 일 목록', + 'extractConclusion': '결론 추출', + 'generateKeyIndicators': '핵심 지표 생성', // Meeting模块 - 分享与导出 - 'shareLink': 'Share Link', - 'copyTranscript': 'Copy Transcript', - 'copySummary': 'Copy Summary', - 'exportAudio': 'Export Audio', - 'exportTranscript': 'Export Transcript', - 'shareMeetingAudio': 'Share Meeting Audio', - 'exportSummary': 'Export Summary', - 'exportAs': 'Export As', - 'exportingPDF': 'Exporting PDF...', - 'export': '내보내기', + 'shareLink': '링크 공유', + 'copyTranscript': '전사 복사', + 'copySummary': '요약 복사', + 'exportAudio': '오디오 내보내기', + 'exportTranscript': '전사 내보내기', + 'shareMeetingAudio': '회의 오디오 공유', + 'exportSummary': '요약 내보내기', + 'exportAs': '다른 형식으로 내보내기', + 'exportingPDF': 'PDF 내보내는 중...', + 'export': '내보내기', // Meeting模块 - 发言者 'applyToAllParagraphs': '이 발언자의 모든 문단에 적용', 'summaryWillBeUpdatedAutomatically': '요약은 템플릿에 따라 자동으로 업데이트됩니다', - 'nameCurrentSpeaker': 'Name Current Speaker', - 'recentlyUsedNames': 'Recently Used Names', - 'applyToCurrentParagraph': 'Apply to Current Paragraph', - 'totalTime': 'Total Time', + 'nameCurrentSpeaker': '현재 발언자 이름 지정', + 'recentlyUsedNames': '최근 사용한 이름', + 'applyToCurrentParagraph': '현재 문단에 적용', + 'totalTime': '총 시간', 'summarySpeakerWillBeUpdatedAutomatically': - 'Summary speakers will be updated automatically', + '요약의 발언자가 자동으로 업데이트됩니다', // Meeting模块 - 云端同步 - 'syncToCloud': 'Sync to Cloud', + 'syncToCloud': '클라우드에 동기화', 'syncToCloudTip': - 'Automatically sync your recordings to the cloud, you can play, manage and share recordings through any VOITRANS APP or VOITRANS Web (web.voitrans.com).', - 'syncToVoitransApp': 'Sync VOITRANS APP', - 'transcriptionRecord': 'Transcription Record', + '녹음을 클라우드에 자동으로 동기화합니다. VOITRANS APP 또는 VOITRANS Web(web.voitrans.com)을 통해 녹음을 재생, 관리 및 공유할 수 있습니다.', + 'syncToVoitransApp': 'VOITRANS APP에 동기화', + 'transcriptionRecord': '전사 기록', // Meeting模块 - 我的页面 - 'transcriptionRecords': 'Transcription Records', - 'templateCommunity': 'Template Community', - 'comingSoon': 'Coming Soon', - 'integration': 'Integration', - 'voitransPrivateCloud': 'VOITRANS PRIVATE CLOUD', - 'enabled': 'Enabled', - 'disabled': 'Disabled', - 'myVoitransDevice': 'My VOITRANS Device', - 'helpAndFeedback': 'Help & Feedback', - 'aboutVoitrans': 'About VOITRANS', - 'meetingDays': 'Days', - 'meetingHours': 'Hours', - 'voitransAiMember': 'Voitrans AI Member', - 'unlockStarterMember': 'Unlock Starter Member', - 'bindDeviceToActivate': 'Bind Voitrans device to activate Starter membership', - 'unlockNow': 'Unlock Now', + 'transcriptionRecords': '전사 기록', + 'templateCommunity': '템플릿 커뮤니티', + 'comingSoon': '곧 출시', + 'integration': '통합', + 'voitransPrivateCloud': 'VOITRANS 프라이빗 클라우드', + 'enabled': '활성화됨', + 'disabled': '비활성화됨', + 'myVoitransDevice': '내 VOITRANS 기기', + 'helpAndFeedback': '도움말 및 피드백', + 'aboutVoitrans': 'VOITRANS 정보', + 'meetingDays': '일', + 'meetingHours': '시간', + 'voitransAiMember': 'Voitrans AI 멤버', + 'unlockStarterMember': '스타터 멤버 잠금 해제', + 'bindDeviceToActivate': 'Voitrans 기기를 연결하여 스타터 멤버십을 활성화하세요', + 'unlockNow': '지금 잠금 해제', // Meeting模块 - 会员与升级 - 'comparison': 'Comparison', - 'detailedInfo': 'Detailed Information', - 'monthlyTranscriptionTime': 'Monthly Transcription Time', - 'unlimited': 'Unlimited', - 'professionalTemplates': 'Professional Templates', - 'limited': 'Limited', - 'fullTemplates': 'Full Templates', - 'professionalTerms': 'Professional Terms', - 'customTemplates': 'Custom Templates', - 'visualMindMap': 'Visual Mind Map', - 'speakerIdentification': 'Speaker Identification', - 'aiVoiceEnhancement': 'AI Voice Enhancement', - 'audioImport': 'Audio Import', - 'multipleExportFormats': 'Multiple Export Formats', - 'professionalSummaryTemplates': 'Professional Summary Templates', + 'comparison': '비교', + 'detailedInfo': '상세 정보', + 'monthlyTranscriptionTime': '월간 전사 시간', + 'unlimited': '무제한', + 'professionalTemplates': '전문 템플릿', + 'limited': '제한됨', + 'fullTemplates': '전체 템플릿', + 'professionalTerms': '전문 용어', + 'customTemplates': '맞춤 템플릿', + 'visualMindMap': '비주얼 마인드맵', + 'speakerIdentification': '발언자 식별', + 'aiVoiceEnhancement': 'AI 음성 향상', + 'audioImport': '오디오 가져오기', + 'multipleExportFormats': '다양한 내보내기 형식', + 'professionalSummaryTemplates': '전문 요약 템플릿', 'professionalTemplateDesc': - 'Professional template design to improve your work efficiency. Customized according to industry needs.', + '업무 효율성을 높이는 전문 템플릿 디자인. 업종별 요구에 맞춰 맞춤 제작됩니다.', 'customTemplateDesc': - 'You can customize summary prompts according to your needs and use them to generate the required summaries.', + '필요에 따라 요약 프롬프트를 맞춤 설정하고, 이를 사용하여 필요한 요약을 생성할 수 있습니다.', 'askAiDesc': - 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', + '녹음에서 심층 정보를 지능적으로 추출하고, 데이터 표, 주요 논의 결론, 할 일 목록, 보고서 이메일 등 서식화된 콘텐츠를 원클릭으로 생성합니다.', 'visualMindMapDesc': - 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', + '요약을 넘어서 마인드맵으로 핵심 사항을 정리하고 시각화하여 전체 내용을 더 효과적으로 이해할 수 있습니다.', 'templateCommunityDesc': - 'Discover, share, and get inspiration from the template library created by users.', + '사용자들이 만든 템플릿 라이브러리에서 영감을 발견하고 공유하세요.', 'speakerIdentificationDesc': - 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', + '오디오 전사에서 발언자 식별을 지원하여 회의 또는 통화 내용을 더 직관적으로 복원합니다. 동시에 요약의 정확도도 향상됩니다.', 'privateCloudSyncDesc': - 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', + '녹음과 전사 내용이 전용 클라우드 서버에 안전하게 저장되며, 업로드 및 다운로드 시 완전히 암호화되어 개인정보와 보안을 보장합니다.', 'aiVoiceEnhancementDesc': - 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', + 'AI 음성 향상은 다양한 노이즈 감소 설정을 지원하여 배경 소음을 지능적으로 제거하고, 음성 선명도를 높이며, 오디오 재생 품질을 향상시킵니다.', 'audioImportDesc': - 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', + '음성 메모, Google 드라이브 등 로컬 또는 타사 앱에서 오디오 파일을 쉽게 가져올 수 있습니다.', 'multipleExportFormatsDesc': - 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', - 'upgradeMembership': 'Upgrade Your Membership', - 'yearlySubscription': 'Yearly Subscription', - 'monthlySubscription': 'Monthly Subscription', - 'proMonthly': 'Pro ¥60/month', + '오디오 녹음, 전사 텍스트 및 요약을 다양한 형식(TXT, PDF, JPEG)으로 내보내 필요에 맞게 활용하세요.', + 'upgradeMembership': '멤버십 업그레이드', + 'yearlySubscription': '연간 구독', + 'monthlySubscription': '월간 구독', + 'proMonthly': 'Pro ¥60/월', 'proMonthlyDesc': - '7-day free trial, then ¥800/year. Cancel anytime before trial ends.', - 'sevenDayTrial': '7-day Free Trial', - 'unlimitedMonthly': 'Unlimited ¥120/month', + '7일 무료 체험 후 ¥800/년. 체험 기간 종료 전 언제든지 취소 가능.', + 'sevenDayTrial': '7일 무료 체험', + 'unlimitedMonthly': 'Unlimited ¥120/월', 'unlimitedMonthlyDesc': - '7-day free trial, then ¥1600/year. Cancel anytime before trial ends.', - 'trialNote': '*Free trial for 7 days, then charged annually, cancel anytime.', + '7일 무료 체험 후 ¥1600/년. 체험 기간 종료 전 언제든지 취소 가능.', + 'trialNote': '*7일 무료 체험 후 연간 결제, 언제든지 취소 가능.', 'proPrice': 'Pro ¥120', - 'proMonthlyPrice': '¥120/month', - 'subscribe': 'Subscribe', + 'proMonthlyPrice': '¥120/월', + 'subscribe': '구독', 'unlimitedPrice': 'Unlimited ¥198', - 'unlimitedMonthlyPrice': '¥198/month', + 'unlimitedMonthlyPrice': '¥198/월', 'upgradeNote': - '*After upgrading subscription, the remaining days of the original subscription will be automatically calculated and refunded to your payment account', - 'buyMoreTranscriptionTime': 'Buy More Transcription Time', - 'sixThousandMinutes': '6,000 minutes', - 'threeThousandMinutes': '3,000 minutes', - 'sixHundredMinutes': '600 minutes', - 'oneHundredTwentyMinutes': '120 minutes', - 'validityPeriod': '*Validity Period: ', + '*구독 업그레이드 시, 기존 구독의 잔여 기간이 자동으로 계산되어 결제 계정으로 환불됩니다', + 'buyMoreTranscriptionTime': '전사 시간 추가 구매', + 'sixThousandMinutes': '6,000분', + 'threeThousandMinutes': '3,000분', + 'sixHundredMinutes': '600분', + 'oneHundredTwentyMinutes': '120분', + 'validityPeriod': '*유효 기간: ', 'validityNote': - 'Activated immediately after purchase, valid for 2 years after activation.', - 'purchase': 'Purchase', + '구매 후 즉시 활성화되며, 활성화 후 2년간 유효합니다.', + 'purchase': '구매', // Meeting模块 - 录音语言 - 'recordLanguage': 'Recording Language', - 'cantonese': 'Cantonese', - 'sichuan': 'Sichuan Dialect', - 'shanghai': 'Shanghai Dialect', + 'recordLanguage': '녹음 언어', + 'cantonese': '광둥어', + 'sichuan': '쓰촨 방언', + 'shanghai': '상하이 방언', // Meeting模块 - 错误提示 - 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': '분석에 실패했습니다. 나중에 다시 시도해 주세요', - 'transcriptionFailed': '전사에 실패했습니다. 나중에 다시 시도해 주세요', - 'summaryFailed': '요약에 실패했습니다. 나중에 다시 시도해 주세요', - 'summaryFailedShort': '요약 실패', - 'transcriptionFailedShort': '전사 실패', + 'meetingUnknownLanguage': '알 수 없는 언어', + 'analysisFailed': '분석에 실패했습니다. 나중에 다시 시도해 주세요', + 'transcriptionFailed': '전사에 실패했습니다. 나중에 다시 시도해 주세요', + 'summaryFailed': '요약에 실패했습니다. 나중에 다시 시도해 주세요', + 'summaryFailedShort': '요약 실패', + 'transcriptionFailedShort': '전사 실패', // Meeting模块 - 播放器 - 'playerNotReady': '오디오 플레이어가 준비되지 않았습니다. 잠시 기다려 주세요', - 'playFailed': '재생 실패', - 'audioFileNotFound': '오디오 파일을 찾을 수 없습니다', - 'fetchingAudio': '클라우드에서 오디오를 가져오는 중...', - 'playerLoadFailed': '오디오 플레이어를 로드하지 못했습니다', + 'playerNotReady': '오디오 플레이어가 준비되지 않았습니다. 잠시 기다려 주세요', + 'playFailed': '재생 실패', + 'audioFileNotFound': '오디오 파일을 찾을 수 없습니다', + 'fetchingAudio': '클라우드에서 오디오를 가져오는 중...', + 'playerLoadFailed': '오디오 플레이어를 로드하지 못했습니다', // 设置页 "systemSettings": "시스템 설정", @@ -707,10 +731,10 @@ const Map koKR = { "translationRecharge": "번역료", "meetingAssistantRecharge": "회의 어시스턴트료", "cloudSync": "클라우드 동기화료", - "memberService": "Member Service", - "bindRewardTitle": "Rewards", + "memberService": "멤버 서비스", + "bindRewardTitle": "리워드", "bindRewardSimpleDesc": - "First bind device reward has been issued. Tap OK to close.", + "첫 기기 연결 보상이 지급되었습니다. 확인을 탭하여 닫으세요.", "joinDevice": "연결된 기기:", "accountId": "계정 ID:", "systemSetting": "시스템 설정", @@ -756,20 +780,20 @@ const Map koKR = { "loading": "로딩 중...", // 设备管理模块 - "deviceTypeUnknown": "Unknown Device", - "deviceTypeClassicBluetoothHeadset": "Classic Bluetooth Headset", - "deviceTypeBleBluetoothHeadset": "BLE Bluetooth Headset", - "deviceTypeSmartVoiceRecorder": "Smart Voice Recorder", - "deviceTypeSmartEye": "Smart Glasses", + "deviceTypeUnknown": "알 수 없는 기기", + "deviceTypeClassicBluetoothHeadset": "클래식 블루투스 헤드셋", + "deviceTypeBleBluetoothHeadset": "BLE 블루투스 헤드셋", + "deviceTypeSmartVoiceRecorder": "스마트 음성 녹음기", + "deviceTypeSmartEye": "스마트 안경", "unbind": "연결 해제", - "noDevicesBound": "No devices bound yet", - "pleaseBindDeviceFirst": "Please bind a device first to manage", - "noMacAddress": "No MAC Address", - "licenseCode": "License Code", - "confirmUnbind": "Confirm Unbind", + "noDevicesBound": "연결된 기기가 없습니다", + "pleaseBindDeviceFirst": "관리하려면 먼저 기기를 연결해 주세요", + "noMacAddress": "MAC 주소 없음", + "licenseCode": "라이선스 코드", + "confirmUnbind": "연결 해제 확인", "confirmUnbindMessage": - "Are you sure you want to unbind device \"{deviceName}\"?", - "confirmUnbindAction": "Confirm Unbind", + "\"{deviceName}\" 기기의 연결을 해제하시겠습니까?", + "confirmUnbindAction": "연결 해제 확인", // Agent模块 - 主界面 "Lily": "Lily", @@ -799,21 +823,22 @@ const Map koKR = { "loadMoreMessages": "메시지 더 불러오기...", "loadFailedClickRetry": "불러오기 실패, 클릭하여 재시도", "swipeUpForMore": "더 보려면 위로 스와이프하세요", - "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! - "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': '활성화 시: AI가 말하는 동안 사용자의 음성으로 중단되지 않으며, 한 번에 하나의 대화 라운드만 처리할 수 있습니다. 새 라운드를 시작하려면 웨이크업 워드를 말하세요.', + "callingTool": "도와드리고 있습니다. 잠시만 기다려 주세요!", // 正在帮您,请稍等! + "voice_interrupt": "음성 중단", // 语音打断 + 'voice_interrupt_tip': + '활성화 시: AI가 말하는 동안 사용자의 음성으로 중단되지 않으며, 한 번에 하나의 대화 라운드만 처리할 수 있습니다. 새 라운드를 시작하려면 웨이크업 워드를 말하세요.', // Agent模块 - 预设提示词 - "presetMusic": "Play some music", // 来点音乐 - "presetNavigation": "Navigation to", // 导航 - "presetWeather": "Today's weather", // 今日天气 - "presetNews": "Today's news", // 今日新闻 - "presetFood": "Nearby food", // 美食 - "playSomeMusic": "Play some popular music", // 播放一些流行音乐 - "navigationTo": "Please help me navigate to", // 导航到 - "todayWeather": "How's the weather today?", // 今日天气 - "todayNews": "What's the news today?", // 今日新闻 - "nearbyFood": "What delicious food is nearby?", // 美食 + "presetMusic": "음악 틀어줘", // 来点音乐 + "presetNavigation": "내비게이션", // 导航 + "presetWeather": "오늘 날씨", // 今日天气 + "presetNews": "오늘 뉴스", // 今日新闻 + "presetFood": "주변 맛집", // 美食 + "playSomeMusic": "인기 음악 틀어줘", // 播放一些流行音乐 + "navigationTo": "안내해줘", // 导航到 + "todayWeather": "오늘 날씨 어때?", // 今日天气 + "todayNews": "오늘 뉴스 뭐 있어?", // 今日新闻 + "nearbyFood": "근처에 맛있는 거 뭐 있어?", // 美食 // Agent模块 - 欢迎消息与权限 'welcomeMessage': '안녕하세요! 저는 **샤오옌**입니다. 다음과 같은 도움을 드릴 수 있습니다:\n\n' @@ -852,6 +877,13 @@ const Map koKR = { 'reportDescriptionHint': '신고 사유를 알고 싶습니다. 겪으신 문제를 설명해주세요.', 'generatedByAi': 'AI가 생성함', + // Agent模块 - 工具调用 + 'toolCall': '도구 호출', + 'noResult': '결과 없음', + 'noToolCallContentToCopy': '복사할 도구 호출 내용이 없습니다', + 'toolCallDetails': '도구 호출 세부사항:', + 'toolCallContentCopied': '도구 호출 내용이 클립보드에 복사되었습니다', + // Agent模块 - 音乐卡片 'recommendedMusic': '추천 음악입니다:', 'playList': '재생 목록', @@ -872,6 +904,28 @@ const Map koKR = { "bicycling": "자전거", "tsransit": "대중교통", + // Agent模块 - 导航选择 + 'selectNavigationApp': '내비게이션 앱 선택', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Amap으로 내비게이션', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Baidu Maps로 내비게이션', + 'googleMap': 'Google 지도', + 'useGoogleNavigation': 'Google 지도로 내비게이션', + 'appleMap': 'Apple 지도', + 'useAppleNavigation': 'Apple 지도로 내비게이션', + 'builtInNavigation': '내장 내비게이션', + 'useBuiltInNavigation': '내장 지도로 내비게이션', + 'navigationStartFailed': '내비게이션 시작 실패', + 'cannotPlayMusicListRetryLater': '음악 목록을 재생할 수 없습니다. 나중에 다시 시도해 주세요', + 'cannotPlaySong': '노래를 재생할 수 없습니다', + 'openMapError': '지도를 여는 중 오류가 발생했습니다', + 'pleaseInstallAmapApp': 'Amap 앱을 설치해 주세요', + 'pleaseInstallBaiduMapApp': 'Baidu Maps 앱을 설치해 주세요', + 'appleMapStartFailed': 'Apple 지도 시작 실패', + 'appleMapUnavailable': 'Apple 지도를 사용할 수 없습니다', + 'openAppleMapError': 'Apple 지도를 여는 중 오류가 발생했습니다', + // Agent模块 - 天气卡片 'weatherQuery': '날씨 정보 조회 중:', 'highest': '최고', @@ -916,8 +970,8 @@ const Map koKR = { "strongWind": "강풍", // 翻译模块 - 中间层 - "pictureTranslation": "Picture Translation", - "textTranslation": "Text Translation", + "pictureTranslation": "사진 번역", + "textTranslation": "텍스트 번역", // 翻译模块 - 主页 "translationHistory": "번역 기록", @@ -927,22 +981,32 @@ const Map koKR = { "phoneUser": "휴대폰 사용자", "selectSourceLanguage": "원본 언어 선택", "selectTargetLanguage": "대상 언어 선택", - "me": "Me", - "counterPart": "Counterpart", + "me": "나", + "counterPart": "상대방", "bluetoothCallStateError": - "Please make sure the Bluetooth headset is connected to the phone and in a call state", - "autoDetect": "Auto Detect", // 自动检测 + "블루투스 헤드셋이 휴대폰에 연결되어 있고 통화 중인지 확인해 주세요", + "autoDetect": "자동 감지", // 自动检测 + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': '플로팅 창 비활성화', + 'enableFloatingWindow': '플로팅 창 활성화', + 'permissionTip': '권한 안내', + 'micPermissionRequiredForRecording': '녹음에는 마이크 권한이 필요합니다', + 'deleteTranslationRecordError': '번역 기록 삭제 중 오류 발생: @error', // 翻译模块 - 文本翻译 - "languageDetectionFailed": "Language detection failed", - "translationFailed": "Translation failed", - "pleaseInputText": "Please input text", - "textTooLong": "Text too long, max 5000 characters", + "languageDetectionFailed": "언어 감지 실패", + "translationFailed": "번역 실패", + "translating": "번역 중", + "translate": "번역", + "pleaseInputText": "텍스트를 입력해 주세요", + "inputTextToTranslate": "번역할 텍스트를 입력해 주세요", + "textTooLong": "텍스트가 너무 깁니다. 최대 5000자까지 입력 가능합니다", // 翻译模块 - 历史记录 "noTranslationHistory": "기록 없음", - "historyRecords": "History Records", - "clearResults": "Clear Results", + "historyRecords": "기록", + "clearResults": "결과 지우기", "clearHistory": "기록 지우기", "clearHistoryConfirm": "모든 번역 기록을 지우시겠습니까? 이 작업은 되돌릴 수 없습니다.", "unknownLanguage": "알 수 없는 언어", @@ -950,55 +1014,55 @@ const Map koKR = { "deleteSessionConfirm": "이 세션의 모든 번역 기록을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", // 翻译模块 - 图片翻译 - "selectImageSource": "Select Image Source", - "imagePreview": "Image Preview", - "translationResult": "Translation Result", - "recognitionResult": "Recognition Result", - "translatedImagePreview": "Translated Image Preview", - "translatedImageLoadFailed": "Failed to load translated image", - "pleaseSelectImage": "Please select an image", - "imageLoadFailed": "Image load failed", - "imageQuality": "Image Quality", - "maxSize": "Max Size", - "close": "Close", - "setImageQuality": "Set Image Quality", - "currentQuality": "Current quality: @value%", - "setMaxSize": "Set Max Size", - "currentMaxSize": "Current: @pxpx", - "waitingForAction": "Waiting for action", - "pleaseSelectImageToStart": "Please select an image to start", - "chooseImage": "Choose Image", - "openingCamera": "Opening camera...", - "openingPhotoAlbum": "Opening photo album...", - "cancelled": "Cancelled", - "userCancelledSelection": "User cancelled selection", - "translatingImage": "Translating Image", - "callingImageTranslateService": "Calling image translation service...", - "savingRecord": "Saving Record", - "savingTranslationResult": "Saving translation result...", - "translationCompleted": "Translation Completed", - "allStepsCompleted": "All steps completed", - "processingFailed": "Processing Failed", + "selectImageSource": "이미지 소스 선택", + "imagePreview": "이미지 미리보기", + "translationResult": "번역 결과", + "recognitionResult": "인식 결과", + "translatedImagePreview": "번역된 이미지 미리보기", + "translatedImageLoadFailed": "번역된 이미지를 불러오지 못했습니다", + "pleaseSelectImage": "이미지를 선택해 주세요", + "imageLoadFailed": "이미지 로드 실패", + "imageQuality": "이미지 품질", + "maxSize": "최대 크기", + "close": "닫기", + "setImageQuality": "이미지 품질 설정", + "currentQuality": "현재 품질: @value%", + "setMaxSize": "최대 크기 설정", + "currentMaxSize": "현재: @pxpx", + "waitingForAction": "작업 대기 중", + "pleaseSelectImageToStart": "시작하려면 이미지를 선택해 주세요", + "chooseImage": "이미지 선택", + "openingCamera": "카메라 열기...", + "openingPhotoAlbum": "사진 앨범 열기...", + "cancelled": "취소됨", + "userCancelledSelection": "사용자가 선택을 취소했습니다", + "translatingImage": "이미지 번역 중", + "callingImageTranslateService": "이미지 번역 서비스 호출 중...", + "savingRecord": "기록 저장 중", + "savingTranslationResult": "번역 결과 저장 중...", + "translationCompleted": "번역 완료", + "allStepsCompleted": "모든 단계 완료", + "processingFailed": "처리 실패", "imageProcessingOrTranslationFailed": - "Image processing or translation failed. Please retry.\nError: {error}", - "imageTooLarge": "Image size exceeds 4MB limit", + "이미지 처리 또는 번역에 실패했습니다. 다시 시도해 주세요.\nError: {error}", + "imageTooLarge": "이미지 크기가 4MB 제한을 초과합니다", "imageTooLargeHint": - "Image size exceeds 4MB. Reduce quality or dimensions and retry", - "emptyTranslationResult": "Image translation API returned empty result", + "이미지 크기가 4MB를 초과합니다. 품질이나 크기를 줄인 후 다시 시도해 주세요", + "emptyTranslationResult": "이미지 번역 API가 빈 결과를 반환했습니다", "imageTranslationFailedTryLater": - "Image translation failed. Network issue or rate limit. Please try later", + "이미지 번역 실패. 네트워크 문제 또는 요청 제한입니다. 나중에 다시 시도해 주세요", "imageTranslationApiException": - "Image translation API exception. Check network and retry", - "permissionRequired": "Permission Required", - "cameraPermissionRequired": "Camera permission required to take photos", + "이미지 번역 API 예외. 네트워크를 확인하고 다시 시도해 주세요", + "permissionRequired": "권한 필요", + "cameraPermissionRequired": "사진 촬영에는 카메라 권한이 필요합니다", "photoAlbumPermissionRequired": - "Photo album permission required to pick images", - "translationDetails": "Translation Details", - "originalImage": "Original Image", - "sourceLanguage": "Source Language", - "targetLanguage": "Target Language", - "translationTime": "Translation Time", - "shareInDevelopment": "Sharing feature under development", + "이미지를 선택하려면 사진 앨범 권한이 필요합니다", + "translationDetails": "번역 상세", + "originalImage": "원본 이미지", + "sourceLanguage": "원본 언어", + "targetLanguage": "대상 언어", + "translationTime": "번역 시간", + "shareInDevelopment": "공유 기능 개발 중", // 翻译模块 - 录音文件 "translateAudioFiles": "녹음 파일 번역", @@ -1046,8 +1110,8 @@ const Map koKR = { "logoutTips": "현재 계정에서 로그아웃하시겠습니까?", 'deleteAccount': '계정 삭제', 'deleteAccountTips': '계정을 영구적으로 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.', - 'clean': 'Clear Cache', - 'cleanTips': 'Are you sure you want to clear personal cache?', + 'clean': '캐시 지우기', + 'cleanTips': '개인 캐시를 지우시겠습니까?', 'networkConnectionFailed': '네트워크 연결 실패, 네트워크 설정을 확인하고 다시 시도하세요', 'serverTemporarilyUnavailable': '서버가 일시적으로 응답하지 않습니다. 잠시 후 다시 시도하세요', 'loginExpiredPleaseRelogin': '로그인이 만료되었습니다. 다시 로그인하세요', @@ -1080,32 +1144,32 @@ const Map koKR = { 'accountServiceInitialized': '계정 서비스가 초기화되었습니다', // AccountService 已初始化 // 权限模块 - 'meetingStoragePermission': 'Storage', + 'meetingStoragePermission': '저장소', 'meetingStoragePermissionExplanation': - 'We need access to storage permissions so you can select and upload audio files.', + '오디오 파일을 선택하고 업로드하려면 저장소 권한이 필요합니다.', 'meetingStoragePermissionPermanentDenial': - 'Detected that you have permanently denied storage permission. To continue using this feature, please go to app settings to manually enable storage permission.', + '저장소 권한을 영구적으로 거부하셨습니다. 이 기능을 계속 사용하려면 앱 설정에서 저장소 권한을 수동으로 활성화해 주세요.', 'getPermissionStatusFailed': '권한 상태 가져오기 실패', 'communicationPermissions': '통신 권한', - 'bluetoothPermissions': 'Bluetooth Permissions', - 'notificationPermissions': 'Notification Permissions', - 'storagePermissions': 'Storage Permissions', - 'microphonePermissions': 'Microphone Permissions', - 'alarmPermissions': 'Alarm Permissions', + 'bluetoothPermissions': '블루투스 권한', + 'notificationPermissions': '알림 권한', + 'storagePermissions': '저장소 권한', + 'microphonePermissions': '마이크 권한', + 'alarmPermissions': '알람 권한', 'calendarPermissions': '캘린더 권한', 'locationPermissions': '위치 권한', 'phone': '전화', 'sms': '문자', - 'contacts': 'Contacts', - 'notification': 'Notification', - 'alarm': 'Alarm', + 'contacts': '연락처', + 'notification': '알림', + 'alarm': '알람', 'calendarWrite': '캘린더 쓰기', 'calendarFullAccess': '캘린더 전체 액세스', 'locationInfo': '위치 정보', 'phonePermissionDesc': '전화 걸기 기능에 사용됩니다', 'smsPermissionDesc': '문자 보내기 기능에 사용됩니다', 'alarmPermissionDesc': - 'Used to set exact alarms to ensure reminders trigger on time', + '정확한 알람을 설정하여 알림이 정시에 울리도록 하는 데 사용됩니다', 'calendarWritePermissionDesc': '캘린더 이벤트 및 알림 생성에 사용됩니다', 'calendarFullAccessPermissionDesc': '캘린더 이벤트 및 알림 읽기 및 관리에 사용됩니다', 'locationPermissionDesc': '현재 위치 정보 가져오기에 사용됩니다', @@ -1120,68 +1184,68 @@ const Map koKR = { 'phonePermissionDetailDesc': '전화 걸기 기능에는 전화 권한이 필요합니다', 'smsPermissionDetailDesc': '문자 보내기 기능에는 문자 권한이 필요합니다', 'alarmPermissionDetailDesc': - 'This permission is required to set exact alarms and ensure reminders trigger on time', + '정확한 알람을 설정하고 알림이 정시에 울리도록 하려면 이 권한이 필요합니다', 'calendarWritePermissionDetailDesc': '캘린더 이벤트 생성에는 캘린더 쓰기 권한이 필요합니다', 'calendarFullAccessPermissionDetailDesc': '캘린더 이벤트 관리에는 전체 캘린더 권한이 필요합니다', 'locationPermissionDetailDesc': '위치 정보 가져오기에는 위치 권한이 필요합니다', - 'contactsPermissionDesc': 'Used for accessing contact information', + 'contactsPermissionDesc': '연락처 정보에 접근하는 데 사용됩니다', 'contactsPermissionDetailDesc': - 'Phone call and SMS functionality requires contacts permission to select contacts', + '전화 및 문자 기능에는 연락처를 선택하기 위해 연락처 권한이 필요합니다', 'bluetoothPermissionDesc': - 'Used for connecting and managing Bluetooth devices', + '블루투스 기기 연결 및 관리에 사용됩니다', 'bluetoothPermissionDetailDesc': - 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', - 'bluetoothScanPermissionDesc': 'Used for scanning nearby Bluetooth devices', + '블루투스 헤드폰 및 기타 기기에 연결하려면 블루투스 권한이 필요합니다', + 'bluetoothScanPermissionDesc': '주변 블루투스 기기 검색에 사용됩니다', 'bluetoothScanPermissionDetailDesc': - 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', - 'bluetoothConnectPermissionDesc': 'Used for connecting to Bluetooth devices', + '주변 블루투스 기기를 검색하려면 블루투스 검색 권한이 필요합니다', + 'bluetoothConnectPermissionDesc': '블루투스 기기 연결에 사용됩니다', 'bluetoothConnectPermissionDetailDesc': - 'Connecting to Bluetooth devices requires Bluetooth connect permission', - 'notificationPermissionDesc': 'Used for sending notification messages', + '블루투스 기기에 연결하려면 블루투스 연결 권한이 필요합니다', + 'notificationPermissionDesc': '알림 메시지 전송에 사용됩니다', 'notificationPermissionDetailDesc': - 'App needs notification permission to send you important alerts and messages', + '중요한 알림과 메시지를 보내려면 알림 권한이 필요합니다', 'appNeedsPermissionForFullFunction': '앱이 전체 기능을 제공하려면 이 권한이 필요합니다', 'permanentDenialText': '{permission} 권한을 영구적으로 거부하셨습니다. 앱 설정에서 활성화해주세요', 'goToSettings': '설정으로 이동', - 'bluetoothScan': 'Bluetooth Scan', - 'bluetoothConnect': 'Bluetooth Connect', + 'bluetoothScan': '블루투스 검색', + 'bluetoothConnect': '블루투스 연결', 'bluetoothScanExplanation': - 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', + '앱이 주변 블루투스 기기를 검색하려면 블루투스 검색 권한이 필요합니다.', 'bluetoothConnectExplanation': - 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', + '앱이 블루투스 기기에 연결하려면 블루투스 연결 권한이 필요합니다.', 'locationForBluetoothExplanation': - 'The app needs location permission to scan Bluetooth devices.', + '앱이 블루투스 기기를 검색하려면 위치 권한이 필요합니다.', 'bluetoothScanPermanentDenial': - 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', + '블루투스 검색 권한이 영구적으로 거부되었습니다. 설정에서 수동으로 활성화해 주세요.', 'bluetoothConnectPermanentDenial': - 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', + '블루투스 연결 권한이 영구적으로 거부되었습니다. 설정에서 수동으로 활성화해 주세요.', 'locationPermanentDenial': - 'Location permission has been permanently denied, please go to settings to enable it manually.', - 'notificationPermission': 'Notification', - 'locationPermission': 'Location', + '위치 권한이 영구적으로 거부되었습니다. 설정에서 수동으로 활성화해 주세요.', + 'notificationPermission': '알림', + 'locationPermission': '위치', 'notificationPermissionExplanation': - 'Notification permission is required to display music playback status.', + '음악 재생 상태를 표시하려면 알림 권한이 필요합니다.', 'locationPermissionExplanation': - 'Location permission is required to get current location.', + '현재 위치를 가져오려면 위치 권한이 필요합니다.', 'notificationPermissionPermanentDenial': - 'You have permanently denied notification permission, please go to settings to enable it.', + '알림 권한을 영구적으로 거부하셨습니다. 설정에서 활성화해 주세요.', 'locationPermissionPermanentDenial': - 'You have permanently denied location permission, please go to settings to enable it.', - 'storagePermission': 'Storage', + '위치 권한을 영구적으로 거부하셨습니다. 설정에서 활성화해 주세요.', + 'storagePermission': '저장소', 'microphonePermissionExplanation': - 'We need microphone permission to record audio content.', + '오디오 콘텐츠를 녹음하려면 마이크 권한이 필요합니다.', 'storagePermissionExplanation': - 'We need storage permission so you can select and upload audio files.', + '오디오 파일을 선택하고 업로드하려면 저장소 권한이 필요합니다.', 'microphonePermissionPermanentDenial': - 'Microphone permission has been permanently denied. To continue using this feature, please go to app settings to manually enable microphone permission.', + '마이크 권한이 영구적으로 거부되었습니다. 이 기능을 계속 사용하려면 앱 설정에서 마이크 권한을 수동으로 활성화해 주세요.', 'storagePermissionPermanentDenial': - 'Storage permission has been permanently denied. To continue using this feature, please go to app settings to manually enable storage permission.', - 'permissionUtilNeed': 'Need ', - 'permissionUtilPermission': ' Permission', - 'permissionUtilRestricted': ' Permission Restricted', + '저장소 권한이 영구적으로 거부되었습니다. 이 기능을 계속 사용하려면 앱 설정에서 저장소 권한을 수동으로 활성화해 주세요.', + 'permissionUtilNeed': '필요: ', + 'permissionUtilPermission': ' 권한', + 'permissionUtilRestricted': ' 권한 제한됨', 'permissionUtilRestrictedMessage': - 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', - 'permissionUtilConfirm': 'OK', + '이 기능은 현재 기기에서 사용할 수 없거나 제한되어 있습니다. 기기 설정 또는 시스템 제한 사항을 확인해 주세요', + 'permissionUtilConfirm': '확인', // 原生前台服务通知(Android) 'native.notification.appName': 'VOITRANS', // VOITRANS @@ -1259,28 +1323,28 @@ const Map koKR = { 'blePairingStartupFailed': 'BLE 페어링 시작 실패', 'bleConnectionFailed': 'BLE 연결 실패', 'deviceAuthorizationFailedCheckCode': '기기 인증 실패, 인증 코드를 확인하세요', - 'bluetoothGuideTitle': 'Manual Bluetooth Activation Required', // 需要手动开启蓝牙 - 'bluetoothGuideSteps': 'Please follow these steps:', // 请按照以下步骤操作: + 'bluetoothGuideTitle': '수동 블루투스 활성화 필요', // 需要手动开启蓝牙 + 'bluetoothGuideSteps': '다음 단계를 따라 주세요:', // 请按照以下步骤操作: 'bluetoothGuideStep1': - 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 + '블루투스 켜기: 설정 → 블루투스 → 켜기', // 开启蓝牙:设置 → 蓝牙 → 开启 'bluetoothGuideStep2': - 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 + '기기 연결: "나의 기기"에서 기기를 찾아 탭하여 연결', // 连接设备:在"我的设备"中找到您的设备并点击连接 'bluetoothGuideStep3': - 'Return to app to continue pairing process', // 返回应用继续配对流程 + '앱으로 돌아와서 페어링 과정을 계속하세요', // 返回应用继续配对流程 'bluetoothGuideTip': - 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 - 'iKnow': 'I Know', // 我知道了 + '팁: 제어 센터에서 블루투스 아이콘을 길게 눌러 블루투스 설정에 빠르게 접근할 수도 있습니다', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 + 'iKnow': '알겠습니다', // 我知道了 // 配对模块 - 绑定奖励 - "firstBindRewardTitle": "Welcome Reward", - "firstBindRewardDesc": "You've received binding rewards.", - "vipLevelLabel": "VIP Level:", - "expiryLabel": "Expiration:", - "notActivated": "Not activated", - "aiChatCreditsLabel": "AI Chat Credits:", - "translationCreditsLabel": "Translation Credits:", - "meetingCreditsLabel": "Meeting Credits:", - "ok": "OK", + "firstBindRewardTitle": "환영 보상", + "firstBindRewardDesc": "기기 연결 보상을 받았습니다.", + "vipLevelLabel": "VIP 레벨:", + "expiryLabel": "만료일:", + "notActivated": "미활성화", + "aiChatCreditsLabel": "AI 채팅 크레딧:", + "translationCreditsLabel": "번역 크레딧:", + "meetingCreditsLabel": "회의 크레딧:", + "ok": "확인", // 用户反馈模块 "feedback": "사용자 피드백", @@ -1307,19 +1371,64 @@ const Map koKR = { "connectionFailed": "연결 실패", "retryConnection": "연결 재시도", "ota_updateNow": "지금 업데이트", - "otaVersionInfoFailed": "Failed to get version info. Please try again later.", + "otaVersionInfoFailed": "버전 정보를 가져오지 못했습니다. 나중에 다시 시도해 주세요.", "otaDeviceInfoUnavailable": - "Unable to get device info. Please check the connection and retry.", + "기기 정보를 가져올 수 없습니다. 연결을 확인하고 다시 시도해 주세요.", "otaProductInfoUnavailable": - "Unable to identify the device. Please reconnect and retry.", + "기기를 식별할 수 없습니다. 다시 연결하고 시도해 주세요.", "otaFirmwareVersionInvalid": - "Firmware version is abnormal. Please reconnect and retry.", + "펌웨어 버전이 비정상입니다. 다시 연결하고 시도해 주세요.", "keepConnectedDontClose": "기기를 연결된 상태로 유지하고 앱을 닫지 마세요", "doNotDisconnect": "연결을 끊지 마세요", "charging": "충전 중", "updateContent": "업데이트 내용", "removeEarbudsEnsureBattery": "양쪽 이어버드를 꺼내고 배터리가 모두 20% 이상인지 확인하세요", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': '새 버전 @version 발견', + 'otaConfirmUpdateNow': '지금 업데이트하시겠습니까?', + 'otaUpdate': '업데이트', + 'otaUpgradeSuccess': '업그레이드 성공', + 'otaUpgradeCompleteRepair': + '펌웨어 업그레이드가 완료되었습니다!\n\n기기를 다시 페어링해야 합니다. 페어링 페이지로 이동하시겠습니까?', + 'otaPairLater': '나중에 페어링', + 'otaPairNow': '지금 페어링', + 'okConfirm': '확인', + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'BLE 연결 상태 확인 중 오류 발생: @error', + 'otaBleNotConnected': 'BLE 기기 미연결', + 'otaBleNeedConnection': + '펌웨어 업그레이드를 위해 BLE 연결이 필요합니다\n기기가 연결되어 있는지 확인 후 다시 시도하세요', + 'otaDeviceInfoUnavailableTitle': '기기 정보 사용 불가', + 'otaCannotGetDeviceInfo': '기기 정보를 가져올 수 없습니다\n기기를 다시 연결하거나 나중에 다시 시도해 주세요', + 'otaBleCheckFailed': 'BLE 연결 확인 실패', + 'otaCannotGetDeviceInfoCheckConnection': '기기 정보를 가져올 수 없습니다. 기기 연결을 확인해 주세요', + 'otaCannotGetProductInfoWithName': '제품 정보를 가져올 수 없습니다. 기기 이름: @deviceName', + 'otaCannotGetBatteryInfo': '유효한 배터리 정보를 가져올 수 없습니다', + 'otaLowBattery': '배터리 부족', + 'otaSingleBatteryLow': + '배터리가 부족합니다\n요구사항: 배터리 20% 이상\n현재: @ear @battery%\n충전 후 다시 시도하세요', + 'otaDoubleBatteryLow': + '배터리가 부족합니다\n요구사항: 양쪽 모두 20% 이상\n현재: 왼쪽 @left%, 오른쪽 @right%\n충전 후 다시 시도하세요', + 'otaBatteryCheckFailed': '배터리 확인 실패', + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': '이번 업데이트에는 성능 최적화 및 버그 수정이 포함되어 있습니다.', + 'otaGetLatestVersionFailed': '최신 버전 정보를 가져오지 못했습니다', + 'otaGetVersionInfoFailed': '버전 정보를 가져오지 못했습니다', + 'otaCheckingDeviceStatus': '기기 상태 확인 중...', + 'otaDownloadFailedCheckNetwork': '다운로드 실패, 네트워크 연결을 확인해 주세요', + 'otaDownloadFailed': '다운로드 실패', + 'otaPreparingConnection': '기기 연결 준비 중...', + 'otaConnectingDevice': '기기 연결 중...', + 'otaUpgradeStarted': 'OTA 업그레이드 시작...', + 'otaUpgradeProgressWithPercent': '업그레이드 진행률: @percent%', + 'otaUpgradeSuccessComplete': '업그레이드 완료', + 'otaUpgradeFailedWithCode': '업그레이드 실패, 오류 코드: @code', + 'otaUpgradeFailedTitle': '업그레이드 실패', + 'otaUpgradeFailedDesc': '기기 연결 또는 업데이트 패키지를 확인해 주세요. 오류 코드: @code', + 'otaDeviceDisconnected': '기기 연결 끊김', + 'otaDeviceConnected': '기기 연결 성공', + // 音乐模块 "noMusic": "음악 없음", // 暂无音乐 "noPlayingMusic": "재생 중인 음악 없음", // 暂无播放音乐 @@ -1475,15 +1584,15 @@ const Map koKR = { "东帝汶": "동티모르", "斐济": "피지", "所罗门群岛": "솔로몬 제도", - "刚果民主共和国": "Democratic Republic of the Congo", - "安哥拉": "Angola", - "苏丹": "Sudan", - "马尔代夫": "Maldives", - "不丹": "Bhutan", - "摩纳哥": "Monaco", - "圣马力诺": "San Marino", - "牙买加": "Jamaica", - "巴哈马": "Bahamas", - "巴布亚新几内亚": "Papua New Guinea", - "萨摩亚": "Samoa", + "刚果民主共和国": "콩고 민주 공화국", + "安哥拉": "앙골라", + "苏丹": "수단", + "马尔代夫": "몰디브", + "不丹": "부탄", + "摩纳哥": "모나코", + "圣马力诺": "산마리노", + "牙买加": "자메이카", + "巴哈马": "바하마", + "巴布亚新几内亚": "파푸아뉴기니", + "萨摩亚": "사모아", }; diff --git a/lib/core/translations/language/lt_lt.dart b/lib/core/translations/language/lt_lt.dart index 04dcf4c5e..dc40a5a55 100644 --- a/lib/core/translations/language/lt_lt.dart +++ b/lib/core/translations/language/lt_lt.dart @@ -1,5 +1,4 @@ const Map ltLT = { - // 通用 'continue': 'Tęsti', 'confirm': 'Patvirtinti', @@ -169,6 +168,29 @@ const Map ltLT = { 'right': 'Dešinė', 'checkConnectionStatusFailed': 'Nepavyko patikrinti ryšio būsenos', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth initialization failed: @error', + 'needBluetoothAndLocationPermission': + 'Bluetooth and location permissions are required to scan devices', + 'permissionRequestFailedWithError': 'Permission request failed: @error', + 'needPermission': 'Permission Required', + 'blePermissionDialogContent': + 'This app requires Bluetooth and location permissions to scan devices. Please enable them in Settings.', + 'needEnableBluetooth': 'Enable Bluetooth', + 'enableBluetoothDialogContent': + 'Please enable Bluetooth to scan and connect devices.', + 'bleScanFailedWithError': 'Scan failed: @error', + 'bleConnectionSuccess': 'Connection Successful', + 'bleConnectedToDevice': 'Connected to @device', + 'bleConnectionFailedWithError': 'Connection failed: @error', + 'bleDisconnected': 'Disconnected', + 'bleDeviceDisconnected': 'Device disconnected', + 'bleDisconnectFailedWithError': 'Disconnect failed: @error', + 'signalStrong': 'Strong', + 'signalMedium': 'Medium', + 'signalWeak': 'Weak', + 'signalVeryWeak': 'Very Weak', + // 发现页 "searchAi": "Ieškoti AI funkcijų...", "exploreSlogan": "Išmaniosios ausinės, beribės galimybės", @@ -245,60 +267,65 @@ const Map ltLT = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Mokėjimas sėkmingas', - 'paymentFailed': 'Mokėjimas nepavyko', - 'gotIt': 'Supratau', - 'paymentFailedTryAgain': 'Mokėjimas nepavyko. Bandykite dar kartą.', - 'selectPaymentMethod': 'Pasirinkite mokėjimo būdą', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Nepavyko sukurti WeChat Pay užsakymo', - 'alipayOrderCreateFailed': 'Nepavyko sukurti Alipay užsakymo', - 'appleOrderCreateFailed': 'Nepavyko sukurti Apple užsakymo', - 'googleOrderCreateFailed': 'Nepavyko sukurti Google užsakymo', - 'paypalOrderCreateFailed': 'Nepavyko sukurti PayPal užsakymo', - 'paymentException': 'Mokėjimo išimtis', - 'paymentLaunchFailed': 'Mokėjimo paleidimas nepavyko', - 'paymentExceptionWithError': 'Mokėjimo išimtis: @error', - 'paymentProcessingCheckLater': 'Jūsų užsakymas apdorojamas. Patikrinkite vėliau.', - 'paymentResultQueryException': 'Nepavyko užklausti mokėjimo rezultato: @error', - 'orderConfirmedQuotaRefreshed': 'Užsakymas patvirtintas. Jūsų kvota buvo atnaujinta.', - 'paymentCompletedConfirming': 'Mokėjimas baigtas. Patvirtinama…', - 'paymentCancelled': 'Mokėjimas atšauktas', - 'paypalOpenedCompleteInBrowser': 'PayPal atidarytas. Užbaikite mokėjimą naršyklėje.', - 'paypalOpenFailed': 'Nepavyko atidaryti PayPal mokėjimo puslapio', - 'paymentTestTitle': 'Mokėjimo testas', - 'paymentTestOrderInfo': 'Testinio užsakymo informacija', - 'paymentTestProductId': 'Produkto ID', - 'paymentTestProductDescription': 'Produkto aprašymas', - 'paymentTestWechatDescription': 'WeChat Pay mokėjimo testas', - 'paymentTestAlipayDescription': 'Alipay mokėjimo testas', - 'paymentTestAmount': 'Suma', - 'paymentTestSelectAmount': 'Pasirinkite testo sumą', - 'paying': 'Mokama...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Mokėjimo būsena', - 'errorInfoWithMessage': 'Klaida: @message', - 'retest': 'Pakartotinis testas', - 'paymentTestInstructionsTitle': 'Instrukcijos', - 'paymentTestInstructionsContent': '1. Pasirinkite testo sumą (rekomenduojama: ¥0,01)\n2. Spustelėkite mokėjimo mygtuką, kad pradėtumėte\n3. Užbaikite mokėjimą mokėjimo programoje\n4. Grįžkite patikrinti rezultatą', - 'startingWechatPayment': 'Paleidžiamas WeChat Pay...', - 'startingAlipayPayment': 'Paleidžiamas Alipay...', - 'wechatPaymentSuccess': 'WeChat Pay sėkmingas!', - 'wechatPaymentFailed': 'WeChat Pay nepavyko', - 'wechatPaymentLaunchFailed': 'Nepavyko paleisti WeChat Pay', - 'cannotLaunchWechatPayment': 'Nepavyko paleisti WeChat Pay', - 'wechatPaymentException': 'WeChat Pay išimtis', - 'wechatPaymentTestCompleted': 'WeChat Pay testas baigtas', - 'alipayPaymentSuccess': 'Alipay sėkmingas!', - 'alipayPaymentFailed': 'Alipay nepavyko', - 'alipayPaymentLaunchFailed': 'Nepavyko paleisti Alipay', - 'cannotLaunchAlipayPayment': 'Nepavyko paleisti Alipay', - 'alipayPaymentException': 'Alipay išimtis', + 'paymentSuccess': 'Mokėjimas sėkmingas', + 'paymentFailed': 'Mokėjimas nepavyko', + 'gotIt': 'Supratau', + 'paymentFailedTryAgain': 'Mokėjimas nepavyko. Bandykite dar kartą.', + 'selectPaymentMethod': 'Pasirinkite mokėjimo būdą', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Nepavyko sukurti WeChat Pay užsakymo', + 'alipayOrderCreateFailed': 'Nepavyko sukurti Alipay užsakymo', + 'appleOrderCreateFailed': 'Nepavyko sukurti Apple užsakymo', + 'googleOrderCreateFailed': 'Nepavyko sukurti Google užsakymo', + 'paypalOrderCreateFailed': 'Nepavyko sukurti PayPal užsakymo', + 'paymentException': 'Mokėjimo išimtis', + 'paymentLaunchFailed': 'Mokėjimo paleidimas nepavyko', + 'paymentExceptionWithError': 'Mokėjimo išimtis: @error', + 'paymentProcessingCheckLater': + 'Jūsų užsakymas apdorojamas. Patikrinkite vėliau.', + 'paymentResultQueryException': + 'Nepavyko užklausti mokėjimo rezultato: @error', + 'orderConfirmedQuotaRefreshed': + 'Užsakymas patvirtintas. Jūsų kvota buvo atnaujinta.', + 'paymentCompletedConfirming': 'Mokėjimas baigtas. Patvirtinama…', + 'paymentCancelled': 'Mokėjimas atšauktas', + 'paypalOpenedCompleteInBrowser': + 'PayPal atidarytas. Užbaikite mokėjimą naršyklėje.', + 'paypalOpenFailed': 'Nepavyko atidaryti PayPal mokėjimo puslapio', + 'paymentTestTitle': 'Mokėjimo testas', + 'paymentTestOrderInfo': 'Testinio užsakymo informacija', + 'paymentTestProductId': 'Produkto ID', + 'paymentTestProductDescription': 'Produkto aprašymas', + 'paymentTestWechatDescription': 'WeChat Pay mokėjimo testas', + 'paymentTestAlipayDescription': 'Alipay mokėjimo testas', + 'paymentTestAmount': 'Suma', + 'paymentTestSelectAmount': 'Pasirinkite testo sumą', + 'paying': 'Mokama...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Mokėjimo būsena', + 'errorInfoWithMessage': 'Klaida: @message', + 'retest': 'Pakartotinis testas', + 'paymentTestInstructionsTitle': 'Instrukcijos', + 'paymentTestInstructionsContent': + '1. Pasirinkite testo sumą (rekomenduojama: ¥0,01)\n2. Spustelėkite mokėjimo mygtuką, kad pradėtumėte\n3. Užbaikite mokėjimą mokėjimo programoje\n4. Grįžkite patikrinti rezultatą', + 'startingWechatPayment': 'Paleidžiamas WeChat Pay...', + 'startingAlipayPayment': 'Paleidžiamas Alipay...', + 'wechatPaymentSuccess': 'WeChat Pay sėkmingas!', + 'wechatPaymentFailed': 'WeChat Pay nepavyko', + 'wechatPaymentLaunchFailed': 'Nepavyko paleisti WeChat Pay', + 'cannotLaunchWechatPayment': 'Nepavyko paleisti WeChat Pay', + 'wechatPaymentException': 'WeChat Pay išimtis', + 'wechatPaymentTestCompleted': 'WeChat Pay testas baigtas', + 'alipayPaymentSuccess': 'Alipay sėkmingas!', + 'alipayPaymentFailed': 'Alipay nepavyko', + 'alipayPaymentLaunchFailed': 'Nepavyko paleisti Alipay', + 'cannotLaunchAlipayPayment': 'Nepavyko paleisti Alipay', + 'alipayPaymentException': 'Alipay išimtis', "insufficientIntegral": "Insufficient integral", "insufficientBalanceDesc": 'Insufficient balance, please go to the corresponding recharge page to recharge.', @@ -496,19 +523,27 @@ const Map ltLT = { 'callRecording': 'Call Recording', 'importAudio': 'Import Audio', 'meetingRecordExitTitle': 'Išeiti iš įrašymo', // 退出录音 - 'meetingRecordExitMessage': 'Pasirinkite, ką daryti prieš išeinant', // 请选择离开后的操作 + 'meetingRecordExitMessage': + 'Pasirinkite, ką daryti prieš išeinant', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Baigti ir išsaugoti', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Baigti neišsaugojus', // 结束录音不保存 'meetingRecordContinueInBackground': 'Tęsti įrašymą fone', // 后台继续录音 - 'meetingRecordStopTimeout': 'Baigiant įrašymą baigėsi laikas. Bandykite dar kartą.', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'Nepavyko sustabdyti įrašymo. Bandykite dar kartą.', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'Nepavyko išsaugoti įrašo. Bandykite dar kartą.', // 保存录音失败,请重试 + 'meetingRecordStopTimeout': + 'Baigiant įrašymą baigėsi laikas. Bandykite dar kartą.', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'Nepavyko sustabdyti įrašymo. Bandykite dar kartą.', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'Nepavyko išsaugoti įrašo. Bandykite dar kartą.', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'Vyksta įrašymas', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Įrašoma fone. Palieskite, kad grįžtumėte į programą.', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'Įrašoma fone. Palieskite, kad grįžtumėte į programą.', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Rodyti virš kitų programų', // 悬浮窗权限 - 'overlayPermissionTranslationDesc': 'Kad galėtume rodyti vertimo rezultatus skambučių arba garso/vaizdo vertimo metu, mums reikia leidimo rodyti virš kitų programų. Tai leis matyti vertimus realiuoju laiku naudojant kitas programas.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 - 'overlayPermissionRecordingDesc': 'Kad įrašymo metu galėtume rodyti plaukiojančią įrašymo juostą (laikmatis/pristabdyti/tęsti), mums reikia leidimo rodyti virš kitų programų.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 - 'overlayPermissionOpenSettingsFailed': 'Nepavyko automatiškai atidaryti sistemos nustatymų. Atidarykite Nustatymus ir rankiniu būdu įjunkite leidimą rodyti virš kitų programų.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 + 'overlayPermissionTranslationDesc': + 'Kad galėtume rodyti vertimo rezultatus skambučių arba garso/vaizdo vertimo metu, mums reikia leidimo rodyti virš kitų programų. Tai leis matyti vertimus realiuoju laiku naudojant kitas programas.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 + 'overlayPermissionRecordingDesc': + 'Kad įrašymo metu galėtume rodyti plaukiojančią įrašymo juostą (laikmatis/pristabdyti/tęsti), mums reikia leidimo rodyti virš kitų programų.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 + 'overlayPermissionOpenSettingsFailed': + 'Nepavyko automatiškai atidaryti sistemos nustatymų. Atidarykite Nustatymus ir rankiniu būdu įjunkite leidimą rodyti virš kitų programų.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 'transcribing': 'Transcribing...', 'summarizing': 'Summarizing...', 'analyzing': 'Analyzing...', @@ -533,21 +568,22 @@ const Map ltLT = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Sukurti', - 'templateDetails': 'Šablono informacija', - 'tag': 'Žyma', - 'description': 'Aprašymas', - 'template': 'Šablonas', - 'deleteTemplate': 'Ištrinti šabloną', - 'deleteTemplateConfirm': 'Ar tikrai norite ištrinti šį šabloną?', - 'editTemplate': 'Redaguoti šabloną', - 'createTemplate': 'Sukurti šabloną', - 'name': 'Pavadinimas', - 'templateContentHint': 'Prašome įvesti šablono turinį! Patarimas: Spustelėkite AI mygtuką viršuje, kad greitai sugeneruotumėte šablono turinį pagal įvestą pavadinimą ir aprašymą', - 'inputNameHint': 'Prašome įvesti pavadinimą', - 'inputDescHint': 'Prašome įvesti aprašymą', - 'custom': 'Pasirinktinis', - 'pleaseEnter': 'Prašome įvesti', + 'create': 'Sukurti', + 'templateDetails': 'Šablono informacija', + 'tag': 'Žyma', + 'description': 'Aprašymas', + 'template': 'Šablonas', + 'deleteTemplate': 'Ištrinti šabloną', + 'deleteTemplateConfirm': 'Ar tikrai norite ištrinti šį šabloną?', + 'editTemplate': 'Redaguoti šabloną', + 'createTemplate': 'Sukurti šabloną', + 'name': 'Pavadinimas', + 'templateContentHint': + 'Prašome įvesti šablono turinį! Patarimas: Spustelėkite AI mygtuką viršuje, kad greitai sugeneruotumėte šablono turinį pagal įvestą pavadinimą ir aprašymą', + 'inputNameHint': 'Prašome įvesti pavadinimą', + 'inputDescHint': 'Prašome įvesti aprašymą', + 'custom': 'Pasirinktinis', + 'pleaseEnter': 'Prašome įvesti', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', @@ -570,7 +606,7 @@ const Map ltLT = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Išsaugoti minčių žemėlapį', + 'saveMindMap': 'Išsaugoti minčių žemėlapį', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -592,7 +628,7 @@ const Map ltLT = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Eksportuoti', + 'export': 'Eksportuoti', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Taikyti visoms šio kalbėtojo pastraipoms', @@ -702,18 +738,18 @@ const Map ltLT = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Analizė nepavyko, bandykite dar kartą vėliau', - 'transcriptionFailed': 'Transkripcija nepavyko, bandykite dar kartą vėliau', - 'summaryFailed': 'Santrauka nepavyko, bandykite dar kartą vėliau', - 'summaryFailedShort': 'Santrauka nepavyko', - 'transcriptionFailedShort': 'Transkripcija nepavyko', + 'analysisFailed': 'Analizė nepavyko, bandykite dar kartą vėliau', + 'transcriptionFailed': 'Transkripcija nepavyko, bandykite dar kartą vėliau', + 'summaryFailed': 'Santrauka nepavyko, bandykite dar kartą vėliau', + 'summaryFailedShort': 'Santrauka nepavyko', + 'transcriptionFailedShort': 'Transkripcija nepavyko', // Meeting模块 - 播放器 - 'playerNotReady': 'Garso grotuvas neparuoštas, palaukite', - 'playFailed': 'Atkūrimas nepavyko', - 'audioFileNotFound': 'Garso failas nerastas', - 'fetchingAudio': 'Gaunamas garso įrašas iš debesies...', - 'playerLoadFailed': 'Garso grotuvo įkėlimas nepavyko', + 'playerNotReady': 'Garso grotuvas neparuoštas, palaukite', + 'playFailed': 'Atkūrimas nepavyko', + 'audioFileNotFound': 'Garso failas nerastas', + 'fetchingAudio': 'Gaunamas garso įrašas iš debesies...', + 'playerLoadFailed': 'Garso grotuvo įkėlimas nepavyko', // 设置页 "systemSettings": "Sistemos nustatymai", @@ -822,7 +858,8 @@ const Map ltLT = { "swipeUpForMore": "Braukite aukštyn, kad pamatytumėte daugiau", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Kai įjungta: AI nebus pertraukiamas jūsų balsu kalbėdamas ir gali apdoroti tik vieną pokalbio raundą vienu metu. Norėdami pradėti naują raundą, tiesiog pasakykite pažadinimo žodį.', + 'voice_interrupt_tip': + 'Kai įjungta: AI nebus pertraukiamas jūsų balsu kalbėdamas ir gali apdoroti tik vieną pokalbio raundą vienu metu. Norėdami pradėti naują raundą, tiesiog pasakykite pažadinimo žodį.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -878,6 +915,13 @@ const Map ltLT = { 'Norėtume sužinoti, kodėl pranešate, galite aprašyti problemą, su kuria susidūrėte.', 'generatedByAi': 'Sugeneruota AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Štai keletas rekomenduojamų dainų:', 'playList': 'Grojaraštis', @@ -898,6 +942,29 @@ const Map ltLT = { "bicycling": "Važiavimas dviračiu", "tsransit": "Viešasis transportas", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Failed to start navigation', + 'cannotPlayMusicListRetryLater': + 'Cannot play music list, please try again later', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Error opening map', + 'pleaseInstallAmapApp': 'Please install the Amap app first', + 'pleaseInstallBaiduMapApp': 'Please install the Baidu Maps app first', + 'appleMapStartFailed': 'Apple Maps failed to start', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Error opening Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Užklausa apie oro sąlygas:', 'highest': 'Aukščiausia', @@ -970,8 +1037,19 @@ const Map ltLT = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Disable Floating Window', + 'enableFloatingWindow': 'Enable Floating Window', + 'permissionTip': 'Permission Tip', + 'micPermissionRequiredForRecording': + 'Microphone permission is required for recording', + 'deleteTranslationRecordError': 'Error deleting translation record: @error', "translationFailed": "Translation failed", + "translating": "Translating", + "translate": "Translate", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Įveskite tekstą, kurį norite išversti", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1245,17 +1323,19 @@ const Map ltLT = { 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigacija vyksta', - 'native.notification.navigation.keepRunning': 'Navigacija, laikykite programą atidarytą', - 'native.notification.bleAgent.running': 'Balso asistento agentas veikia', - 'native.notification.audioRecording.recording': 'Garso įrašas, bakstelėkite, kad grįžtumėte į programą', - 'native.notification.music.waiting': 'Laukiama grojimo', - 'native.notification.music.previous': 'Ankstesnis', - 'native.notification.music.next': 'Kitas', - 'native.notification.music.play': 'Groti', - 'native.notification.music.pause': 'Pauzė', - 'native.notification.qqMusic.playing': 'Grojama muzika', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigacija vyksta', + 'native.notification.navigation.keepRunning': + 'Navigacija, laikykite programą atidarytą', + 'native.notification.bleAgent.running': 'Balso asistento agentas veikia', + 'native.notification.audioRecording.recording': + 'Garso įrašas, bakstelėkite, kad grįžtumėte į programą', + 'native.notification.music.waiting': 'Laukiama grojimo', + 'native.notification.music.previous': 'Ankstesnis', + 'native.notification.music.next': 'Kitas', + 'native.notification.music.play': 'Groti', + 'native.notification.music.pause': 'Pauzė', + 'native.notification.qqMusic.playing': 'Grojama muzika', // 版本更新 'newVersionFound': 'Rasta nauja versija', // 版本更新对话框标题 @@ -1397,6 +1477,59 @@ const Map ltLT = { "removeEarbudsEnsureBattery": "Išimkite abi ausines ir įsitikinkite, kad abiejų baterijos lygis yra didesnis nei 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Upgrade Successful', + 'otaUpgradeCompleteRepair': + 'Firmware upgrade complete!\n\nDevice needs to be re-paired to work properly. Go to pairing page now?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': + 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': + 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': + 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', + // 音乐模块 "noMusic": "Nėra muzikos", // 暂无音乐 "noPlayingMusic": "Negrojama jokia muzika", // 暂无播放音乐 diff --git a/lib/core/translations/language/lv_lv.dart b/lib/core/translations/language/lv_lv.dart index 1fd98eedd..01c222374 100644 --- a/lib/core/translations/language/lv_lv.dart +++ b/lib/core/translations/language/lv_lv.dart @@ -1,5 +1,4 @@ const Map lvLV = { - // 通用 'continue': 'Turpināt', 'confirm': 'Apstiprināt', @@ -19,11 +18,11 @@ const Map lvLV = { "unknownError": "Nezināma kļūda", "asrConnectionFailed": "Neizdevās izveidot savienojumu ar runas atpazīšanas pakalpojumu. Pārbaudiet tīklu vai mēģiniet vēlreiz vēlāk.", - "justNow": "Just now", - "minutesAgo": "@minutes minutes ago", - "yesterday": "Yesterday", - "daysAgo": "@days days ago", - "hoursAgo": "@hours hours ago", + "justNow": "Tikko", + "minutesAgo": "Pirms @minutes minūtēm", + "yesterday": "Vakar", + "daysAgo": "Pirms @days dienām", + "hoursAgo": "Pirms @hours stundām", // 启动页 "slogan": "Pasaules savienošana, pāri skaņai", @@ -170,6 +169,29 @@ const Map lvLV = { 'right': 'Labais', 'checkConnectionStatusFailed': 'Savienojuma statusa pārbaude neizdevās', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth inicializācija neizdevās: @error', + 'needBluetoothAndLocationPermission': + 'Bluetooth un atrašanās vietas atļaujas ir nepieciešamas, lai skenētu ierīces', + 'permissionRequestFailedWithError': 'Atļaujas pieprasījums neizdevās: @error', + 'needPermission': 'Nepieciešama atļauja', + 'blePermissionDialogContent': + 'Šai lietotnei ir nepieciešamas Bluetooth un atrašanās vietas atļaujas, lai skenētu ierīces. Lūdzu, iespējojiet tās iestatījumos.', + 'needEnableBluetooth': 'Iespējot Bluetooth', + 'enableBluetoothDialogContent': + 'Lūdzu, iespējojiet Bluetooth, lai skenētu un savienotu ierīces.', + 'bleScanFailedWithError': 'Skenēšana neizdevās: @error', + 'bleConnectionSuccess': 'Savienojums veiksmīgs', + 'bleConnectedToDevice': 'Savienots ar @device', + 'bleConnectionFailedWithError': 'Savienojums neizdevās: @error', + 'bleDisconnected': 'Atvienots', + 'bleDeviceDisconnected': 'Ierīce atvienota', + 'bleDisconnectFailedWithError': 'Atvienošana neizdevās: @error', + 'signalStrong': 'Spēcīgs', + 'signalMedium': 'Vidējs', + 'signalWeak': 'Vājš', + 'signalVeryWeak': 'Ļoti vājš', + // 发现页 "searchAi": "Meklēt AI funkcijas...", "exploreSlogan": "Viedās austiņas, bezgalīgas iespējas", @@ -196,260 +218,271 @@ const Map lvLV = { "scene": "Scenārijs", // 用量统计模块 - "aiChat": "AI Chat", - "translationStats": "Translation Statistics", - "meetingStats": "Meeting Statistics", - "today": "Today", - "thisWeek": "This Week", - "thisMonth": "This Month", - "history": "History", - "currentSessionStats": "Current Session Stats", - "translationCount": "Translation Count", - "sessionDuration": "Session Duration", - "characters": "Characters", - "recordingDuration": "Recording Duration", - "totalApiCalls": "Total API Calls", - "sessionCount": "Session Count", - "totalCharacters": "Total Characters", - "apiCallStats": "API Call Stats", - "translationApi": "Translation API", + "aiChat": "AI tērzēšana", + "translationStats": "Tulkošanas statistika", + "meetingStats": "Sapulču statistika", + "today": "Šodien", + "thisWeek": "Šonedēļ", + "thisMonth": "Šomēnes", + "history": "Vēsture", + "currentSessionStats": "Pašreizējās sesijas statistika", + "translationCount": "Tulkojumu skaits", + "sessionDuration": "Sesijas ilgums", + "characters": "Rakstzīmes", + "recordingDuration": "Ieraksta ilgums", + "totalApiCalls": "Kopējie API izsaukumi", + "sessionCount": "Sesiju skaits", + "totalCharacters": "Kopējais rakstzīmju skaits", + "apiCallStats": "API izsaukumu statistika", + "translationApi": "Tulkošanas API", "asr": "ASR", "tts": "TTS", - "dataVolumeStats": "Data Volume Stats", - "sourceTextCharacters": "Source Text Characters", - "ttsTextCharacters": "TTS Text Characters", - "effectiveAudioDuration": "Effective Audio Duration", - "totalSessionDuration": "Total Session Duration", - "costStats": "Cost Stats", - "estimatedCost": "Estimated Cost", - "dailyCostThreshold": "Daily Cost Threshold", - "monthlyCostThreshold": "Monthly Cost Threshold", - "usageBehaviorStats": "Usage Behavior Stats", - "mostUsedLanguagePair": "Most-used language pair", - "mostUsedMode": "Most-used mode", - "asrApiCalls": "ASR Calls", - "totalAudioDuration": "Total Audio Duration", - "audioFileSize": "Audio File Size", - "transcriptBytes": "Transcript Bytes", - "loadFailed": "Load Failed", + "dataVolumeStats": "Datu apjoma statistika", + "sourceTextCharacters": "Avota teksta rakstzīmes", + "ttsTextCharacters": "TTS teksta rakstzīmes", + "effectiveAudioDuration": "Efektīvais audio ilgums", + "totalSessionDuration": "Kopējais sesijas ilgums", + "costStats": "Izmaksu statistika", + "estimatedCost": "Aptuvenas izmaksas", + "dailyCostThreshold": "Dienas izmaksu slieksnis", + "monthlyCostThreshold": "Mēneša izmaksu slieksnis", + "usageBehaviorStats": "Lietošanas paradumu statistika", + "mostUsedLanguagePair": "Visbiežāk lietotais valodu pāris", + "mostUsedMode": "Visbiežāk lietotais režīms", + "asrApiCalls": "ASR izsaukumi", + "totalAudioDuration": "Kopējais audio ilgums", + "audioFileSize": "Audio faila lielums", + "transcriptBytes": "Transkripcijas baiti", + "loadFailed": "Ielāde neizdevās", "statsLoadFailedTryLater": - "Statistics failed to load. Please try again later.", - "cleanupComplete": "Cleanup Complete", - "cleanedOldData": "Cleaned data older than 90 days", - "exportFeature": "Export Feature", - "exportInDevelopment": "Data export is under development", + "Statistikas ielāde neizdevās. Lūdzu, mēģiniet vēlreiz vēlāk.", + "cleanupComplete": "Tīrīšana pabeigta", + "cleanedOldData": "Notīrīti dati, kas vecāki par 90 dienām", + "exportFeature": "Eksporta funkcija", + "exportInDevelopment": "Datu eksports tiek izstrādāts", // 商品模块 - 通用 - 'availablePackages': 'Available Packages', - 'remainingQuota': 'Remaining Quota', - 'totalQuota': 'Total Quota', - 'remaining': 'Remaining', - 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Maksājums veiksmīgs', - 'paymentFailed': 'Maksājums neizdevās', - 'gotIt': 'Sapratu', - 'paymentFailedTryAgain': 'Maksājums neizdevās. Lūdzu, mēģiniet vēlreiz.', - 'selectPaymentMethod': 'Izvēlieties maksājuma veidu', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Neizdevās izveidot WeChat Pay pasūtījumu', - 'alipayOrderCreateFailed': 'Neizdevās izveidot Alipay pasūtījumu', - 'appleOrderCreateFailed': 'Neizdevās izveidot Apple pasūtījumu', - 'googleOrderCreateFailed': 'Neizdevās izveidot Google pasūtījumu', - 'paypalOrderCreateFailed': 'Neizdevās izveidot PayPal pasūtījumu', - 'paymentException': 'Maksājuma izņēmums', - 'paymentLaunchFailed': 'Maksājuma palaišana neizdevās', - 'paymentExceptionWithError': 'Maksājuma izņēmums: @error', - 'paymentProcessingCheckLater': 'Jūsu pasūtījums tiek apstrādāts. Lūdzu, pārbaudiet vēlāk.', - 'paymentResultQueryException': 'Neizdevās pieprasīt maksājuma rezultātu: @error', - 'orderConfirmedQuotaRefreshed': 'Pasūtījums apstiprināts. Jūsu kvota ir atjaunināta.', - 'paymentCompletedConfirming': 'Maksājums pabeigts. Apstiprina…', - 'paymentCancelled': 'Maksājums atcelts', - 'paypalOpenedCompleteInBrowser': 'PayPal atvērts. Lūdzu, pabeidziet maksājumu pārlūkprogrammā.', - 'paypalOpenFailed': 'Nevar atvērt PayPal maksājuma lapu', - 'paymentTestTitle': 'Maksājuma tests', - 'paymentTestOrderInfo': 'Testa pasūtījuma informācija', - 'paymentTestProductId': 'Produkta ID', - 'paymentTestProductDescription': 'Produkta apraksts', - 'paymentTestWechatDescription': 'WeChat Pay maksājuma tests', - 'paymentTestAlipayDescription': 'Alipay maksājuma tests', - 'paymentTestAmount': 'Summa', - 'paymentTestSelectAmount': 'Izvēlieties testa summu', - 'paying': 'Maksā...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Maksājuma statuss', - 'errorInfoWithMessage': 'Kļūda: @message', - 'retest': 'Atkārtots tests', - 'paymentTestInstructionsTitle': 'Instrukcijas', - 'paymentTestInstructionsContent': '1. Izvēlieties testa summu (ieteicams: ¥0,01)\n2. Noklikšķiniet uz maksājuma pogas, lai sāktu\n3. Pabeidziet maksājumu maksājuma lietotnē\n4. Atgriezieties, lai pārbaudītu rezultātu', - 'startingWechatPayment': 'Palaižam WeChat Pay...', - 'startingAlipayPayment': 'Palaižam Alipay...', - 'wechatPaymentSuccess': 'WeChat Pay veiksmīgs!', - 'wechatPaymentFailed': 'WeChat Pay neizdevās', - 'wechatPaymentLaunchFailed': 'Neizdevās palaist WeChat Pay', - 'cannotLaunchWechatPayment': 'Nevar palaist WeChat Pay', - 'wechatPaymentException': 'WeChat Pay izņēmums', - 'wechatPaymentTestCompleted': 'WeChat Pay tests pabeigts', - 'alipayPaymentSuccess': 'Alipay veiksmīgs!', - 'alipayPaymentFailed': 'Alipay neizdevās', - 'alipayPaymentLaunchFailed': 'Neizdevās palaist Alipay', - 'cannotLaunchAlipayPayment': 'Nevar palaist Alipay', - 'alipayPaymentException': 'Alipay izņēmums', - "insufficientIntegral": "Insufficient integral", + 'availablePackages': 'Pieejamās paketes', + 'remainingQuota': 'Atlikušā kvota', + 'totalQuota': 'Kopējā kvota', + 'remaining': 'Atlikušais', + 'featureDescription': 'Funkcijas apraksts', + 'paymentSuccess': 'Maksājums veiksmīgs', + 'paymentFailed': 'Maksājums neizdevās', + 'gotIt': 'Sapratu', + 'paymentFailedTryAgain': 'Maksājums neizdevās. Lūdzu, mēģiniet vēlreiz.', + 'selectPaymentMethod': 'Izvēlieties maksājuma veidu', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Neizdevās izveidot WeChat Pay pasūtījumu', + 'alipayOrderCreateFailed': 'Neizdevās izveidot Alipay pasūtījumu', + 'appleOrderCreateFailed': 'Neizdevās izveidot Apple pasūtījumu', + 'googleOrderCreateFailed': 'Neizdevās izveidot Google pasūtījumu', + 'paypalOrderCreateFailed': 'Neizdevās izveidot PayPal pasūtījumu', + 'paymentException': 'Maksājuma izņēmums', + 'paymentLaunchFailed': 'Maksājuma palaišana neizdevās', + 'paymentExceptionWithError': 'Maksājuma izņēmums: @error', + 'paymentProcessingCheckLater': + 'Jūsu pasūtījums tiek apstrādāts. Lūdzu, pārbaudiet vēlāk.', + 'paymentResultQueryException': + 'Neizdevās pieprasīt maksājuma rezultātu: @error', + 'orderConfirmedQuotaRefreshed': + 'Pasūtījums apstiprināts. Jūsu kvota ir atjaunināta.', + 'paymentCompletedConfirming': 'Maksājums pabeigts. Apstiprina…', + 'paymentCancelled': 'Maksājums atcelts', + 'paypalOpenedCompleteInBrowser': + 'PayPal atvērts. Lūdzu, pabeidziet maksājumu pārlūkprogrammā.', + 'paypalOpenFailed': 'Nevar atvērt PayPal maksājuma lapu', + 'paymentTestTitle': 'Maksājuma tests', + 'paymentTestOrderInfo': 'Testa pasūtījuma informācija', + 'paymentTestProductId': 'Produkta ID', + 'paymentTestProductDescription': 'Produkta apraksts', + 'paymentTestWechatDescription': 'WeChat Pay maksājuma tests', + 'paymentTestAlipayDescription': 'Alipay maksājuma tests', + 'paymentTestAmount': 'Summa', + 'paymentTestSelectAmount': 'Izvēlieties testa summu', + 'paying': 'Maksā...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Maksājuma statuss', + 'errorInfoWithMessage': 'Kļūda: @message', + 'retest': 'Atkārtots tests', + 'paymentTestInstructionsTitle': 'Instrukcijas', + 'paymentTestInstructionsContent': + '1. Izvēlieties testa summu (ieteicams: ¥0,01)\n2. Noklikšķiniet uz maksājuma pogas, lai sāktu\n3. Pabeidziet maksājumu maksājuma lietotnē\n4. Atgriezieties, lai pārbaudītu rezultātu', + 'startingWechatPayment': 'Palaižam WeChat Pay...', + 'startingAlipayPayment': 'Palaižam Alipay...', + 'wechatPaymentSuccess': 'WeChat Pay veiksmīgs!', + 'wechatPaymentFailed': 'WeChat Pay neizdevās', + 'wechatPaymentLaunchFailed': 'Neizdevās palaist WeChat Pay', + 'cannotLaunchWechatPayment': 'Nevar palaist WeChat Pay', + 'wechatPaymentException': 'WeChat Pay izņēmums', + 'wechatPaymentTestCompleted': 'WeChat Pay tests pabeigts', + 'alipayPaymentSuccess': 'Alipay veiksmīgs!', + 'alipayPaymentFailed': 'Alipay neizdevās', + 'alipayPaymentLaunchFailed': 'Neizdevās palaist Alipay', + 'cannotLaunchAlipayPayment': 'Nevar palaist Alipay', + 'alipayPaymentException': 'Alipay izņēmums', + "insufficientIntegral": "Nepietiekams atlikums", "insufficientBalanceDesc": - 'Insufficient balance, please go to the corresponding recharge page to recharge.', - "recharge": 'Go to Recharge', + 'Nepietiekams atlikums, lūdzu, dodieties uz atbilstošo papildināšanas lapu, lai papildinātu.', + "recharge": 'Doties uz papildināšanu', "aiMemberExpiredDesc": - 'AI membership expired, please go to the membership recharge page to renew.', + 'AI dalība ir beigusies, lūdzu, dodieties uz dalības papildināšanas lapu, lai atjaunotu.', // 商品模块 - AI商品页 - 'musicAndRecommendation': 'Music & Recommendation', - 'navigationAndRoutes': 'Navigation & Routes', - 'nearbySearch': 'Nearby Search', - 'newsInformation': 'News', - 'communicationAssistant': 'Communication Assistant', + 'musicAndRecommendation': 'Mūzika un ieteikumi', + 'navigationAndRoutes': 'Navigācija un maršruti', + 'nearbySearch': 'Meklēšana tuvumā', + 'newsInformation': 'Jaunumi', + 'communicationAssistant': 'Komunikācijas palīgs', 'aiHeaderDesc1': - 'Longer conversation quota, more tool calls, extended context length.', + 'Garāka sarunu kvota, vairāk rīku izsaukumu, paplašināts konteksta garums.', 'aiHeaderDesc2': - 'Suitable for agent Q&A, summarization, analysis, and task execution.', - 'musicSearchPlaybackControl': 'Music library search and playback control', + 'Piemērots aģenta jautājumiem un atbildēm, apkopošanai, analīzei un uzdevumu izpildei.', + 'musicSearchPlaybackControl': + 'Mūzikas bibliotēkas meklēšana un atskaņošanas vadība', 'smartPlaylistAndSimilarRecommendations': - 'Smart playlist and similar song recommendations', + 'Viedais atskaņošanas saraksts un līdzīgu dziesmu ieteikumi', 'routePlanningAndCongestionAvoidance': - 'Route planning and congestion avoidance', - 'voiceBroadcastAndWaypoints': 'Voice broadcast and waypoint settings', - 'realTimeWeatherForecast': 'Real-time weather and forecast', - 'clothingAdviceAndTravelReminders': 'Clothing advice and travel reminders', - 'poiSearchFoodGasParking': 'POI search: dining / gas / parking', - 'ratingsHoursAndDirectRoutes': 'Ratings, business hours, and direct routing', - 'hotNewsAndTopicOverview': 'Hot news and topic overview', - 'longArticleSummariesAndKeyPoints': 'Long-article summaries and key points', - 'helpCallAndSMS': 'Help with calls and SMS', + 'Maršrutu plānošana un sastrēgumu izvairīšanās', + 'voiceBroadcastAndWaypoints': 'Balss apraide un maršruta punktu iestatījumi', + 'realTimeWeatherForecast': 'Reāllaika laikapstākļi un prognoze', + 'clothingAdviceAndTravelReminders': 'Apģērba padomi un ceļojumu atgādinājumi', + 'poiSearchFoodGasParking': + 'POI meklēšana: ēdināšana / degviela / autostāvvieta', + 'ratingsHoursAndDirectRoutes': 'Vērtējumi, darba laiki un tiešie maršruti', + 'hotNewsAndTopicOverview': 'Aktuālās ziņas un tēmu pārskats', + 'longArticleSummariesAndKeyPoints': + 'Garu rakstu kopsavilkumi un galvenie punkti', + 'helpCallAndSMS': 'Palīdzība ar zvaniem un SMS', 'templatedMessagesAndScheduleReminders': - 'Template messages and schedule reminders', + 'Veidņu ziņojumi un grafika atgādinājumi', 'aiDisclaimer': - 'Features depend on device permissions, service availability, and network conditions.', + 'Funkcijas ir atkarīgas no ierīces atļaujām, pakalpojumu pieejamības un tīkla apstākļiem.', // 商品模块 - 翻译商品页 - 'realtimeTranscription': 'Real-time Transcription', - 'sceneLexicon': 'Scenario Glossary', - 'subtitleDisplay': 'Subtitles', + 'realtimeTranscription': 'Reāllaika transkripcija', + 'sceneLexicon': 'Scenāriju vārdnīca', + 'subtitleDisplay': 'Subtitri', 'transHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'transHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', - 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', + 'Reāllaika sinhronā tulkošana un teksta tulkošana ar zema latentuma balsi.', + 'transHeaderDesc2': 'Piemērots ceļojumiem, biznesam, runām un apmācībām.', + 'translateZhEn': 'Ķīniešu-angļu tulkošana', + 'lowLatencyVoiceBroadcast': 'Zema latentuma balss apraide', + 'multiLangTextTranslation': 'Daudzvalodu teksta tulkošana', 'termOptimizationContextPreserve': - 'Terminology optimization and context preservation', - 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', - 'personalVocabularyMemory': 'Personal vocabulary memory', - 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', - 'colorHighContrast': 'High color contrast', + 'Terminoloģijas optimizācija un konteksta saglabāšana', + 'lexiconTourBusinessLife': 'Ceļojumu/biznesa/dzīves vārdnīcas', + 'personalVocabularyMemory': 'Personīgā vārdu krājuma atmiņa', + 'conversationSubtitleLargeText': 'Sarunu subtitri / Liela teksta režīms', + 'colorHighContrast': 'Augsts krāsu kontrasts', 'transDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'Tulkošanas veiktspēja ir atkarīga no mikrofona, tīkla latentuma un apkārtējā trokšņa.', // 商品模块 - 会议商品页 - 'meetingRecording': 'Meeting Recording', - 'transcriptionAndSummary': 'Transcription & Summary', - 'keywordSearch': 'Keyword Search', - 'collaborationSharing': 'Collaboration & Sharing', + 'meetingRecording': 'Sapulces ierakstīšana', + 'transcriptionAndSummary': 'Transkripcija un kopsavilkums', + 'keywordSearch': 'Atslēgvārdu meklēšana', + 'collaborationSharing': 'Sadarbība un kopīgošana', 'meetingHeaderDesc1': - 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', + 'Audio ierakstīšana, transkripcija, atslēgvārdu meklēšana un automātisks kopsavilkums sapulču efektivitātes uzlabošanai.', 'meetingHeaderDesc2': - 'Suitable for business meetings, class notes, and interview minutes.', - 'meetingAutoRecording': 'Auto recording and segmentation', - 'meetingSpeakerTagging': 'Speaker labeling', - 'meetingLongAudioTranscription': 'Long audio transcription', - 'meetingKeyPointSummary': 'Key point extraction', - 'meetingTopicNameSearch': 'Search by topic/name', - 'meetingTimelineJump': 'Timeline jump', - 'meetingExportSummary': 'Export minutes', - 'meetingMultiPlatformShare': 'Share across platforms', + 'Piemērots biznesa sapulcēm, lekciju piezīmēm un interviju protokoliem.', + 'meetingAutoRecording': 'Automātiska ierakstīšana un segmentēšana', + 'meetingSpeakerTagging': 'Runātāju iezīmēšana', + 'meetingLongAudioTranscription': 'Garu audio transkripcija', + 'meetingKeyPointSummary': 'Galveno punktu izvilkšana', + 'meetingTopicNameSearch': 'Meklēšana pēc tēmas/vārda', + 'meetingTimelineJump': 'Laika līnijas pārlēkšana', + 'meetingExportSummary': 'Eksportēt protokolu', + 'meetingMultiPlatformShare': 'Kopīgot starp platformām', 'meetingDisclaimer': - 'Use in quiet environments; performance depends on microphone and network.', + 'Lietojiet klusā vidē; veiktspēja ir atkarīga no mikrofona un tīkla.', // 商品模块 - VIP会员页 - 'benefitsOverview': 'Benefits overview', - 'higherQuota': 'Higher usage quota', - 'lowerUnitPrice': 'Lower unit price', - 'priorityService': 'Priority service', - 'exclusiveSupportChannel': 'Dedicated support channel', - 'fastResponse': 'Fast issue response', - 'eventsAndDiscounts': 'Events and discounts', - 'memberExclusiveEvents': 'Member-exclusive events', - 'longTermDiscountPlan': 'Long-term discount plan', - 'generalPrivileges': 'General privileges', - 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', + 'benefitsOverview': 'Priekšrocību pārskats', + 'higherQuota': 'Augstāka lietošanas kvota', + 'lowerUnitPrice': 'Zemāka vienības cena', + 'priorityService': 'Prioritārs pakalpojums', + 'exclusiveSupportChannel': 'Īpašs atbalsta kanāls', + 'fastResponse': 'Ātra problēmu atbilde', + 'eventsAndDiscounts': 'Pasākumi un atlaides', + 'memberExclusiveEvents': 'Biedru ekskluzīvi pasākumi', + 'longTermDiscountPlan': 'Ilgtermiņa atlaižu plāns', + 'generalPrivileges': 'Vispārīgās privilēģijas', + 'earlyAccessNewFeatures': 'Agrīna piekļuve jaunām funkcijām', + 'crossDeviceSync': 'Sinhronizācija starp ierīcēm', 'vipDisclaimer': - 'Actual benefits depend on the package details and may change with versions.', + 'Faktiskās priekšrocības ir atkarīgas no paketes detaļām un var mainīties līdz ar versijām.', // 商品模块 - 商品名称与描述 - 'ai_001_name': 'AI Basic 100', - 'ai_002_name': 'AI Basic 500', - 'ai_003_name': 'AI Basic 1000', - 'meet_001_name': 'Meeting Basic 100', - 'meet_002_name': 'Meeting Basic 500', - 'meet_003_name': 'Meeting Basic 1000', - 'trans_001_name': 'Translation Basic 100', - 'trans_002_name': 'Translation Basic 500', - 'trans_003_name': 'Translation Basic 1000', - 'ai_001_desc': 'Includes 100 uses. Access core AI features.', - 'ai_002_desc': 'Includes 500 uses. Access core AI features.', - 'ai_003_desc': 'Includes 1000 uses. Access core AI features.', - 'meet_001_desc': 'Includes 100 meeting recordings/transcriptions.', - 'meet_002_desc': 'Includes 500 meeting recordings/transcriptions.', - 'meet_003_desc': 'Includes 1000 meeting recordings/transcriptions.', - 'trans_001_desc': 'Includes 100 translations (voice/text).', - 'trans_002_desc': 'Includes 500 translations (voice/text).', - 'trans_003_desc': 'Includes 1000 translations (voice/text).', + 'ai_001_name': 'AI pamata 100', + 'ai_002_name': 'AI pamata 500', + 'ai_003_name': 'AI pamata 1000', + 'meet_001_name': 'Sapulču pamata 100', + 'meet_002_name': 'Sapulču pamata 500', + 'meet_003_name': 'Sapulču pamata 1000', + 'trans_001_name': 'Tulkošanas pamata 100', + 'trans_002_name': 'Tulkošanas pamata 500', + 'trans_003_name': 'Tulkošanas pamata 1000', + 'ai_001_desc': 'Ietver 100 lietojumus. Piekļuve galvenajām AI funkcijām.', + 'ai_002_desc': 'Ietver 500 lietojumus. Piekļuve galvenajām AI funkcijām.', + 'ai_003_desc': 'Ietver 1000 lietojumu. Piekļuve galvenajām AI funkcijām.', + 'meet_001_desc': 'Ietver 100 sapulču ierakstus/transkripcijas.', + 'meet_002_desc': 'Ietver 500 sapulču ierakstus/transkripcijas.', + 'meet_003_desc': 'Ietver 1000 sapulču ierakstu/transkripciju.', + 'trans_001_desc': 'Ietver 100 tulkojumus (balss/teksts).', + 'trans_002_desc': 'Ietver 500 tulkojumus (balss/teksts).', + 'trans_003_desc': 'Ietver 1000 tulkojumu (balss/teksts).', // 商品模块 - 页脚 - 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', - 'iapCustomerServiceQQLabel': 'IAP customer service QQ: @qq', + 'appNameProvider': 'Lietotne: VoiTrans · Nodrošina: VoiTrans', + 'iapCustomerServiceQQLabel': 'IAP klientu apkalpošanas QQ: @qq', 'copyrightVoitrans': '© 2025 Voitrans Technologies', // 新手引导 'skip': "Izlaist", - 'next': 'Next', - 'sayLilyHint': 'Say "Lily Lily" to the mic', - 'imHere': 'I’m here~', - 'guideWelcomeWakeAI': 'Welcome to Voitrans! First, wake your AI “Lily”.', - 'aiReplyCompleted': 'Lily has finished the reply!', - 'aiThinking': 'Lily is thinking…', - 'guideAwakenSuccess': 'Great! Lily is awake—ask it to help.', - 'confirmInput': 'Confirm Input', - 'guideClickSendPrefix': 'Tap send, ', - 'guideWeatherStart': 'Tell Lily: “What’s the weather today?”', - 'guideWeatherInput': 'What’s the weather today?', - 'guideWeatherSend': 'Lily will report the weather in real time', - 'guideWeatherEnd': 'Lily can report weather live—try other commands', - 'guideMusicStart': 'Tell Lily: “Play some rock music”', - 'guideMusicInput': 'Play some rock music', - 'guideMusicSend': 'Lily will find music for you', - 'guideMusicEnd': 'Lily found music—try other commands', - 'guideNavStart': 'Tell Lily: “Navigate to Shenzhen Airport”', - 'guideNavInput': 'Navigate to Shenzhen Airport', - 'guideNavSend': 'Lily will plan the route', - 'guideNavEnd': 'Navigation set—try other commands', + 'next': 'Tālāk', + 'sayLilyHint': 'Sakiet “Lilija, Lilija” mikrofonā', + 'imHere': 'Es esmu šeit~', + 'guideWelcomeWakeAI': + 'Laipni lūdzam Voitrans! Vispirms pamodiniet savu AI “Liliju”.', + 'aiReplyCompleted': 'Lilija ir pabeigusi atbildi!', + 'aiThinking': 'Lilija domā…', + 'guideAwakenSuccess': 'Lieliski! Lilija ir nomodā — lūdziet tai palīdzēt.', + 'confirmInput': 'Apstiprināt ievadi', + 'guideClickSendPrefix': 'Nospiediet sūtīt, ', + 'guideWeatherStart': 'Sakiet Lilijai: “Kāds šodien ir laiks?”', + 'guideWeatherInput': 'Kāds šodien ir laiks?', + 'guideWeatherSend': 'Lilija ziņos par laikapstākļiem reāllaikā', + 'guideWeatherEnd': + 'Lilija var ziņot par laikapstākļiem tiešsaistē — izmēģiniet citas komandas', + 'guideMusicStart': 'Sakiet Lilijai: “Atskaņo rokmūziku”', + 'guideMusicInput': 'Atskaņo rokmūziku', + 'guideMusicSend': 'Lilija atradīs mūziku jums', + 'guideMusicEnd': 'Lilija atrada mūziku — izmēģiniet citas komandas', + 'guideNavStart': 'Sakiet Lilijai: “Navigē uz Šeņdžeņas lidostu”', + 'guideNavInput': 'Navigē uz Šeņdžeņas lidostu', + 'guideNavSend': 'Lilija izplānos maršrutu', + 'guideNavEnd': 'Navigācija iestatīta — izmēģiniet citas komandas', 'guideMeetingStart': - 'Tell Lily: “Create a meeting reminder for 3pm tomorrow”', - 'guideMeetingInput': 'Create a meeting reminder for 3pm tomorrow', - 'guideMeetingSend': 'Lily will create a meeting reminder', - 'guideMeetingEnd': 'Reminder created—try other commands', - 'guidePhoneStart': 'Tell Lily: “Call Mom”', - 'guidePhoneInput': 'Call Mom', - 'guidePhoneSend': 'Lily will make the call', - 'guidePhoneEnd': 'Call placed—try other commands', - 'guideSmsStart': 'Tell Lily: “Send Dad a text: I’ll be home for dinner”', - 'guideSmsInput': 'Text Dad: I’ll be home for dinner', - 'guideSmsSend': 'Lily will send the message', - 'guideSmsEnd': 'Message sent—voice control is convenient', + 'Sakiet Lilijai: “Izveido sapulces atgādinājumu rītdien plkst. 15:00”', + 'guideMeetingInput': 'Izveido sapulces atgādinājumu rītdien plkst. 15:00', + 'guideMeetingSend': 'Lilija izveidos sapulces atgādinājumu', + 'guideMeetingEnd': 'Atgādinājums izveidots — izmēģiniet citas komandas', + 'guidePhoneStart': 'Sakiet Lilijai: “Zvani mammai”', + 'guidePhoneInput': 'Zvani mammai', + 'guidePhoneSend': 'Lilija veiks zvanu', + 'guidePhoneEnd': 'Zvans veikts — izmēģiniet citas komandas', + 'guideSmsStart': + 'Sakiet Lilijai: “Nosūti tētim ziņu: Es būšu mājās uz vakariņām”', + 'guideSmsInput': 'Ziņa tētim: Es būšu mājās uz vakariņām', + 'guideSmsSend': 'Lilija nosūtīs ziņu', + 'guideSmsEnd': 'Ziņa nosūtīta — balss vadība ir ērta', // Meeting模块 - 首页与导航 "startMeeting": "Sākt sapulci", @@ -463,154 +496,166 @@ const Map lvLV = { 'recordingDetails': 'Ieraksta detaļas', 'aiSummary': 'AI kopsavilkums', 'meetingTranscript': 'Sapulces atšifrējums', - 'files': 'Files', - 'mine': 'Mine', - 'connect': 'Connect', - 'allFiles': 'All Files', - 'searchInAllFiles': 'Search in all files', - 'from': 'From', - 'sortBy': 'Sort by', - 'creationTime': 'Creation Time', - 'bluetoothConnection': 'Bluetooth Connection', - 'meetingReconnect': 'Reconnect', - 'searching': 'Searching...', - 'searchFailed': 'Search failed, please check if Bluetooth is enabled', - 'aiPenNotFound': 'AI PEN device not found', - 'connectedToAiPen': 'Connected to AI PEN device', - 'checkingNewFiles': 'Checking for new files to import', - 'startingWifi': 'Starting Wi-Fi...', - 'newFilesDetected': 'New files detected, preparing to import', - 'noNewFiles': 'No new files to import', - 'connectingWifi': 'Connecting to Wi-Fi...', - 'wifiConnected': 'Wi-Fi connected successfully', - 'downloadingFiles': 'Downloading files...', - 'downloadingFileProgress': 'Total {total} files, downloading file {current}', - 'downloadComplete': 'Download complete', + 'files': 'Faili', + 'mine': 'Mani', + 'connect': 'Savienot', + 'allFiles': 'Visi faili', + 'searchInAllFiles': 'Meklēt visos failos', + 'from': 'No', + 'sortBy': 'Kārtot pēc', + 'creationTime': 'Izveides laiks', + 'bluetoothConnection': 'Bluetooth savienojums', + 'meetingReconnect': 'Atkārtoti savienot', + 'searching': 'Meklē...', + 'searchFailed': + 'Meklēšana neizdevās, lūdzu, pārbaudiet, vai Bluetooth ir iespējots', + 'aiPenNotFound': 'AI PEN ierīce nav atrasta', + 'connectedToAiPen': 'Savienots ar AI PEN ierīci', + 'checkingNewFiles': 'Pārbauda jaunus failus importēšanai', + 'startingWifi': 'Startē Wi-Fi...', + 'newFilesDetected': 'Atrasti jauni faili, gatavo importēšanai', + 'noNewFiles': 'Nav jaunu failu importēšanai', + 'connectingWifi': 'Savieno ar Wi-Fi...', + 'wifiConnected': 'Wi-Fi savienojums veiksmīgs', + 'downloadingFiles': 'Lejupielādē failus...', + 'downloadingFileProgress': 'Kopā {total} faili, lejupielādē failu {current}', + 'downloadComplete': 'Lejupielāde pabeigta', 'downloadCompleteInfo': - 'Download complete, {count} files in total, returning automatically in 2 seconds', + 'Lejupielāde pabeigta, kopā {count} faili, automātiski atgriežas pēc 2 sekundēm', // Meeting模块 - 录音功能 - 'startRecording': 'Start Recording', - 'liveRecording': 'Live Recording', - 'audioVideoRecording': 'Audio/Video Recording', - 'callRecording': 'Call Recording', - 'importAudio': 'Import Audio', + 'startRecording': 'Sākt ierakstīšanu', + 'liveRecording': 'Tiešraide', + 'audioVideoRecording': 'Audio/video ierakstīšana', + 'callRecording': 'Zvanu ierakstīšana', + 'importAudio': 'Importēt audio', 'meetingRecordExitTitle': 'Iziet no ieraksta', // 退出录音 - 'meetingRecordExitMessage': 'Izvēlieties, ko darīt pirms iziešanas', // 请选择离开后的操作 + 'meetingRecordExitMessage': + 'Izvēlieties, ko darīt pirms iziešanas', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Beigt un saglabāt', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Beigt nesaglabājot', // 结束录音不保存 'meetingRecordContinueInBackground': 'Turpināt ierakstīšanu fonā', // 后台继续录音 - 'meetingRecordStopTimeout': 'Ieraksta apturēšanai beidzās laiks. Mēģiniet vēlreiz.', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'Neizdevās apturēt ierakstu. Mēģiniet vēlreiz.', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'Neizdevās saglabāt ierakstu. Mēģiniet vēlreiz.', // 保存录音失败,请重试 + 'meetingRecordStopTimeout': + 'Ieraksta apturēšanai beidzās laiks. Mēģiniet vēlreiz.', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'Neizdevās apturēt ierakstu. Mēģiniet vēlreiz.', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'Neizdevās saglabāt ierakstu. Mēģiniet vēlreiz.', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'Notiek ierakstīšana', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Ierakstīšana fonā. Pieskarieties, lai atgrieztos lietotnē.', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'Ierakstīšana fonā. Pieskarieties, lai atgrieztos lietotnē.', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Rādīt virs citām lietotnēm', // 悬浮窗权限 - 'overlayPermissionTranslationDesc': 'Lai rādītu tulkojuma rezultātus zvanu vai audio/video tulkošanas laikā, mums nepieciešama pārklājuma atļauja. Tas ļauj redzēt tulkojumus reāllaikā, izmantojot citas lietotnes.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 - 'overlayPermissionRecordingDesc': 'Lai ierakstīšanas laikā rādītu peldošo ierakstīšanas joslu (taimeris/pauze/turpināt), mums nepieciešama pārklājuma atļauja.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 - 'overlayPermissionOpenSettingsFailed': 'Nevar automātiski atvērt sistēmas iestatījumus. Lūdzu, atveriet Iestatījumus un manuāli iespējojiet pārklājuma atļauju.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 - 'transcribing': 'Transcribing...', - 'summarizing': 'Summarizing...', - 'analyzing': 'Analyzing...', - 'summaryComplete': 'Summary Complete', - 'generate': 'Generate', - 'overview': 'Overview', - 'transcription': 'Transcription', - 'summary': 'Summary', - 'mindMap': 'Mind Map', - 'editSpeaker': 'Edit', - 'nameSpeaker': 'Name Speaker', + 'overlayPermissionTranslationDesc': + 'Lai rādītu tulkojuma rezultātus zvanu vai audio/video tulkošanas laikā, mums nepieciešama pārklājuma atļauja. Tas ļauj redzēt tulkojumus reāllaikā, izmantojot citas lietotnes.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 + 'overlayPermissionRecordingDesc': + 'Lai ierakstīšanas laikā rādītu peldošo ierakstīšanas joslu (taimeris/pauze/turpināt), mums nepieciešama pārklājuma atļauja.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 + 'overlayPermissionOpenSettingsFailed': + 'Nevar automātiski atvērt sistēmas iestatījumus. Lūdzu, atveriet Iestatījumus un manuāli iespējojiet pārklājuma atļauju.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 + 'transcribing': 'Transkribē...', + 'summarizing': 'Apkopo...', + 'analyzing': 'Analizē...', + 'summaryComplete': 'Kopsavilkums pabeigts', + 'generate': 'Ģenerēt', + 'overview': 'Pārskats', + 'transcription': 'Transkripcija', + 'summary': 'Kopsavilkums', + 'mindMap': 'Domu karte', + 'editSpeaker': 'Rediģēt', + 'nameSpeaker': 'Nosaukt runātāju', // Meeting模块 - 转写与总结 - 'reSummarize': 'Re-summarize', - 'dateAndTime': 'Date & Time', - 'location': 'Location', - 'attendees': 'Attendees', - 'inputLocation': 'Enter Location', - 'inputAttendees': 'Enter Attendees', + 'reSummarize': 'Apkopot atkārtoti', + 'dateAndTime': 'Datums un laiks', + 'location': 'Atrašanās vieta', + 'attendees': 'Dalībnieki', + 'inputLocation': 'Ievadiet atrašanās vietu', + 'inputAttendees': 'Ievadiet dalībniekus', // Meeting模块 - 模版与生成 - 'selectSummaryTemplate': 'Select Summary Template', - 'useThisTemplate': 'Use This Template', - 'lastUsed': 'Last Used', - 'create': 'Izveidot', - 'templateDetails': 'Veidnes informācija', - 'tag': 'Birka', - 'description': 'Apraksts', - 'template': 'Veidne', - 'deleteTemplate': 'Dzēst veidni', - 'deleteTemplateConfirm': 'Vai esat pārliecināts, ka vēlaties dzēst šo veidni?', - 'editTemplate': 'Rediģēt veidni', - 'createTemplate': 'Izveidot veidni', - 'name': 'Nosaukums', - 'templateContentHint': 'Lūdzu, ievadiet veidnes saturu! Padoms: Noklikšķiniet uz AI pogas augšpusē, lai ātri ģenerētu veidnes saturu, pamatojoties uz ievadīto nosaukumu un aprakstu', - 'inputNameHint': 'Lūdzu, ievadiet nosaukumu', - 'inputDescHint': 'Lūdzu, ievadiet aprakstu', - 'custom': 'Pielāgots', - 'pleaseEnter': 'Lūdzu ievadiet', - 'viewAll': 'View All', - 'recordingLanguage': 'Recording Language', - 'chineseSimplified': 'Chinese Mandarin (Simplified)', - 'meetingGenerateNow': 'Generate Now', - 'keyEventsAnalyzed': 'Analyzed {count} key events.', + 'selectSummaryTemplate': 'Izvēlēties kopsavilkuma veidni', + 'useThisTemplate': 'Lietot šo veidni', + 'lastUsed': 'Pēdējo reizi lietots', + 'create': 'Izveidot', + 'templateDetails': 'Veidnes informācija', + 'tag': 'Birka', + 'description': 'Apraksts', + 'template': 'Veidne', + 'deleteTemplate': 'Dzēst veidni', + 'deleteTemplateConfirm': + 'Vai esat pārliecināts, ka vēlaties dzēst šo veidni?', + 'editTemplate': 'Rediģēt veidni', + 'createTemplate': 'Izveidot veidni', + 'name': 'Nosaukums', + 'templateContentHint': + 'Lūdzu, ievadiet veidnes saturu! Padoms: Noklikšķiniet uz AI pogas augšpusē, lai ātri ģenerētu veidnes saturu, pamatojoties uz ievadīto nosaukumu un aprakstu', + 'inputNameHint': 'Lūdzu, ievadiet nosaukumu', + 'inputDescHint': 'Lūdzu, ievadiet aprakstu', + 'custom': 'Pielāgots', + 'pleaseEnter': 'Lūdzu ievadiet', + 'viewAll': 'Skatīt visu', + 'recordingLanguage': 'Ieraksta valoda', + 'chineseSimplified': 'Ķīniešu mandarīnu (vienkāršotā)', + 'meetingGenerateNow': 'Ģenerēt tagad', + 'keyEventsAnalyzed': 'Analizēti {count} galvenie notikumi.', 'aiAnalysisDesc': - 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', + 'AI analīze identificē galvenos notikumus ierakstos, ļaujot jums atlasīt svarīgus notikumus AI ģenerēšanai.', // Meeting模块 - 文件操作 - 'importing': 'Importing...', - 'batchImporting': 'Batch importing...', - 'importingLocalRecordings': 'Importing local recordings...', - 'importFailed': 'Import file failed: {filePath}, error: {error}', - 'importSuccess': 'Successfully imported {count} local recordings', - 'importError': 'Import failed: {error}', - 'pleaseSelectAudioFile': 'Please select audio file', - 'shareAudio': 'Share Meeting Audio', - 'shareComplete': 'Share complete!', - 'shareFailed': 'Share failed: {error}', - 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', + 'importing': 'Importē...', + 'batchImporting': 'Pakešu importēšana...', + 'importingLocalRecordings': 'Importē lokālos ierakstus...', + 'importFailed': 'Faila importēšana neizdevās: {filePath}, kļūda: {error}', + 'importSuccess': 'Veiksmīgi importēti {count} lokālie ieraksti', + 'importError': 'Importēšana neizdevās: {error}', + 'pleaseSelectAudioFile': 'Lūdzu, atlasiet audio failu', + 'shareAudio': 'Kopīgot sapulces audio', + 'shareComplete': 'Kopīgošana pabeigta!', + 'shareFailed': 'Kopīgošana neizdevās: {error}', + 'fileProcessingFailed': + 'Faila apstrāde neizdevās: {filePath}, kļūda: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Saglabāt domu karti', - 'shareMindMap': 'Share Mind Map', - 'shareSuccess': 'Share Success', + 'saveMindMap': 'Saglabāt domu karti', + 'shareMindMap': 'Kopīgot domu karti', + 'shareSuccess': 'Kopīgošana veiksmīga', // Meeting模块 - AI问答 - 'askAI': 'Ask AI ...', - 'askAIPrompt': 'What can I help you with today?', - 'continueAsk': 'Continue Asking', - 'todoList': 'To-Do List', - 'extractConclusion': 'Extract Conclusion', - 'generateKeyIndicators': 'Generate Key Indicators', + 'askAI': 'Jautāt AI ...', + 'askAIPrompt': 'Kā es varu jums šodien palīdzēt?', + 'continueAsk': 'Turpināt jautāt', + 'todoList': 'Uzdevumu saraksts', + 'extractConclusion': 'Izvilkt secinājumu', + 'generateKeyIndicators': 'Ģenerēt galvenos rādītājus', // Meeting模块 - 分享与导出 - 'shareLink': 'Share Link', - 'copyTranscript': 'Copy Transcript', - 'copySummary': 'Copy Summary', - 'exportAudio': 'Export Audio', - 'exportTranscript': 'Export Transcript', - 'shareMeetingAudio': 'Share Meeting Audio', - 'exportSummary': 'Export Summary', - 'exportAs': 'Export As', - 'exportingPDF': 'Exporting PDF...', - 'export': 'Eksportēt', + 'shareLink': 'Kopīgot saiti', + 'copyTranscript': 'Kopēt transkripciju', + 'copySummary': 'Kopēt kopsavilkumu', + 'exportAudio': 'Eksportēt audio', + 'exportTranscript': 'Eksportēt transkripciju', + 'shareMeetingAudio': 'Kopīgot sapulces audio', + 'exportSummary': 'Eksportēt kopsavilkumu', + 'exportAs': 'Eksportēt kā', + 'exportingPDF': 'Eksportē PDF...', + 'export': 'Eksportēt', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Piemērot visām šī runātāja rindkopām', 'summaryWillBeUpdatedAutomatically': 'Kopsavilkums tiks automātiski atjaunināts, pamatojoties uz veidni', - 'nameCurrentSpeaker': 'Name Current Speaker', - 'recentlyUsedNames': 'Recently Used Names', - 'applyToCurrentParagraph': 'Apply to Current Paragraph', - 'totalTime': 'Total Time', + 'nameCurrentSpeaker': 'Nosaukt pašreizējo runātāju', + 'recentlyUsedNames': 'Nesen lietotie vārdi', + 'applyToCurrentParagraph': 'Piemērot pašreizējai rindkopai', + 'totalTime': 'Kopējais laiks', 'summarySpeakerWillBeUpdatedAutomatically': - 'Summary speakers will be updated automatically', + 'Kopsavilkuma runātāji tiks automātiski atjaunināti', // Meeting模块 - 云端同步 - 'syncToCloud': 'Sync to Cloud', + 'syncToCloud': 'Sinhronizēt ar mākoni', 'syncToCloudTip': - 'Automatically sync your recordings to the cloud, you can play, manage and share recordings through any VOITRANS APP or VOITRANS Web (web.voitrans.com).', - 'syncToVoitransApp': 'Sync VOITRANS APP', - 'transcriptionRecord': 'Transcription Record', + 'Automātiski sinhronizējiet savus ierakstus ar mākoni — varat atskaņot, pārvaldīt un kopīgot ierakstus caur jebkuru VOITRANS lietotni vai VOITRANS tīmekli (web.voitrans.com).', + 'syncToVoitransApp': 'Sinhronizēt ar VOITRANS lietotni', + 'transcriptionRecord': 'Transkripcijas ieraksts', // Meeting模块 - 我的页面 'transcriptionRecords': 'Transcription Records', @@ -702,18 +747,19 @@ const Map lvLV = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Analīze neizdevās, lūdzu, mēģiniet vēlreiz vēlāk', - 'transcriptionFailed': 'Transkripcija neizdevās, lūdzu, mēģiniet vēlreiz vēlāk', - 'summaryFailed': 'Kopsavilkums neizdevās, lūdzu, mēģiniet vēlreiz vēlāk', - 'summaryFailedShort': 'Kopsavilkums neizdevās', - 'transcriptionFailedShort': 'Transkripcija neizdevās', + 'analysisFailed': 'Analīze neizdevās, lūdzu, mēģiniet vēlreiz vēlāk', + 'transcriptionFailed': + 'Transkripcija neizdevās, lūdzu, mēģiniet vēlreiz vēlāk', + 'summaryFailed': 'Kopsavilkums neizdevās, lūdzu, mēģiniet vēlreiz vēlāk', + 'summaryFailedShort': 'Kopsavilkums neizdevās', + 'transcriptionFailedShort': 'Transkripcija neizdevās', // Meeting模块 - 播放器 - 'playerNotReady': 'Audio atskaņotājs nav gatavs, lūdzu, uzgaidiet', - 'playFailed': 'Atskaņošana neizdevās', - 'audioFileNotFound': 'Audio fails nav atrasts', - 'fetchingAudio': 'Iegūst audio no mākoņa...', - 'playerLoadFailed': 'Audio atskaņotāja ielāde neizdevās', + 'playerNotReady': 'Audio atskaņotājs nav gatavs, lūdzu, uzgaidiet', + 'playFailed': 'Atskaņošana neizdevās', + 'audioFileNotFound': 'Audio fails nav atrasts', + 'fetchingAudio': 'Iegūst audio no mākoņa...', + 'playerLoadFailed': 'Audio atskaņotāja ielāde neizdevās', // 设置页 "systemSettings": "Sistēmas iestatījumi", @@ -822,7 +868,8 @@ const Map lvLV = { "swipeUpForMore": "Velciet uz augšu, lai redzētu vairāk", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Kad iespējots: AI netiks pārtraukts ar jūsu balsi, kamēr tas runā, un var apstrādāt tikai vienu sarunas kārtu vienlaicīgi. Lai sāktu jaunu kārtu, vienkārši pasakiet modināšanas vārdu.', + 'voice_interrupt_tip': + 'Kad iespējots: AI netiks pārtraukts ar jūsu balsi, kamēr tas runā, un var apstrādāt tikai vienu sarunas kārtu vienlaicīgi. Lai sāktu jaunu kārtu, vienkārši pasakiet modināšanas vārdu.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -879,6 +926,13 @@ const Map lvLV = { 'Mēs vēlamies zināt, kāpēc jūs ziņojat, jūs varat aprakstīt problēmu, ar kuru saskārāties.', 'generatedByAi': 'Ģenerējis AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Šeit ir dažas ieteicamās dziesmas:', 'playList': 'Atskaņošanas saraksts', @@ -899,6 +953,29 @@ const Map lvLV = { "bicycling": "Riteņbraukšana", "tsransit": "Sabiedriskais transports", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Failed to start navigation', + 'cannotPlayMusicListRetryLater': + 'Cannot play music list, please try again later', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Error opening map', + 'pleaseInstallAmapApp': 'Please install the Amap app first', + 'pleaseInstallBaiduMapApp': 'Please install the Baidu Maps app first', + 'appleMapStartFailed': 'Apple Maps failed to start', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Error opening Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Laikapstākļu pieprasījums:', 'highest': 'Augstākā', @@ -971,8 +1048,19 @@ const Map lvLV = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Disable Floating Window', + 'enableFloatingWindow': 'Enable Floating Window', + 'permissionTip': 'Permission Tip', + 'micPermissionRequiredForRecording': + 'Microphone permission is required for recording', + 'deleteTranslationRecordError': 'Error deleting translation record: @error', "translationFailed": "Translation failed", + "translating": "Translating", + "translate": "Translate", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Lūdzu, ievadiet tulkojamo tekstu", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1247,17 +1335,19 @@ const Map lvLV = { 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigācija notiek', - 'native.notification.navigation.keepRunning': 'Notiek navigācija, turiet lietotni atvērtu', - 'native.notification.bleAgent.running': 'Balss asistenta aģents darbojas', - 'native.notification.audioRecording.recording': 'Notiek audio ierakstīšana, pieskarieties, lai atgrieztos lietotnē', - 'native.notification.music.waiting': 'Gaida atskaņošanu', - 'native.notification.music.previous': 'Iepriekšējais', - 'native.notification.music.next': 'Nākamais', - 'native.notification.music.play': 'Atskaņot', - 'native.notification.music.pause': 'Pauze', - 'native.notification.qqMusic.playing': 'Atskaņo mūziku', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigācija notiek', + 'native.notification.navigation.keepRunning': + 'Notiek navigācija, turiet lietotni atvērtu', + 'native.notification.bleAgent.running': 'Balss asistenta aģents darbojas', + 'native.notification.audioRecording.recording': + 'Notiek audio ierakstīšana, pieskarieties, lai atgrieztos lietotnē', + 'native.notification.music.waiting': 'Gaida atskaņošanu', + 'native.notification.music.previous': 'Iepriekšējais', + 'native.notification.music.next': 'Nākamais', + 'native.notification.music.play': 'Atskaņot', + 'native.notification.music.pause': 'Pauze', + 'native.notification.qqMusic.playing': 'Atskaņo mūziku', // 版本更新 'newVersionFound': 'Atrasta jauna versija', // 版本更新对话框标题 @@ -1398,6 +1488,59 @@ const Map lvLV = { "removeEarbudsEnsureBattery": "Izņemiet abas austiņas un pārliecinieties, ka abu baterijas līmenis ir virs 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Upgrade Successful', + 'otaUpgradeCompleteRepair': + 'Firmware upgrade complete!\n\nDevice needs to be re-paired to work properly. Go to pairing page now?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': + 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': + 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': + 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', + // 音乐模块 "noMusic": "Nav mūzikas", // 暂无音乐 "noPlayingMusic": "Netiek atskaņota mūzika", // 暂无播放音乐 diff --git a/lib/core/translations/language/ms_my.dart b/lib/core/translations/language/ms_my.dart index 1bc3ff392..cd30995de 100644 --- a/lib/core/translations/language/ms_my.dart +++ b/lib/core/translations/language/ms_my.dart @@ -1,5 +1,4 @@ const Map msMY = { - // 通用 'continue': 'Teruskan', 'confirm': 'Sahkan', @@ -19,11 +18,11 @@ const Map msMY = { "unknownError": "Ralat tidak diketahui", "asrConnectionFailed": "Sambungan ke perkhidmatan pengecaman suara gagal. Sila semak rangkaian atau cuba lagi nanti.", - "justNow": "Just now", - "minutesAgo": "@minutes minutes ago", - "yesterday": "Yesterday", - "daysAgo": "@days days ago", - "hoursAgo": "@hours hours ago", + "justNow": "Sebentar tadi", + "minutesAgo": "@minutes minit yang lalu", + "yesterday": "Semalam", + "daysAgo": "@days hari yang lalu", + "hoursAgo": "@hours jam yang lalu", // 启动页 "slogan": "Menghubungkan dunia, melampaui suara", @@ -169,6 +168,29 @@ const Map msMY = { 'right': 'Kanan', 'checkConnectionStatusFailed': 'Gagal menyemak status sambungan', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Inisialisasi Bluetooth gagal: @error', + 'needBluetoothAndLocationPermission': + 'Kebenaran Bluetooth dan lokasi diperlukan untuk mengimbas peranti', + 'permissionRequestFailedWithError': 'Permintaan kebenaran gagal: @error', + 'needPermission': 'Kebenaran Diperlukan', + 'blePermissionDialogContent': + 'Aplikasi ini memerlukan kebenaran Bluetooth dan lokasi untuk mengimbas peranti. Sila aktifkan di Tetapan.', + 'needEnableBluetooth': 'Aktifkan Bluetooth', + 'enableBluetoothDialogContent': + 'Sila aktifkan Bluetooth untuk mengimbas dan menyambung peranti.', + 'bleScanFailedWithError': 'Imbasan gagal: @error', + 'bleConnectionSuccess': 'Sambungan Berjaya', + 'bleConnectedToDevice': 'Disambungkan ke @device', + 'bleConnectionFailedWithError': 'Sambungan gagal: @error', + 'bleDisconnected': 'Terputus', + 'bleDeviceDisconnected': 'Peranti terputus', + 'bleDisconnectFailedWithError': 'Gagal memutuskan sambungan: @error', + 'signalStrong': 'Kuat', + 'signalMedium': 'Sederhana', + 'signalWeak': 'Lemah', + 'signalVeryWeak': 'Sangat Lemah', + // 发现页 "searchAi": "Cari fungsi AI...", "exploreSlogan": "Fon telinga pintar, kemungkinan tanpa had", @@ -196,22 +218,22 @@ const Map msMY = { // 用量统计模块 "aiChat": "AI Chat", - "translationStats": "Translation Statistics", + "translationStats": "Statistik Terjemahan", "meetingStats": "Meeting Statistics", "today": "Today", "thisWeek": "This Week", "thisMonth": "This Month", "history": "History", "currentSessionStats": "Current Session Stats", - "translationCount": "Translation Count", + "translationCount": "Bilangan Terjemahan", "sessionDuration": "Session Duration", "characters": "Characters", - "recordingDuration": "Recording Duration", + "recordingDuration": "Tempoh Rakaman", "totalApiCalls": "Total API Calls", "sessionCount": "Session Count", "totalCharacters": "Total Characters", "apiCallStats": "API Call Stats", - "translationApi": "Translation API", + "translationApi": "API Terjemahan", "asr": "ASR", "tts": "TTS", "dataVolumeStats": "Data Volume Stats", @@ -230,9 +252,8 @@ const Map msMY = { "totalAudioDuration": "Total Audio Duration", "audioFileSize": "Audio File Size", "transcriptBytes": "Transcript Bytes", - "loadFailed": "Load Failed", - "statsLoadFailedTryLater": - "Statistics failed to load. Please try again later.", + "loadFailed": "Gagal Memuat", + "statsLoadFailedTryLater": "Statistik gagal dimuat. Sila cuba lagi kemudian.", "cleanupComplete": "Cleanup Complete", "cleanedOldData": "Cleaned data older than 90 days", "exportFeature": "Export Feature", @@ -244,66 +265,70 @@ const Map msMY = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Pembayaran berjaya', - 'paymentFailed': 'Pembayaran gagal', - 'gotIt': 'Faham', - 'paymentFailedTryAgain': 'Pembayaran gagal. Sila cuba lagi.', - 'selectPaymentMethod': 'Pilih kaedah pembayaran', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Gagal mencipta pesanan WeChat', - 'alipayOrderCreateFailed': 'Gagal mencipta pesanan Alipay', - 'appleOrderCreateFailed': 'Gagal mencipta pesanan Apple', - 'googleOrderCreateFailed': 'Gagal mencipta pesanan Google', - 'paypalOrderCreateFailed': 'Gagal mencipta pesanan PayPal', - 'paymentException': 'Pembayaran tidak normal', - 'paymentLaunchFailed': 'Gagal membuka pembayaran', - 'paymentExceptionWithError': 'Pembayaran tidak normal: @error', - 'paymentProcessingCheckLater': 'Pesanan anda sedang diproses. Sila semak kemudian.', - 'paymentResultQueryException': 'Gagal menyemak keputusan pembayaran: @error', - 'orderConfirmedQuotaRefreshed': 'Pesanan disahkan. Kuota anda telah dikemas kini.', - 'paymentCompletedConfirming': 'Pembayaran selesai. Sedang mengesahkan…', - 'paymentCancelled': 'Pembayaran dibatalkan', - 'paypalOpenedCompleteInBrowser': 'PayPal telah dibuka. Sila selesaikan pembayaran dalam pelayar.', - 'paypalOpenFailed': 'Tidak dapat membuka halaman pembayaran PayPal', - 'paymentTestTitle': 'Ujian Pembayaran', - 'paymentTestOrderInfo': 'Maklumat Pesanan Ujian', - 'paymentTestProductId': 'ID Produk', - 'paymentTestProductDescription': 'Penerangan produk', - 'paymentTestWechatDescription': 'Ujian pembayaran WeChat', - 'paymentTestAlipayDescription': 'Ujian pembayaran Alipay', - 'paymentTestAmount': 'Jumlah', - 'paymentTestSelectAmount': 'Pilih jumlah ujian', - 'paying': 'Sedang membayar...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Status pembayaran', - 'errorInfoWithMessage': 'Ralat: @message', - 'retest': 'Uji semula', - 'paymentTestInstructionsTitle': 'Arahan', - 'paymentTestInstructionsContent': '1. Pilih jumlah ujian (disyorkan: ¥0.01)\n2. Klik butang pembayaran untuk mula\n3. Selesaikan pembayaran dalam aplikasi pembayaran\n4. Kembali untuk menyemak keputusan', - 'startingWechatPayment': 'Membuka WeChat Pay...', - 'startingAlipayPayment': 'Membuka Alipay...', - 'wechatPaymentSuccess': 'Pembayaran WeChat Pay berjaya!', - 'wechatPaymentFailed': 'Pembayaran WeChat Pay gagal', - 'wechatPaymentLaunchFailed': 'Gagal membuka WeChat Pay', - 'cannotLaunchWechatPayment': 'Tidak dapat membuka WeChat Pay', - 'wechatPaymentException': 'WeChat Pay tidak normal', - 'wechatPaymentTestCompleted': 'Ujian pembayaran WeChat Pay selesai', - 'alipayPaymentSuccess': 'Pembayaran Alipay berjaya!', - 'alipayPaymentFailed': 'Pembayaran Alipay gagal', - 'alipayPaymentLaunchFailed': 'Gagal membuka Alipay', - 'cannotLaunchAlipayPayment': 'Tidak dapat membuka Alipay', - 'alipayPaymentException': 'Alipay tidak normal', - "insufficientIntegral": "Insufficient integral", + 'paymentSuccess': 'Pembayaran berjaya', + 'paymentFailed': 'Pembayaran gagal', + 'gotIt': 'Faham', + 'paymentFailedTryAgain': 'Pembayaran gagal. Sila cuba lagi.', + 'selectPaymentMethod': 'Pilih kaedah pembayaran', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Gagal mencipta pesanan WeChat', + 'alipayOrderCreateFailed': 'Gagal mencipta pesanan Alipay', + 'appleOrderCreateFailed': 'Gagal mencipta pesanan Apple', + 'googleOrderCreateFailed': 'Gagal mencipta pesanan Google', + 'paypalOrderCreateFailed': 'Gagal mencipta pesanan PayPal', + 'paymentException': 'Pembayaran tidak normal', + 'paymentLaunchFailed': 'Gagal membuka pembayaran', + 'paymentExceptionWithError': 'Pembayaran tidak normal: @error', + 'paymentProcessingCheckLater': + 'Pesanan anda sedang diproses. Sila semak kemudian.', + 'paymentResultQueryException': 'Gagal menyemak keputusan pembayaran: @error', + 'orderConfirmedQuotaRefreshed': + 'Pesanan disahkan. Kuota anda telah dikemas kini.', + 'paymentCompletedConfirming': 'Pembayaran selesai. Sedang mengesahkan…', + 'paymentCancelled': 'Pembayaran dibatalkan', + 'paypalOpenedCompleteInBrowser': + 'PayPal telah dibuka. Sila selesaikan pembayaran dalam pelayar.', + 'paypalOpenFailed': 'Tidak dapat membuka halaman pembayaran PayPal', + 'paymentTestTitle': 'Ujian Pembayaran', + 'paymentTestOrderInfo': 'Maklumat Pesanan Ujian', + 'paymentTestProductId': 'ID Produk', + 'paymentTestProductDescription': 'Penerangan produk', + 'paymentTestWechatDescription': 'Ujian pembayaran WeChat', + 'paymentTestAlipayDescription': 'Ujian pembayaran Alipay', + 'paymentTestAmount': 'Jumlah', + 'paymentTestSelectAmount': 'Pilih jumlah ujian', + 'paying': 'Sedang membayar...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Status pembayaran', + 'errorInfoWithMessage': 'Ralat: @message', + 'retest': 'Uji semula', + 'paymentTestInstructionsTitle': 'Arahan', + 'paymentTestInstructionsContent': + '1. Pilih jumlah ujian (disyorkan: ¥0.01)\n2. Klik butang pembayaran untuk mula\n3. Selesaikan pembayaran dalam aplikasi pembayaran\n4. Kembali untuk menyemak keputusan', + 'startingWechatPayment': 'Membuka WeChat Pay...', + 'startingAlipayPayment': 'Membuka Alipay...', + 'wechatPaymentSuccess': 'Pembayaran WeChat Pay berjaya!', + 'wechatPaymentFailed': 'Pembayaran WeChat Pay gagal', + 'wechatPaymentLaunchFailed': 'Gagal membuka WeChat Pay', + 'cannotLaunchWechatPayment': 'Tidak dapat membuka WeChat Pay', + 'wechatPaymentException': 'WeChat Pay tidak normal', + 'wechatPaymentTestCompleted': 'Ujian pembayaran WeChat Pay selesai', + 'alipayPaymentSuccess': 'Pembayaran Alipay berjaya!', + 'alipayPaymentFailed': 'Pembayaran Alipay gagal', + 'alipayPaymentLaunchFailed': 'Gagal membuka Alipay', + 'cannotLaunchAlipayPayment': 'Tidak dapat membuka Alipay', + 'alipayPaymentException': 'Alipay tidak normal', + "insufficientIntegral": "Mata tidak mencukupi", "insufficientBalanceDesc": - 'Insufficient balance, please go to the corresponding recharge page to recharge.', - "recharge": 'Go to Recharge', + 'Baki tidak mencukupi, sila pergi ke halaman tambah nilai yang berkaitan untuk tambah nilai.', + "recharge": 'Tambah Nilai', "aiMemberExpiredDesc": - 'AI membership expired, please go to the membership recharge page to renew.', + 'Keahlian AI telah tamat tempoh, sila pergi ke halaman pembaharuan keahlian untuk memperbaharui.', // 商品模块 - AI商品页 'musicAndRecommendation': 'Music & Recommendation', @@ -331,18 +356,18 @@ const Map msMY = { 'templatedMessagesAndScheduleReminders': 'Template messages and schedule reminders', 'aiDisclaimer': - 'Features depend on device permissions, service availability, and network conditions.', + 'Ciri bergantung pada kebenaran peranti, ketersediaan perkhidmatan, dan keadaan rangkaian.', // 商品模块 - 翻译商品页 'realtimeTranscription': 'Real-time Transcription', 'sceneLexicon': 'Scenario Glossary', 'subtitleDisplay': 'Subtitles', 'transHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'Pentafsiran serentak masa nyata dan terjemahan teks dengan suara kependaman rendah.', 'transHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', + 'translateZhEn': 'Terjemahan Cina-Inggeris', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', + 'multiLangTextTranslation': 'Terjemahan teks berbilang bahasa', 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', @@ -350,18 +375,18 @@ const Map msMY = { 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', 'colorHighContrast': 'High color contrast', 'transDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'Prestasi terjemahan bergantung pada mikrofon, kependaman rangkaian, dan bunyi persekitaran.', // 商品模块 - 会议商品页 - 'meetingRecording': 'Meeting Recording', + 'meetingRecording': 'Rakaman Mesyuarat', 'transcriptionAndSummary': 'Transcription & Summary', 'keywordSearch': 'Keyword Search', 'collaborationSharing': 'Collaboration & Sharing', 'meetingHeaderDesc1': - 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', + 'Rakaman audio, transkripsi, carian kata kunci, dan ringkasan automatik untuk meningkatkan kecekapan mesyuarat.', 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', - 'meetingAutoRecording': 'Auto recording and segmentation', + 'meetingAutoRecording': 'Rakaman automatik dan segmentasi', 'meetingSpeakerTagging': 'Speaker labeling', 'meetingLongAudioTranscription': 'Long audio transcription', 'meetingKeyPointSummary': 'Key point extraction', @@ -370,7 +395,7 @@ const Map msMY = { 'meetingExportSummary': 'Export minutes', 'meetingMultiPlatformShare': 'Share across platforms', 'meetingDisclaimer': - 'Use in quiet environments; performance depends on microphone and network.', + 'Gunakan di persekitaran yang senyap; prestasi bergantung pada mikrofon dan rangkaian.', // 商品模块 - VIP会员页 'benefitsOverview': 'Benefits overview', @@ -384,7 +409,7 @@ const Map msMY = { 'longTermDiscountPlan': 'Long-term discount plan', 'generalPrivileges': 'General privileges', 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', + 'crossDeviceSync': 'Penyegerakan merentas peranti', 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', @@ -395,18 +420,18 @@ const Map msMY = { 'meet_001_name': 'Meeting Basic 100', 'meet_002_name': 'Meeting Basic 500', 'meet_003_name': 'Meeting Basic 1000', - 'trans_001_name': 'Translation Basic 100', - 'trans_002_name': 'Translation Basic 500', - 'trans_003_name': 'Translation Basic 1000', + 'trans_001_name': 'Terjemahan Asas 100', + 'trans_002_name': 'Terjemahan Asas 500', + 'trans_003_name': 'Terjemahan Asas 1000', 'ai_001_desc': 'Includes 100 uses. Access core AI features.', 'ai_002_desc': 'Includes 500 uses. Access core AI features.', 'ai_003_desc': 'Includes 1000 uses. Access core AI features.', - 'meet_001_desc': 'Includes 100 meeting recordings/transcriptions.', - 'meet_002_desc': 'Includes 500 meeting recordings/transcriptions.', - 'meet_003_desc': 'Includes 1000 meeting recordings/transcriptions.', - 'trans_001_desc': 'Includes 100 translations (voice/text).', - 'trans_002_desc': 'Includes 500 translations (voice/text).', - 'trans_003_desc': 'Includes 1000 translations (voice/text).', + 'meet_001_desc': 'Termasuk 100 rakaman/transkripsi mesyuarat.', + 'meet_002_desc': 'Termasuk 500 rakaman/transkripsi mesyuarat.', + 'meet_003_desc': 'Termasuk 1000 rakaman/transkripsi mesyuarat.', + 'trans_001_desc': 'Termasuk 100 terjemahan (suara/teks).', + 'trans_002_desc': 'Termasuk 500 terjemahan (suara/teks).', + 'trans_003_desc': 'Termasuk 1000 terjemahan (suara/teks).', // 商品模块 - 页脚 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', @@ -462,52 +487,61 @@ const Map msMY = { 'recordingDetails': 'Butiran Rakaman', 'aiSummary': 'Ringkasan AI', 'meetingTranscript': 'Transkrip Mesyuarat', - 'files': 'Files', - 'mine': 'Mine', - 'connect': 'Connect', - 'allFiles': 'All Files', - 'searchInAllFiles': 'Search in all files', - 'from': 'From', - 'sortBy': 'Sort by', - 'creationTime': 'Creation Time', - 'bluetoothConnection': 'Bluetooth Connection', - 'meetingReconnect': 'Reconnect', - 'searching': 'Searching...', - 'searchFailed': 'Search failed, please check if Bluetooth is enabled', - 'aiPenNotFound': 'AI PEN device not found', - 'connectedToAiPen': 'Connected to AI PEN device', - 'checkingNewFiles': 'Checking for new files to import', + 'files': 'Fail', + 'mine': 'Milik Saya', + 'connect': 'Sambung', + 'allFiles': 'Semua Fail', + 'searchInAllFiles': 'Cari dalam semua fail', + 'from': 'Daripada', + 'sortBy': 'Isih mengikut', + 'creationTime': 'Masa dicipta', + 'bluetoothConnection': 'Sambungan Bluetooth', + 'meetingReconnect': 'Sambung semula', + 'searching': 'Mencari...', + 'searchFailed': 'Carian gagal, sila semak sama ada Bluetooth diaktifkan', + 'aiPenNotFound': 'Peranti AI PEN tidak ditemui', + 'connectedToAiPen': 'Disambungkan ke peranti AI PEN', + 'checkingNewFiles': 'Menyemak fail baharu untuk diimport', 'startingWifi': 'Starting Wi-Fi...', 'newFilesDetected': 'New files detected, preparing to import', 'noNewFiles': 'No new files to import', - 'connectingWifi': 'Connecting to Wi-Fi...', - 'wifiConnected': 'Wi-Fi connected successfully', - 'downloadingFiles': 'Downloading files...', - 'downloadingFileProgress': 'Total {total} files, downloading file {current}', - 'downloadComplete': 'Download complete', + 'connectingWifi': 'Menyambung ke Wi‑Fi...', + 'wifiConnected': 'Wi‑Fi berjaya disambungkan', + 'downloadingFiles': 'Memuat turun fail...', + 'downloadingFileProgress': 'Jumlah {total} fail, memuat turun fail {current}', + 'downloadComplete': 'Muat turun selesai', 'downloadCompleteInfo': - 'Download complete, {count} files in total, returning automatically in 2 seconds', + 'Muat turun selesai, jumlah {count} fail, kembali secara automatik dalam 2 saat', // Meeting模块 - 录音功能 - 'startRecording': 'Start Recording', - 'liveRecording': 'Live Recording', - 'audioVideoRecording': 'Audio/Video Recording', - 'callRecording': 'Call Recording', + 'startRecording': 'Mula Merakam', + 'liveRecording': 'Rakaman Langsung', + 'audioVideoRecording': 'Rakaman Audio/Video', + 'callRecording': 'Rakaman Panggilan', 'importAudio': 'Import Audio', 'meetingRecordExitTitle': 'Keluar dari rakaman', // 退出录音 - 'meetingRecordExitMessage': 'Pilih apa yang perlu dibuat sebelum keluar', // 请选择离开后的操作 + 'meetingRecordExitMessage': + 'Pilih apa yang perlu dibuat sebelum keluar', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Tamatkan dan simpan', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Tamatkan tanpa menyimpan', // 结束录音不保存 - 'meetingRecordContinueInBackground': 'Teruskan rakaman di latar belakang', // 后台继续录音 - 'meetingRecordStopTimeout': 'Masa untuk menghentikan rakaman telah tamat. Sila cuba lagi.', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'Gagal menghentikan rakaman. Sila cuba lagi.', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'Gagal menyimpan rakaman. Sila cuba lagi.', // 保存录音失败,请重试 + 'meetingRecordContinueInBackground': + 'Teruskan rakaman di latar belakang', // 后台继续录音 + 'meetingRecordStopTimeout': + 'Masa untuk menghentikan rakaman telah tamat. Sila cuba lagi.', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'Gagal menghentikan rakaman. Sila cuba lagi.', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'Gagal menyimpan rakaman. Sila cuba lagi.', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'Rakaman sedang berjalan', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Merakam di latar belakang. Ketik untuk kembali ke aplikasi.', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'Merakam di latar belakang. Ketik untuk kembali ke aplikasi.', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Papar di atas aplikasi lain', // 悬浮窗权限 - 'overlayPermissionTranslationDesc': 'Untuk memaparkan hasil terjemahan semasa panggilan atau terjemahan audio/video, kami memerlukan kebenaran overlay. Ini membolehkan anda melihat terjemahan masa nyata semasa menggunakan aplikasi lain.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 - 'overlayPermissionRecordingDesc': 'Untuk memaparkan bar rakaman terapung (pemasa/jeda/sambung) semasa merakam, kami memerlukan kebenaran overlay.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 - 'overlayPermissionOpenSettingsFailed': 'Tidak dapat membuka tetapan sistem secara automatik. Sila buka Tetapan dan dayakan kebenaran overlay secara manual.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 + 'overlayPermissionTranslationDesc': + 'Untuk memaparkan hasil terjemahan semasa panggilan atau terjemahan audio/video, kami memerlukan kebenaran overlay. Ini membolehkan anda melihat terjemahan masa nyata semasa menggunakan aplikasi lain.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 + 'overlayPermissionRecordingDesc': + 'Untuk memaparkan bar rakaman terapung (pemasa/jeda/sambung) semasa merakam, kami memerlukan kebenaran overlay.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 + 'overlayPermissionOpenSettingsFailed': + 'Tidak dapat membuka tetapan sistem secara automatik. Sila buka Tetapan dan dayakan kebenaran overlay secara manual.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 'transcribing': 'Transcribing...', 'summarizing': 'Summarizing...', 'analyzing': 'Analyzing...', @@ -532,46 +566,47 @@ const Map msMY = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Cipta', - 'templateDetails': 'Butiran Templat', - 'tag': 'Tag', - 'description': 'Penerangan', - 'template': 'Templat', - 'deleteTemplate': 'Padam Templat', - 'deleteTemplateConfirm': 'Adakah anda pasti mahu memadamkan templat ini?', - 'editTemplate': 'Edit Templat', - 'createTemplate': 'Cipta Templat', - 'name': 'Nama', - 'templateContentHint': 'Sila masukkan kandungan templat! Petua: Klik butang AI di atas untuk menjana kandungan templat dengan cepat berdasarkan nama dan penerangan yang anda masukkan', - 'inputNameHint': 'Sila masukkan nama', - 'inputDescHint': 'Sila masukkan penerangan', - 'custom': 'Tersuai', - 'pleaseEnter': 'Sila masukkan', - 'viewAll': 'View All', - 'recordingLanguage': 'Recording Language', + 'create': 'Cipta', + 'templateDetails': 'Butiran Templat', + 'tag': 'Tag', + 'description': 'Penerangan', + 'template': 'Templat', + 'deleteTemplate': 'Padam Templat', + 'deleteTemplateConfirm': 'Adakah anda pasti mahu memadamkan templat ini?', + 'editTemplate': 'Edit Templat', + 'createTemplate': 'Cipta Templat', + 'name': 'Nama', + 'templateContentHint': + 'Sila masukkan kandungan templat! Petua: Klik butang AI di atas untuk menjana kandungan templat dengan cepat berdasarkan nama dan penerangan yang anda masukkan', + 'inputNameHint': 'Sila masukkan nama', + 'inputDescHint': 'Sila masukkan penerangan', + 'custom': 'Tersuai', + 'pleaseEnter': 'Sila masukkan', + 'viewAll': 'Lihat semua', + 'recordingLanguage': 'Bahasa Rakaman', 'chineseSimplified': 'Chinese Mandarin (Simplified)', - 'meetingGenerateNow': 'Generate Now', - 'keyEventsAnalyzed': 'Analyzed {count} key events.', + 'meetingGenerateNow': 'Jana Sekarang', + 'keyEventsAnalyzed': 'Menganalisis {count} peristiwa utama.', 'aiAnalysisDesc': - 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', + 'Analisis AI mengenal pasti peristiwa utama dalam rakaman, membolehkan anda memilih peristiwa penting untuk penjanaan AI.', // Meeting模块 - 文件操作 'importing': 'Importing...', 'batchImporting': 'Batch importing...', - 'importingLocalRecordings': 'Importing local recordings...', - 'importFailed': 'Import file failed: {filePath}, error: {error}', - 'importSuccess': 'Successfully imported {count} local recordings', - 'importError': 'Import failed: {error}', - 'pleaseSelectAudioFile': 'Please select audio file', + 'importingLocalRecordings': 'Mengimport rakaman tempatan...', + 'importFailed': 'Import fail gagal: {filePath}, ralat: {error}', + 'importSuccess': 'Berjaya mengimport {count} rakaman tempatan', + 'importError': 'Import gagal: {error}', + 'pleaseSelectAudioFile': 'Sila pilih fail audio', 'shareAudio': 'Share Meeting Audio', 'shareComplete': 'Share complete!', - 'shareFailed': 'Share failed: {error}', - 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', + 'shareFailed': 'Perkongsian gagal: {error}', + 'fileProcessingFailed': 'Pemprosesan fail gagal: {filePath}, ralat: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Simpan Peta Minda', + 'saveMindMap': 'Simpan Peta Minda', 'shareMindMap': 'Share Mind Map', - 'shareSuccess': 'Share Success', + 'shareSuccess': 'Perkongsian Berjaya', // Meeting模块 - AI问答 'askAI': 'Ask AI ...', @@ -591,7 +626,7 @@ const Map msMY = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Eksport', + 'export': 'Eksport', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Guna pada semua perenggan penutur ini', @@ -607,26 +642,27 @@ const Map msMY = { // Meeting模块 - 云端同步 'syncToCloud': 'Sync to Cloud', 'syncToCloudTip': - 'Automatically sync your recordings to the cloud, you can play, manage and share recordings through any VOITRANS APP or VOITRANS Web (web.voitrans.com).', + 'Segerakkan rakaman anda ke awan secara automatik; anda boleh memainkan, mengurus dan berkongsi rakaman melalui VOITRANS APP atau VOITRANS Web (web.voitrans.com).', 'syncToVoitransApp': 'Sync VOITRANS APP', - 'transcriptionRecord': 'Transcription Record', + 'transcriptionRecord': 'Rekod Transkripsi', // Meeting模块 - 我的页面 - 'transcriptionRecords': 'Transcription Records', + 'transcriptionRecords': 'Rekod Transkripsi', 'templateCommunity': 'Template Community', 'comingSoon': 'Coming Soon', 'integration': 'Integration', 'voitransPrivateCloud': 'VOITRANS PRIVATE CLOUD', - 'enabled': 'Enabled', - 'disabled': 'Disabled', - 'myVoitransDevice': 'My VOITRANS Device', + 'enabled': 'Diaktifkan', + 'disabled': 'Dilumpuhkan', + 'myVoitransDevice': 'Peranti VOITRANS Saya', 'helpAndFeedback': 'Help & Feedback', 'aboutVoitrans': 'About VOITRANS', 'meetingDays': 'Days', 'meetingHours': 'Hours', 'voitransAiMember': 'Voitrans AI Member', 'unlockStarterMember': 'Unlock Starter Member', - 'bindDeviceToActivate': 'Bind Voitrans device to activate Starter membership', + 'bindDeviceToActivate': + 'Ikat peranti Voitrans untuk mengaktifkan keahlian Starter', 'unlockNow': 'Unlock Now', // Meeting模块 - 会员与升级 @@ -650,7 +686,7 @@ const Map msMY = { 'customTemplateDesc': 'You can customize summary prompts according to your needs and use them to generate the required summaries.', 'askAiDesc': - 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', + 'Ekstrak maklumat lebih mendalam daripada rakaman secara pintar; jana jadual data, kesimpulan perbincangan utama, senarai tugasan, e-mel laporan dan kandungan berformat lain dengan satu klik.', 'visualMindMapDesc': 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', 'templateCommunityDesc': @@ -658,13 +694,13 @@ const Map msMY = { 'speakerIdentificationDesc': 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', 'privateCloudSyncDesc': - 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', + 'Rakaman dan transkripsi anda akan disimpan dengan selamat pada pelayan awan khusus, dengan penyulitan penuh semasa muat naik dan muat turun untuk memastikan privasi dan keselamatan.', 'aiVoiceEnhancementDesc': 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', 'audioImportDesc': 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', 'multipleExportFormatsDesc': - 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', + 'Eksport rakaman audio, teks transkripsi dan ringkasan anda dalam pelbagai format (TXT, PDF, JPEG) mengikut keperluan.', 'upgradeMembership': 'Upgrade Your Membership', 'yearlySubscription': 'Yearly Subscription', 'monthlySubscription': 'Monthly Subscription', @@ -694,25 +730,25 @@ const Map msMY = { 'purchase': 'Purchase', // Meeting模块 - 录音语言 - 'recordLanguage': 'Recording Language', + 'recordLanguage': 'Bahasa Rakaman', 'cantonese': 'Cantonese', 'sichuan': 'Sichuan Dialect', 'shanghai': 'Shanghai Dialect', // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Analisis gagal, sila cuba lagi kemudian', - 'transcriptionFailed': 'Transkripsi gagal, sila cuba lagi kemudian', - 'summaryFailed': 'Ringkasan gagal, sila cuba lagi kemudian', - 'summaryFailedShort': 'Ringkasan gagal', - 'transcriptionFailedShort': 'Transkripsi gagal', + 'analysisFailed': 'Analisis gagal, sila cuba lagi kemudian', + 'transcriptionFailed': 'Transkripsi gagal, sila cuba lagi kemudian', + 'summaryFailed': 'Ringkasan gagal, sila cuba lagi kemudian', + 'summaryFailedShort': 'Ringkasan gagal', + 'transcriptionFailedShort': 'Transkripsi gagal', // Meeting模块 - 播放器 - 'playerNotReady': 'Pemain audio belum sedia, sila tunggu', - 'playFailed': 'Gagal memainkan', - 'audioFileNotFound': 'Fail audio tidak ditemui', - 'fetchingAudio': 'Mendapatkan audio dari awan...', - 'playerLoadFailed': 'Pemain audio gagal dimuatkan', + 'playerNotReady': 'Pemain audio belum sedia, sila tunggu', + 'playFailed': 'Gagal memainkan', + 'audioFileNotFound': 'Fail audio tidak ditemui', + 'fetchingAudio': 'Mendapatkan audio dari awan...', + 'playerLoadFailed': 'Pemain audio gagal dimuatkan', // 设置页 "systemSettings": "Tetapan Sistem", @@ -721,10 +757,10 @@ const Map msMY = { "translationRecharge": "Pembayaran Penterjemahan", "meetingAssistantRecharge": "Pembayaran Pembantu Mesyuarat", "cloudSync": "Pembayaran Sinkronisasi awan", - "memberService": "Member Service", - "bindRewardTitle": "Rewards", + "memberService": "Perkhidmatan Ahli", + "bindRewardTitle": "Ganjaran", "bindRewardSimpleDesc": - "First bind device reward has been issued. Tap OK to close.", + "Ganjaran ikatan peranti pertama telah dikeluarkan. Ketik OK untuk menutup.", "joinDevice": "Peranti disambungkan:", "accountId": "ID Akaun:", "systemSetting": "Tetapan Sistem", @@ -773,19 +809,19 @@ const Map msMY = { "loading": "Memuatkan...", // 设备管理模块 - "deviceTypeUnknown": "Unknown Device", - "deviceTypeClassicBluetoothHeadset": "Classic Bluetooth Headset", - "deviceTypeBleBluetoothHeadset": "BLE Bluetooth Headset", - "deviceTypeSmartVoiceRecorder": "Smart Voice Recorder", - "deviceTypeSmartEye": "Smart Glasses", + "deviceTypeUnknown": "Peranti Tidak Diketahui", + "deviceTypeClassicBluetoothHeadset": "Fon Kepala Bluetooth Klasik", + "deviceTypeBleBluetoothHeadset": "Fon Kepala Bluetooth BLE", + "deviceTypeSmartVoiceRecorder": "Perakam Suara Pintar", + "deviceTypeSmartEye": "Cermin Mata Pintar", "unbind": "Nyahikat", - "noDevicesBound": "No devices bound yet", - "pleaseBindDeviceFirst": "Please bind a device first to manage", + "noDevicesBound": "Belum ada peranti diikat", + "pleaseBindDeviceFirst": "Sila ikat peranti dahulu untuk diurus", "noMacAddress": "No MAC Address", "licenseCode": "License Code", "confirmUnbind": "Confirm Unbind", "confirmUnbindMessage": - "Are you sure you want to unbind device \"{deviceName}\"?", + "Adakah anda pasti mahu nyahikat peranti \"{deviceName}\"?", "confirmUnbindAction": "Confirm Unbind", // Agent模块 - 主界面 @@ -816,9 +852,10 @@ const Map msMY = { "loadMoreMessages": "Muatkan lebih banyak mesej...", "loadFailedClickRetry": "Gagal memuatkan, klik untuk cuba lagi", "swipeUpForMore": "Leret ke atas untuk lebih banyak", - "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! + "callingTool": "Saya sedang membantu anda, sila tunggu!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Apabila diaktifkan: AI tidak akan terganggu oleh suara anda semasa bercakap dan hanya boleh mengendalikan satu pusingan perbualan pada satu masa. Untuk memulakan pusingan baharu, sebut sahaja kata bangun.', + 'voice_interrupt_tip': + 'Apabila diaktifkan: AI tidak akan terganggu oleh suara anda semasa bercakap dan hanya boleh mengendalikan satu pusingan perbualan pada satu masa. Untuk memulakan pusingan baharu, sebut sahaja kata bangun.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -827,7 +864,7 @@ const Map msMY = { "presetNews": "Today's news", // 今日新闻 "presetFood": "Nearby food", // 美食 "playSomeMusic": "Play some popular music", // 播放一些流行音乐 - "navigationTo": "Please help me navigate to", // 导航到 + "navigationTo": "Tolong bantu saya menavigasi ke", // 导航到 "todayWeather": "How's the weather today?", // 今日天气 "todayNews": "What's the news today?", // 今日新闻 "nearbyFood": "What delicious food is nearby?", // 美食 @@ -875,6 +912,13 @@ const Map msMY = { 'Kami ingin tahu sebab anda melaporkan, anda boleh menerangkan masalah yang anda hadapi.', 'generatedByAi': 'Dihasilkan oleh AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Berikut adalah beberapa muzik yang disyorkan:', 'playList': 'Senarai Main', @@ -895,6 +939,29 @@ const Map msMY = { "bicycling": "Berbasikal", "tsransit": "Pengangkutan Awam", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Pilih Aplikasi Navigasi', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigasi dengan Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigasi dengan Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigasi dengan Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigasi dengan Apple Maps', + 'builtInNavigation': 'Navigasi Terbina Dalam', + 'useBuiltInNavigation': 'Navigasi dengan peta terbina dalam', + 'navigationStartFailed': 'Gagal memulakan navigasi', + 'cannotPlayMusicListRetryLater': + 'Tidak dapat memainkan senarai muzik, sila cuba lagi nanti', + 'cannotPlaySong': 'Tidak dapat memainkan lagu', + 'openMapError': 'Ralat membuka peta', + 'pleaseInstallAmapApp': 'Sila pasang aplikasi Amap dahulu', + 'pleaseInstallBaiduMapApp': 'Sila pasang aplikasi Baidu Maps dahulu', + 'appleMapStartFailed': 'Apple Maps gagal dimulakan', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Ralat membuka Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Menyemak keadaan cuaca:', 'highest': 'Tertinggi', @@ -948,8 +1015,8 @@ const Map msMY = { "strongWind": "Angin kencang", // 翻译模块 - 中间层 - "pictureTranslation": "Picture Translation", - "textTranslation": "Text Translation", + "pictureTranslation": "Terjemahan Gambar", + "textTranslation": "Terjemahan Teks", // 翻译模块 - 主页 "translationHistory": "Sejarah Terjemahan", @@ -959,22 +1026,33 @@ const Map msMY = { "phoneUser": "Pengguna Telefon", "selectSourceLanguage": "Pilih bahasa sumber", "selectTargetLanguage": "Pilih bahasa sasaran", - "me": "Me", - "counterPart": "Counterpart", + "me": "Saya", + "counterPart": "Rakan Bicara", "bluetoothCallStateError": - "Please make sure the Bluetooth headset is connected to the phone and in a call state", - "autoDetect": "Auto Detect", // 自动检测 + "Sila pastikan fon kepala Bluetooth disambungkan ke telefon dan sedang dalam keadaan panggilan", + "autoDetect": "Kesan Automatik", // 自动检测 // 翻译模块 - 文本翻译 - "languageDetectionFailed": "Language detection failed", - "translationFailed": "Translation failed", - "pleaseInputText": "Please input text", - "textTooLong": "Text too long, max 5000 characters", + "languageDetectionFailed": "Pengesanan bahasa gagal", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Nyahdayakan Tetingkap Terapung', + 'enableFloatingWindow': 'Dayakan Tetingkap Terapung', + 'permissionTip': 'Petua Kebenaran', + 'micPermissionRequiredForRecording': + 'Kebenaran mikrofon diperlukan untuk rakaman', + 'deleteTranslationRecordError': 'Ralat memadam rekod terjemahan: @error', + "translationFailed": "Terjemahan gagal", + "translating": "Sedang menterjemah", + "translate": "Terjemah", + "pleaseInputText": "Sila masukkan teks", + "inputTextToTranslate": "Sila masukkan teks untuk diterjemahkan", + "textTooLong": "Teks terlalu panjang, maksimum 5000 aksara", // 翻译模块 - 历史记录 "noTranslationHistory": "Tiada sejarah lagi", - "historyRecords": "History Records", - "clearResults": "Clear Results", + "historyRecords": "Rekod Sejarah", + "clearResults": "Kosongkan Hasil", "clearHistory": "Kosongkan Sejarah", "clearHistoryConfirm": "Adakah anda pasti mahu mengosongkan semua sejarah terjemahan? Tindakan ini tidak boleh dibatalkan.", @@ -984,14 +1062,14 @@ const Map msMY = { "Adakah anda pasti mahu memadam semua rekod terjemahan untuk sesi ini? Tindakan ini tidak boleh dibatalkan.", // 翻译模块 - 图片翻译 - "selectImageSource": "Select Image Source", - "imagePreview": "Image Preview", - "translationResult": "Translation Result", - "recognitionResult": "Recognition Result", - "translatedImagePreview": "Translated Image Preview", - "translatedImageLoadFailed": "Failed to load translated image", - "pleaseSelectImage": "Please select an image", - "imageLoadFailed": "Image load failed", + "selectImageSource": "Pilih Sumber Imej", + "imagePreview": "Pratonton Imej", + "translationResult": "Hasil Terjemahan", + "recognitionResult": "Hasil Pengecaman", + "translatedImagePreview": "Pratonton Imej Terjemahan", + "translatedImageLoadFailed": "Gagal memuatkan imej terjemahan", + "pleaseSelectImage": "Sila pilih imej", + "imageLoadFailed": "Imej gagal dimuatkan", "imageQuality": "Image Quality", "maxSize": "Max Size", "close": "Close", @@ -999,39 +1077,40 @@ const Map msMY = { "currentQuality": "Current quality: @value%", "setMaxSize": "Set Max Size", "currentMaxSize": "Current: @pxpx", - "waitingForAction": "Waiting for action", - "pleaseSelectImageToStart": "Please select an image to start", - "chooseImage": "Choose Image", - "openingCamera": "Opening camera...", - "openingPhotoAlbum": "Opening photo album...", - "cancelled": "Cancelled", - "userCancelledSelection": "User cancelled selection", - "translatingImage": "Translating Image", - "callingImageTranslateService": "Calling image translation service...", - "savingRecord": "Saving Record", - "savingTranslationResult": "Saving translation result...", - "translationCompleted": "Translation Completed", - "allStepsCompleted": "All steps completed", - "processingFailed": "Processing Failed", + "waitingForAction": "Menunggu tindakan", + "pleaseSelectImageToStart": "Sila pilih imej untuk mula", + "chooseImage": "Pilih Imej", + "openingCamera": "Membuka kamera...", + "openingPhotoAlbum": "Membuka album foto...", + "cancelled": "Dibatalkan", + "userCancelledSelection": "Pengguna membatalkan pilihan", + "translatingImage": "Sedang menterjemah imej", + "callingImageTranslateService": "Memanggil perkhidmatan terjemahan imej...", + "savingRecord": "Menyimpan Rekod", + "savingTranslationResult": "Menyimpan hasil terjemahan...", + "translationCompleted": "Terjemahan Selesai", + "allStepsCompleted": "Semua langkah selesai", + "processingFailed": "Pemprosesan Gagal", "imageProcessingOrTranslationFailed": - "Image processing or translation failed. Please retry.\nError: {error}", + "Pemprosesan imej atau terjemahan gagal. Sila cuba lagi.\nRalat: {error}", "imageTooLarge": "Image size exceeds 4MB limit", "imageTooLargeHint": "Image size exceeds 4MB. Reduce quality or dimensions and retry", - "emptyTranslationResult": "Image translation API returned empty result", + "emptyTranslationResult": "API terjemahan imej mengembalikan hasil kosong", "imageTranslationFailedTryLater": - "Image translation failed. Network issue or rate limit. Please try later", + "Terjemahan imej gagal. Masalah rangkaian atau had kadar. Sila cuba kemudian", "imageTranslationApiException": - "Image translation API exception. Check network and retry", - "permissionRequired": "Permission Required", - "cameraPermissionRequired": "Camera permission required to take photos", + "Pengecualian API terjemahan imej. Semak rangkaian dan cuba lagi", + "permissionRequired": "Kebenaran Diperlukan", + "cameraPermissionRequired": + "Kebenaran kamera diperlukan untuk mengambil foto", "photoAlbumPermissionRequired": - "Photo album permission required to pick images", - "translationDetails": "Translation Details", + "Kebenaran album foto diperlukan untuk memilih imej", + "translationDetails": "Butiran Terjemahan", "originalImage": "Original Image", "sourceLanguage": "Source Language", "targetLanguage": "Target Language", - "translationTime": "Translation Time", + "translationTime": "Masa Terjemahan", "shareInDevelopment": "Sharing feature under development", // 翻译模块 - 录音文件 @@ -1129,16 +1208,16 @@ const Map msMY = { // 权限模块 'meetingStoragePermission': 'Storage', 'meetingStoragePermissionExplanation': - 'We need access to storage permissions so you can select and upload audio files.', + 'Kami memerlukan kebenaran storan supaya anda boleh memilih dan memuat naik fail audio.', 'meetingStoragePermissionPermanentDenial': - 'Detected that you have permanently denied storage permission. To continue using this feature, please go to app settings to manually enable storage permission.', + 'Dikesan anda telah menafikan kebenaran storan secara kekal. Untuk terus menggunakan ciri ini, sila pergi ke tetapan aplikasi untuk mendayakan kebenaran storan secara manual.', 'getPermissionStatusFailed': 'Gagal mendapatkan status kebenaran', 'communicationPermissions': 'Kebenaran Komunikasi', - 'bluetoothPermissions': 'Bluetooth Permissions', - 'notificationPermissions': 'Notification Permissions', - 'storagePermissions': 'Storage Permissions', - 'microphonePermissions': 'Microphone Permissions', - 'alarmPermissions': 'Alarm Permissions', + 'bluetoothPermissions': 'Kebenaran Bluetooth', + 'notificationPermissions': 'Kebenaran Notifikasi', + 'storagePermissions': 'Kebenaran Storan', + 'microphonePermissions': 'Kebenaran Mikrofon', + 'alarmPermissions': 'Kebenaran Penggera', 'calendarPermissions': 'Kebenaran Kalendar', 'locationPermissions': 'Kebenaran Lokasi', 'phone': 'Telefon', @@ -1152,7 +1231,7 @@ const Map msMY = { 'phonePermissionDesc': 'Digunakan untuk fungsi membuat panggilan', 'smsPermissionDesc': 'Digunakan untuk fungsi menghantar SMS', 'alarmPermissionDesc': - 'Used to set exact alarms to ensure reminders trigger on time', + 'Digunakan untuk menetapkan penggera tepat supaya peringatan dicetus tepat pada masanya', 'calendarWritePermissionDesc': 'Digunakan untuk membuat acara kalendar dan peringatan', 'calendarFullAccessPermissionDesc': @@ -1170,86 +1249,90 @@ const Map msMY = { 'phonePermissionDetailDesc': 'Fungsi panggilan memerlukan kebenaran telefon', 'smsPermissionDetailDesc': 'Fungsi menghantar SMS memerlukan kebenaran SMS', 'alarmPermissionDetailDesc': - 'This permission is required to set exact alarms and ensure reminders trigger on time', + 'Kebenaran ini diperlukan untuk menetapkan penggera tepat dan memastikan peringatan dicetus tepat pada masanya', 'calendarWritePermissionDetailDesc': 'Membuat acara kalendar memerlukan kebenaran menulis kalendar', 'calendarFullAccessPermissionDetailDesc': 'Mengurus acara kalendar memerlukan kebenaran penuh kalendar', 'locationPermissionDetailDesc': 'Mendapatkan maklumat lokasi memerlukan kebenaran lokasi', - 'contactsPermissionDesc': 'Used for accessing contact information', + 'contactsPermissionDesc': 'Digunakan untuk mengakses maklumat kenalan', 'contactsPermissionDetailDesc': - 'Phone call and SMS functionality requires contacts permission to select contacts', + 'Fungsi panggilan telefon dan SMS memerlukan kebenaran kenalan untuk memilih kenalan', 'bluetoothPermissionDesc': - 'Used for connecting and managing Bluetooth devices', + 'Digunakan untuk menyambung dan mengurus peranti Bluetooth', 'bluetoothPermissionDetailDesc': - 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', - 'bluetoothScanPermissionDesc': 'Used for scanning nearby Bluetooth devices', + 'Menyambung ke fon kepala Bluetooth dan peranti lain memerlukan kebenaran Bluetooth', + 'bluetoothScanPermissionDesc': + 'Digunakan untuk mengimbas peranti Bluetooth berdekatan', 'bluetoothScanPermissionDetailDesc': - 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', - 'bluetoothConnectPermissionDesc': 'Used for connecting to Bluetooth devices', + 'Mengimbas peranti Bluetooth berdekatan memerlukan kebenaran imbas Bluetooth', + 'bluetoothConnectPermissionDesc': + 'Digunakan untuk menyambung ke peranti Bluetooth', 'bluetoothConnectPermissionDetailDesc': - 'Connecting to Bluetooth devices requires Bluetooth connect permission', + 'Menyambung ke peranti Bluetooth memerlukan kebenaran sambung Bluetooth', 'notificationPermissionDesc': 'Used for sending notification messages', 'notificationPermissionDetailDesc': - 'App needs notification permission to send you important alerts and messages', + 'Aplikasi memerlukan kebenaran notifikasi untuk menghantar amaran dan mesej penting kepada anda', 'appNeedsPermissionForFullFunction': 'Aplikasi memerlukan kebenaran ini untuk fungsi penuh', 'permanentDenialText': 'Anda telah menafikan kebenaran {permission} secara kekal, sila pergi ke tetapan aplikasi untuk mendayakannya', 'goToSettings': 'Pergi ke Tetapan', 'bluetoothScan': 'Bluetooth Scan', - 'bluetoothConnect': 'Bluetooth Connect', + 'bluetoothConnect': 'Sambung Bluetooth', 'bluetoothScanExplanation': - 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', + 'Aplikasi memerlukan kebenaran imbas Bluetooth untuk mengimbas peranti Bluetooth berdekatan.', 'bluetoothConnectExplanation': - 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', + 'Aplikasi memerlukan kebenaran sambung Bluetooth untuk menyambung ke peranti Bluetooth.', 'locationForBluetoothExplanation': - 'The app needs location permission to scan Bluetooth devices.', + 'Aplikasi memerlukan kebenaran lokasi untuk mengimbas peranti Bluetooth.', 'bluetoothScanPermanentDenial': - 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', + 'Kebenaran imbas Bluetooth telah ditolak secara kekal, sila pergi ke tetapan untuk mendayakannya secara manual.', 'bluetoothConnectPermanentDenial': - 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', + 'Kebenaran sambung Bluetooth telah ditolak secara kekal, sila pergi ke tetapan untuk mendayakannya secara manual.', 'locationPermanentDenial': - 'Location permission has been permanently denied, please go to settings to enable it manually.', + 'Kebenaran lokasi telah ditolak secara kekal, sila pergi ke tetapan untuk mendayakannya secara manual.', 'notificationPermission': 'Notification', 'locationPermission': 'Location', 'notificationPermissionExplanation': - 'Notification permission is required to display music playback status.', + 'Kebenaran notifikasi diperlukan untuk memaparkan status main balik muzik.', 'locationPermissionExplanation': - 'Location permission is required to get current location.', + 'Kebenaran lokasi diperlukan untuk mendapatkan lokasi semasa.', 'notificationPermissionPermanentDenial': - 'You have permanently denied notification permission, please go to settings to enable it.', + 'Anda telah menafikan kebenaran notifikasi secara kekal, sila pergi ke tetapan untuk mendayakannya.', 'locationPermissionPermanentDenial': - 'You have permanently denied location permission, please go to settings to enable it.', + 'Anda telah menafikan kebenaran lokasi secara kekal, sila pergi ke tetapan untuk mendayakannya.', 'storagePermission': 'Storage', 'microphonePermissionExplanation': - 'We need microphone permission to record audio content.', + 'Kami memerlukan kebenaran mikrofon untuk merakam kandungan audio.', 'storagePermissionExplanation': - 'We need storage permission so you can select and upload audio files.', + 'Kami memerlukan kebenaran storan supaya anda boleh memilih dan memuat naik fail audio.', 'microphonePermissionPermanentDenial': - 'Microphone permission has been permanently denied. To continue using this feature, please go to app settings to manually enable microphone permission.', + 'Kebenaran mikrofon telah ditolak secara kekal. Untuk terus menggunakan ciri ini, sila pergi ke tetapan aplikasi untuk mendayakan kebenaran mikrofon secara manual.', 'storagePermissionPermanentDenial': - 'Storage permission has been permanently denied. To continue using this feature, please go to app settings to manually enable storage permission.', - 'permissionUtilNeed': 'Need ', - 'permissionUtilPermission': ' Permission', - 'permissionUtilRestricted': ' Permission Restricted', + 'Kebenaran storan telah ditolak secara kekal. Untuk terus menggunakan ciri ini, sila pergi ke tetapan aplikasi untuk mendayakan kebenaran storan secara manual.', + 'permissionUtilNeed': 'Perlu ', + 'permissionUtilPermission': ' Kebenaran', + 'permissionUtilRestricted': ' Kebenaran Terhad', 'permissionUtilRestrictedMessage': - 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', + 'Ciri ini tidak tersedia atau terhad pada peranti semasa, sila semak tetapan peranti atau sekatan sistem', 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigasi sedang berjalan', - 'native.notification.navigation.keepRunning': 'Sedang menavigasi, pastikan aplikasi terus berjalan', - 'native.notification.bleAgent.running': 'Ejen pembantu suara sedang berjalan', - 'native.notification.audioRecording.recording': 'Sedang merakam audio, ketik untuk kembali ke aplikasi', - 'native.notification.music.waiting': 'Menunggu untuk dimainkan', - 'native.notification.music.previous': 'Sebelumnya', - 'native.notification.music.next': 'Seterusnya', - 'native.notification.music.play': 'Main', - 'native.notification.music.pause': 'Jeda', - 'native.notification.qqMusic.playing': 'Sedang memainkan muzik', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigasi sedang berjalan', + 'native.notification.navigation.keepRunning': + 'Sedang menavigasi, pastikan aplikasi terus berjalan', + 'native.notification.bleAgent.running': 'Ejen pembantu suara sedang berjalan', + 'native.notification.audioRecording.recording': + 'Sedang merakam audio, ketik untuk kembali ke aplikasi', + 'native.notification.music.waiting': 'Menunggu untuk dimainkan', + 'native.notification.music.previous': 'Sebelumnya', + 'native.notification.music.next': 'Seterusnya', + 'native.notification.music.play': 'Main', + 'native.notification.music.pause': 'Jeda', + 'native.notification.qqMusic.playing': 'Sedang memainkan muzik', // 版本更新 'newVersionFound': 'Versi Baharu Ditemui', // 版本更新对话框标题 @@ -1321,17 +1404,17 @@ const Map msMY = { 'bleConnectionFailed': 'Sambungan BLE gagal', 'deviceAuthorizationFailedCheckCode': 'Kebenaran peranti gagal, sila semak kod kebenaran', - 'bluetoothGuideTitle': 'Manual Bluetooth Activation Required', // 需要手动开启蓝牙 - 'bluetoothGuideSteps': 'Please follow these steps:', // 请按照以下步骤操作: + 'bluetoothGuideTitle': 'Pengaktifan Bluetooth Manual Diperlukan', // 需要手动开启蓝牙 + 'bluetoothGuideSteps': 'Sila ikuti langkah-langkah ini:', // 请按照以下步骤操作: 'bluetoothGuideStep1': - 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 + 'Aktifkan Bluetooth: Tetapan → Bluetooth → Hidupkan', // 开启蓝牙:设置 → 蓝牙 → 开启 'bluetoothGuideStep2': - 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 + 'Sambung Peranti: Cari peranti anda di "Peranti Saya" dan ketik untuk sambung', // 连接设备:在"我的设备"中找到您的设备并点击连接 'bluetoothGuideStep3': - 'Return to app to continue pairing process', // 返回应用继续配对流程 + 'Kembali ke aplikasi untuk meneruskan proses pemasangan', // 返回应用继续配对流程 'bluetoothGuideTip': - 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 - 'iKnow': 'I Know', // 我知道了 + 'Tip: Anda juga boleh tekan lama ikon Bluetooth di Pusat Kawalan untuk akses cepat ke tetapan Bluetooth', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 + 'iKnow': 'Saya Faham', // 我知道了 // 配对模块 - 绑定奖励 "firstBindRewardTitle": "Welcome Reward", @@ -1372,13 +1455,14 @@ const Map msMY = { "connectionFailed": "Sambungan Gagal", "retryConnection": "Cuba Sambung Semula", "ota_updateNow": "Kemas Kini Sekarang", - "otaVersionInfoFailed": "Failed to get version info. Please try again later.", + "otaVersionInfoFailed": + "Gagal mendapatkan maklumat versi. Sila cuba lagi kemudian.", "otaDeviceInfoUnavailable": - "Unable to get device info. Please check the connection and retry.", + "Tidak dapat mendapatkan maklumat peranti. Sila semak sambungan dan cuba lagi.", "otaProductInfoUnavailable": - "Unable to identify the device. Please reconnect and retry.", + "Tidak dapat mengenal pasti peranti. Sila sambung semula dan cuba lagi.", "otaFirmwareVersionInvalid": - "Firmware version is abnormal. Please reconnect and retry.", + "Versi firmware tidak normal. Sila sambung semula dan cuba lagi.", "keepConnectedDontClose": "Pastikan peranti sentiasa bersambung, jangan tutup aplikasi", "doNotDisconnect": "Jangan putuskan sambungan", @@ -1387,6 +1471,59 @@ const Map msMY = { "removeEarbudsEnsureBattery": "Keluarkan kedua-dua fon telinga, dan pastikan bateri kedua-duanya melebihi 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Versi baharu @version ditemui', + 'otaConfirmUpdateNow': 'Kemas kini sekarang?', + 'otaUpdate': 'Kemas kini', + 'otaUpgradeSuccess': 'Naik Taraf Berjaya', + 'otaUpgradeCompleteRepair': + 'Naik taraf firmware selesai!\n\nPeranti perlu dipasang semula untuk berfungsi dengan betul. Pergi ke halaman pemasangan sekarang?', + 'otaPairLater': 'Pasang Kemudian', + 'otaPairNow': 'Pasang Sekarang', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Ralat semasa menyemak sambungan BLE: @error', + 'otaBleNotConnected': 'Peranti BLE Tidak Bersambung', + 'otaBleNeedConnection': + 'Naik taraf firmware memerlukan sambungan peranti BLE\nSila pastikan peranti disambungkan dengan betul dan cuba lagi', + 'otaDeviceInfoUnavailableTitle': 'Maklumat Peranti Tidak Tersedia', + 'otaCannotGetDeviceInfo': + 'Tidak dapat mendapatkan maklumat peranti\nSila sambung semula peranti atau cuba lagi kemudian', + 'otaBleCheckFailed': 'Semakan Sambungan BLE Gagal', + 'otaCannotGetDeviceInfoCheckConnection': + 'Tidak dapat mendapatkan maklumat peranti, sila semak sambungan peranti', + 'otaCannotGetProductInfoWithName': + 'Tidak dapat mendapatkan maklumat produk, nama peranti: @deviceName', + 'otaCannotGetBatteryInfo': 'Tidak dapat mendapatkan maklumat bateri yang sah', + 'otaLowBattery': 'Bateri Rendah', + 'otaSingleBatteryLow': + 'Bateri peranti terlalu rendah untuk naik taraf firmware\nKeperluan: bateri mesti melebihi 20%\nSemasa: @ear @battery%\nSila cas dan cuba lagi', + 'otaDoubleBatteryLow': + 'Bateri peranti terlalu rendah untuk naik taraf firmware\nKeperluan: kedua-dua fon telinga mesti melebihi 20%\nSemasa: Kiri @left%, Kanan @right%\nSila cas dan cuba lagi', + 'otaBatteryCheckFailed': 'Semakan Bateri Gagal', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'Kemas kini ini termasuk pengoptimuman prestasi dan pembetulan pepijat.', + 'otaGetLatestVersionFailed': 'Gagal mendapatkan maklumat versi terkini', + 'otaGetVersionInfoFailed': 'Gagal mendapatkan maklumat versi', + 'otaCheckingDeviceStatus': 'Menyemak status peranti...', + 'otaDownloadFailedCheckNetwork': + 'Muat turun gagal, sila semak sambungan rangkaian', + 'otaDownloadFailed': 'Muat Turun Gagal', + 'otaPreparingConnection': 'Menyediakan sambungan peranti...', + 'otaConnectingDevice': 'Menyambung ke peranti...', + 'otaUpgradeStarted': 'Naik taraf OTA bermula...', + 'otaUpgradeProgressWithPercent': 'Kemajuan naik taraf: @percent%', + 'otaUpgradeSuccessComplete': 'Naik taraf selesai dengan berjaya', + 'otaUpgradeFailedWithCode': 'Naik taraf gagal, kod ralat: @code', + 'otaUpgradeFailedTitle': 'Naik Taraf Gagal', + 'otaUpgradeFailedDesc': + 'Sila semak sambungan peranti atau pakej kemas kini, kod ralat: @code', + 'otaDeviceDisconnected': 'Peranti terputus', + 'otaDeviceConnected': 'Peranti bersambung', + // 音乐模块 "noMusic": "Tiada Muzik", // 暂无音乐 "noPlayingMusic": "Tiada muzik dimainkan", // 暂无播放音乐 diff --git a/lib/core/translations/language/nb_no.dart b/lib/core/translations/language/nb_no.dart index d5fdcb821..a7909ad5f 100644 --- a/lib/core/translations/language/nb_no.dart +++ b/lib/core/translations/language/nb_no.dart @@ -169,6 +169,26 @@ const Map nbNO = { 'right': 'Høyre', 'checkConnectionStatusFailed': 'Kontroll av tilkoblingsstatus mislyktes', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth-initialisering mislyktes: @error', + 'needBluetoothAndLocationPermission': 'Bluetooth- og plasseringstillatelser kreves for å skanne enheter', + 'permissionRequestFailedWithError': 'Tillatelsesforespørsel mislyktes: @error', + 'needPermission': 'Tillatelse kreves', + 'blePermissionDialogContent': 'Appen trenger Bluetooth- og plasseringstillatelser for å skanne enheter. Aktiver dem i Innstillinger.', + 'needEnableBluetooth': 'Aktiver Bluetooth', + 'enableBluetoothDialogContent': 'Aktiver Bluetooth for å skanne og koble til enheter.', + 'bleScanFailedWithError': 'Skanning mislyktes: @error', + 'bleConnectionSuccess': 'Tilkobling vellykket', + 'bleConnectedToDevice': 'Koblet til @device', + 'bleConnectionFailedWithError': 'Tilkobling mislyktes: @error', + 'bleDisconnected': 'Frakoblet', + 'bleDeviceDisconnected': 'Enhet frakoblet', + 'bleDisconnectFailedWithError': 'Frakobling mislyktes: @error', + 'signalStrong': 'Sterkt signal', + 'signalMedium': 'Middels signal', + 'signalWeak': 'Svakt signal', + 'signalVeryWeak': 'Veldig svakt signal', + // 发现页 "searchAi": "Søk etter AI-funksjoner...", "exploreSlogan": "Smarte ørepropper, uendelige muligheter", @@ -877,6 +897,13 @@ const Map nbNO = { 'Vi vil gjerne vite hvorfor du rapporterer, du kan beskrive problemet du opplevde.', 'generatedByAi': 'Generert av AI', + // Agent模块 - 工具调用 + 'toolCall': 'Verktøykall', + 'noResult': 'Ingen resultat', + 'noToolCallContentToCopy': 'Ingen verktøykall å kopiere', + 'toolCallDetails': 'Verktøykalldetaljer:', + 'toolCallContentCopied': 'Verktøykall kopiert til utklippstavlen', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Her er noen anbefalte sanger:', 'playList': 'Spilleliste', @@ -897,6 +924,28 @@ const Map nbNO = { "bicycling": 'Sykling', "tsransit": 'Kollektivtransport', + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Velg navigasjonsapp', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Naviger med Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Naviger med Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Naviger med Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Naviger med Apple Maps', + 'builtInNavigation': 'Innebygd navigasjon', + 'useBuiltInNavigation': 'Naviger med innebygd kart', + 'navigationStartFailed': 'Kunne ikke starte navigasjon', + 'cannotPlayMusicListRetryLater': 'Kan ikke spille musiklisten, prøv igjen senere', + 'cannotPlaySong': 'Kan ikke spille sangen', + 'openMapError': 'Feil ved åpning av kart', + 'pleaseInstallAmapApp': 'Installer Amap-appen først', + 'pleaseInstallBaiduMapApp': 'Installer Baidu Maps-appen først', + 'appleMapStartFailed': 'Apple Maps kunne ikke starte', + 'appleMapUnavailable': 'Apple Maps er ikke tilgjengelig', + 'openAppleMapError': 'Feil ved åpning av Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Spør om værforhold:', 'highest': 'Høyeste', @@ -969,8 +1018,18 @@ const Map nbNO = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Deaktiver flytende vindu', + 'enableFloatingWindow': 'Aktiver flytende vindu', + 'permissionTip': 'Tillatelsestips', + 'micPermissionRequiredForRecording': 'Mikrofontillatelse kreves for opptak', + 'deleteTranslationRecordError': 'Feil ved sletting av oversettelsespost: @error', "translationFailed": "Translation failed", + "translating": "Oversetter", + "translate": "Oversett", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Skriv inn teksten som skal oversettes", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1385,6 +1444,49 @@ const Map nbNO = { "removeEarbudsEnsureBattery": "Ta ut begge øreproppene og sørg for at batterinivået på begge er over 20 %", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Ny versjon @version funnet', + 'otaConfirmUpdateNow': 'Oppdater nå?', + 'otaUpdate': 'Oppdater', + 'otaUpgradeSuccess': 'Oppgradering vellykket', + 'otaUpgradeCompleteRepair': 'Firmware-oppgradering fullført!\n\nEnheten må pares på nytt. Gå til paringssiden?', + 'otaPairLater': 'Par senere', + 'otaPairNow': 'Par nå', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Feil ved BLE-kontroll: @error', + 'otaBleNotConnected': 'BLE-enhet ikke tilkoblet', + 'otaBleNeedConnection': 'Firmware-oppgradering krever BLE-tilkobling\nSørg for at enheten er tilkoblet og prøv igjen', + 'otaDeviceInfoUnavailableTitle': 'Enhetsinfo utilgjengelig', + 'otaCannotGetDeviceInfo': 'Kan ikke hente enhetsinfo\nKoble til enheten igjen eller prøv senere', + 'otaBleCheckFailed': 'BLE-kontroll mislyktes', + 'otaCannotGetDeviceInfoCheckConnection': 'Kan ikke hente enhetsinfo, sjekk tilkoblingen', + 'otaCannotGetProductInfoWithName': 'Kan ikke hente produktinfo, enhetsnavn: @deviceName', + 'otaCannotGetBatteryInfo': 'Kan ikke hente batteriinfo', + 'otaLowBattery': 'Lavt batteri', + 'otaSingleBatteryLow': 'Batterinivå for lavt for oppgradering\nKrav: batteri over 20%\nNåværende: @ear @battery%\nLad og prøv igjen', + 'otaDoubleBatteryLow': 'Batterinivå for lavt for oppgradering\nKrav: begge øreproppene over 20%\nNåværende: Venstre @left%, Høyre @right%\nLad og prøv igjen', + 'otaBatteryCheckFailed': 'Batterikontroll mislyktes', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': 'Oppdateringen inneholder ytelsesforbedringer og feilrettinger.', + 'otaGetLatestVersionFailed': 'Kunne ikke hente siste versjon', + 'otaGetVersionInfoFailed': 'Kunne ikke hente versjonsinfo', + 'otaCheckingDeviceStatus': 'Sjekker enhetsstatus...', + 'otaDownloadFailedCheckNetwork': 'Nedlasting mislyktes, sjekk nettverkstilkoblingen', + 'otaDownloadFailed': 'Nedlasting mislyktes', + 'otaPreparingConnection': 'Forbereder enhetstilkobling...', + 'otaConnectingDevice': 'Kobler til enhet...', + 'otaUpgradeStarted': 'OTA-oppgradering startet...', + 'otaUpgradeProgressWithPercent': 'Oppgraderingsforløp: @percent%', + 'otaUpgradeSuccessComplete': 'Oppgradering fullført', + 'otaUpgradeFailedWithCode': 'Oppgradering mislyktes, feilkode: @code', + 'otaUpgradeFailedTitle': 'Oppgradering mislyktes', + 'otaUpgradeFailedDesc': 'Sjekk tilkobling eller oppdateringspakke, feilkode: @code', + 'otaDeviceDisconnected': 'Enhet frakoblet', + 'otaDeviceConnected': 'Enhet tilkoblet', + // 音乐模块 "noMusic": "Ingen musikk", // 暂无音乐 "noPlayingMusic": "Ingen musikk spilles av", // 暂无播放音乐 diff --git a/lib/core/translations/language/nl_nl.dart b/lib/core/translations/language/nl_nl.dart index 2c5f69e06..4b69a85a1 100644 --- a/lib/core/translations/language/nl_nl.dart +++ b/lib/core/translations/language/nl_nl.dart @@ -1,5 +1,4 @@ const Map nlNL = { - // 通用 'continue': 'Doorgaan', 'confirm': 'Bevestigen', @@ -169,6 +168,29 @@ const Map nlNL = { 'right': 'Rechts', 'checkConnectionStatusFailed': 'Controle van verbindingsstatus mislukt', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth-initialisatie mislukt: @error', + 'needBluetoothAndLocationPermission': + 'Bluetooth- en locatiemachtigingen zijn vereist om apparaten te scannen', + 'permissionRequestFailedWithError': 'Machtigingsverzoek mislukt: @error', + 'needPermission': 'Machtiging vereist', + 'blePermissionDialogContent': + 'Deze app heeft Bluetooth- en locatiemachtigingen nodig om apparaten te scannen. Schakel ze in via Instellingen.', + 'needEnableBluetooth': 'Bluetooth inschakelen', + 'enableBluetoothDialogContent': + 'Schakel Bluetooth in om apparaten te scannen en te verbinden.', + 'bleScanFailedWithError': 'Scan mislukt: @error', + 'bleConnectionSuccess': 'Verbinding geslaagd', + 'bleConnectedToDevice': 'Verbonden met @device', + 'bleConnectionFailedWithError': 'Verbinding mislukt: @error', + 'bleDisconnected': 'Verbinding verbroken', + 'bleDeviceDisconnected': 'Apparaat losgekoppeld', + 'bleDisconnectFailedWithError': 'Loskoppelen mislukt: @error', + 'signalStrong': 'Sterk', + 'signalMedium': 'Gemiddeld', + 'signalWeak': 'Zwak', + 'signalVeryWeak': 'Zeer zwak', + // 发现页 "searchAi": "Zoek AI-functies...", "exploreSlogan": "Slimme oortjes, eindeloze mogelijkheden", @@ -245,60 +267,64 @@ const Map nlNL = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Betaling geslaagd', - 'paymentFailed': 'Betaling mislukt', - 'gotIt': 'Begrepen', - 'paymentFailedTryAgain': 'Betaling mislukt. Probeer het opnieuw.', - 'selectPaymentMethod': 'Selecteer betaalmethode', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Kan WeChat-bestelling niet aanmaken', - 'alipayOrderCreateFailed': 'Kan Alipay-bestelling niet aanmaken', - 'appleOrderCreateFailed': 'Kan Apple-bestelling niet aanmaken', - 'googleOrderCreateFailed': 'Kan Google-bestelling niet aanmaken', - 'paypalOrderCreateFailed': 'Kan PayPal-bestelling niet aanmaken', - 'paymentException': 'Betalingsuitzondering', - 'paymentLaunchFailed': 'Kan betaling niet starten', - 'paymentExceptionWithError': 'Betalingsuitzondering: @error', - 'paymentProcessingCheckLater': 'Uw bestelling wordt verwerkt. Controleer het later.', - 'paymentResultQueryException': 'Kan betalingsresultaat niet opvragen: @error', - 'orderConfirmedQuotaRefreshed': 'Bestelling bevestigd. Uw tegoed is bijgewerkt.', - 'paymentCompletedConfirming': 'Betaling voltooid. Bevestigen…', - 'paymentCancelled': 'Betaling geannuleerd', - 'paypalOpenedCompleteInBrowser': 'PayPal geopend. Voltooi de betaling in uw browser.', - 'paypalOpenFailed': 'Kan PayPal-betaalpagina niet openen', - 'paymentTestTitle': 'Betalingstest', - 'paymentTestOrderInfo': 'Testbestelgegevens', - 'paymentTestProductId': 'Product-ID', - 'paymentTestProductDescription': 'Productbeschrijving', - 'paymentTestWechatDescription': 'WeChat-betalingstest', - 'paymentTestAlipayDescription': 'Alipay-betalingstest', - 'paymentTestAmount': 'Bedrag', - 'paymentTestSelectAmount': 'Selecteer testbedrag', - 'paying': 'Betalen...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Betalingsstatus', - 'errorInfoWithMessage': 'Fout: @message', - 'retest': 'Opnieuw testen', - 'paymentTestInstructionsTitle': 'Instructies', - 'paymentTestInstructionsContent': '1. Selecteer een testbedrag (aanbevolen: ¥0.01)\n2. Klik op de betaalknop om te starten\n3. Voltooi de betaling in de betaal-app\n4. Keer terug om het resultaat te controleren', - 'startingWechatPayment': 'WeChat Pay starten...', - 'startingAlipayPayment': 'Alipay starten...', - 'wechatPaymentSuccess': 'WeChat Pay-betaling geslaagd!', - 'wechatPaymentFailed': 'WeChat Pay mislukt', - 'wechatPaymentLaunchFailed': 'Kan WeChat Pay niet starten', - 'cannotLaunchWechatPayment': 'Kan WeChat Pay niet starten', - 'wechatPaymentException': 'WeChat Pay-uitzondering', - 'wechatPaymentTestCompleted': 'WeChat Pay-test voltooid', - 'alipayPaymentSuccess': 'Alipay-betaling geslaagd!', - 'alipayPaymentFailed': 'Alipay mislukt', - 'alipayPaymentLaunchFailed': 'Kan Alipay niet starten', - 'cannotLaunchAlipayPayment': 'Kan Alipay niet starten', - 'alipayPaymentException': 'Alipay-uitzondering', + 'paymentSuccess': 'Betaling geslaagd', + 'paymentFailed': 'Betaling mislukt', + 'gotIt': 'Begrepen', + 'paymentFailedTryAgain': 'Betaling mislukt. Probeer het opnieuw.', + 'selectPaymentMethod': 'Selecteer betaalmethode', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Kan WeChat-bestelling niet aanmaken', + 'alipayOrderCreateFailed': 'Kan Alipay-bestelling niet aanmaken', + 'appleOrderCreateFailed': 'Kan Apple-bestelling niet aanmaken', + 'googleOrderCreateFailed': 'Kan Google-bestelling niet aanmaken', + 'paypalOrderCreateFailed': 'Kan PayPal-bestelling niet aanmaken', + 'paymentException': 'Betalingsuitzondering', + 'paymentLaunchFailed': 'Kan betaling niet starten', + 'paymentExceptionWithError': 'Betalingsuitzondering: @error', + 'paymentProcessingCheckLater': + 'Uw bestelling wordt verwerkt. Controleer het later.', + 'paymentResultQueryException': 'Kan betalingsresultaat niet opvragen: @error', + 'orderConfirmedQuotaRefreshed': + 'Bestelling bevestigd. Uw tegoed is bijgewerkt.', + 'paymentCompletedConfirming': 'Betaling voltooid. Bevestigen…', + 'paymentCancelled': 'Betaling geannuleerd', + 'paypalOpenedCompleteInBrowser': + 'PayPal geopend. Voltooi de betaling in uw browser.', + 'paypalOpenFailed': 'Kan PayPal-betaalpagina niet openen', + 'paymentTestTitle': 'Betalingstest', + 'paymentTestOrderInfo': 'Testbestelgegevens', + 'paymentTestProductId': 'Product-ID', + 'paymentTestProductDescription': 'Productbeschrijving', + 'paymentTestWechatDescription': 'WeChat-betalingstest', + 'paymentTestAlipayDescription': 'Alipay-betalingstest', + 'paymentTestAmount': 'Bedrag', + 'paymentTestSelectAmount': 'Selecteer testbedrag', + 'paying': 'Betalen...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Betalingsstatus', + 'errorInfoWithMessage': 'Fout: @message', + 'retest': 'Opnieuw testen', + 'paymentTestInstructionsTitle': 'Instructies', + 'paymentTestInstructionsContent': + '1. Selecteer een testbedrag (aanbevolen: ¥0.01)\n2. Klik op de betaalknop om te starten\n3. Voltooi de betaling in de betaal-app\n4. Keer terug om het resultaat te controleren', + 'startingWechatPayment': 'WeChat Pay starten...', + 'startingAlipayPayment': 'Alipay starten...', + 'wechatPaymentSuccess': 'WeChat Pay-betaling geslaagd!', + 'wechatPaymentFailed': 'WeChat Pay mislukt', + 'wechatPaymentLaunchFailed': 'Kan WeChat Pay niet starten', + 'cannotLaunchWechatPayment': 'Kan WeChat Pay niet starten', + 'wechatPaymentException': 'WeChat Pay-uitzondering', + 'wechatPaymentTestCompleted': 'WeChat Pay-test voltooid', + 'alipayPaymentSuccess': 'Alipay-betaling geslaagd!', + 'alipayPaymentFailed': 'Alipay mislukt', + 'alipayPaymentLaunchFailed': 'Kan Alipay niet starten', + 'cannotLaunchAlipayPayment': 'Kan Alipay niet starten', + 'alipayPaymentException': 'Alipay-uitzondering', "insufficientIntegral": "Insufficient integral", "insufficientBalanceDesc": 'Insufficient balance, please go to the corresponding recharge page to recharge.', @@ -496,19 +522,28 @@ const Map nlNL = { 'callRecording': 'Call Recording', 'importAudio': 'Import Audio', 'meetingRecordExitTitle': 'Opname verlaten', // 退出录音 - 'meetingRecordExitMessage': 'Kies wat je wilt doen voordat je vertrekt', // 请选择离开后的操作 + 'meetingRecordExitMessage': + 'Kies wat je wilt doen voordat je vertrekt', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Beëindigen en opslaan', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Beëindigen zonder op te slaan', // 结束录音不保存 - 'meetingRecordContinueInBackground': 'Opname op de achtergrond voortzetten', // 后台继续录音 - 'meetingRecordStopTimeout': 'Time-out bij het stoppen van de opname. Probeer het opnieuw.', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'Kan de opname niet stoppen. Probeer het opnieuw.', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'Kan de opname niet opslaan. Probeer het opnieuw.', // 保存录音失败,请重试 + 'meetingRecordContinueInBackground': + 'Opname op de achtergrond voortzetten', // 后台继续录音 + 'meetingRecordStopTimeout': + 'Time-out bij het stoppen van de opname. Probeer het opnieuw.', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'Kan de opname niet stoppen. Probeer het opnieuw.', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'Kan de opname niet opslaan. Probeer het opnieuw.', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'Opname bezig', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Opname op de achtergrond. Tik om terug te keren naar de app.', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'Opname op de achtergrond. Tik om terug te keren naar de app.', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Weergeven over andere apps', // 悬浮窗权限 - 'overlayPermissionTranslationDesc': 'Om vertaalresultaten tijdens gesprekken of audio-/videotranslatie te tonen, hebben we overlay-machtiging nodig. Zo kun je realtime vertalingen zien terwijl je andere apps gebruikt.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 - 'overlayPermissionRecordingDesc': 'Om tijdens het opnemen de zwevende opnamebalk (timer/pauze/hervatten) te tonen, hebben we overlay-machtiging nodig.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 - 'overlayPermissionOpenSettingsFailed': 'Kan de systeeminstellingen niet automatisch openen. Open Instellingen en schakel de overlay-machtiging handmatig in.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 + 'overlayPermissionTranslationDesc': + 'Om vertaalresultaten tijdens gesprekken of audio-/videotranslatie te tonen, hebben we overlay-machtiging nodig. Zo kun je realtime vertalingen zien terwijl je andere apps gebruikt.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 + 'overlayPermissionRecordingDesc': + 'Om tijdens het opnemen de zwevende opnamebalk (timer/pauze/hervatten) te tonen, hebben we overlay-machtiging nodig.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 + 'overlayPermissionOpenSettingsFailed': + 'Kan de systeeminstellingen niet automatisch openen. Open Instellingen en schakel de overlay-machtiging handmatig in.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 'transcribing': 'Transcribing...', 'summarizing': 'Summarizing...', 'analyzing': 'Analyzing...', @@ -533,21 +568,22 @@ const Map nlNL = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Aanmaken', - 'templateDetails': 'Sjabloondetails', - 'tag': 'Label', - 'description': 'Beschrijving', - 'template': 'Sjabloon', - 'deleteTemplate': 'Sjabloon verwijderen', - 'deleteTemplateConfirm': 'Weet u zeker dat u dit sjabloon wilt verwijderen?', - 'editTemplate': 'Sjabloon bewerken', - 'createTemplate': 'Sjabloon aanmaken', - 'name': 'Naam', - 'templateContentHint': 'Voer de inhoud van het sjabloon in! Tip: Klik op de AI-knop hierboven om snel sjablooninhoud te genereren op basis van de naam en beschrijving die u hebt ingevoerd', - 'inputNameHint': 'Voer een naam in', - 'inputDescHint': 'Voer een beschrijving in', - 'custom': 'Aangepast', - 'pleaseEnter': 'Voer alstublieft in', + 'create': 'Aanmaken', + 'templateDetails': 'Sjabloondetails', + 'tag': 'Label', + 'description': 'Beschrijving', + 'template': 'Sjabloon', + 'deleteTemplate': 'Sjabloon verwijderen', + 'deleteTemplateConfirm': 'Weet u zeker dat u dit sjabloon wilt verwijderen?', + 'editTemplate': 'Sjabloon bewerken', + 'createTemplate': 'Sjabloon aanmaken', + 'name': 'Naam', + 'templateContentHint': + 'Voer de inhoud van het sjabloon in! Tip: Klik op de AI-knop hierboven om snel sjablooninhoud te genereren op basis van de naam en beschrijving die u hebt ingevoerd', + 'inputNameHint': 'Voer een naam in', + 'inputDescHint': 'Voer een beschrijving in', + 'custom': 'Aangepast', + 'pleaseEnter': 'Voer alstublieft in', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', @@ -570,7 +606,7 @@ const Map nlNL = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Mindmap opslaan', + 'saveMindMap': 'Mindmap opslaan', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -592,7 +628,7 @@ const Map nlNL = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Exporteren', + 'export': 'Exporteren', // Meeting模块 - 发言者 'applyToAllParagraphs': "Toepassen op alle alinea's van deze spreker", @@ -702,18 +738,18 @@ const Map nlNL = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Analyse mislukt, probeer het later opnieuw', - 'transcriptionFailed': 'Transcriptie mislukt, probeer het later opnieuw', - 'summaryFailed': 'Samenvatting mislukt, probeer het later opnieuw', - 'summaryFailedShort': 'Samenvatting mislukt', - 'transcriptionFailedShort': 'Transcriptie mislukt', + 'analysisFailed': 'Analyse mislukt, probeer het later opnieuw', + 'transcriptionFailed': 'Transcriptie mislukt, probeer het later opnieuw', + 'summaryFailed': 'Samenvatting mislukt, probeer het later opnieuw', + 'summaryFailedShort': 'Samenvatting mislukt', + 'transcriptionFailedShort': 'Transcriptie mislukt', // Meeting模块 - 播放器 - 'playerNotReady': 'Audiospeler is niet gereed, even geduld', - 'playFailed': 'Afspelen mislukt', - 'audioFileNotFound': 'Audiobestand niet gevonden', - 'fetchingAudio': 'Audio ophalen uit de cloud...', - 'playerLoadFailed': 'Audiospeler kan niet laden', + 'playerNotReady': 'Audiospeler is niet gereed, even geduld', + 'playFailed': 'Afspelen mislukt', + 'audioFileNotFound': 'Audiobestand niet gevonden', + 'fetchingAudio': 'Audio ophalen uit de cloud...', + 'playerLoadFailed': 'Audiospeler kan niet laden', // 设置页 "systemSettings": "Systeeminstellingen", @@ -820,7 +856,8 @@ const Map nlNL = { "swipeUpForMore": "Veeg omhoog voor meer", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Wanneer ingeschakeld: De AI wordt niet onderbroken door uw stem terwijl deze spreekt en kan slechts één gespreksronde tegelijk verwerken. Om een nieuwe ronde te starten, zeg gewoon het activeringswoord.', + 'voice_interrupt_tip': + 'Wanneer ingeschakeld: De AI wordt niet onderbroken door uw stem terwijl deze spreekt en kan slechts één gespreksronde tegelijk verwerken. Om een nieuwe ronde te starten, zeg gewoon het activeringswoord.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -877,6 +914,14 @@ const Map nlNL = { 'We willen weten waarom u rapporteert, u kunt het probleem dat u tegenkwam beschrijven.', 'generatedByAi': 'Gegenereerd door AI', + // Agent模块 - 工具调用 + 'toolCall': 'Gereedschapsoproep', + 'noResult': 'Geen resultaat', + 'noToolCallContentToCopy': + 'Geen inhoud van gereedschapsoproep om te kopieren', + 'toolCallDetails': 'Details gereedschapsoproep:', + 'toolCallContentCopied': 'Inhoud gekopieerd naar klembord', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Hier zijn enkele aanbevolen muziekstukken:', 'playList': 'Afspeellijst', @@ -897,6 +942,29 @@ const Map nlNL = { "bicycling": 'Fietsen', "tsransit": 'Openbaar vervoer', + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Navigatie-app selecteren', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigeren met Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigeren met Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigeren met Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigeren met Apple Maps', + 'builtInNavigation': 'Ingebouwde navigatie', + 'useBuiltInNavigation': 'Navigeren met ingebouwde kaart', + 'navigationStartFailed': 'Navigatie starten mislukt', + 'cannotPlayMusicListRetryLater': + 'Kan muzieklijst niet afspelen, probeer het later opnieuw', + 'cannotPlaySong': 'Kan nummer niet afspelen', + 'openMapError': 'Fout bij openen van kaart', + 'pleaseInstallAmapApp': 'Installeer eerst de Amap-app', + 'pleaseInstallBaiduMapApp': 'Installeer eerst de Baidu Maps-app', + 'appleMapStartFailed': 'Apple Maps starten mislukt', + 'appleMapUnavailable': 'Apple Maps niet beschikbaar', + 'openAppleMapError': 'Fout bij openen van Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Weersomstandigheden opvragen:', 'highest': 'Hoogste', @@ -968,8 +1036,19 @@ const Map nlNL = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Zwevend venster uitschakelen', + 'enableFloatingWindow': 'Zwevend venster inschakelen', + 'permissionTip': 'Machtigingstip', + 'micPermissionRequiredForRecording': + 'Microfoonmachtiging vereist voor opname', + 'deleteTranslationRecordError': 'Fout bij verwijderen vertaalrecord: @error', "translationFailed": "Translation failed", + "translating": "Vertalen", + "translate": "Vertaal", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Voer de tekst in om te vertalen", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1247,17 +1326,18 @@ const Map nlNL = { 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigatie actief', - 'native.notification.navigation.keepRunning': 'Navigeren, houd de app actief', - 'native.notification.bleAgent.running': 'Spraakassistent is actief', - 'native.notification.audioRecording.recording': 'Audio opnemen, tik om terug te keren naar de app', - 'native.notification.music.waiting': 'Wachten op afspelen', - 'native.notification.music.previous': 'Vorige', - 'native.notification.music.next': 'Volgende', - 'native.notification.music.play': 'Afspelen', - 'native.notification.music.pause': 'Pauzeren', - 'native.notification.qqMusic.playing': 'Muziek afspelen', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigatie actief', + 'native.notification.navigation.keepRunning': 'Navigeren, houd de app actief', + 'native.notification.bleAgent.running': 'Spraakassistent is actief', + 'native.notification.audioRecording.recording': + 'Audio opnemen, tik om terug te keren naar de app', + 'native.notification.music.waiting': 'Wachten op afspelen', + 'native.notification.music.previous': 'Vorige', + 'native.notification.music.next': 'Volgende', + 'native.notification.music.play': 'Afspelen', + 'native.notification.music.pause': 'Pauzeren', + 'native.notification.qqMusic.playing': 'Muziek afspelen', // 版本更新 'newVersionFound': 'Nieuwe versie gevonden', // 版本更新对话框标题 @@ -1397,6 +1477,59 @@ const Map nlNL = { "removeEarbudsEnsureBattery": "Haal beide oortjes eruit en zorg ervoor dat de batterij van beide meer dan 20% is", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Nieuwe versie @version gevonden', + 'otaConfirmUpdateNow': 'Nu bijwerken?', + 'otaUpdate': 'Bijwerken', + 'otaUpgradeSuccess': 'Upgrade geslaagd', + 'otaUpgradeCompleteRepair': + 'Firmware-update voltooid!\n\nHet apparaat moet opnieuw worden gekoppeld. Naar koppelingspagina?', + 'otaPairLater': 'Later koppelen', + 'otaPairNow': 'Nu koppelen', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Fout bij controle BLE-verbinding: @error', + 'otaBleNotConnected': 'BLE-apparaat niet verbonden', + 'otaBleNeedConnection': + 'BLE-verbinding vereist\nZorg dat het apparaat verbonden is en probeer opnieuw', + 'otaDeviceInfoUnavailableTitle': 'Apparaatinfo niet beschikbaar', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE-verbindingscontrole mislukt', + 'otaCannotGetDeviceInfoCheckConnection': + 'Kan apparaatinfo niet ophalen, controleer de verbinding', + 'otaCannotGetProductInfoWithName': + 'Kan productinfo niet ophalen, apparaatnaam: @deviceName', + 'otaCannotGetBatteryInfo': 'Kan geen geldige batterij-info ophalen', + 'otaLowBattery': 'Batterij bijna leeg', + 'otaSingleBatteryLow': + 'Batterij te laag\nVereiste: boven 20%\nHuidig: @ear @battery%\nLaad op en probeer opnieuw', + 'otaDoubleBatteryLow': + 'Batterij te laag\nVereiste: beide oordopjes boven 20%\nHuidig: Links @left%, Rechts @right%\nLaad op en probeer opnieuw', + 'otaBatteryCheckFailed': 'Batterijcontrole mislukt', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'Deze update bevat prestatieverbeteringen en bugfixes.', + 'otaGetLatestVersionFailed': 'Kan nieuwste versie niet ophalen', + 'otaGetVersionInfoFailed': 'Kan versie-info niet ophalen', + 'otaCheckingDeviceStatus': 'Apparaatstatus controleren...', + 'otaDownloadFailedCheckNetwork': + 'Download mislukt, controleer de netwerkverbinding', + 'otaDownloadFailed': 'Download mislukt', + 'otaPreparingConnection': 'Verbinding voorbereiden...', + 'otaConnectingDevice': 'Verbinden met apparaat...', + 'otaUpgradeStarted': 'OTA-upgrade gestart...', + 'otaUpgradeProgressWithPercent': 'Voortgang: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade succesvol voltooid', + 'otaUpgradeFailedWithCode': 'Upgrade mislukt, foutcode: @code', + 'otaUpgradeFailedTitle': 'Upgrade mislukt', + 'otaUpgradeFailedDesc': + 'Controleer de verbinding of het updatepakket, foutcode: @code', + 'otaDeviceDisconnected': 'Apparaat losgekoppeld', + 'otaDeviceConnected': 'Apparaat verbonden', + // 音乐模块 "noMusic": "Geen muziek", // 暂无音乐 "noPlayingMusic": "Geen muziek aan het afspelen", // 暂无播放音乐 diff --git a/lib/core/translations/language/pl_pl.dart b/lib/core/translations/language/pl_pl.dart index 4a5b4e21b..3d1b01481 100644 --- a/lib/core/translations/language/pl_pl.dart +++ b/lib/core/translations/language/pl_pl.dart @@ -19,11 +19,11 @@ const Map plPL = { "unknownError": "Nieznany błąd", "asrConnectionFailed": "Nie udało się połączyć z usługą rozpoznawania mowy. Sprawdź sieć lub spróbuj ponownie później.", - "justNow": "Just now", - "minutesAgo": "@minutes minutes ago", - "yesterday": "Yesterday", - "daysAgo": "@days days ago", - "hoursAgo": "@hours hours ago", + "justNow": "Przed chwilą", + "minutesAgo": "@minutes min temu", + "yesterday": "Wczoraj", + "daysAgo": "@days dni temu", + "hoursAgo": "@hours godz. temu", // 启动页 "slogan": "Łącząc świat, poza dźwiękiem", @@ -170,6 +170,26 @@ const Map plPL = { 'checkConnectionStatusFailed': 'Sprawdzenie stanu połączenia nie powiodło się', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Inicjalizacja Bluetooth nie powiodła się: @error', + 'needBluetoothAndLocationPermission': 'Uprawnienia Bluetooth i lokalizacji są wymagane do skanowania urządzeń', + 'permissionRequestFailedWithError': 'Żądanie uprawnień nie powiodło się: @error', + 'needPermission': 'Wymagane uprawnienia', + 'blePermissionDialogContent': 'Ta aplikacja wymaga uprawnień Bluetooth i lokalizacji do skanowania urządzeń. Włącz je w Ustawieniach.', + 'needEnableBluetooth': 'Włącz Bluetooth', + 'enableBluetoothDialogContent': 'Włącz Bluetooth, aby skanować i łączyć urządzenia.', + 'bleScanFailedWithError': 'Skanowanie nie powiodło się: @error', + 'bleConnectionSuccess': 'Połączenie udane', + 'bleConnectedToDevice': 'Połączono z @device', + 'bleConnectionFailedWithError': 'Połączenie nie powiodło się: @error', + 'bleDisconnected': 'Rozłączono', + 'bleDeviceDisconnected': 'Urządzenie rozłączone', + 'bleDisconnectFailedWithError': 'Rozłączenie nie powiodło się: @error', + 'signalStrong': 'Silny', + 'signalMedium': 'Średni', + 'signalWeak': 'Słaby', + 'signalVeryWeak': 'Bardzo słaby', + // 发现页 "searchAi": "Szukaj funkcji AI...", "exploreSlogan": "Inteligentne słuchawki, nieskończone możliwości", @@ -197,48 +217,48 @@ const Map plPL = { "scene": "Scenariusz", // 用量统计模块 - "aiChat": "AI Chat", - "translationStats": "Translation Statistics", - "meetingStats": "Meeting Statistics", - "today": "Today", - "thisWeek": "This Week", - "thisMonth": "This Month", - "history": "History", - "currentSessionStats": "Current Session Stats", - "translationCount": "Translation Count", - "sessionDuration": "Session Duration", - "characters": "Characters", - "recordingDuration": "Recording Duration", - "totalApiCalls": "Total API Calls", - "sessionCount": "Session Count", - "totalCharacters": "Total Characters", - "apiCallStats": "API Call Stats", - "translationApi": "Translation API", + "aiChat": "Czat AI", + "translationStats": "Statystyki tłumaczeń", + "meetingStats": "Statystyki spotkań", + "today": "Dzisiaj", + "thisWeek": "Ten tydzień", + "thisMonth": "Ten miesiąc", + "history": "Historia", + "currentSessionStats": "Statystyki bieżącej sesji", + "translationCount": "Liczba tłumaczeń", + "sessionDuration": "Czas trwania sesji", + "characters": "Znaki", + "recordingDuration": "Czas nagrywania", + "totalApiCalls": "Łączna liczba wywołań API", + "sessionCount": "Liczba sesji", + "totalCharacters": "Łączna liczba znaków", + "apiCallStats": "Statystyki wywołań API", + "translationApi": "API tłumaczeń", "asr": "ASR", "tts": "TTS", - "dataVolumeStats": "Data Volume Stats", - "sourceTextCharacters": "Source Text Characters", - "ttsTextCharacters": "TTS Text Characters", - "effectiveAudioDuration": "Effective Audio Duration", - "totalSessionDuration": "Total Session Duration", - "costStats": "Cost Stats", - "estimatedCost": "Estimated Cost", - "dailyCostThreshold": "Daily Cost Threshold", - "monthlyCostThreshold": "Monthly Cost Threshold", - "usageBehaviorStats": "Usage Behavior Stats", - "mostUsedLanguagePair": "Most-used language pair", - "mostUsedMode": "Most-used mode", - "asrApiCalls": "ASR Calls", - "totalAudioDuration": "Total Audio Duration", - "audioFileSize": "Audio File Size", - "transcriptBytes": "Transcript Bytes", - "loadFailed": "Load Failed", + "dataVolumeStats": "Statystyki wolumenu danych", + "sourceTextCharacters": "Znaki tekstu źródłowego", + "ttsTextCharacters": "Znaki tekstu TTS", + "effectiveAudioDuration": "Efektywny czas trwania audio", + "totalSessionDuration": "Łączny czas trwania sesji", + "costStats": "Statystyki kosztów", + "estimatedCost": "Szacowany koszt", + "dailyCostThreshold": "Dzienny limit kosztów", + "monthlyCostThreshold": "Miesięczny limit kosztów", + "usageBehaviorStats": "Statystyki zachowań użytkownika", + "mostUsedLanguagePair": "Najczęściej używana para językowa", + "mostUsedMode": "Najczęściej używany tryb", + "asrApiCalls": "Wywołania ASR", + "totalAudioDuration": "Łączny czas trwania audio", + "audioFileSize": "Rozmiar pliku audio", + "transcriptBytes": "Rozmiar transkrypcji", + "loadFailed": "Ładowanie nie powiodło się", "statsLoadFailedTryLater": - "Statistics failed to load. Please try again later.", - "cleanupComplete": "Cleanup Complete", - "cleanedOldData": "Cleaned data older than 90 days", - "exportFeature": "Export Feature", - "exportInDevelopment": "Data export is under development", + "Ładowanie statystyk nie powiodło się. Spróbuj ponownie później.", + "cleanupComplete": "Czyszczenie zakończone", + "cleanedOldData": "Wyczyszczono dane starsze niż 90 dni", + "exportFeature": "Funkcja eksportu", + "exportInDevelopment": "Eksport danych jest w trakcie rozwoju", // 商品模块 - 通用 'availablePackages': 'Available Packages', @@ -882,6 +902,13 @@ const Map plPL = { 'Chcielibyśmy wiedzieć, dlaczego zgłaszasz, możesz opisać problem, z którym się spotkałeś.', 'generatedByAi': 'Wygenerowano przez AI', + // Agent模块 - 工具调用 + 'toolCall': 'Wywołanie narzędzia', + 'noResult': 'Brak wyniku', + 'noToolCallContentToCopy': 'Brak treści wywołania narzędzia do skopiowania', + 'toolCallDetails': 'Szczegóły wywołania narzędzia:', + 'toolCallContentCopied': 'Treść wywołania narzędzia skopiowana do schowka', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Oto kilka polecanych utworów:', 'playList': 'Lista odtwarzania', @@ -902,6 +929,28 @@ const Map plPL = { "bicycling": 'Rowerem', "tsransit": 'Transport publiczny', + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Wybierz aplikację nawigacyjną', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Nawiguj z Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Nawiguj z Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Nawiguj z Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Nawiguj z Apple Maps', + 'builtInNavigation': 'Wbudowana nawigacja', + 'useBuiltInNavigation': 'Nawiguj z wbudowaną mapą', + 'navigationStartFailed': 'Nie udało się uruchomić nawigacji', + 'cannotPlayMusicListRetryLater': 'Nie można odtworzyć listy muzyki, spróbuj ponownie później', + 'cannotPlaySong': 'Nie można odtworzyć utworu', + 'openMapError': 'Błąd otwierania mapy', + 'pleaseInstallAmapApp': 'Najpierw zainstaluj aplikację Amap', + 'pleaseInstallBaiduMapApp': 'Najpierw zainstaluj aplikację Baidu Maps', + 'appleMapStartFailed': 'Nie udało się uruchomić Apple Maps', + 'appleMapUnavailable': 'Apple Maps niedostępne', + 'openAppleMapError': 'Błąd otwierania Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Zapytanie o warunki pogodowe:', 'highest': 'Najwyższa', @@ -974,8 +1023,18 @@ const Map plPL = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Wyłącz pływające okno', + 'enableFloatingWindow': 'Włącz pływające okno', + 'permissionTip': 'Wskazówka dotycząca uprawnień', + 'micPermissionRequiredForRecording': 'Uprawnienie do mikrofonu jest wymagane do nagrywania', + 'deleteTranslationRecordError': 'Błąd usuwania rekordu tłumaczenia: @error', "translationFailed": "Translation failed", + "translating": "Tłumaczenie", + "translate": "Tłumacz", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Wprowadź tekst do przetłumaczenia", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1405,6 +1464,49 @@ const Map plPL = { "removeEarbudsEnsureBattery": "Wyjmij obie słuchawki i upewnij się, że poziom naładowania baterii obu wynosi ponad 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Znaleziono nową wersję @version', + 'otaConfirmUpdateNow': 'Zaktualizować teraz?', + 'otaUpdate': 'Aktualizuj', + 'otaUpgradeSuccess': 'Aktualizacja zakończona sukcesem', + 'otaUpgradeCompleteRepair': 'Aktualizacja firmware zakończona!\n\nUrządzenie wymaga ponownego sparowania, aby działać poprawnie. Przejść do strony parowania?', + 'otaPairLater': 'Sparuj później', + 'otaPairNow': 'Sparuj teraz', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Błąd sprawdzania połączenia BLE: @error', + 'otaBleNotConnected': 'Urządzenie BLE niepodłączone', + 'otaBleNeedConnection': 'Aktualizacja firmware wymaga połączenia BLE\nUpewnij się, że urządzenie jest prawidłowo podłączone i spróbuj ponownie', + 'otaDeviceInfoUnavailableTitle': 'Informacje o urządzeniu niedostępne', + 'otaCannotGetDeviceInfo': 'Nie można uzyskać informacji o urządzeniu\nPodłącz ponownie urządzenie lub spróbuj później', + 'otaBleCheckFailed': 'Sprawdzanie połączenia BLE nie powiodło się', + 'otaCannotGetDeviceInfoCheckConnection': 'Nie można uzyskać informacji o urządzeniu, sprawdź połączenie', + 'otaCannotGetProductInfoWithName': 'Nie można uzyskać informacji o produkcie, nazwa urządzenia: @deviceName', + 'otaCannotGetBatteryInfo': 'Nie można uzyskać prawidłowych informacji o baterii', + 'otaLowBattery': 'Niski poziom baterii', + 'otaSingleBatteryLow': 'Poziom baterii urządzenia zbyt niski do aktualizacji firmware\nWymaganie: bateria musi być powyżej 20%\nAktualnie: @ear @battery%\nNaładuj i spróbuj ponownie', + 'otaDoubleBatteryLow': 'Poziom baterii urządzenia zbyt niski do aktualizacji firmware\nWymaganie: obie słuchawki muszą mieć powyżej 20%\nAktualnie: Lewa @left%, Prawa @right%\nNaładuj i spróbuj ponownie', + 'otaBatteryCheckFailed': 'Sprawdzanie baterii nie powiodło się', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': 'Ta aktualizacja zawiera optymalizacje wydajności i poprawki błędów.', + 'otaGetLatestVersionFailed': 'Nie udało się pobrać informacji o najnowszej wersji', + 'otaGetVersionInfoFailed': 'Nie udało się pobrać informacji o wersji', + 'otaCheckingDeviceStatus': 'Sprawdzanie stanu urządzenia...', + 'otaDownloadFailedCheckNetwork': 'Pobieranie nie powiodło się, sprawdź połączenie sieciowe', + 'otaDownloadFailed': 'Pobieranie nie powiodło się', + 'otaPreparingConnection': 'Przygotowywanie połączenia z urządzeniem...', + 'otaConnectingDevice': 'Łączenie z urządzeniem...', + 'otaUpgradeStarted': 'Aktualizacja OTA rozpoczęta...', + 'otaUpgradeProgressWithPercent': 'Postęp aktualizacji: @percent%', + 'otaUpgradeSuccessComplete': 'Aktualizacja zakończona pomyślnie', + 'otaUpgradeFailedWithCode': 'Aktualizacja nie powiodła się, kod błędu: @code', + 'otaUpgradeFailedTitle': 'Aktualizacja nie powiodła się', + 'otaUpgradeFailedDesc': 'Sprawdź połączenie urządzenia lub pakiet aktualizacji, kod błędu: @code', + 'otaDeviceDisconnected': 'Urządzenie rozłączone', + 'otaDeviceConnected': 'Urządzenie podłączone', + // 音乐模块 "noMusic": "Brak muzyki", // 暂无音乐 "noPlayingMusic": "Brak odtwarzanej muzyki", // 暂无播放音乐 diff --git a/lib/core/translations/language/pt_pt.dart b/lib/core/translations/language/pt_pt.dart index c2c1bd629..d08485b2f 100644 --- a/lib/core/translations/language/pt_pt.dart +++ b/lib/core/translations/language/pt_pt.dart @@ -1,5 +1,4 @@ const Map ptPT = { - // 通用 'continue': 'Continuar', 'confirm': 'Confirmar', @@ -172,6 +171,30 @@ const Map ptPT = { 'right': 'Direita', 'checkConnectionStatusFailed': 'Falha ao verificar o estado da conexão', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Falha na inicializacao do Bluetooth: @error', + 'needBluetoothAndLocationPermission': + 'Sao necessarias permissoes de Bluetooth e localizacao para procurar dispositivos', + 'permissionRequestFailedWithError': + 'Falha na solicitacao de permissao: @error', + 'needPermission': 'Permissao necessaria', + 'blePermissionDialogContent': + 'Este aplicativo precisa de permissoes de Bluetooth e localizacao para procurar dispositivos. Ative-as nas Configuracoes.', + 'needEnableBluetooth': 'Ativar Bluetooth', + 'enableBluetoothDialogContent': + 'Ative o Bluetooth para procurar e conectar dispositivos.', + 'bleScanFailedWithError': 'Falha na busca: @error', + 'bleConnectionSuccess': 'Conexao bem-sucedida', + 'bleConnectedToDevice': 'Conectado a @device', + 'bleConnectionFailedWithError': 'Falha na conexao: @error', + 'bleDisconnected': 'Desconectado', + 'bleDeviceDisconnected': 'Dispositivo desconectado', + 'bleDisconnectFailedWithError': 'Falha ao desconectar: @error', + 'signalStrong': 'Forte', + 'signalMedium': 'Medio', + 'signalWeak': 'Fraco', + 'signalVeryWeak': 'Muito fraco', + // 发现页 "searchAi": "Pesquisar funções de IA...", "exploreSlogan": "Auriculares inteligentes, possibilidades infinitas", @@ -248,60 +271,65 @@ const Map ptPT = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Pagamento bem-sucedido', - 'paymentFailed': 'Pagamento falhou', - 'gotIt': 'Entendido', - 'paymentFailedTryAgain': 'Pagamento falhou. Por favor, tente novamente.', - 'selectPaymentMethod': 'Selecione o método de pagamento', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Falha ao criar pedido do WeChat', - 'alipayOrderCreateFailed': 'Falha ao criar pedido do Alipay', - 'appleOrderCreateFailed': 'Falha ao criar pedido da Apple', - 'googleOrderCreateFailed': 'Falha ao criar pedido do Google', - 'paypalOrderCreateFailed': 'Falha ao criar pedido do PayPal', - 'paymentException': 'Exceção de pagamento', - 'paymentLaunchFailed': 'Falha ao iniciar o pagamento', - 'paymentExceptionWithError': 'Exceção de pagamento: @error', - 'paymentProcessingCheckLater': 'O seu pedido está a ser processado. Por favor, verifique mais tarde.', - 'paymentResultQueryException': 'Falha ao consultar o resultado do pagamento: @error', - 'orderConfirmedQuotaRefreshed': 'Pedido confirmado. A sua quota foi atualizada.', - 'paymentCompletedConfirming': 'Pagamento concluído. A confirmar…', - 'paymentCancelled': 'Pagamento cancelado', - 'paypalOpenedCompleteInBrowser': 'PayPal aberto. Por favor, conclua o pagamento no seu navegador.', - 'paypalOpenFailed': 'Não é possível abrir a página de pagamento do PayPal', - 'paymentTestTitle': 'Teste de pagamento', - 'paymentTestOrderInfo': 'Informações do pedido de teste', - 'paymentTestProductId': 'ID do produto', - 'paymentTestProductDescription': 'Descrição do produto', - 'paymentTestWechatDescription': 'Teste de pagamento via WeChat', - 'paymentTestAlipayDescription': 'Teste de pagamento via Alipay', - 'paymentTestAmount': 'Montante', - 'paymentTestSelectAmount': 'Selecione o montante de teste', - 'paying': 'A pagar...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Estado do pagamento', - 'errorInfoWithMessage': 'Erro: @message', - 'retest': 'Testar novamente', - 'paymentTestInstructionsTitle': 'Instruções', - 'paymentTestInstructionsContent': '1. Selecione um montante de teste (recomendado: ¥0.01)\n2. Clique no botão de pagamento para iniciar\n3. Conclua o pagamento na aplicação de pagamento\n4. Volte para verificar o resultado', - 'startingWechatPayment': 'A iniciar o WeChat Pay...', - 'startingAlipayPayment': 'A iniciar o Alipay...', - 'wechatPaymentSuccess': 'Pagamento via WeChat Pay bem-sucedido!', - 'wechatPaymentFailed': 'Falha no WeChat Pay', - 'wechatPaymentLaunchFailed': 'Falha ao iniciar o WeChat Pay', - 'cannotLaunchWechatPayment': 'Não é possível iniciar o WeChat Pay', - 'wechatPaymentException': 'Exceção do WeChat Pay', - 'wechatPaymentTestCompleted': 'Teste do WeChat Pay concluído', - 'alipayPaymentSuccess': 'Pagamento via Alipay bem-sucedido!', - 'alipayPaymentFailed': 'Falha no Alipay', - 'alipayPaymentLaunchFailed': 'Falha ao iniciar o Alipay', - 'cannotLaunchAlipayPayment': 'Não é possível iniciar o Alipay', - 'alipayPaymentException': 'Exceção do Alipay', + 'paymentSuccess': 'Pagamento bem-sucedido', + 'paymentFailed': 'Pagamento falhou', + 'gotIt': 'Entendido', + 'paymentFailedTryAgain': 'Pagamento falhou. Por favor, tente novamente.', + 'selectPaymentMethod': 'Selecione o método de pagamento', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Falha ao criar pedido do WeChat', + 'alipayOrderCreateFailed': 'Falha ao criar pedido do Alipay', + 'appleOrderCreateFailed': 'Falha ao criar pedido da Apple', + 'googleOrderCreateFailed': 'Falha ao criar pedido do Google', + 'paypalOrderCreateFailed': 'Falha ao criar pedido do PayPal', + 'paymentException': 'Exceção de pagamento', + 'paymentLaunchFailed': 'Falha ao iniciar o pagamento', + 'paymentExceptionWithError': 'Exceção de pagamento: @error', + 'paymentProcessingCheckLater': + 'O seu pedido está a ser processado. Por favor, verifique mais tarde.', + 'paymentResultQueryException': + 'Falha ao consultar o resultado do pagamento: @error', + 'orderConfirmedQuotaRefreshed': + 'Pedido confirmado. A sua quota foi atualizada.', + 'paymentCompletedConfirming': 'Pagamento concluído. A confirmar…', + 'paymentCancelled': 'Pagamento cancelado', + 'paypalOpenedCompleteInBrowser': + 'PayPal aberto. Por favor, conclua o pagamento no seu navegador.', + 'paypalOpenFailed': 'Não é possível abrir a página de pagamento do PayPal', + 'paymentTestTitle': 'Teste de pagamento', + 'paymentTestOrderInfo': 'Informações do pedido de teste', + 'paymentTestProductId': 'ID do produto', + 'paymentTestProductDescription': 'Descrição do produto', + 'paymentTestWechatDescription': 'Teste de pagamento via WeChat', + 'paymentTestAlipayDescription': 'Teste de pagamento via Alipay', + 'paymentTestAmount': 'Montante', + 'paymentTestSelectAmount': 'Selecione o montante de teste', + 'paying': 'A pagar...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Estado do pagamento', + 'errorInfoWithMessage': 'Erro: @message', + 'retest': 'Testar novamente', + 'paymentTestInstructionsTitle': 'Instruções', + 'paymentTestInstructionsContent': + '1. Selecione um montante de teste (recomendado: ¥0.01)\n2. Clique no botão de pagamento para iniciar\n3. Conclua o pagamento na aplicação de pagamento\n4. Volte para verificar o resultado', + 'startingWechatPayment': 'A iniciar o WeChat Pay...', + 'startingAlipayPayment': 'A iniciar o Alipay...', + 'wechatPaymentSuccess': 'Pagamento via WeChat Pay bem-sucedido!', + 'wechatPaymentFailed': 'Falha no WeChat Pay', + 'wechatPaymentLaunchFailed': 'Falha ao iniciar o WeChat Pay', + 'cannotLaunchWechatPayment': 'Não é possível iniciar o WeChat Pay', + 'wechatPaymentException': 'Exceção do WeChat Pay', + 'wechatPaymentTestCompleted': 'Teste do WeChat Pay concluído', + 'alipayPaymentSuccess': 'Pagamento via Alipay bem-sucedido!', + 'alipayPaymentFailed': 'Falha no Alipay', + 'alipayPaymentLaunchFailed': 'Falha ao iniciar o Alipay', + 'cannotLaunchAlipayPayment': 'Não é possível iniciar o Alipay', + 'alipayPaymentException': 'Exceção do Alipay', "insufficientIntegral": "Insufficient integral", "insufficientBalanceDesc": 'Insufficient balance, please go to the corresponding recharge page to recharge.', @@ -545,21 +573,22 @@ const Map ptPT = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Criar', - 'templateDetails': 'Detalhes do modelo', - 'tag': 'Etiqueta', - 'description': 'Descrição', - 'template': 'Modelo', - 'deleteTemplate': 'Eliminar modelo', - 'deleteTemplateConfirm': 'Tem a certeza de que deseja eliminar este modelo?', - 'editTemplate': 'Editar modelo', - 'createTemplate': 'Criar modelo', - 'name': 'Nome', - 'templateContentHint': 'Por favor, insira o conteúdo do modelo! Dica: Clique no botão de IA acima para gerar rapidamente o conteúdo do modelo com base no nome e na descrição que introduziu', - 'inputNameHint': 'Por favor, insira o nome', - 'inputDescHint': 'Por favor, insira a descrição', - 'custom': 'Personalizado', - 'pleaseEnter': 'Por favor, insira', + 'create': 'Criar', + 'templateDetails': 'Detalhes do modelo', + 'tag': 'Etiqueta', + 'description': 'Descrição', + 'template': 'Modelo', + 'deleteTemplate': 'Eliminar modelo', + 'deleteTemplateConfirm': 'Tem a certeza de que deseja eliminar este modelo?', + 'editTemplate': 'Editar modelo', + 'createTemplate': 'Criar modelo', + 'name': 'Nome', + 'templateContentHint': + 'Por favor, insira o conteúdo do modelo! Dica: Clique no botão de IA acima para gerar rapidamente o conteúdo do modelo com base no nome e na descrição que introduziu', + 'inputNameHint': 'Por favor, insira o nome', + 'inputDescHint': 'Por favor, insira a descrição', + 'custom': 'Personalizado', + 'pleaseEnter': 'Por favor, insira', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', @@ -582,7 +611,7 @@ const Map ptPT = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Guardar mapa mental', + 'saveMindMap': 'Guardar mapa mental', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -604,7 +633,7 @@ const Map ptPT = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Exportar', + 'export': 'Exportar', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Aplicar a todos os parágrafos deste orador', @@ -714,18 +743,18 @@ const Map ptPT = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Análise falhou, por favor tente mais tarde', - 'transcriptionFailed': 'Transcrição falhou, por favor tente mais tarde', - 'summaryFailed': 'Resumo falhou, por favor tente mais tarde', - 'summaryFailedShort': 'Resumo falhou', - 'transcriptionFailedShort': 'Transcrição falhou', + 'analysisFailed': 'Análise falhou, por favor tente mais tarde', + 'transcriptionFailed': 'Transcrição falhou, por favor tente mais tarde', + 'summaryFailed': 'Resumo falhou, por favor tente mais tarde', + 'summaryFailedShort': 'Resumo falhou', + 'transcriptionFailedShort': 'Transcrição falhou', // Meeting模块 - 播放器 - 'playerNotReady': 'O reprodutor de áudio não está pronto, por favor aguarde', - 'playFailed': 'Reprodução falhou', - 'audioFileNotFound': 'Ficheiro de áudio não encontrado', - 'fetchingAudio': 'A obter áudio da nuvem...', - 'playerLoadFailed': 'Falha ao carregar o reprodutor de áudio', + 'playerNotReady': 'O reprodutor de áudio não está pronto, por favor aguarde', + 'playFailed': 'Reprodução falhou', + 'audioFileNotFound': 'Ficheiro de áudio não encontrado', + 'fetchingAudio': 'A obter áudio da nuvem...', + 'playerLoadFailed': 'Falha ao carregar o reprodutor de áudio', // 设置页 "systemSettings": "Definições do Sistema", @@ -835,7 +864,8 @@ const Map ptPT = { "swipeUpForMore": "Deslize para cima para ver mais", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Quando ativado: A IA não será interrompida pela sua voz enquanto fala e só poderá lidar com uma ronda de conversa de cada vez. Para iniciar uma nova ronda, basta dizer a palavra de ativação.', + 'voice_interrupt_tip': + 'Quando ativado: A IA não será interrompida pela sua voz enquanto fala e só poderá lidar com uma ronda de conversa de cada vez. Para iniciar uma nova ronda, basta dizer a palavra de ativação.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -891,6 +921,14 @@ const Map ptPT = { 'Gostaríamos de saber o motivo da sua denúncia, pode descrever o problema que encontrou.', 'generatedByAi': 'Gerado por IA', + // Agent模块 - 工具调用 + 'toolCall': 'Chamada de ferramenta', + 'noResult': 'Sem resultado', + 'noToolCallContentToCopy': + 'Sem conteudo de chamada de ferramenta para copiar', + 'toolCallDetails': 'Detalhes da chamada de ferramenta:', + 'toolCallContentCopied': 'Conteudo copiado para a area de transferencia', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Aqui estão algumas músicas recomendadas:', 'playList': 'Lista de Reprodução', @@ -911,6 +949,29 @@ const Map ptPT = { "bicycling": "De bicicleta", "tsransit": "Transportes Públicos", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Selecionar aplicativo de navegacao', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navegar com Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navegar com Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navegar com Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navegar com Apple Maps', + 'builtInNavigation': 'Navegacao integrada', + 'useBuiltInNavigation': 'Navegar com mapa integrado', + 'navigationStartFailed': 'Falha ao iniciar a navegacao', + 'cannotPlayMusicListRetryLater': + 'Nao foi possivel reproduzir a lista de musicas, tente novamente mais tarde', + 'cannotPlaySong': 'Nao foi possivel reproduzir a musica', + 'openMapError': 'Erro ao abrir o mapa', + 'pleaseInstallAmapApp': 'Instale primeiro o aplicativo Amap', + 'pleaseInstallBaiduMapApp': 'Instale primeiro o aplicativo Baidu Maps', + 'appleMapStartFailed': 'Falha ao iniciar Apple Maps', + 'appleMapUnavailable': 'Apple Maps indisponivel', + 'openAppleMapError': 'Erro ao abrir Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'A consultar as condições meteorológicas:', 'highest': 'Máxima', @@ -983,8 +1044,20 @@ const Map ptPT = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Desativar janela flutuante', + 'enableFloatingWindow': 'Ativar janela flutuante', + 'permissionTip': 'Dica de permissao', + 'micPermissionRequiredForRecording': + 'Permissao de microfone necessaria para gravacao', + 'deleteTranslationRecordError': + 'Erro ao excluir registro de traducao: @error', "translationFailed": "Translation failed", + "translating": "A traduzir", + "translate": "Traduzir", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Introduza o texto a traduzir", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1261,17 +1334,20 @@ const Map ptPT = { 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navegação em curso', - 'native.notification.navigation.keepRunning': 'A navegar, mantenha a aplicação em execução', - 'native.notification.bleAgent.running': 'O assistente de voz está em execução', - 'native.notification.audioRecording.recording': 'A gravar áudio, toque para voltar à aplicação', - 'native.notification.music.waiting': 'A aguardar reprodução', - 'native.notification.music.previous': 'Anterior', - 'native.notification.music.next': 'Seguinte', - 'native.notification.music.play': 'Reproduzir', - 'native.notification.music.pause': 'Pausa', - 'native.notification.qqMusic.playing': 'A reproduzir música', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navegação em curso', + 'native.notification.navigation.keepRunning': + 'A navegar, mantenha a aplicação em execução', + 'native.notification.bleAgent.running': + 'O assistente de voz está em execução', + 'native.notification.audioRecording.recording': + 'A gravar áudio, toque para voltar à aplicação', + 'native.notification.music.waiting': 'A aguardar reprodução', + 'native.notification.music.previous': 'Anterior', + 'native.notification.music.next': 'Seguinte', + 'native.notification.music.play': 'Reproduzir', + 'native.notification.music.pause': 'Pausa', + 'native.notification.qqMusic.playing': 'A reproduzir música', // 版本更新 'newVersionFound': 'Nova Versão Encontrada', // 版本更新对话框标题 @@ -1413,6 +1489,60 @@ const Map ptPT = { "removeEarbudsEnsureBattery": "Retire ambos os auriculares e certifique-se de que a bateria de ambos está acima de 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Nova versao @version encontrada', + 'otaConfirmUpdateNow': 'Atualizar agora?', + 'otaUpdate': 'Atualizar', + 'otaUpgradeSuccess': 'Atualizacao bem-sucedida', + 'otaUpgradeCompleteRepair': + 'Atualizacao concluida!\n\nO dispositivo precisa ser emparelhado novamente. Ir para emparelhamento?', + 'otaPairLater': 'Emparelhar depois', + 'otaPairNow': 'Emparelhar agora', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Erro ao verificar conexao BLE: @error', + 'otaBleNotConnected': 'Dispositivo BLE nao conectado', + 'otaBleNeedConnection': + 'Conexao BLE necessaria\nVerifique a conexao e tente novamente', + 'otaDeviceInfoUnavailableTitle': 'Informacoes do dispositivo indisponiveis', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'Verificacao de conexao BLE falhou', + 'otaCannotGetDeviceInfoCheckConnection': + 'Nao foi possivel obter informacoes, verifique a conexao', + 'otaCannotGetProductInfoWithName': + 'Nao foi possivel obter informacoes do produto, nome: @deviceName', + 'otaCannotGetBatteryInfo': + 'Nao foi possivel obter informacoes de bateria validas', + 'otaLowBattery': 'Bateria fraca', + 'otaSingleBatteryLow': + 'Bateria muito baixa\nRequisito: acima de 20%\nAtual: @ear @battery%\nCarregue e tente novamente', + 'otaDoubleBatteryLow': + 'Bateria muito baixa\nRequisito: ambos acima de 20%\nAtual: Esquerdo @left%, Direito @right%\nCarregue e tente novamente', + 'otaBatteryCheckFailed': 'Verificacao de bateria falhou', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'Esta atualizacao inclui otimizacoes de desempenho e correcoes de bugs.', + 'otaGetLatestVersionFailed': 'Falha ao obter a versao mais recente', + 'otaGetVersionInfoFailed': 'Falha ao obter informacoes de versao', + 'otaCheckingDeviceStatus': 'Verificando status do dispositivo...', + 'otaDownloadFailedCheckNetwork': + 'Download falhou, verifique a conexao de rede', + 'otaDownloadFailed': 'Download falhou', + 'otaPreparingConnection': 'Preparando conexao do dispositivo...', + 'otaConnectingDevice': 'Conectando ao dispositivo...', + 'otaUpgradeStarted': 'Atualizacao OTA iniciada...', + 'otaUpgradeProgressWithPercent': 'Progresso: @percent%', + 'otaUpgradeSuccessComplete': 'Atualizacao concluida com sucesso', + 'otaUpgradeFailedWithCode': 'Atualizacao falhou, codigo de erro: @code', + 'otaUpgradeFailedTitle': 'Atualizacao falhou', + 'otaUpgradeFailedDesc': + 'Verifique a conexao ou o pacote de atualizacao, codigo: @code', + 'otaDeviceDisconnected': 'Dispositivo desconectado', + 'otaDeviceConnected': 'Dispositivo conectado', + // 音乐模块 "noMusic": "Sem Música", // 暂无音乐 "noPlayingMusic": "Nenhuma música a tocar", // 暂无播放音乐 diff --git a/lib/core/translations/language/ro_ro.dart b/lib/core/translations/language/ro_ro.dart index d8563c176..c083c26d6 100644 --- a/lib/core/translations/language/ro_ro.dart +++ b/lib/core/translations/language/ro_ro.dart @@ -1,5 +1,4 @@ const Map roRO = { - // 通用 'continue': 'Continuă', 'confirm': 'Confirmă', @@ -172,6 +171,29 @@ const Map roRO = { 'right': 'Dreapta', 'checkConnectionStatusFailed': 'Verificarea stării conexiunii a eșuat', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Initializarea Bluetooth a esuat: @error', + 'needBluetoothAndLocationPermission': + 'Sunt necesare permisiuni Bluetooth si locatie pentru scanare', + 'permissionRequestFailedWithError': 'Solicitarea permisiunii a esuat: @error', + 'needPermission': 'Permisiune necesara', + 'blePermissionDialogContent': + 'Aplicatia necesita permisiuni Bluetooth si locatie pentru scanarea dispozitivelor. Activati-le din Setari.', + 'needEnableBluetooth': 'Activati Bluetooth', + 'enableBluetoothDialogContent': + 'Activati Bluetooth pentru a scana si conecta dispozitive.', + 'bleScanFailedWithError': 'Scanare esuata: @error', + 'bleConnectionSuccess': 'Conectare reusita', + 'bleConnectedToDevice': 'Conectat la @device', + 'bleConnectionFailedWithError': 'Conectare esuata: @error', + 'bleDisconnected': 'Deconectat', + 'bleDeviceDisconnected': 'Dispozitiv deconectat', + 'bleDisconnectFailedWithError': 'Deconectare esuata: @error', + 'signalStrong': 'Puternic', + 'signalMedium': 'Mediu', + 'signalWeak': 'Slab', + 'signalVeryWeak': 'Foarte slab', + // 发现页 "searchAi": "Căutați funcții AI...", "exploreSlogan": "Căști inteligente, posibilități infinite", @@ -247,60 +269,65 @@ const Map roRO = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Plată reușită', - 'paymentFailed': 'Plata a eșuat', - 'gotIt': 'Am înțeles', - 'paymentFailedTryAgain': 'Plata a eșuat. Vă rugăm să reîncercați.', - 'selectPaymentMethod': 'Selectați metoda de plată', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Crearea comenzii WeChat Pay a eșuat', - 'alipayOrderCreateFailed': 'Crearea comenzii Alipay a eșuat', - 'appleOrderCreateFailed': 'Crearea comenzii Apple a eșuat', - 'googleOrderCreateFailed': 'Crearea comenzii Google a eșuat', - 'paypalOrderCreateFailed': 'Crearea comenzii PayPal a eșuat', - 'paymentException': 'Excepție la plată', - 'paymentLaunchFailed': 'Lansarea plății a eșuat', - 'paymentExceptionWithError': 'Excepție la plată: @error', - 'paymentProcessingCheckLater': 'Comanda dvs. este în curs de procesare. Verificați mai târziu.', - 'paymentResultQueryException': 'Interogarea rezultatului plății a eșuat: @error', - 'orderConfirmedQuotaRefreshed': 'Comanda a fost confirmată. Cota dvs. a fost reîmprospătată.', - 'paymentCompletedConfirming': 'Plată finalizată. Se confirmă…', - 'paymentCancelled': 'Plată anulată', - 'paypalOpenedCompleteInBrowser': 'PayPal deschis. Vă rugăm să finalizați plata în browser.', - 'paypalOpenFailed': 'Nu se poate deschide pagina de plată PayPal', - 'paymentTestTitle': 'Test de plată', - 'paymentTestOrderInfo': 'Informații comandă de test', - 'paymentTestProductId': 'ID produs', - 'paymentTestProductDescription': 'Descrierea produsului', - 'paymentTestWechatDescription': 'Test plată WeChat Pay', - 'paymentTestAlipayDescription': 'Test plată Alipay', - 'paymentTestAmount': 'Sumă', - 'paymentTestSelectAmount': 'Selectați suma de test', - 'paying': 'Se plătește...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Starea plății', - 'errorInfoWithMessage': 'Eroare: @message', - 'retest': 'Retestare', - 'paymentTestInstructionsTitle': 'Instrucțiuni', - 'paymentTestInstructionsContent': '1. Selectați o sumă de test (recomandat: ¥0,01)\n2. Faceți clic pe butonul de plată pentru a începe\n3. Finalizați plata în aplicația de plată\n4. Reveniți pentru a verifica rezultatul', - 'startingWechatPayment': 'Se lansează WeChat Pay...', - 'startingAlipayPayment': 'Se lansează Alipay...', - 'wechatPaymentSuccess': 'WeChat Pay reușit!', - 'wechatPaymentFailed': 'WeChat Pay eșuat', - 'wechatPaymentLaunchFailed': 'Lansarea WeChat Pay a eșuat', - 'cannotLaunchWechatPayment': 'Nu se poate lansa WeChat Pay', - 'wechatPaymentException': 'Excepție WeChat Pay', - 'wechatPaymentTestCompleted': 'Test WeChat Pay finalizat', - 'alipayPaymentSuccess': 'Alipay reușit!', - 'alipayPaymentFailed': 'Alipay eșuat', - 'alipayPaymentLaunchFailed': 'Lansarea Alipay a eșuat', - 'cannotLaunchAlipayPayment': 'Nu se poate lansa Alipay', - 'alipayPaymentException': 'Excepție Alipay', + 'paymentSuccess': 'Plată reușită', + 'paymentFailed': 'Plata a eșuat', + 'gotIt': 'Am înțeles', + 'paymentFailedTryAgain': 'Plata a eșuat. Vă rugăm să reîncercați.', + 'selectPaymentMethod': 'Selectați metoda de plată', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Crearea comenzii WeChat Pay a eșuat', + 'alipayOrderCreateFailed': 'Crearea comenzii Alipay a eșuat', + 'appleOrderCreateFailed': 'Crearea comenzii Apple a eșuat', + 'googleOrderCreateFailed': 'Crearea comenzii Google a eșuat', + 'paypalOrderCreateFailed': 'Crearea comenzii PayPal a eșuat', + 'paymentException': 'Excepție la plată', + 'paymentLaunchFailed': 'Lansarea plății a eșuat', + 'paymentExceptionWithError': 'Excepție la plată: @error', + 'paymentProcessingCheckLater': + 'Comanda dvs. este în curs de procesare. Verificați mai târziu.', + 'paymentResultQueryException': + 'Interogarea rezultatului plății a eșuat: @error', + 'orderConfirmedQuotaRefreshed': + 'Comanda a fost confirmată. Cota dvs. a fost reîmprospătată.', + 'paymentCompletedConfirming': 'Plată finalizată. Se confirmă…', + 'paymentCancelled': 'Plată anulată', + 'paypalOpenedCompleteInBrowser': + 'PayPal deschis. Vă rugăm să finalizați plata în browser.', + 'paypalOpenFailed': 'Nu se poate deschide pagina de plată PayPal', + 'paymentTestTitle': 'Test de plată', + 'paymentTestOrderInfo': 'Informații comandă de test', + 'paymentTestProductId': 'ID produs', + 'paymentTestProductDescription': 'Descrierea produsului', + 'paymentTestWechatDescription': 'Test plată WeChat Pay', + 'paymentTestAlipayDescription': 'Test plată Alipay', + 'paymentTestAmount': 'Sumă', + 'paymentTestSelectAmount': 'Selectați suma de test', + 'paying': 'Se plătește...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Starea plății', + 'errorInfoWithMessage': 'Eroare: @message', + 'retest': 'Retestare', + 'paymentTestInstructionsTitle': 'Instrucțiuni', + 'paymentTestInstructionsContent': + '1. Selectați o sumă de test (recomandat: ¥0,01)\n2. Faceți clic pe butonul de plată pentru a începe\n3. Finalizați plata în aplicația de plată\n4. Reveniți pentru a verifica rezultatul', + 'startingWechatPayment': 'Se lansează WeChat Pay...', + 'startingAlipayPayment': 'Se lansează Alipay...', + 'wechatPaymentSuccess': 'WeChat Pay reușit!', + 'wechatPaymentFailed': 'WeChat Pay eșuat', + 'wechatPaymentLaunchFailed': 'Lansarea WeChat Pay a eșuat', + 'cannotLaunchWechatPayment': 'Nu se poate lansa WeChat Pay', + 'wechatPaymentException': 'Excepție WeChat Pay', + 'wechatPaymentTestCompleted': 'Test WeChat Pay finalizat', + 'alipayPaymentSuccess': 'Alipay reușit!', + 'alipayPaymentFailed': 'Alipay eșuat', + 'alipayPaymentLaunchFailed': 'Lansarea Alipay a eșuat', + 'cannotLaunchAlipayPayment': 'Nu se poate lansa Alipay', + 'alipayPaymentException': 'Excepție Alipay', "insufficientIntegral": "Insufficient integral", "insufficientBalanceDesc": 'Insufficient balance, please go to the corresponding recharge page to recharge.', @@ -501,16 +528,24 @@ const Map roRO = { 'meetingRecordExitMessage': 'Alege ce să faci înainte de a ieși', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Încheie și salvează', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Încheie fără a salva', // 结束录音不保存 - 'meetingRecordContinueInBackground': 'Continuă înregistrarea în fundal', // 后台继续录音 - 'meetingRecordStopTimeout': 'A expirat timpul pentru oprirea înregistrării. Încearcă din nou.', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'Nu s-a putut opri înregistrarea. Încearcă din nou.', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'Nu s-a putut salva înregistrarea. Încearcă din nou.', // 保存录音失败,请重试 + 'meetingRecordContinueInBackground': + 'Continuă înregistrarea în fundal', // 后台继续录音 + 'meetingRecordStopTimeout': + 'A expirat timpul pentru oprirea înregistrării. Încearcă din nou.', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'Nu s-a putut opri înregistrarea. Încearcă din nou.', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'Nu s-a putut salva înregistrarea. Încearcă din nou.', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'Înregistrare în curs', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Se înregistrează în fundal. Atinge pentru a reveni la aplicație.', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'Se înregistrează în fundal. Atinge pentru a reveni la aplicație.', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Afișare peste alte aplicații', // 悬浮窗权限 - 'overlayPermissionTranslationDesc': 'Pentru a afișa rezultatele traducerii în timpul apelurilor sau al traducerii audio/video, avem nevoie de permisiunea de suprapunere. Astfel poți vedea traduceri în timp real în timp ce folosești alte aplicații.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 - 'overlayPermissionRecordingDesc': 'Pentru a afișa bara flotantă de înregistrare (cronometru/pauză/continuă) în timpul înregistrării, avem nevoie de permisiunea de suprapunere.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 - 'overlayPermissionOpenSettingsFailed': 'Nu se pot deschide automat setările de sistem. Deschide Setări și activează manual permisiunea de suprapunere.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 + 'overlayPermissionTranslationDesc': + 'Pentru a afișa rezultatele traducerii în timpul apelurilor sau al traducerii audio/video, avem nevoie de permisiunea de suprapunere. Astfel poți vedea traduceri în timp real în timp ce folosești alte aplicații.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 + 'overlayPermissionRecordingDesc': + 'Pentru a afișa bara flotantă de înregistrare (cronometru/pauză/continuă) în timpul înregistrării, avem nevoie de permisiunea de suprapunere.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 + 'overlayPermissionOpenSettingsFailed': + 'Nu se pot deschide automat setările de sistem. Deschide Setări și activează manual permisiunea de suprapunere.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 'transcribing': 'Transcribing...', 'summarizing': 'Summarizing...', 'analyzing': 'Analyzing...', @@ -535,21 +570,22 @@ const Map roRO = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Creează', - 'templateDetails': 'Detalii șablon', - 'tag': 'Etichetă', - 'description': 'Descriere', - 'template': 'Șablon', - 'deleteTemplate': 'Șterge șablon', - 'deleteTemplateConfirm': 'Sunteți sigur că doriți să ștergeți acest șablon?', - 'editTemplate': 'Editează șablon', - 'createTemplate': 'Creează șablon', - 'name': 'Nume', - 'templateContentHint': 'Vă rugăm să introduceți conținutul șablonului! Sfat: Faceți clic pe butonul AI de mai sus pentru a genera rapid conținutul șablonului pe baza numelui și descrierii introduse', - 'inputNameHint': 'Vă rugăm să introduceți numele', - 'inputDescHint': 'Vă rugăm să introduceți descrierea', - 'custom': 'Personalizat', - 'pleaseEnter': 'Vă rugăm introduceți', + 'create': 'Creează', + 'templateDetails': 'Detalii șablon', + 'tag': 'Etichetă', + 'description': 'Descriere', + 'template': 'Șablon', + 'deleteTemplate': 'Șterge șablon', + 'deleteTemplateConfirm': 'Sunteți sigur că doriți să ștergeți acest șablon?', + 'editTemplate': 'Editează șablon', + 'createTemplate': 'Creează șablon', + 'name': 'Nume', + 'templateContentHint': + 'Vă rugăm să introduceți conținutul șablonului! Sfat: Faceți clic pe butonul AI de mai sus pentru a genera rapid conținutul șablonului pe baza numelui și descrierii introduse', + 'inputNameHint': 'Vă rugăm să introduceți numele', + 'inputDescHint': 'Vă rugăm să introduceți descrierea', + 'custom': 'Personalizat', + 'pleaseEnter': 'Vă rugăm introduceți', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', @@ -572,7 +608,7 @@ const Map roRO = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Salvează harta mentală', + 'saveMindMap': 'Salvează harta mentală', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -594,7 +630,7 @@ const Map roRO = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Exportă', + 'export': 'Exportă', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Aplică la toate paragrafele acestui vorbitor', @@ -704,18 +740,19 @@ const Map roRO = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Analiza a eșuat, vă rugăm să reîncercați mai târziu', - 'transcriptionFailed': 'Transcrierea a eșuat, vă rugăm să reîncercați mai târziu', - 'summaryFailed': 'Rezumatul a eșuat, vă rugăm să reîncercați mai târziu', - 'summaryFailedShort': 'Rezumat eșuat', - 'transcriptionFailedShort': 'Transcriere eșuată', + 'analysisFailed': 'Analiza a eșuat, vă rugăm să reîncercați mai târziu', + 'transcriptionFailed': + 'Transcrierea a eșuat, vă rugăm să reîncercați mai târziu', + 'summaryFailed': 'Rezumatul a eșuat, vă rugăm să reîncercați mai târziu', + 'summaryFailedShort': 'Rezumat eșuat', + 'transcriptionFailedShort': 'Transcriere eșuată', // Meeting模块 - 播放器 - 'playerNotReady': 'Playerul audio nu este pregătit, vă rugăm așteptați', - 'playFailed': 'Redarea a eșuat', - 'audioFileNotFound': 'Fișierul audio nu a fost găsit', - 'fetchingAudio': 'Se descarcă audio din cloud...', - 'playerLoadFailed': 'Playerul audio nu a putut fi încărcat', + 'playerNotReady': 'Playerul audio nu este pregătit, vă rugăm așteptați', + 'playFailed': 'Redarea a eșuat', + 'audioFileNotFound': 'Fișierul audio nu a fost găsit', + 'fetchingAudio': 'Se descarcă audio din cloud...', + 'playerLoadFailed': 'Playerul audio nu a putut fi încărcat', // 设置页 "systemSettings": "Setări de sistem", @@ -823,7 +860,8 @@ const Map roRO = { "swipeUpForMore": "Glisați în sus pentru mai mult", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Când este activat: AI-ul nu va fi întrerupt de vocea dvs. în timp ce vorbește și poate gestiona doar o rundă de conversație pe rând. Pentru a începe o rundă nouă, spuneți cuvântul de activare.', + 'voice_interrupt_tip': + 'Când este activat: AI-ul nu va fi întrerupt de vocea dvs. în timp ce vorbește și poate gestiona doar o rundă de conversație pe rând. Pentru a începe o rundă nouă, spuneți cuvântul de activare.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -880,6 +918,13 @@ const Map roRO = { 'Dorim să știm de ce raportați, puteți descrie problema pe care ați întâmpinat-o.', 'generatedByAi': 'Generat de AI', + // Agent模块 - 工具调用 + 'toolCall': 'Apel instrument', + 'noResult': 'Niciun rezultat', + 'noToolCallContentToCopy': 'Nu exista continut de apel instrument de copiat', + 'toolCallDetails': 'Detalii apel instrument:', + 'toolCallContentCopied': 'Continut copiat in clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Iată câteva melodii recomandate:', 'playList': 'Listă de redare', @@ -900,6 +945,29 @@ const Map roRO = { "bicycling": "Cu bicicleta", "tsransit": "Transport public", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Selectati aplicatia de navigare', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigare cu Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigare cu Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigare cu Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigare cu Apple Maps', + 'builtInNavigation': 'Navigare integrata', + 'useBuiltInNavigation': 'Navigare cu harta integrata', + 'navigationStartFailed': 'Pornirea navigarii a esuat', + 'cannotPlayMusicListRetryLater': + 'Nu se poate reda lista de muzica, incercati mai tarziu', + 'cannotPlaySong': 'Nu se poate reda melodia', + 'openMapError': 'Eroare la deschiderea hartii', + 'pleaseInstallAmapApp': 'Instalati mai intai aplicatia Amap', + 'pleaseInstallBaiduMapApp': 'Instalati mai intai aplicatia Baidu Maps', + 'appleMapStartFailed': 'Pornirea Apple Maps a esuat', + 'appleMapUnavailable': 'Apple Maps indisponibil', + 'openAppleMapError': 'Eroare la deschiderea Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Se interoghează condițiile meteo:', 'highest': 'Maximă', @@ -972,8 +1040,20 @@ const Map roRO = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Dezactivare fereastra plutitoare', + 'enableFloatingWindow': 'Activare fereastra plutitoare', + 'permissionTip': 'Sfat privind permisiunile', + 'micPermissionRequiredForRecording': + 'Este necesara permisiunea microfonului pentru inregistrare', + 'deleteTranslationRecordError': + 'Eroare la stergerea inregistrarii de traducere: @error', "translationFailed": "Translation failed", + "translating": "Se traduce", + "translate": "Traducere", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Introduceți textul de tradus", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1250,17 +1330,19 @@ const Map roRO = { 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigare în curs', - 'native.notification.navigation.keepRunning': 'Navigare în curs, mențineți aplicația deschisă', - 'native.notification.bleAgent.running': 'Asistentul vocal funcționează', - 'native.notification.audioRecording.recording': 'Se înregistrează audio, atingeți pentru a reveni la aplicație', - 'native.notification.music.waiting': 'Așteaptă redarea', - 'native.notification.music.previous': 'Anterior', - 'native.notification.music.next': 'Următorul', - 'native.notification.music.play': 'Redare', - 'native.notification.music.pause': 'Pauză', - 'native.notification.qqMusic.playing': 'Se redă muzică', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigare în curs', + 'native.notification.navigation.keepRunning': + 'Navigare în curs, mențineți aplicația deschisă', + 'native.notification.bleAgent.running': 'Asistentul vocal funcționează', + 'native.notification.audioRecording.recording': + 'Se înregistrează audio, atingeți pentru a reveni la aplicație', + 'native.notification.music.waiting': 'Așteaptă redarea', + 'native.notification.music.previous': 'Anterior', + 'native.notification.music.next': 'Următorul', + 'native.notification.music.play': 'Redare', + 'native.notification.music.pause': 'Pauză', + 'native.notification.qqMusic.playing': 'Se redă muzică', // 版本更新 'newVersionFound': 'Versiune nouă găsită', // 版本更新对话框标题 @@ -1401,6 +1483,60 @@ const Map roRO = { "removeEarbudsEnsureBattery": "Scoateți ambele căști și asigurați-vă că bateria ambelor este peste 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Versiune noua @version gasita', + 'otaConfirmUpdateNow': 'Actualizare acum?', + 'otaUpdate': 'Actualizare', + 'otaUpgradeSuccess': 'Actualizare reusita', + 'otaUpgradeCompleteRepair': + 'Actualizare finalizata!\n\nDispozitivul trebuie re-asociat. Pagina de asociere?', + 'otaPairLater': 'Imperechere mai tarziu', + 'otaPairNow': 'Imperechere acum', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Eroare la verificarea conexiunii BLE: @error', + 'otaBleNotConnected': 'Dispozitiv BLE neconectat', + 'otaBleNeedConnection': + 'Conexiune BLE necesara\nVerificati conexiunea si incercati din nou', + 'otaDeviceInfoUnavailableTitle': 'Informatii dispozitiv indisponibile', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'Verificarea conexiunii BLE a esuat', + 'otaCannotGetDeviceInfoCheckConnection': + 'Nu se pot obtine informatii, verificati conexiunea', + 'otaCannotGetProductInfoWithName': + 'Nu se pot obtine informatii produs, nume: @deviceName', + 'otaCannotGetBatteryInfo': + 'Nu se pot obtine informatii valide despre baterie', + 'otaLowBattery': 'Baterie scazuta', + 'otaSingleBatteryLow': + 'Baterie prea scazuta\nCerinta: peste 20%\nActual: @ear @battery%\nIncarcati si incercati din nou', + 'otaDoubleBatteryLow': + 'Baterie prea scazuta\nCerinta: ambele casti peste 20%\nActual: Stanga @left%, Dreapta @right%\nIncarcati si incercati din nou', + 'otaBatteryCheckFailed': 'Verificarea bateriei a esuat', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'Aceasta actualizare include optimizari de performanta si remedieri de erori.', + 'otaGetLatestVersionFailed': 'Nu s-a putut obtine ultima versiune', + 'otaGetVersionInfoFailed': 'Nu s-au putut obtine informatiile de versiune', + 'otaCheckingDeviceStatus': 'Se verifica starea dispozitivului...', + 'otaDownloadFailedCheckNetwork': + 'Descarcare esuata, verificati conexiunea la retea', + 'otaDownloadFailed': 'Descarcare esuata', + 'otaPreparingConnection': 'Se pregateste conexiunea...', + 'otaConnectingDevice': 'Se conecteaza la dispozitiv...', + 'otaUpgradeStarted': 'Actualizare OTA inceputa...', + 'otaUpgradeProgressWithPercent': 'Progres: @percent%', + 'otaUpgradeSuccessComplete': 'Actualizare finalizata cu succes', + 'otaUpgradeFailedWithCode': 'Actualizare esuata, cod eroare: @code', + 'otaUpgradeFailedTitle': 'Actualizare esuata', + 'otaUpgradeFailedDesc': + 'Verificati conexiunea sau pachetul de actualizare, cod: @code', + 'otaDeviceDisconnected': 'Dispozitiv deconectat', + 'otaDeviceConnected': 'Dispozitiv conectat', + // 音乐模块 "noMusic": "Fără muzică", // 暂无音乐 "noPlayingMusic": "Nicio melodie în redare", // 暂无播放音乐 diff --git a/lib/core/translations/language/ru_ru.dart b/lib/core/translations/language/ru_ru.dart index 41b1b9e06..39a468395 100644 --- a/lib/core/translations/language/ru_ru.dart +++ b/lib/core/translations/language/ru_ru.dart @@ -1,5 +1,4 @@ const Map ruRU = { - // 通用 'continue': 'Продолжить', 'confirm': 'Подтвердить', @@ -169,6 +168,29 @@ const Map ruRU = { 'right': 'Право', 'checkConnectionStatusFailed': 'Не удалось проверить статус подключения', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Инициализация Bluetooth не удалась: @error', + 'needBluetoothAndLocationPermission': + 'Для сканирования устройств требуются разрешения Bluetooth и местоположения', + 'permissionRequestFailedWithError': 'Ошибка запроса разрешения: @error', + 'needPermission': 'Требуется разрешение', + 'blePermissionDialogContent': + 'Приложению требуются разрешения Bluetooth и местоположения. Включите их в настройках.', + 'needEnableBluetooth': 'Включите Bluetooth', + 'enableBluetoothDialogContent': + 'Включите Bluetooth для сканирования и подключения устройств.', + 'bleScanFailedWithError': 'Ошибка сканирования: @error', + 'bleConnectionSuccess': 'Подключение успешно', + 'bleConnectedToDevice': 'Подключено к @device', + 'bleConnectionFailedWithError': 'Ошибка подключения: @error', + 'bleDisconnected': 'Отключено', + 'bleDeviceDisconnected': 'Устройство отключено', + 'bleDisconnectFailedWithError': 'Ошибка отключения: @error', + 'signalStrong': 'Сильный', + 'signalMedium': 'Средний', + 'signalWeak': 'Слабый', + 'signalVeryWeak': 'Очень слабый', + // 发现页 "searchAi": "Поиск функций AI...", "exploreSlogan": "Умные наушники, безграничные возможности", @@ -245,60 +267,63 @@ const Map ruRU = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Оплата прошла успешно', - 'paymentFailed': 'Оплата не удалась', - 'gotIt': 'Понятно', - 'paymentFailedTryAgain': 'Оплата не удалась. Попробуйте ещё раз.', - 'selectPaymentMethod': 'Выберите способ оплаты', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Не удалось создать заказ WeChat', - 'alipayOrderCreateFailed': 'Не удалось создать заказ Alipay', - 'appleOrderCreateFailed': 'Не удалось создать заказ Apple', - 'googleOrderCreateFailed': 'Не удалось создать заказ Google', - 'paypalOrderCreateFailed': 'Не удалось создать заказ PayPal', - 'paymentException': 'Ошибка оплаты', - 'paymentLaunchFailed': 'Не удалось запустить оплату', - 'paymentExceptionWithError': 'Ошибка оплаты: @error', - 'paymentProcessingCheckLater': 'Ваш заказ обрабатывается. Проверьте позже.', - 'paymentResultQueryException': 'Не удалось запросить результат оплаты: @error', - 'orderConfirmedQuotaRefreshed': 'Заказ подтверждён. Ваша квота обновлена.', - 'paymentCompletedConfirming': 'Оплата завершена. Подтверждение…', - 'paymentCancelled': 'Оплата отменена', - 'paypalOpenedCompleteInBrowser': 'PayPal открыт. Завершите оплату в браузере.', - 'paypalOpenFailed': 'Не удалось открыть страницу оплаты PayPal', - 'paymentTestTitle': 'Тест оплаты', - 'paymentTestOrderInfo': 'Информация о тестовом заказе', - 'paymentTestProductId': 'ID товара', - 'paymentTestProductDescription': 'Описание товара', - 'paymentTestWechatDescription': 'Тест оплаты через WeChat', - 'paymentTestAlipayDescription': 'Тест оплаты через Alipay', - 'paymentTestAmount': 'Сумма', - 'paymentTestSelectAmount': 'Выберите тестовую сумму', - 'paying': 'Оплата...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Статус оплаты', - 'errorInfoWithMessage': 'Ошибка: @message', - 'retest': 'Повторный тест', - 'paymentTestInstructionsTitle': 'Инструкция', - 'paymentTestInstructionsContent': '1. Выберите тестовую сумму (рекомендуется: ¥0.01)\n2. Нажмите кнопку оплаты для начала\n3. Завершите оплату в приложении для оплаты\n4. Вернитесь, чтобы проверить результат', - 'startingWechatPayment': 'Запуск WeChat Pay...', - 'startingAlipayPayment': 'Запуск Alipay...', - 'wechatPaymentSuccess': 'Оплата через WeChat Pay прошла успешно!', - 'wechatPaymentFailed': 'Оплата через WeChat Pay не удалась', - 'wechatPaymentLaunchFailed': 'Не удалось запустить WeChat Pay', - 'cannotLaunchWechatPayment': 'Невозможно запустить WeChat Pay', - 'wechatPaymentException': 'Ошибка WeChat Pay', - 'wechatPaymentTestCompleted': 'Тест оплаты WeChat Pay завершён', - 'alipayPaymentSuccess': 'Оплата через Alipay прошла успешно!', - 'alipayPaymentFailed': 'Оплата через Alipay не удалась', - 'alipayPaymentLaunchFailed': 'Не удалось запустить Alipay', - 'cannotLaunchAlipayPayment': 'Невозможно запустить Alipay', - 'alipayPaymentException': 'Ошибка Alipay', + 'paymentSuccess': 'Оплата прошла успешно', + 'paymentFailed': 'Оплата не удалась', + 'gotIt': 'Понятно', + 'paymentFailedTryAgain': 'Оплата не удалась. Попробуйте ещё раз.', + 'selectPaymentMethod': 'Выберите способ оплаты', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Не удалось создать заказ WeChat', + 'alipayOrderCreateFailed': 'Не удалось создать заказ Alipay', + 'appleOrderCreateFailed': 'Не удалось создать заказ Apple', + 'googleOrderCreateFailed': 'Не удалось создать заказ Google', + 'paypalOrderCreateFailed': 'Не удалось создать заказ PayPal', + 'paymentException': 'Ошибка оплаты', + 'paymentLaunchFailed': 'Не удалось запустить оплату', + 'paymentExceptionWithError': 'Ошибка оплаты: @error', + 'paymentProcessingCheckLater': 'Ваш заказ обрабатывается. Проверьте позже.', + 'paymentResultQueryException': + 'Не удалось запросить результат оплаты: @error', + 'orderConfirmedQuotaRefreshed': 'Заказ подтверждён. Ваша квота обновлена.', + 'paymentCompletedConfirming': 'Оплата завершена. Подтверждение…', + 'paymentCancelled': 'Оплата отменена', + 'paypalOpenedCompleteInBrowser': + 'PayPal открыт. Завершите оплату в браузере.', + 'paypalOpenFailed': 'Не удалось открыть страницу оплаты PayPal', + 'paymentTestTitle': 'Тест оплаты', + 'paymentTestOrderInfo': 'Информация о тестовом заказе', + 'paymentTestProductId': 'ID товара', + 'paymentTestProductDescription': 'Описание товара', + 'paymentTestWechatDescription': 'Тест оплаты через WeChat', + 'paymentTestAlipayDescription': 'Тест оплаты через Alipay', + 'paymentTestAmount': 'Сумма', + 'paymentTestSelectAmount': 'Выберите тестовую сумму', + 'paying': 'Оплата...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Статус оплаты', + 'errorInfoWithMessage': 'Ошибка: @message', + 'retest': 'Повторный тест', + 'paymentTestInstructionsTitle': 'Инструкция', + 'paymentTestInstructionsContent': + '1. Выберите тестовую сумму (рекомендуется: ¥0.01)\n2. Нажмите кнопку оплаты для начала\n3. Завершите оплату в приложении для оплаты\n4. Вернитесь, чтобы проверить результат', + 'startingWechatPayment': 'Запуск WeChat Pay...', + 'startingAlipayPayment': 'Запуск Alipay...', + 'wechatPaymentSuccess': 'Оплата через WeChat Pay прошла успешно!', + 'wechatPaymentFailed': 'Оплата через WeChat Pay не удалась', + 'wechatPaymentLaunchFailed': 'Не удалось запустить WeChat Pay', + 'cannotLaunchWechatPayment': 'Невозможно запустить WeChat Pay', + 'wechatPaymentException': 'Ошибка WeChat Pay', + 'wechatPaymentTestCompleted': 'Тест оплаты WeChat Pay завершён', + 'alipayPaymentSuccess': 'Оплата через Alipay прошла успешно!', + 'alipayPaymentFailed': 'Оплата через Alipay не удалась', + 'alipayPaymentLaunchFailed': 'Не удалось запустить Alipay', + 'cannotLaunchAlipayPayment': 'Невозможно запустить Alipay', + 'alipayPaymentException': 'Ошибка Alipay', "insufficientIntegral": "Insufficient integral", "insufficientBalanceDesc": "Insufficient balance, please go to the corresponding recharge page to recharge.", @@ -544,21 +569,22 @@ const Map ruRU = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Создать', - 'templateDetails': 'Детали шаблона', - 'tag': 'Тег', - 'description': 'Описание', - 'template': 'Шаблон', - 'deleteTemplate': 'Удалить шаблон', - 'deleteTemplateConfirm': 'Вы уверены, что хотите удалить этот шаблон?', - 'editTemplate': 'Редактировать шаблон', - 'createTemplate': 'Создать шаблон', - 'name': 'Название', - 'templateContentHint': 'Пожалуйста, введите содержание шаблона! Совет: нажмите кнопку AI выше, чтобы быстро сгенерировать содержание шаблона на основе введённого названия и описания', - 'inputNameHint': 'Пожалуйста, введите название', - 'inputDescHint': 'Пожалуйста, введите описание', - 'custom': 'Пользовательский', - 'pleaseEnter': 'Пожалуйста, введите', + 'create': 'Создать', + 'templateDetails': 'Детали шаблона', + 'tag': 'Тег', + 'description': 'Описание', + 'template': 'Шаблон', + 'deleteTemplate': 'Удалить шаблон', + 'deleteTemplateConfirm': 'Вы уверены, что хотите удалить этот шаблон?', + 'editTemplate': 'Редактировать шаблон', + 'createTemplate': 'Создать шаблон', + 'name': 'Название', + 'templateContentHint': + 'Пожалуйста, введите содержание шаблона! Совет: нажмите кнопку AI выше, чтобы быстро сгенерировать содержание шаблона на основе введённого названия и описания', + 'inputNameHint': 'Пожалуйста, введите название', + 'inputDescHint': 'Пожалуйста, введите описание', + 'custom': 'Пользовательский', + 'pleaseEnter': 'Пожалуйста, введите', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', @@ -581,7 +607,7 @@ const Map ruRU = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Сохранить интеллект-карту', + 'saveMindMap': 'Сохранить интеллект-карту', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -603,7 +629,7 @@ const Map ruRU = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Экспорт', + 'export': 'Экспорт', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Применить ко всем абзацам этого говорящего', @@ -713,18 +739,18 @@ const Map ruRU = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Анализ не удался, попробуйте позже', - 'transcriptionFailed': 'Транскрипция не удалась, попробуйте позже', - 'summaryFailed': 'Не удалось создать сводку, попробуйте позже', - 'summaryFailedShort': 'Сводка не удалась', - 'transcriptionFailedShort': 'Транскрипция не удалась', + 'analysisFailed': 'Анализ не удался, попробуйте позже', + 'transcriptionFailed': 'Транскрипция не удалась, попробуйте позже', + 'summaryFailed': 'Не удалось создать сводку, попробуйте позже', + 'summaryFailedShort': 'Сводка не удалась', + 'transcriptionFailedShort': 'Транскрипция не удалась', // Meeting模块 - 播放器 - 'playerNotReady': 'Аудиоплеер не готов, подождите', - 'playFailed': 'Ошибка воспроизведения', - 'audioFileNotFound': 'Аудиофайл не найден', - 'fetchingAudio': 'Получение аудио из облака...', - 'playerLoadFailed': 'Не удалось загрузить аудиоплеер', + 'playerNotReady': 'Аудиоплеер не готов, подождите', + 'playFailed': 'Ошибка воспроизведения', + 'audioFileNotFound': 'Аудиофайл не найден', + 'fetchingAudio': 'Получение аудио из облака...', + 'playerLoadFailed': 'Не удалось загрузить аудиоплеер', // 设置页 "systemSettings": "Системные настройки", @@ -830,7 +856,8 @@ const Map ruRU = { "swipeUpForMore": "Проведите пальцем вверх, чтобы увидеть больше", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'При включении: ИИ не будет прерываться вашим голосом во время ответа и сможет обрабатывать только один раунд разговора за раз. Чтобы начать новый раунд, просто произнесите слово активации.', + 'voice_interrupt_tip': + 'При включении: ИИ не будет прерываться вашим голосом во время ответа и сможет обрабатывать только один раунд разговора за раз. Чтобы начать новый раунд, просто произнесите слово активации.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -886,6 +913,13 @@ const Map ruRU = { 'Мы хотим знать причину вашей жалобы, вы можете описать проблему, с которой столкнулись.', 'generatedByAi': 'Сгенерировано AI', + // Agent模块 - 工具调用 + 'toolCall': 'Вызов инструмента', + 'noResult': 'Нет результатов', + 'noToolCallContentToCopy': 'Нет содержимого вызова для копирования', + 'toolCallDetails': 'Детали вызова инструмента:', + 'toolCallContentCopied': 'Содержимое скопировано в буфер обмена', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Вот несколько рекомендованных композиций:', 'playList': 'Плейлист', @@ -906,6 +940,29 @@ const Map ruRU = { "bicycling": "На велосипеде", "tsransit": "Общественный транспорт", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Выберите навигатор', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Навигация через Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Навигация через Baidu Maps', + 'googleMap': 'Google Карты', + 'useGoogleNavigation': 'Навигация через Google Карты', + 'appleMap': 'Apple Карты', + 'useAppleNavigation': 'Навигация через Apple Карты', + 'builtInNavigation': 'Встроенная навигация', + 'useBuiltInNavigation': 'Навигация по встроенной карте', + 'navigationStartFailed': 'Не удалось запустить навигацию', + 'cannotPlayMusicListRetryLater': + 'Не удаётся воспроизвести плейлист, попробуйте позже', + 'cannotPlaySong': 'Не удаётся воспроизвести песню', + 'openMapError': 'Ошибка при открытии карты', + 'pleaseInstallAmapApp': 'Установите приложение Amap', + 'pleaseInstallBaiduMapApp': 'Установите приложение Baidu Maps', + 'appleMapStartFailed': 'Не удалось запустить Apple Карты', + 'appleMapUnavailable': 'Apple Карты недоступны', + 'openAppleMapError': 'Ошибка при открытии Apple Карт', + // Agent模块 - 天气卡片 'weatherQuery': 'Запрос погодных условий:', 'highest': 'Макс.', @@ -978,8 +1035,19 @@ const Map ruRU = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Отключить плавающее окно', + 'enableFloatingWindow': 'Включить плавающее окно', + 'permissionTip': 'Подсказка о разрешениях', + 'micPermissionRequiredForRecording': + 'Для записи требуется разрешение микрофона', + 'deleteTranslationRecordError': 'Ошибка при удалении записи перевода: @error', "translationFailed": "Translation failed", + "translating": "Перевод", + "translate": "Перевести", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Введите текст для перевода", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1259,7 +1327,8 @@ const Map ruRU = { 'native.notification.navigation.title': 'Навигация запущена', // 导航进行中 'native.notification.navigation.keepRunning': 'Идёт навигация, держите приложение запущенным', // 正在导航中,请保持应用运行 - 'native.notification.bleAgent.running': 'Голосовой помощник работает', // 语音助手正在运行 + 'native.notification.bleAgent.running': + 'Голосовой помощник работает', // 语音助手正在运行 'native.notification.audioRecording.recording': 'Идёт запись, нажмите чтобы вернуться в приложение', // 正在录音,点击返回应用 'native.notification.music.waiting': 'Ожидание воспроизведения', // 等待播放 @@ -1409,6 +1478,59 @@ const Map ruRU = { "removeEarbudsEnsureBattery": "Извлеките оба наушника и убедитесь, что уровень заряда батареи в обоих превышает 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Найдена новая версия @version', + 'otaConfirmUpdateNow': 'Обновить сейчас?', + 'otaUpdate': 'Обновить', + 'otaUpgradeSuccess': 'Обновление успешно', + 'otaUpgradeCompleteRepair': + 'Обновление прошивки завершено!\n\nУстройство необходимо повторно сопрячь. Перейти на страницу сопряжения?', + 'otaPairLater': 'Сопрячь позже', + 'otaPairNow': 'Сопрячь сейчас', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Ошибка проверки BLE-соединения: @error', + 'otaBleNotConnected': 'BLE-устройство не подключено', + 'otaBleNeedConnection': + 'Требуется BLE-подключение\nУбедитесь, что устройство подключено, и повторите', + 'otaDeviceInfoUnavailableTitle': 'Информация об устройстве недоступна', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'Проверка BLE-соединения не удалась', + 'otaCannotGetDeviceInfoCheckConnection': + 'Не удаётся получить информацию, проверьте подключение', + 'otaCannotGetProductInfoWithName': + 'Не удаётся получить информацию о продукте, устройство: @deviceName', + 'otaCannotGetBatteryInfo': 'Не удаётся получить данные о батарее', + 'otaLowBattery': 'Низкий заряд', + 'otaSingleBatteryLow': + 'Заряд слишком низкий\nТребование: выше 20%\nТекущий: @ear @battery%\nЗарядите и повторите', + 'otaDoubleBatteryLow': + 'Заряд слишком низкий\nТребование: оба наушника выше 20%\nТекущий: Левый @left%, Правый @right%\nЗарядите и повторите', + 'otaBatteryCheckFailed': 'Проверка батареи не удалась', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'Это обновление включает оптимизацию производительности и исправление ошибок.', + 'otaGetLatestVersionFailed': + 'Не удалось получить информацию о последней версии', + 'otaGetVersionInfoFailed': 'Не удалось получить информацию о версии', + 'otaCheckingDeviceStatus': 'Проверка состояния устройства...', + 'otaDownloadFailedCheckNetwork': 'Загрузка не удалась, проверьте сеть', + 'otaDownloadFailed': 'Загрузка не удалась', + 'otaPreparingConnection': 'Подготовка подключения...', + 'otaConnectingDevice': 'Подключение к устройству...', + 'otaUpgradeStarted': 'OTA-обновление начато...', + 'otaUpgradeProgressWithPercent': 'Прогресс: @percent%', + 'otaUpgradeSuccessComplete': 'Обновление успешно завершено', + 'otaUpgradeFailedWithCode': 'Обновление не удалось, код ошибки: @code', + 'otaUpgradeFailedTitle': 'Обновление не удалось', + 'otaUpgradeFailedDesc': + 'Проверьте подключение или пакет обновления, код: @code', + 'otaDeviceDisconnected': 'Устройство отключено', + 'otaDeviceConnected': 'Устройство подключено', + // 音乐模块 "noMusic": "Нет музыки", // 暂无音乐 "noPlayingMusic": "Нет воспроизводимой музыки", // 暂无播放音乐 diff --git a/lib/core/translations/language/sk_sk.dart b/lib/core/translations/language/sk_sk.dart index d745bad26..9ba45053b 100644 --- a/lib/core/translations/language/sk_sk.dart +++ b/lib/core/translations/language/sk_sk.dart @@ -1,5 +1,4 @@ const Map skSK = { - // 通用 'continue': 'Pokračovať', 'confirm': 'Potvrdiť', @@ -169,6 +168,29 @@ const Map skSK = { 'right': 'Vpravo', 'checkConnectionStatusFailed': 'Kontrola stavu pripojenia zlyhala', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth initialization failed: @error', + 'needBluetoothAndLocationPermission': + 'Bluetooth and location permissions are required to scan devices', + 'permissionRequestFailedWithError': 'Permission request failed: @error', + 'needPermission': 'Permission Required', + 'blePermissionDialogContent': + 'This app requires Bluetooth and location permissions to scan devices. Please enable them in Settings.', + 'needEnableBluetooth': 'Enable Bluetooth', + 'enableBluetoothDialogContent': + 'Please enable Bluetooth to scan and connect devices.', + 'bleScanFailedWithError': 'Scan failed: @error', + 'bleConnectionSuccess': 'Connection Successful', + 'bleConnectedToDevice': 'Connected to @device', + 'bleConnectionFailedWithError': 'Connection failed: @error', + 'bleDisconnected': 'Disconnected', + 'bleDeviceDisconnected': 'Device disconnected', + 'bleDisconnectFailedWithError': 'Disconnect failed: @error', + 'signalStrong': 'Strong', + 'signalMedium': 'Medium', + 'signalWeak': 'Weak', + 'signalVeryWeak': 'Very Weak', + // 发现页 "searchAi": "Hľadať AI funkcie...", "exploreSlogan": "Inteligentné slúchadlá, nekonečné možnosti", @@ -245,60 +267,64 @@ const Map skSK = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Platba úspešná', - 'paymentFailed': 'Platba zlyhala', - 'gotIt': 'Rozumiem', - 'paymentFailedTryAgain': 'Platba zlyhala. Skúste to znova.', - 'selectPaymentMethod': 'Vyberte spôsob platby', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Vytvorenie objednávky WeChat zlyhalo', - 'alipayOrderCreateFailed': 'Vytvorenie objednávky Alipay zlyhalo', - 'appleOrderCreateFailed': 'Vytvorenie objednávky Apple zlyhalo', - 'googleOrderCreateFailed': 'Vytvorenie objednávky Google zlyhalo', - 'paypalOrderCreateFailed': 'Vytvorenie objednávky PayPal zlyhalo', - 'paymentException': 'Výnimka platby', - 'paymentLaunchFailed': 'Spustenie platby zlyhalo', - 'paymentExceptionWithError': 'Výnimka platby: @error', - 'paymentProcessingCheckLater': 'Vaša objednávka sa spracováva. Skontrolujte neskôr.', - 'paymentResultQueryException': 'Nepodarilo sa zistiť výsledok platby: @error', - 'orderConfirmedQuotaRefreshed': 'Objednávka potvrdená. Váš limit bol obnovený.', - 'paymentCompletedConfirming': 'Platba dokončená. Potvrdzovanie…', - 'paymentCancelled': 'Platba bola zrušená', - 'paypalOpenedCompleteInBrowser': 'PayPal je otvorený. Dokončite platbu v prehliadači.', - 'paypalOpenFailed': 'Nie je možné otvoriť platobnú stránku PayPal', - 'paymentTestTitle': 'Test platby', - 'paymentTestOrderInfo': 'Informácie o testovacej objednávke', - 'paymentTestProductId': 'ID produktu', - 'paymentTestProductDescription': 'Popis produktu', - 'paymentTestWechatDescription': 'Test platby WeChat', - 'paymentTestAlipayDescription': 'Test platby Alipay', - 'paymentTestAmount': 'Suma', - 'paymentTestSelectAmount': 'Vyberte testovaciu sumu', - 'paying': 'Platba prebieha...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Stav platby', - 'errorInfoWithMessage': 'Chyba: @message', - 'retest': 'Znova otestovať', - 'paymentTestInstructionsTitle': 'Pokyny', - 'paymentTestInstructionsContent': '1. Vyberte testovaciu sumu (odporúčané: ¥0.01)\n2. Kliknite na tlačidlo platby pre spustenie\n3. Dokončite platbu v platobnej aplikácii\n4. Vráťte sa a skontrolujte výsledok', - 'startingWechatPayment': 'Spúšťanie WeChat Pay...', - 'startingAlipayPayment': 'Spúšťanie Alipay...', - 'wechatPaymentSuccess': 'Platba WeChat Pay úspešná!', - 'wechatPaymentFailed': 'Platba WeChat Pay zlyhala', - 'wechatPaymentLaunchFailed': 'Spustenie WeChat Pay zlyhalo', - 'cannotLaunchWechatPayment': 'Nie je možné spustiť WeChat Pay', - 'wechatPaymentException': 'Výnimka WeChat Pay', - 'wechatPaymentTestCompleted': 'Test platby WeChat Pay dokončený', - 'alipayPaymentSuccess': 'Platba Alipay úspešná!', - 'alipayPaymentFailed': 'Platba Alipay zlyhala', - 'alipayPaymentLaunchFailed': 'Spustenie Alipay zlyhalo', - 'cannotLaunchAlipayPayment': 'Nie je možné spustiť Alipay', - 'alipayPaymentException': 'Výnimka Alipay', + 'paymentSuccess': 'Platba úspešná', + 'paymentFailed': 'Platba zlyhala', + 'gotIt': 'Rozumiem', + 'paymentFailedTryAgain': 'Platba zlyhala. Skúste to znova.', + 'selectPaymentMethod': 'Vyberte spôsob platby', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Vytvorenie objednávky WeChat zlyhalo', + 'alipayOrderCreateFailed': 'Vytvorenie objednávky Alipay zlyhalo', + 'appleOrderCreateFailed': 'Vytvorenie objednávky Apple zlyhalo', + 'googleOrderCreateFailed': 'Vytvorenie objednávky Google zlyhalo', + 'paypalOrderCreateFailed': 'Vytvorenie objednávky PayPal zlyhalo', + 'paymentException': 'Výnimka platby', + 'paymentLaunchFailed': 'Spustenie platby zlyhalo', + 'paymentExceptionWithError': 'Výnimka platby: @error', + 'paymentProcessingCheckLater': + 'Vaša objednávka sa spracováva. Skontrolujte neskôr.', + 'paymentResultQueryException': 'Nepodarilo sa zistiť výsledok platby: @error', + 'orderConfirmedQuotaRefreshed': + 'Objednávka potvrdená. Váš limit bol obnovený.', + 'paymentCompletedConfirming': 'Platba dokončená. Potvrdzovanie…', + 'paymentCancelled': 'Platba bola zrušená', + 'paypalOpenedCompleteInBrowser': + 'PayPal je otvorený. Dokončite platbu v prehliadači.', + 'paypalOpenFailed': 'Nie je možné otvoriť platobnú stránku PayPal', + 'paymentTestTitle': 'Test platby', + 'paymentTestOrderInfo': 'Informácie o testovacej objednávke', + 'paymentTestProductId': 'ID produktu', + 'paymentTestProductDescription': 'Popis produktu', + 'paymentTestWechatDescription': 'Test platby WeChat', + 'paymentTestAlipayDescription': 'Test platby Alipay', + 'paymentTestAmount': 'Suma', + 'paymentTestSelectAmount': 'Vyberte testovaciu sumu', + 'paying': 'Platba prebieha...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Stav platby', + 'errorInfoWithMessage': 'Chyba: @message', + 'retest': 'Znova otestovať', + 'paymentTestInstructionsTitle': 'Pokyny', + 'paymentTestInstructionsContent': + '1. Vyberte testovaciu sumu (odporúčané: ¥0.01)\n2. Kliknite na tlačidlo platby pre spustenie\n3. Dokončite platbu v platobnej aplikácii\n4. Vráťte sa a skontrolujte výsledok', + 'startingWechatPayment': 'Spúšťanie WeChat Pay...', + 'startingAlipayPayment': 'Spúšťanie Alipay...', + 'wechatPaymentSuccess': 'Platba WeChat Pay úspešná!', + 'wechatPaymentFailed': 'Platba WeChat Pay zlyhala', + 'wechatPaymentLaunchFailed': 'Spustenie WeChat Pay zlyhalo', + 'cannotLaunchWechatPayment': 'Nie je možné spustiť WeChat Pay', + 'wechatPaymentException': 'Výnimka WeChat Pay', + 'wechatPaymentTestCompleted': 'Test platby WeChat Pay dokončený', + 'alipayPaymentSuccess': 'Platba Alipay úspešná!', + 'alipayPaymentFailed': 'Platba Alipay zlyhala', + 'alipayPaymentLaunchFailed': 'Spustenie Alipay zlyhalo', + 'cannotLaunchAlipayPayment': 'Nie je možné spustiť Alipay', + 'alipayPaymentException': 'Výnimka Alipay', "insufficientIntegral": "Insufficient integral", "insufficientBalanceDesc": "Insufficient balance, please go to the corresponding recharge page to recharge.", @@ -541,21 +567,22 @@ const Map skSK = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Vytvoriť', - 'templateDetails': 'Podrobnosti šablóny', - 'tag': 'Štítok', - 'description': 'Popis', - 'template': 'Šablóna', - 'deleteTemplate': 'Odstrániť šablónu', - 'deleteTemplateConfirm': 'Ste si istí, že chcete odstrániť túto šablónu?', - 'editTemplate': 'Upraviť šablónu', - 'createTemplate': 'Vytvoriť šablónu', - 'name': 'Názov', - 'templateContentHint': 'Prosím zadajte obsah šablóny! Tip: Kliknite na tlačidlo AI vyššie pre rýchle vygenerovanie obsahu šablóny na základe zadaného názvu a popisu', - 'inputNameHint': 'Prosím zadajte názov', - 'inputDescHint': 'Prosím zadajte popis', - 'custom': 'Vlastné', - 'pleaseEnter': 'Prosím zadajte', + 'create': 'Vytvoriť', + 'templateDetails': 'Podrobnosti šablóny', + 'tag': 'Štítok', + 'description': 'Popis', + 'template': 'Šablóna', + 'deleteTemplate': 'Odstrániť šablónu', + 'deleteTemplateConfirm': 'Ste si istí, že chcete odstrániť túto šablónu?', + 'editTemplate': 'Upraviť šablónu', + 'createTemplate': 'Vytvoriť šablónu', + 'name': 'Názov', + 'templateContentHint': + 'Prosím zadajte obsah šablóny! Tip: Kliknite na tlačidlo AI vyššie pre rýchle vygenerovanie obsahu šablóny na základe zadaného názvu a popisu', + 'inputNameHint': 'Prosím zadajte názov', + 'inputDescHint': 'Prosím zadajte popis', + 'custom': 'Vlastné', + 'pleaseEnter': 'Prosím zadajte', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', @@ -578,7 +605,7 @@ const Map skSK = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Uložiť myšlienkovú mapu', + 'saveMindMap': 'Uložiť myšlienkovú mapu', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -600,7 +627,7 @@ const Map skSK = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Exportovať', + 'export': 'Exportovať', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Použiť na všetky odseky tohto rečníka', @@ -710,18 +737,18 @@ const Map skSK = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Analýza zlyhala, skúste to znova neskôr', - 'transcriptionFailed': 'Prepis zlyhal, skúste to znova neskôr', - 'summaryFailed': 'Zhrnutie zlyhalo, skúste to znova neskôr', - 'summaryFailedShort': 'Zhrnutie zlyhalo', - 'transcriptionFailedShort': 'Prepis zlyhal', + 'analysisFailed': 'Analýza zlyhala, skúste to znova neskôr', + 'transcriptionFailed': 'Prepis zlyhal, skúste to znova neskôr', + 'summaryFailed': 'Zhrnutie zlyhalo, skúste to znova neskôr', + 'summaryFailedShort': 'Zhrnutie zlyhalo', + 'transcriptionFailedShort': 'Prepis zlyhal', // Meeting模块 - 播放器 - 'playerNotReady': 'Zvukový prehrávač nie je pripravený, prosím počkajte', - 'playFailed': 'Prehrávanie zlyhalo', - 'audioFileNotFound': 'Zvukový súbor sa nenašiel', - 'fetchingAudio': 'Načítavanie zvuku z cloudu...', - 'playerLoadFailed': 'Zvukový prehrávač sa nepodarilo načítať', + 'playerNotReady': 'Zvukový prehrávač nie je pripravený, prosím počkajte', + 'playFailed': 'Prehrávanie zlyhalo', + 'audioFileNotFound': 'Zvukový súbor sa nenašiel', + 'fetchingAudio': 'Načítavanie zvuku z cloudu...', + 'playerLoadFailed': 'Zvukový prehrávač sa nepodarilo načítať', // 设置页 "systemSettings": "Systémové nastavenia", @@ -826,7 +853,8 @@ const Map skSK = { "swipeUpForMore": "Potiahnite nahor pre viac", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Keď je zapnuté: AI nebude prerušený vaším hlasom počas rozprávania a môže spracovať iba jedno kolo konverzácie naraz. Pre začatie nového kola stačí povedať aktivačné slovo.', + 'voice_interrupt_tip': + 'Keď je zapnuté: AI nebude prerušený vaším hlasom počas rozprávania a môže spracovať iba jedno kolo konverzácie naraz. Pre začatie nového kola stačí povedať aktivačné slovo.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -882,6 +910,13 @@ const Map skSK = { 'Chceme vedieť dôvod vášho hlásenia, môžete opísať problém, s ktorým ste sa stretli.', 'generatedByAi': 'Vygenerované AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Tu sú niektoré odporúčané skladby:', 'playList': 'Zoznam skladieb', @@ -902,6 +937,29 @@ const Map skSK = { "bicycling": "Bicyklovanie", "tsransit": "Verejná doprava", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Failed to start navigation', + 'cannotPlayMusicListRetryLater': + 'Cannot play music list, please try again later', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Error opening map', + 'pleaseInstallAmapApp': 'Please install the Amap app first', + 'pleaseInstallBaiduMapApp': 'Please install the Baidu Maps app first', + 'appleMapStartFailed': 'Apple Maps failed to start', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Error opening Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Dotaz na poveternostné podmienky:', 'highest': 'Najvyššia', @@ -973,8 +1031,19 @@ const Map skSK = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Disable Floating Window', + 'enableFloatingWindow': 'Enable Floating Window', + 'permissionTip': 'Permission Tip', + 'micPermissionRequiredForRecording': + 'Microphone permission is required for recording', + 'deleteTranslationRecordError': 'Error deleting translation record: @error', "translationFailed": "Translation failed", + "translating": "Translating", + "translate": "Translate", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Zadajte text na preklad", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1247,17 +1316,19 @@ const Map skSK = { 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigácia prebieha', - 'native.notification.navigation.keepRunning': 'Navigácia, ponechajte aplikáciu spustenú', - 'native.notification.bleAgent.running': 'Hlasový asistent je spustený', - 'native.notification.audioRecording.recording': 'Nahrávanie zvuku, ťuknite pre návrat do aplikácie', - 'native.notification.music.waiting': 'Čakanie na prehranie', - 'native.notification.music.previous': 'Predchádzajúca', - 'native.notification.music.next': 'Ďalšia', - 'native.notification.music.play': 'Prehrať', - 'native.notification.music.pause': 'Pozastaviť', - 'native.notification.qqMusic.playing': 'Prehrávanie hudby', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigácia prebieha', + 'native.notification.navigation.keepRunning': + 'Navigácia, ponechajte aplikáciu spustenú', + 'native.notification.bleAgent.running': 'Hlasový asistent je spustený', + 'native.notification.audioRecording.recording': + 'Nahrávanie zvuku, ťuknite pre návrat do aplikácie', + 'native.notification.music.waiting': 'Čakanie na prehranie', + 'native.notification.music.previous': 'Predchádzajúca', + 'native.notification.music.next': 'Ďalšia', + 'native.notification.music.play': 'Prehrať', + 'native.notification.music.pause': 'Pozastaviť', + 'native.notification.qqMusic.playing': 'Prehrávanie hudby', // 版本更新 'newVersionFound': 'Nájdená nová verzia', // 版本更新对话框标题 @@ -1398,6 +1469,59 @@ const Map skSK = { "removeEarbudsEnsureBattery": "Vyberte obe slúchadlá a uistite sa, že batéria oboch je nad 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Upgrade Successful', + 'otaUpgradeCompleteRepair': + 'Firmware upgrade complete!\n\nDevice needs to be re-paired to work properly. Go to pairing page now?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': + 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': + 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': + 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', + // 音乐模块 "noMusic": "Žiadna hudba", // 暂无音乐 "noPlayingMusic": "Neprehráva sa žiadna hudba", // 暂无播放音乐 diff --git a/lib/core/translations/language/sl_si.dart b/lib/core/translations/language/sl_si.dart index 9fdfb8e19..09452bfbb 100644 --- a/lib/core/translations/language/sl_si.dart +++ b/lib/core/translations/language/sl_si.dart @@ -1,5 +1,4 @@ const Map slSI = { - // 通用 'continue': 'Nadaljuj', 'confirm': 'Potrdi', @@ -169,6 +168,29 @@ const Map slSI = { 'right': 'Desno', 'checkConnectionStatusFailed': 'Preverjanje stanja povezave ni uspelo', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth initialization failed: @error', + 'needBluetoothAndLocationPermission': + 'Bluetooth and location permissions are required to scan devices', + 'permissionRequestFailedWithError': 'Permission request failed: @error', + 'needPermission': 'Permission Required', + 'blePermissionDialogContent': + 'This app requires Bluetooth and location permissions to scan devices. Please enable them in Settings.', + 'needEnableBluetooth': 'Enable Bluetooth', + 'enableBluetoothDialogContent': + 'Please enable Bluetooth to scan and connect devices.', + 'bleScanFailedWithError': 'Scan failed: @error', + 'bleConnectionSuccess': 'Connection Successful', + 'bleConnectedToDevice': 'Connected to @device', + 'bleConnectionFailedWithError': 'Connection failed: @error', + 'bleDisconnected': 'Disconnected', + 'bleDeviceDisconnected': 'Device disconnected', + 'bleDisconnectFailedWithError': 'Disconnect failed: @error', + 'signalStrong': 'Strong', + 'signalMedium': 'Medium', + 'signalWeak': 'Weak', + 'signalVeryWeak': 'Very Weak', + // 发现页 "searchAi": "Išči funkcije AI...", "exploreSlogan": "Pametne slušalke, neskončne možnosti", @@ -245,60 +267,65 @@ const Map slSI = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Plačilo uspešno', - 'paymentFailed': 'Plačilo ni uspelo', - 'gotIt': 'Razumem', - 'paymentFailedTryAgain': 'Plačilo ni uspelo. Poskusite znova.', - 'selectPaymentMethod': 'Izberite način plačila', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Ustvarjanje naročila WeChat ni uspelo', - 'alipayOrderCreateFailed': 'Ustvarjanje naročila Alipay ni uspelo', - 'appleOrderCreateFailed': 'Ustvarjanje naročila Apple ni uspelo', - 'googleOrderCreateFailed': 'Ustvarjanje naročila Google ni uspelo', - 'paypalOrderCreateFailed': 'Ustvarjanje naročila PayPal ni uspelo', - 'paymentException': 'Izjema pri plačilu', - 'paymentLaunchFailed': 'Zagon plačila ni uspel', - 'paymentExceptionWithError': 'Izjema pri plačilu: @error', - 'paymentProcessingCheckLater': 'Vaše naročilo se obdeluje. Preverite pozneje.', - 'paymentResultQueryException': 'Poizvedba o rezultatu plačila ni uspela: @error', - 'orderConfirmedQuotaRefreshed': 'Naročilo je potrjeno. Vaša kvota je bila osvežena.', - 'paymentCompletedConfirming': 'Plačilo je zaključeno. Potrjevanje…', - 'paymentCancelled': 'Plačilo je preklicano', - 'paypalOpenedCompleteInBrowser': 'PayPal je odprt. Prosimo dokončajte plačilo v brskalniku.', - 'paypalOpenFailed': 'Ni mogoče odpreti strani za plačilo PayPal', - 'paymentTestTitle': 'Test plačila', - 'paymentTestOrderInfo': 'Informacije o testnem naročilu', - 'paymentTestProductId': 'ID izdelka', - 'paymentTestProductDescription': 'Opis izdelka', - 'paymentTestWechatDescription': 'Test plačila WeChat', - 'paymentTestAlipayDescription': 'Test plačila Alipay', - 'paymentTestAmount': 'Znesek', - 'paymentTestSelectAmount': 'Izberite testni znesek', - 'paying': 'Plačevanje...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Stanje plačila', - 'errorInfoWithMessage': 'Napaka: @message', - 'retest': 'Ponovno testiraj', - 'paymentTestInstructionsTitle': 'Navodila', - 'paymentTestInstructionsContent': '1. Izberite testni znesek (priporočeno: ¥0.01)\n2. Kliknite gumb za plačilo za začetek\n3. Dokončajte plačilo v aplikaciji za plačila\n4. Vrnite se in preverite rezultat', - 'startingWechatPayment': 'Zaganjanje WeChat Pay...', - 'startingAlipayPayment': 'Zaganjanje Alipay...', - 'wechatPaymentSuccess': 'Plačilo WeChat Pay uspešno!', - 'wechatPaymentFailed': 'Plačilo WeChat Pay ni uspelo', - 'wechatPaymentLaunchFailed': 'Zagon WeChat Pay ni uspel', - 'cannotLaunchWechatPayment': 'Ni mogoče zagnati WeChat Pay', - 'wechatPaymentException': 'Izjema WeChat Pay', - 'wechatPaymentTestCompleted': 'Test plačila WeChat Pay je zaključen', - 'alipayPaymentSuccess': 'Plačilo Alipay uspešno!', - 'alipayPaymentFailed': 'Plačilo Alipay ni uspelo', - 'alipayPaymentLaunchFailed': 'Zagon Alipay ni uspel', - 'cannotLaunchAlipayPayment': 'Ni mogoče zagnati Alipay', - 'alipayPaymentException': 'Izjema Alipay', + 'paymentSuccess': 'Plačilo uspešno', + 'paymentFailed': 'Plačilo ni uspelo', + 'gotIt': 'Razumem', + 'paymentFailedTryAgain': 'Plačilo ni uspelo. Poskusite znova.', + 'selectPaymentMethod': 'Izberite način plačila', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Ustvarjanje naročila WeChat ni uspelo', + 'alipayOrderCreateFailed': 'Ustvarjanje naročila Alipay ni uspelo', + 'appleOrderCreateFailed': 'Ustvarjanje naročila Apple ni uspelo', + 'googleOrderCreateFailed': 'Ustvarjanje naročila Google ni uspelo', + 'paypalOrderCreateFailed': 'Ustvarjanje naročila PayPal ni uspelo', + 'paymentException': 'Izjema pri plačilu', + 'paymentLaunchFailed': 'Zagon plačila ni uspel', + 'paymentExceptionWithError': 'Izjema pri plačilu: @error', + 'paymentProcessingCheckLater': + 'Vaše naročilo se obdeluje. Preverite pozneje.', + 'paymentResultQueryException': + 'Poizvedba o rezultatu plačila ni uspela: @error', + 'orderConfirmedQuotaRefreshed': + 'Naročilo je potrjeno. Vaša kvota je bila osvežena.', + 'paymentCompletedConfirming': 'Plačilo je zaključeno. Potrjevanje…', + 'paymentCancelled': 'Plačilo je preklicano', + 'paypalOpenedCompleteInBrowser': + 'PayPal je odprt. Prosimo dokončajte plačilo v brskalniku.', + 'paypalOpenFailed': 'Ni mogoče odpreti strani za plačilo PayPal', + 'paymentTestTitle': 'Test plačila', + 'paymentTestOrderInfo': 'Informacije o testnem naročilu', + 'paymentTestProductId': 'ID izdelka', + 'paymentTestProductDescription': 'Opis izdelka', + 'paymentTestWechatDescription': 'Test plačila WeChat', + 'paymentTestAlipayDescription': 'Test plačila Alipay', + 'paymentTestAmount': 'Znesek', + 'paymentTestSelectAmount': 'Izberite testni znesek', + 'paying': 'Plačevanje...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Stanje plačila', + 'errorInfoWithMessage': 'Napaka: @message', + 'retest': 'Ponovno testiraj', + 'paymentTestInstructionsTitle': 'Navodila', + 'paymentTestInstructionsContent': + '1. Izberite testni znesek (priporočeno: ¥0.01)\n2. Kliknite gumb za plačilo za začetek\n3. Dokončajte plačilo v aplikaciji za plačila\n4. Vrnite se in preverite rezultat', + 'startingWechatPayment': 'Zaganjanje WeChat Pay...', + 'startingAlipayPayment': 'Zaganjanje Alipay...', + 'wechatPaymentSuccess': 'Plačilo WeChat Pay uspešno!', + 'wechatPaymentFailed': 'Plačilo WeChat Pay ni uspelo', + 'wechatPaymentLaunchFailed': 'Zagon WeChat Pay ni uspel', + 'cannotLaunchWechatPayment': 'Ni mogoče zagnati WeChat Pay', + 'wechatPaymentException': 'Izjema WeChat Pay', + 'wechatPaymentTestCompleted': 'Test plačila WeChat Pay je zaključen', + 'alipayPaymentSuccess': 'Plačilo Alipay uspešno!', + 'alipayPaymentFailed': 'Plačilo Alipay ni uspelo', + 'alipayPaymentLaunchFailed': 'Zagon Alipay ni uspel', + 'cannotLaunchAlipayPayment': 'Ni mogoče zagnati Alipay', + 'alipayPaymentException': 'Izjema Alipay', "insufficientIntegral": "Insufficient integral", "insufficientBalanceDesc": "Insufficient balance, please go to the corresponding recharge page to recharge.", @@ -540,21 +567,23 @@ const Map slSI = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Ustvari', - 'templateDetails': 'Podrobnosti predloge', - 'tag': 'Oznaka', - 'description': 'Opis', - 'template': 'Predloga', - 'deleteTemplate': 'Izbriši predlogo', - 'deleteTemplateConfirm': 'Ali ste prepričani, da želite izbrisati to predlogo?', - 'editTemplate': 'Uredi predlogo', - 'createTemplate': 'Ustvari predlogo', - 'name': 'Ime', - 'templateContentHint': 'Prosimo vnesite vsebino predloge! Namig: Kliknite gumb AI zgoraj za hitro ustvarjanje vsebine predloge na podlagi vnesenega imena in opisa', - 'inputNameHint': 'Prosimo vnesite ime', - 'inputDescHint': 'Prosimo vnesite opis', - 'custom': 'Po meri', - 'pleaseEnter': 'Prosimo vnesite', + 'create': 'Ustvari', + 'templateDetails': 'Podrobnosti predloge', + 'tag': 'Oznaka', + 'description': 'Opis', + 'template': 'Predloga', + 'deleteTemplate': 'Izbriši predlogo', + 'deleteTemplateConfirm': + 'Ali ste prepričani, da želite izbrisati to predlogo?', + 'editTemplate': 'Uredi predlogo', + 'createTemplate': 'Ustvari predlogo', + 'name': 'Ime', + 'templateContentHint': + 'Prosimo vnesite vsebino predloge! Namig: Kliknite gumb AI zgoraj za hitro ustvarjanje vsebine predloge na podlagi vnesenega imena in opisa', + 'inputNameHint': 'Prosimo vnesite ime', + 'inputDescHint': 'Prosimo vnesite opis', + 'custom': 'Po meri', + 'pleaseEnter': 'Prosimo vnesite', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', @@ -577,7 +606,7 @@ const Map slSI = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Shrani miselni zemljevid', + 'saveMindMap': 'Shrani miselni zemljevid', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -599,7 +628,7 @@ const Map slSI = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Izvozi', + 'export': 'Izvozi', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Uporabi za vse odstavke tega govorca', @@ -709,18 +738,18 @@ const Map slSI = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Analiza ni uspela, poskusite znova pozneje', - 'transcriptionFailed': 'Prepis ni uspel, poskusite znova pozneje', - 'summaryFailed': 'Povzetek ni uspel, poskusite znova pozneje', - 'summaryFailedShort': 'Povzetek ni uspel', - 'transcriptionFailedShort': 'Prepis ni uspel', + 'analysisFailed': 'Analiza ni uspela, poskusite znova pozneje', + 'transcriptionFailed': 'Prepis ni uspel, poskusite znova pozneje', + 'summaryFailed': 'Povzetek ni uspel, poskusite znova pozneje', + 'summaryFailedShort': 'Povzetek ni uspel', + 'transcriptionFailedShort': 'Prepis ni uspel', // Meeting模块 - 播放器 - 'playerNotReady': 'Zvočni predvajalnik ni pripravljen, prosimo počakajte', - 'playFailed': 'Predvajanje ni uspelo', - 'audioFileNotFound': 'Zvočna datoteka ni bila najdena', - 'fetchingAudio': 'Pridobivanje zvoka iz oblaka...', - 'playerLoadFailed': 'Zvočni predvajalnik se ni uspel naložiti', + 'playerNotReady': 'Zvočni predvajalnik ni pripravljen, prosimo počakajte', + 'playFailed': 'Predvajanje ni uspelo', + 'audioFileNotFound': 'Zvočna datoteka ni bila najdena', + 'fetchingAudio': 'Pridobivanje zvoka iz oblaka...', + 'playerLoadFailed': 'Zvočni predvajalnik se ni uspel naložiti', // 设置页 "systemSettings": "Sistemske nastavitve", @@ -827,7 +856,8 @@ const Map slSI = { "swipeUpForMore": "Povlecite navzgor za več", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Ko je vklopljeno: AI ne bo prekinjen z vašim glasom med govorjenjem in lahko obdela le en krog pogovora naenkrat. Za začetek novega kroga preprosto izgovorite prebujeno besedo.', + 'voice_interrupt_tip': + 'Ko je vklopljeno: AI ne bo prekinjen z vašim glasom med govorjenjem in lahko obdela le en krog pogovora naenkrat. Za začetek novega kroga preprosto izgovorite prebujeno besedo.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -884,6 +914,13 @@ const Map slSI = { 'Želimo vedeti, zakaj prijavljate, lahko opišete težavo, s katero ste se soočili.', 'generatedByAi': 'Generirano s strani AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Tukaj je nekaj priporočene glasbe:', 'playList': 'Seznam predvajanja', @@ -904,6 +941,29 @@ const Map slSI = { "bicycling": "Kolesarjenje", "tsransit": "Javni prevoz", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Failed to start navigation', + 'cannotPlayMusicListRetryLater': + 'Cannot play music list, please try again later', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Error opening map', + 'pleaseInstallAmapApp': 'Please install the Amap app first', + 'pleaseInstallBaiduMapApp': 'Please install the Baidu Maps app first', + 'appleMapStartFailed': 'Apple Maps failed to start', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Error opening Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Poizvedba o vremenskih razmerah:', 'highest': 'Najvišja', @@ -976,8 +1036,19 @@ const Map slSI = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Disable Floating Window', + 'enableFloatingWindow': 'Enable Floating Window', + 'permissionTip': 'Permission Tip', + 'micPermissionRequiredForRecording': + 'Microphone permission is required for recording', + 'deleteTranslationRecordError': 'Error deleting translation record: @error', "translationFailed": "Translation failed", + "translating": "Translating", + "translate": "Translate", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Vnesite besedilo za prevod", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1251,17 +1322,19 @@ const Map slSI = { 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigacija poteka', - 'native.notification.navigation.keepRunning': 'Navigacija, ohranite aplikacijo zagnano', - 'native.notification.bleAgent.running': 'Glasovni pomočnik deluje', - 'native.notification.audioRecording.recording': 'Snemanje zvoka, tapnite za vrnitev v aplikacijo', - 'native.notification.music.waiting': 'Čakanje na predvajanje', - 'native.notification.music.previous': 'Prejšnja', - 'native.notification.music.next': 'Naslednja', - 'native.notification.music.play': 'Predvajaj', - 'native.notification.music.pause': 'Premor', - 'native.notification.qqMusic.playing': 'Predvajanje glasbe', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigacija poteka', + 'native.notification.navigation.keepRunning': + 'Navigacija, ohranite aplikacijo zagnano', + 'native.notification.bleAgent.running': 'Glasovni pomočnik deluje', + 'native.notification.audioRecording.recording': + 'Snemanje zvoka, tapnite za vrnitev v aplikacijo', + 'native.notification.music.waiting': 'Čakanje na predvajanje', + 'native.notification.music.previous': 'Prejšnja', + 'native.notification.music.next': 'Naslednja', + 'native.notification.music.play': 'Predvajaj', + 'native.notification.music.pause': 'Premor', + 'native.notification.qqMusic.playing': 'Predvajanje glasbe', // 版本更新 'newVersionFound': 'Najdena nova različica', // 版本更新对话框标题 @@ -1402,6 +1475,59 @@ const Map slSI = { "removeEarbudsEnsureBattery": "Odstranite obe slušalki in se prepričajte, da je baterija obeh nad 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Upgrade Successful', + 'otaUpgradeCompleteRepair': + 'Firmware upgrade complete!\n\nDevice needs to be re-paired to work properly. Go to pairing page now?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': + 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': + 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': + 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', + // 音乐模块 "noMusic": "Ni glasbe", // 暂无音乐 "noPlayingMusic": "Ni predvajane glasbe", // 暂无播放音乐 diff --git a/lib/core/translations/language/sr_rs.dart b/lib/core/translations/language/sr_rs.dart index 3c70a1417..2bced0a0e 100644 --- a/lib/core/translations/language/sr_rs.dart +++ b/lib/core/translations/language/sr_rs.dart @@ -1,5 +1,4 @@ const Map srRS = { - // 通用 'continue': 'Nastavi', 'confirm': 'Potvrdi', @@ -19,11 +18,11 @@ const Map srRS = { "unknownError": "Nepoznata greška", "asrConnectionFailed": "Povezivanje sa servisom za prepoznavanje govora nije uspelo. Proverite mrežu i pokušajte ponovo kasnije.", - "justNow": "Just now", - "minutesAgo": "@minutes minutes ago", - "yesterday": "Yesterday", - "daysAgo": "@days days ago", - "hoursAgo": "@hours hours ago", + "justNow": "Upravo sada", + "minutesAgo": "Pre @minutes minuta", + "yesterday": "Juče", + "daysAgo": "Pre @days dana", + "hoursAgo": "Pre @hours sati", // 启动页 "slogan": "Povezivanje sveta, izvan zvuka", @@ -110,7 +109,7 @@ const Map srRS = { "welcomeToThisApp": "Dobrodošli u Voitrans, molimo vas da pažljivo pročitate", // 欢迎使用Voitrans,请充分阅读 "privacyPolicyText": - ",点击'同意并进入'表示您已充分阅读并同意上述协议。点击'不同意'将退出应用。", // ,点击"同意并进入"表示您已充分阅读并同意上述协议。点击"不同意"将退出应用。 + ", klikom na 'Slažem se i ulazim' potvrđujete da ste u potpunosti pročitali i da se slažete sa gorenavedenim sporazumima. Klikom na 'Ne slažem se' napustićete aplikaciju.", // ,点击"同意并进入"表示您已充分阅读并同意上述协议。点击"不同意"将退出应用。 "disagree": "Ne slažem se", // 不同意 "agreeAndEnter": "Slažem se i ulazim", // 同意并进入 @@ -169,6 +168,30 @@ const Map srRS = { 'right': 'Desno', 'checkConnectionStatusFailed': 'Neuspešna provera statusa veze', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Inicijalizacija Bluetooth-a nije uspela: @error', + 'needBluetoothAndLocationPermission': + 'Za skeniranje uređaja potrebne su dozvole za Bluetooth i lokaciju', + 'permissionRequestFailedWithError': + 'Zahtev za dozvolu nije uspeo: @error', + 'needPermission': 'Potrebna dozvola', + 'blePermissionDialogContent': + 'Ova aplikacija zahteva dozvole za Bluetooth i lokaciju za skeniranje uređaja. Molimo omogućite ih u Podešavanjima.', + 'needEnableBluetooth': 'Omogućite Bluetooth', + 'enableBluetoothDialogContent': + 'Molimo omogućite Bluetooth za skeniranje i povezivanje uređaja.', + 'bleScanFailedWithError': 'Skeniranje nije uspelo: @error', + 'bleConnectionSuccess': 'Povezivanje uspešno', + 'bleConnectedToDevice': 'Povezano sa @device', + 'bleConnectionFailedWithError': 'Povezivanje nije uspelo: @error', + 'bleDisconnected': 'Veza prekinuta', + 'bleDeviceDisconnected': 'Uređaj je isključen', + 'bleDisconnectFailedWithError': 'Prekidanje veze nije uspelo: @error', + 'signalStrong': 'Jak', + 'signalMedium': 'Srednji', + 'signalWeak': 'Slab', + 'signalVeryWeak': 'Veoma slab', + // 发现页 "searchAi": "Pretraži AI funkcije...", "exploreSlogan": "Pametne slušalice, beskonačne mogućnosti", @@ -195,260 +218,265 @@ const Map srRS = { "scene": "Scena", // 用量统计模块 - "aiChat": "AI Chat", - "translationStats": "Translation Statistics", - "meetingStats": "Meeting Statistics", - "today": "Today", - "thisWeek": "This Week", - "thisMonth": "This Month", - "history": "History", - "currentSessionStats": "Current Session Stats", - "translationCount": "Translation Count", - "sessionDuration": "Session Duration", - "characters": "Characters", - "recordingDuration": "Recording Duration", - "totalApiCalls": "Total API Calls", - "sessionCount": "Session Count", - "totalCharacters": "Total Characters", - "apiCallStats": "API Call Stats", - "translationApi": "Translation API", + "aiChat": "AI ćaskanje", + "translationStats": "Statistika prevođenja", + "meetingStats": "Statistika sastanaka", + "today": "Danas", + "thisWeek": "Ova nedelja", + "thisMonth": "Ovaj mesec", + "history": "Istorija", + "currentSessionStats": "Statistika trenutne sesije", + "translationCount": "Broj prevoda", + "sessionDuration": "Trajanje sesije", + "characters": "Karakteri", + "recordingDuration": "Trajanje snimka", + "totalApiCalls": "Ukupni API pozivi", + "sessionCount": "Broj sesija", + "totalCharacters": "Ukupno karaktera", + "apiCallStats": "Statistika API poziva", + "translationApi": "API za prevođenje", "asr": "ASR", "tts": "TTS", - "dataVolumeStats": "Data Volume Stats", - "sourceTextCharacters": "Source Text Characters", - "ttsTextCharacters": "TTS Text Characters", - "effectiveAudioDuration": "Effective Audio Duration", - "totalSessionDuration": "Total Session Duration", - "costStats": "Cost Stats", - "estimatedCost": "Estimated Cost", - "dailyCostThreshold": "Daily Cost Threshold", - "monthlyCostThreshold": "Monthly Cost Threshold", - "usageBehaviorStats": "Usage Behavior Stats", - "mostUsedLanguagePair": "Most-used language pair", - "mostUsedMode": "Most-used mode", - "asrApiCalls": "ASR Calls", - "totalAudioDuration": "Total Audio Duration", - "audioFileSize": "Audio File Size", - "transcriptBytes": "Transcript Bytes", - "loadFailed": "Load Failed", + "dataVolumeStats": "Statistika obima podataka", + "sourceTextCharacters": "Karakteri izvornog teksta", + "ttsTextCharacters": "Karakteri TTS teksta", + "effectiveAudioDuration": "Efektivno trajanje zvuka", + "totalSessionDuration": "Ukupno trajanje sesija", + "costStats": "Statistika troškova", + "estimatedCost": "Procenjeni trošak", + "dailyCostThreshold": "Dnevni prag troškova", + "monthlyCostThreshold": "Mesečni prag troškova", + "usageBehaviorStats": "Statistika ponašanja korišćenja", + "mostUsedLanguagePair": "Najkorišćeniji jezički par", + "mostUsedMode": "Najkorišćeniji režim", + "asrApiCalls": "ASR pozivi", + "totalAudioDuration": "Ukupno trajanje zvuka", + "audioFileSize": "Veličina audio datoteke", + "transcriptBytes": "Bajtovi transkripta", + "loadFailed": "Učitavanje nije uspelo", "statsLoadFailedTryLater": - "Statistics failed to load. Please try again later.", - "cleanupComplete": "Cleanup Complete", - "cleanedOldData": "Cleaned data older than 90 days", - "exportFeature": "Export Feature", - "exportInDevelopment": "Data export is under development", + "Statistika nije učitana. Molimo pokušajte ponovo kasnije.", + "cleanupComplete": "Čišćenje završeno", + "cleanedOldData": "Obrisani podaci stariji od 90 dana", + "exportFeature": "Funkcija izvoza", + "exportInDevelopment": "Izvoz podataka je u razvoju", // 商品模块 - 通用 - 'availablePackages': 'Available Packages', - 'remainingQuota': 'Remaining Quota', - 'totalQuota': 'Total Quota', - 'remaining': 'Remaining', - 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Plaćanje uspešno', - 'paymentFailed': 'Plaćanje nije uspelo', - 'gotIt': 'Razumem', - 'paymentFailedTryAgain': 'Plaćanje nije uspelo. Pokušajte ponovo.', - 'selectPaymentMethod': 'Izaberite način plaćanja', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Kreiranje WeChat porudžbine nije uspelo', - 'alipayOrderCreateFailed': 'Kreiranje Alipay porudžbine nije uspelo', - 'appleOrderCreateFailed': 'Kreiranje Apple porudžbine nije uspelo', - 'googleOrderCreateFailed': 'Kreiranje Google porudžbine nije uspelo', - 'paypalOrderCreateFailed': 'Kreiranje PayPal porudžbine nije uspelo', - 'paymentException': 'Izuzetak pri plaćanju', - 'paymentLaunchFailed': 'Pokretanje plaćanja nije uspelo', - 'paymentExceptionWithError': 'Izuzetak pri plaćanju: @error', - 'paymentProcessingCheckLater': 'Vaša porudžbina se obrađuje. Proverite kasnije.', - 'paymentResultQueryException': 'Neuspešno pretraživanje rezultata plaćanja: @error', - 'orderConfirmedQuotaRefreshed': 'Porudžbina je potvrđena. Vaša kvota je osvežena.', - 'paymentCompletedConfirming': 'Plaćanje je završeno. Potvrđivanje…', - 'paymentCancelled': 'Plaćanje je otkazano', - 'paypalOpenedCompleteInBrowser': 'PayPal je otvoren. Molimo završite plaćanje u pretraživaču.', - 'paypalOpenFailed': 'Nije moguće otvoriti PayPal stranicu za plaćanje', - 'paymentTestTitle': 'Test plaćanja', - 'paymentTestOrderInfo': 'Informacije o test porudžbini', - 'paymentTestProductId': 'ID proizvoda', - 'paymentTestProductDescription': 'Opis proizvoda', - 'paymentTestWechatDescription': 'Test WeChat plaćanja', - 'paymentTestAlipayDescription': 'Test Alipay plaćanja', - 'paymentTestAmount': 'Iznos', - 'paymentTestSelectAmount': 'Izaberite test iznos', - 'paying': 'Plaćanje...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Status plaćanja', - 'errorInfoWithMessage': 'Greška: @message', - 'retest': 'Ponovo testiraj', - 'paymentTestInstructionsTitle': 'Uputstva', - 'paymentTestInstructionsContent': '1. Izaberite test iznos (preporučeno: ¥0.01)\n2. Kliknite dugme za plaćanje da započnete\n3. Završite plaćanje u aplikaciji za plaćanje\n4. Vratite se da proverite rezultat', - 'startingWechatPayment': 'Pokretanje WeChat Pay-a...', - 'startingAlipayPayment': 'Pokretanje Alipay-a...', - 'wechatPaymentSuccess': 'WeChat Pay plaćanje uspešno!', - 'wechatPaymentFailed': 'WeChat Pay plaćanje nije uspelo', - 'wechatPaymentLaunchFailed': 'Pokretanje WeChat Pay-a nije uspelo', - 'cannotLaunchWechatPayment': 'Nije moguće pokrenuti WeChat Pay', - 'wechatPaymentException': 'WeChat Pay izuzetak', - 'wechatPaymentTestCompleted': 'Test WeChat Pay plaćanja je završen', - 'alipayPaymentSuccess': 'Alipay plaćanje uspešno!', - 'alipayPaymentFailed': 'Alipay plaćanje nije uspelo', - 'alipayPaymentLaunchFailed': 'Pokretanje Alipay-a nije uspelo', - 'cannotLaunchAlipayPayment': 'Nije moguće pokrenuti Alipay', - 'alipayPaymentException': 'Alipay izuzetak', - "insufficientIntegral": "Insufficient integral", + 'availablePackages': 'Dostupni paketi', + 'remainingQuota': 'Preostala kvota', + 'totalQuota': 'Ukupna kvota', + 'remaining': 'Preostalo', + 'featureDescription': 'Opis funkcije', + 'paymentSuccess': 'Plaćanje uspešno', + 'paymentFailed': 'Plaćanje nije uspelo', + 'gotIt': 'Razumem', + 'paymentFailedTryAgain': 'Plaćanje nije uspelo. Pokušajte ponovo.', + 'selectPaymentMethod': 'Izaberite način plaćanja', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Kreiranje WeChat porudžbine nije uspelo', + 'alipayOrderCreateFailed': 'Kreiranje Alipay porudžbine nije uspelo', + 'appleOrderCreateFailed': 'Kreiranje Apple porudžbine nije uspelo', + 'googleOrderCreateFailed': 'Kreiranje Google porudžbine nije uspelo', + 'paypalOrderCreateFailed': 'Kreiranje PayPal porudžbine nije uspelo', + 'paymentException': 'Izuzetak pri plaćanju', + 'paymentLaunchFailed': 'Pokretanje plaćanja nije uspelo', + 'paymentExceptionWithError': 'Izuzetak pri plaćanju: @error', + 'paymentProcessingCheckLater': + 'Vaša porudžbina se obrađuje. Proverite kasnije.', + 'paymentResultQueryException': + 'Neuspešno pretraživanje rezultata plaćanja: @error', + 'orderConfirmedQuotaRefreshed': + 'Porudžbina je potvrđena. Vaša kvota je osvežena.', + 'paymentCompletedConfirming': 'Plaćanje je završeno. Potvrđivanje…', + 'paymentCancelled': 'Plaćanje je otkazano', + 'paypalOpenedCompleteInBrowser': + 'PayPal je otvoren. Molimo završite plaćanje u pretraživaču.', + 'paypalOpenFailed': 'Nije moguće otvoriti PayPal stranicu za plaćanje', + 'paymentTestTitle': 'Test plaćanja', + 'paymentTestOrderInfo': 'Informacije o test porudžbini', + 'paymentTestProductId': 'ID proizvoda', + 'paymentTestProductDescription': 'Opis proizvoda', + 'paymentTestWechatDescription': 'Test WeChat plaćanja', + 'paymentTestAlipayDescription': 'Test Alipay plaćanja', + 'paymentTestAmount': 'Iznos', + 'paymentTestSelectAmount': 'Izaberite test iznos', + 'paying': 'Plaćanje...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Status plaćanja', + 'errorInfoWithMessage': 'Greška: @message', + 'retest': 'Ponovo testiraj', + 'paymentTestInstructionsTitle': 'Uputstva', + 'paymentTestInstructionsContent': + '1. Izaberite test iznos (preporučeno: ¥0.01)\n2. Kliknite dugme za plaćanje da započnete\n3. Završite plaćanje u aplikaciji za plaćanje\n4. Vratite se da proverite rezultat', + 'startingWechatPayment': 'Pokretanje WeChat Pay-a...', + 'startingAlipayPayment': 'Pokretanje Alipay-a...', + 'wechatPaymentSuccess': 'WeChat Pay plaćanje uspešno!', + 'wechatPaymentFailed': 'WeChat Pay plaćanje nije uspelo', + 'wechatPaymentLaunchFailed': 'Pokretanje WeChat Pay-a nije uspelo', + 'cannotLaunchWechatPayment': 'Nije moguće pokrenuti WeChat Pay', + 'wechatPaymentException': 'WeChat Pay izuzetak', + 'wechatPaymentTestCompleted': 'Test WeChat Pay plaćanja je završen', + 'alipayPaymentSuccess': 'Alipay plaćanje uspešno!', + 'alipayPaymentFailed': 'Alipay plaćanje nije uspelo', + 'alipayPaymentLaunchFailed': 'Pokretanje Alipay-a nije uspelo', + 'cannotLaunchAlipayPayment': 'Nije moguće pokrenuti Alipay', + 'alipayPaymentException': 'Alipay izuzetak', + "insufficientIntegral": "Nedovoljno bodova", "insufficientBalanceDesc": - "Insufficient balance, please go to the corresponding recharge page to recharge.", - "recharge": "Go to Recharge", + "Nedovoljan saldo, molimo idite na odgovarajuću stranicu za dopunu.", + "recharge": "Idi na dopunu", "aiMemberExpiredDesc": - "AI membership expired, please go to the membership recharge page to renew.", + "AI članstvo je isteklo, molimo idite na stranicu za dopunu članstva da biste obnovili.", // 商品模块 - AI商品页 - 'musicAndRecommendation': 'Music & Recommendation', - 'navigationAndRoutes': 'Navigation & Routes', - 'nearbySearch': 'Nearby Search', - 'newsInformation': 'News', - 'communicationAssistant': 'Communication Assistant', + 'musicAndRecommendation': 'Muzika i preporuke', + 'navigationAndRoutes': 'Navigacija i putanje', + 'nearbySearch': 'Pretraga u blizini', + 'newsInformation': 'Vesti', + 'communicationAssistant': 'Asistent za komunikaciju', 'aiHeaderDesc1': - 'Longer conversation quota, more tool calls, extended context length.', + 'Duža kvota za razgovor, više poziva alata, produžena dužina konteksta.', 'aiHeaderDesc2': - 'Suitable for agent Q&A, summarization, analysis, and task execution.', - 'musicSearchPlaybackControl': 'Music library search and playback control', + 'Pogodno za pitanja i odgovore agenta, sažimanje, analizu i izvršavanje zadataka.', + 'musicSearchPlaybackControl': 'Pretraga muzičke biblioteke i kontrola reprodukcije', 'smartPlaylistAndSimilarRecommendations': - 'Smart playlist and similar song recommendations', + 'Pametna lista pesama i preporuke sličnih pesama', 'routePlanningAndCongestionAvoidance': - 'Route planning and congestion avoidance', - 'voiceBroadcastAndWaypoints': 'Voice broadcast and waypoint settings', - 'realTimeWeatherForecast': 'Real-time weather and forecast', - 'clothingAdviceAndTravelReminders': 'Clothing advice and travel reminders', - 'poiSearchFoodGasParking': 'POI search: dining / gas / parking', - 'ratingsHoursAndDirectRoutes': 'Ratings, business hours, and direct routing', - 'hotNewsAndTopicOverview': 'Hot news and topic overview', - 'longArticleSummariesAndKeyPoints': 'Long-article summaries and key points', - 'helpCallAndSMS': 'Help with calls and SMS', + 'Planiranje rute i izbegavanje gužve', + 'voiceBroadcastAndWaypoints': 'Glasovno emitovanje i podešavanje putnih tačaka', + 'realTimeWeatherForecast': 'Vremenski uslovi i prognoza u realnom vremenu', + 'clothingAdviceAndTravelReminders': 'Saveti za odeću i podsetnici za putovanje', + 'poiSearchFoodGasParking': 'POI pretraga: hrana / gorivo / parking', + 'ratingsHoursAndDirectRoutes': 'Ocene, radno vreme i direktne rute', + 'hotNewsAndTopicOverview': 'Najnovije vesti i pregled tema', + 'longArticleSummariesAndKeyPoints': 'Sažeci dugih članaka i ključne tačke', + 'helpCallAndSMS': 'Pomoć pri pozivima i SMS porukama', 'templatedMessagesAndScheduleReminders': - 'Template messages and schedule reminders', + 'Šablonske poruke i podsetnici za raspored', 'aiDisclaimer': - 'Features depend on device permissions, service availability, and network conditions.', + 'Funkcije zavise od dozvola uređaja, dostupnosti servisa i mrežnih uslova.', // 商品模块 - 翻译商品页 - 'realtimeTranscription': 'Real-time Transcription', - 'sceneLexicon': 'Scenario Glossary', - 'subtitleDisplay': 'Subtitles', + 'realtimeTranscription': 'Transkripcija u realnom vremenu', + 'sceneLexicon': 'Rečnik za scenarije', + 'subtitleDisplay': 'Titlovi', 'transHeaderDesc1': - 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'transHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', - 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', + 'Simultano prevođenje i prevod teksta u realnom vremenu sa glasom niske latencije.', + 'transHeaderDesc2': 'Pogodno za putovanja, poslovanje, govore i nastavu.', + 'translateZhEn': 'Kinesko-engleski prevod', + 'lowLatencyVoiceBroadcast': 'Glasovno emitovanje niske latencije', + 'multiLangTextTranslation': 'Višejezični prevod teksta', 'termOptimizationContextPreserve': - 'Terminology optimization and context preservation', - 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', - 'personalVocabularyMemory': 'Personal vocabulary memory', - 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', - 'colorHighContrast': 'High color contrast', + 'Optimizacija terminologije i očuvanje konteksta', + 'lexiconTourBusinessLife': 'Rečnici za putovanje/poslovanje/svakodnevicu', + 'personalVocabularyMemory': 'Lična memorija vokabulara', + 'conversationSubtitleLargeText': 'Titlovi razgovora / Režim velikog teksta', + 'colorHighContrast': 'Visoki kontrast boja', 'transDisclaimer': - 'Translation performance depends on microphone, network latency, and ambient noise.', + 'Kvalitet prevođenja zavisi od mikrofona, mrežne latencije i buke u okruženju.', // 商品模块 - 会议商品页 - 'meetingRecording': 'Meeting Recording', - 'transcriptionAndSummary': 'Transcription & Summary', - 'keywordSearch': 'Keyword Search', - 'collaborationSharing': 'Collaboration & Sharing', + 'meetingRecording': 'Snimanje sastanka', + 'transcriptionAndSummary': 'Transkripcija i sažetak', + 'keywordSearch': 'Pretraga ključnih reči', + 'collaborationSharing': 'Saradnja i deljenje', 'meetingHeaderDesc1': - 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', + 'Audio snimanje, transkripcija, pretraga ključnih reči i automatski sažetak za poboljšanje efikasnosti sastanka.', 'meetingHeaderDesc2': - 'Suitable for business meetings, class notes, and interview minutes.', - 'meetingAutoRecording': 'Auto recording and segmentation', - 'meetingSpeakerTagging': 'Speaker labeling', - 'meetingLongAudioTranscription': 'Long audio transcription', - 'meetingKeyPointSummary': 'Key point extraction', - 'meetingTopicNameSearch': 'Search by topic/name', - 'meetingTimelineJump': 'Timeline jump', - 'meetingExportSummary': 'Export minutes', - 'meetingMultiPlatformShare': 'Share across platforms', + 'Pogodno za poslovne sastanke, beleške sa predavanja i zapisnike sa intervjua.', + 'meetingAutoRecording': 'Automatsko snimanje i segmentacija', + 'meetingSpeakerTagging': 'Označavanje govornika', + 'meetingLongAudioTranscription': 'Transkripcija dugog zvuka', + 'meetingKeyPointSummary': 'Izdvajanje ključnih tačaka', + 'meetingTopicNameSearch': 'Pretraga po temi/imenu', + 'meetingTimelineJump': 'Skok na vremensku liniju', + 'meetingExportSummary': 'Izvoz zapisnika', + 'meetingMultiPlatformShare': 'Deljenje na više platformi', 'meetingDisclaimer': - 'Use in quiet environments; performance depends on microphone and network.', + 'Koristite u tihom okruženju; performanse zavise od mikrofona i mreže.', // 商品模块 - VIP会员页 - 'benefitsOverview': 'Benefits overview', - 'higherQuota': 'Higher usage quota', - 'lowerUnitPrice': 'Lower unit price', - 'priorityService': 'Priority service', - 'exclusiveSupportChannel': 'Dedicated support channel', - 'fastResponse': 'Fast issue response', - 'eventsAndDiscounts': 'Events and discounts', - 'memberExclusiveEvents': 'Member-exclusive events', - 'longTermDiscountPlan': 'Long-term discount plan', - 'generalPrivileges': 'General privileges', - 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', + 'benefitsOverview': 'Pregled pogodnosti', + 'higherQuota': 'Veća kvota korišćenja', + 'lowerUnitPrice': 'Niža jedinična cena', + 'priorityService': 'Prioritetna usluga', + 'exclusiveSupportChannel': 'Namenski kanal podrške', + 'fastResponse': 'Brz odgovor na probleme', + 'eventsAndDiscounts': 'Događaji i popusti', + 'memberExclusiveEvents': 'Ekskluzivni događaji za članove', + 'longTermDiscountPlan': 'Dugoročni plan popusta', + 'generalPrivileges': 'Opšte privilegije', + 'earlyAccessNewFeatures': 'Rani pristup novim funkcijama', + 'crossDeviceSync': 'Sinhronizacija između uređaja', 'vipDisclaimer': - 'Actual benefits depend on the package details and may change with versions.', + 'Stvarne pogodnosti zavise od detalja paketa i mogu se promeniti sa verzijama.', // 商品模块 - 商品名称与描述 - 'ai_001_name': 'AI Basic 100', - 'ai_002_name': 'AI Basic 500', - 'ai_003_name': 'AI Basic 1000', - 'meet_001_name': 'Meeting Basic 100', - 'meet_002_name': 'Meeting Basic 500', - 'meet_003_name': 'Meeting Basic 1000', - 'trans_001_name': 'Translation Basic 100', - 'trans_002_name': 'Translation Basic 500', - 'trans_003_name': 'Translation Basic 1000', - 'ai_001_desc': 'Includes 100 uses. Access core AI features.', - 'ai_002_desc': 'Includes 500 uses. Access core AI features.', - 'ai_003_desc': 'Includes 1000 uses. Access core AI features.', - 'meet_001_desc': 'Includes 100 meeting recordings/transcriptions.', - 'meet_002_desc': 'Includes 500 meeting recordings/transcriptions.', - 'meet_003_desc': 'Includes 1000 meeting recordings/transcriptions.', - 'trans_001_desc': 'Includes 100 translations (voice/text).', - 'trans_002_desc': 'Includes 500 translations (voice/text).', - 'trans_003_desc': 'Includes 1000 translations (voice/text).', + 'ai_001_name': 'AI Osnovni 100', + 'ai_002_name': 'AI Osnovni 500', + 'ai_003_name': 'AI Osnovni 1000', + 'meet_001_name': 'Sastanak Osnovni 100', + 'meet_002_name': 'Sastanak Osnovni 500', + 'meet_003_name': 'Sastanak Osnovni 1000', + 'trans_001_name': 'Prevod Osnovni 100', + 'trans_002_name': 'Prevod Osnovni 500', + 'trans_003_name': 'Prevod Osnovni 1000', + 'ai_001_desc': 'Uključuje 100 korišćenja. Pristup osnovnim AI funkcijama.', + 'ai_002_desc': 'Uključuje 500 korišćenja. Pristup osnovnim AI funkcijama.', + 'ai_003_desc': 'Uključuje 1000 korišćenja. Pristup osnovnim AI funkcijama.', + 'meet_001_desc': 'Uključuje 100 snimanja/transkripcija sastanaka.', + 'meet_002_desc': 'Uključuje 500 snimanja/transkripcija sastanaka.', + 'meet_003_desc': 'Uključuje 1000 snimanja/transkripcija sastanaka.', + 'trans_001_desc': 'Uključuje 100 prevoda (glas/tekst).', + 'trans_002_desc': 'Uključuje 500 prevoda (glas/tekst).', + 'trans_003_desc': 'Uključuje 1000 prevoda (glas/tekst).', // 商品模块 - 页脚 - 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', - 'iapCustomerServiceQQLabel': 'IAP customer service QQ: @qq', + 'appNameProvider': 'Aplikacija: VoiTrans · Pruža: VoiTrans', + 'iapCustomerServiceQQLabel': 'Korisnički servis za IAP QQ: @qq', 'copyrightVoitrans': '© 2025 Voitrans Technologies', // 新手引导 'skip': 'Preskoči', - 'next': 'Next', - 'sayLilyHint': 'Say "Lily Lily" to the mic', - 'imHere': 'I’m here~', - 'guideWelcomeWakeAI': 'Welcome to Voitrans! First, wake your AI “Lily”.', - 'aiReplyCompleted': 'Lily has finished the reply!', - 'aiThinking': 'Lily is thinking…', - 'guideAwakenSuccess': 'Great! Lily is awake—ask it to help.', - 'confirmInput': 'Confirm Input', - 'guideClickSendPrefix': 'Tap send, ', - 'guideWeatherStart': 'Tell Lily: “What’s the weather today?”', - 'guideWeatherInput': 'What’s the weather today?', - 'guideWeatherSend': 'Lily will report the weather in real time', - 'guideWeatherEnd': 'Lily can report weather live—try other commands', - 'guideMusicStart': 'Tell Lily: “Play some rock music”', - 'guideMusicInput': 'Play some rock music', - 'guideMusicSend': 'Lily will find music for you', - 'guideMusicEnd': 'Lily found music—try other commands', - 'guideNavStart': 'Tell Lily: “Navigate to Shenzhen Airport”', - 'guideNavInput': 'Navigate to Shenzhen Airport', - 'guideNavSend': 'Lily will plan the route', - 'guideNavEnd': 'Navigation set—try other commands', + 'next': 'Sledeće', + 'sayLilyHint': 'Recite "Lily Lily" u mikrofon', + 'imHere': 'Ovde sam~', + 'guideWelcomeWakeAI': 'Dobrodošli u Voitrans! Prvo probudite svog AI „Lily".', + 'aiReplyCompleted': 'Lily je završila odgovor!', + 'aiThinking': 'Lily razmišlja…', + 'guideAwakenSuccess': 'Odlično! Lily je budna — zamolite je za pomoć.', + 'confirmInput': 'Potvrdi unos', + 'guideClickSendPrefix': 'Dodirnite pošalji, ', + 'guideWeatherStart': 'Recite Lily: „Kakvo je vreme danas?"', + 'guideWeatherInput': 'Kakvo je vreme danas?', + 'guideWeatherSend': 'Lily će javiti vremensku prognozu u realnom vremenu', + 'guideWeatherEnd': 'Lily može da javlja vreme uživo — probajte druge komande', + 'guideMusicStart': 'Recite Lily: „Pusti rok muziku"', + 'guideMusicInput': 'Pusti rok muziku', + 'guideMusicSend': 'Lily će pronaći muziku za vas', + 'guideMusicEnd': 'Lily je pronašla muziku — probajte druge komande', + 'guideNavStart': 'Recite Lily: „Navigiraj do aerodroma"', + 'guideNavInput': 'Navigiraj do aerodroma', + 'guideNavSend': 'Lily će isplanirati rutu', + 'guideNavEnd': 'Navigacija je podešena — probajte druge komande', 'guideMeetingStart': - 'Tell Lily: “Create a meeting reminder for 3pm tomorrow”', - 'guideMeetingInput': 'Create a meeting reminder for 3pm tomorrow', - 'guideMeetingSend': 'Lily will create a meeting reminder', - 'guideMeetingEnd': 'Reminder created—try other commands', - 'guidePhoneStart': 'Tell Lily: “Call Mom”', - 'guidePhoneInput': 'Call Mom', - 'guidePhoneSend': 'Lily will make the call', - 'guidePhoneEnd': 'Call placed—try other commands', - 'guideSmsStart': 'Tell Lily: “Send Dad a text: I’ll be home for dinner”', - 'guideSmsInput': 'Text Dad: I’ll be home for dinner', - 'guideSmsSend': 'Lily will send the message', - 'guideSmsEnd': 'Message sent—voice control is convenient', + 'Recite Lily: „Kreiraj podsetnik za sastanak sutra u 15h"', + 'guideMeetingInput': 'Kreiraj podsetnik za sastanak sutra u 15h', + 'guideMeetingSend': 'Lily će kreirati podsetnik za sastanak', + 'guideMeetingEnd': 'Podsetnik je kreiran — probajte druge komande', + 'guidePhoneStart': 'Recite Lily: „Pozovi mamu"', + 'guidePhoneInput': 'Pozovi mamu', + 'guidePhoneSend': 'Lily će obaviti poziv', + 'guidePhoneEnd': 'Poziv je upućen — probajte druge komande', + 'guideSmsStart': 'Recite Lily: „Pošalji tati poruku: Dolazim na večeru"', + 'guideSmsInput': 'Pošalji tati poruku: Dolazim na večeru', + 'guideSmsSend': 'Lily će poslati poruku', + 'guideSmsEnd': 'Poruka je poslata — glasovna kontrola je praktična', // Meeting模块 - 首页与导航 "startMeeting": "Započni sastanak", @@ -462,38 +490,38 @@ const Map srRS = { 'recordingDetails': 'Detalji snimka', 'aiSummary': 'AI sažetak', 'meetingTranscript': 'Transkript sastanka', - 'files': 'Files', - 'mine': 'Mine', - 'connect': 'Connect', - 'allFiles': 'All Files', - 'searchInAllFiles': 'Search in all files', - 'from': 'From', - 'sortBy': 'Sort by', - 'creationTime': 'Creation Time', - 'bluetoothConnection': 'Bluetooth Connection', - 'meetingReconnect': 'Reconnect', - 'searching': 'Searching...', - 'searchFailed': 'Search failed, please check if Bluetooth is enabled', - 'aiPenNotFound': 'AI PEN device not found', - 'connectedToAiPen': 'Connected to AI PEN device', - 'checkingNewFiles': 'Checking for new files to import', - 'startingWifi': 'Starting Wi-Fi...', - 'newFilesDetected': 'New files detected, preparing to import', - 'noNewFiles': 'No new files to import', - 'connectingWifi': 'Connecting to Wi-Fi...', - 'wifiConnected': 'Wi-Fi connected successfully', - 'downloadingFiles': 'Downloading files...', - 'downloadingFileProgress': 'Total {total} files, downloading file {current}', - 'downloadComplete': 'Download complete', + 'files': 'Datoteke', + 'mine': 'Moje', + 'connect': 'Poveži', + 'allFiles': 'Sve datoteke', + 'searchInAllFiles': 'Pretraga u svim datotekama', + 'from': 'Od', + 'sortBy': 'Sortiraj po', + 'creationTime': 'Vreme kreiranja', + 'bluetoothConnection': 'Bluetooth veza', + 'meetingReconnect': 'Ponovo poveži', + 'searching': 'Pretraga...', + 'searchFailed': 'Pretraga nije uspela, proverite da li je Bluetooth uključen', + 'aiPenNotFound': 'AI PEN uređaj nije pronađen', + 'connectedToAiPen': 'Povezano sa AI PEN uređajem', + 'checkingNewFiles': 'Provera novih datoteka za uvoz', + 'startingWifi': 'Pokretanje Wi-Fi-ja...', + 'newFilesDetected': 'Nove datoteke otkrivene, priprema za uvoz', + 'noNewFiles': 'Nema novih datoteka za uvoz', + 'connectingWifi': 'Povezivanje sa Wi-Fi-jem...', + 'wifiConnected': 'Wi-Fi uspešno povezan', + 'downloadingFiles': 'Preuzimanje datoteka...', + 'downloadingFileProgress': 'Ukupno {total} datoteka, preuzimanje datoteke {current}', + 'downloadComplete': 'Preuzimanje završeno', 'downloadCompleteInfo': - 'Download complete, {count} files in total, returning automatically in 2 seconds', + 'Preuzimanje završeno, ukupno {count} datoteka, automatsko vraćanje za 2 sekunde', // Meeting模块 - 录音功能 - 'startRecording': 'Start Recording', - 'liveRecording': 'Live Recording', - 'audioVideoRecording': 'Audio/Video Recording', - 'callRecording': 'Call Recording', - 'importAudio': 'Import Audio', + 'startRecording': 'Započni snimanje', + 'liveRecording': 'Snimanje uživo', + 'audioVideoRecording': 'Audio/video snimanje', + 'callRecording': 'Snimanje poziva', + 'importAudio': 'Uvoz zvuka', 'meetingRecordExitTitle': 'Izađi iz snimanja', // 退出录音 'meetingRecordExitMessage': 'Izaberite radnju nakon izlaska', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Završi i sačuvaj', // 结束录音并保存 @@ -515,223 +543,225 @@ const Map srRS = { 'Da bismo tokom snimanja prikazali plutajuću traku snimanja (tajmer/pauza/nastavi), potrebna nam je dozvola za prekrivanje.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 'overlayPermissionOpenSettingsFailed': 'Nije moguće automatski otvoriti sistemska podešavanja. Otvorite Podešavanja i ručno omogućite dozvolu za prekrivanje.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 - 'transcribing': 'Transcribing...', - 'summarizing': 'Summarizing...', - 'analyzing': 'Analyzing...', - 'summaryComplete': 'Summary Complete', - 'generate': 'Generate', - 'overview': 'Overview', - 'transcription': 'Transcription', - 'summary': 'Summary', - 'mindMap': 'Mind Map', - 'editSpeaker': 'Edit', - 'nameSpeaker': 'Name Speaker', + 'transcribing': 'Transkripcija...', + 'summarizing': 'Sažimanje...', + 'analyzing': 'Analiziranje...', + 'summaryComplete': 'Sažetak završen', + 'generate': 'Generiši', + 'overview': 'Pregled', + 'transcription': 'Transkripcija', + 'summary': 'Sažetak', + 'mindMap': 'Mentalna mapa', + 'editSpeaker': 'Uredi', + 'nameSpeaker': 'Imenuj govornika', // Meeting模块 - 转写与总结 - 'reSummarize': 'Re-summarize', - 'dateAndTime': 'Date & Time', - 'location': 'Location', - 'attendees': 'Attendees', - 'inputLocation': 'Enter Location', - 'inputAttendees': 'Enter Attendees', + 'reSummarize': 'Ponovo sažmi', + 'dateAndTime': 'Datum i vreme', + 'location': 'Lokacija', + 'attendees': 'Učesnici', + 'inputLocation': 'Unesite lokaciju', + 'inputAttendees': 'Unesite učesnike', // Meeting模块 - 模版与生成 - 'selectSummaryTemplate': 'Select Summary Template', - 'useThisTemplate': 'Use This Template', - 'lastUsed': 'Last Used', - 'create': 'Kreiraj', - 'templateDetails': 'Detalji šablona', - 'tag': 'Oznaka', - 'description': 'Opis', - 'template': 'Šablon', - 'deleteTemplate': 'Obriši šablon', - 'deleteTemplateConfirm': 'Da li ste sigurni da želite da obrišete ovaj šablon?', - 'editTemplate': 'Uredi šablon', - 'createTemplate': 'Kreiraj šablon', - 'name': 'Ime', - 'templateContentHint': 'Molimo unesite sadržaj šablona! Savet: Kliknite na AI dugme iznad da brzo generišete sadržaj šablona na osnovu imena i opisa koje ste uneli', - 'inputNameHint': 'Molimo unesite ime', - 'inputDescHint': 'Molimo unesite opis', - 'custom': 'Prilagođeno', - 'pleaseEnter': 'Молимо унесите', - 'viewAll': 'View All', - 'recordingLanguage': 'Recording Language', - 'chineseSimplified': 'Chinese Mandarin (Simplified)', - 'meetingGenerateNow': 'Generate Now', - 'keyEventsAnalyzed': 'Analyzed {count} key events.', + 'selectSummaryTemplate': 'Izaberite šablon sažetka', + 'useThisTemplate': 'Koristi ovaj šablon', + 'lastUsed': 'Poslednje korišćeno', + 'create': 'Kreiraj', + 'templateDetails': 'Detalji šablona', + 'tag': 'Oznaka', + 'description': 'Opis', + 'template': 'Šablon', + 'deleteTemplate': 'Obriši šablon', + 'deleteTemplateConfirm': + 'Da li ste sigurni da želite da obrišete ovaj šablon?', + 'editTemplate': 'Uredi šablon', + 'createTemplate': 'Kreiraj šablon', + 'name': 'Ime', + 'templateContentHint': + 'Molimo unesite sadržaj šablona! Savet: Kliknite na AI dugme iznad da brzo generišete sadržaj šablona na osnovu imena i opisa koje ste uneli', + 'inputNameHint': 'Molimo unesite ime', + 'inputDescHint': 'Molimo unesite opis', + 'custom': 'Prilagođeno', + 'pleaseEnter': 'Молимо унесите', + 'viewAll': 'Prikaži sve', + 'recordingLanguage': 'Jezik snimanja', + 'chineseSimplified': 'Kineski mandarinski (pojednostavljeni)', + 'meetingGenerateNow': 'Generiši odmah', + 'keyEventsAnalyzed': 'Analizirano {count} ključnih događaja.', 'aiAnalysisDesc': - 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', + 'AI analiza prepoznaje ključne događaje u snimcima, omogućavajući vam da izaberete važne događaje za AI generisanje.', // Meeting模块 - 文件操作 - 'importing': 'Importing...', - 'batchImporting': 'Batch importing...', - 'importingLocalRecordings': 'Importing local recordings...', - 'importFailed': 'Import file failed: {filePath}, error: {error}', - 'importSuccess': 'Successfully imported {count} local recordings', - 'importError': 'Import failed: {error}', - 'pleaseSelectAudioFile': 'Please select audio file', - 'shareAudio': 'Share Meeting Audio', - 'shareComplete': 'Share complete!', - 'shareFailed': 'Share failed: {error}', - 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', + 'importing': 'Uvoz...', + 'batchImporting': 'Grupni uvoz...', + 'importingLocalRecordings': 'Uvoz lokalnih snimaka...', + 'importFailed': 'Uvoz datoteke nije uspeo: {filePath}, greška: {error}', + 'importSuccess': 'Uspešno uvezeno {count} lokalnih snimaka', + 'importError': 'Uvoz nije uspeo: {error}', + 'pleaseSelectAudioFile': 'Molimo izaberite audio datoteku', + 'shareAudio': 'Podeli audio sastanka', + 'shareComplete': 'Deljenje završeno!', + 'shareFailed': 'Deljenje nije uspelo: {error}', + 'fileProcessingFailed': 'Obrada datoteke nije uspela: {filePath}, greška: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Sačuvaj mentalnu mapu', - 'shareMindMap': 'Share Mind Map', - 'shareSuccess': 'Share Success', + 'saveMindMap': 'Sačuvaj mentalnu mapu', + 'shareMindMap': 'Podeli mentalnu mapu', + 'shareSuccess': 'Deljenje uspešno', // Meeting模块 - AI问答 - 'askAI': 'Ask AI ...', - 'askAIPrompt': 'What can I help you with today?', - 'continueAsk': 'Continue Asking', - 'todoList': 'To-Do List', - 'extractConclusion': 'Extract Conclusion', - 'generateKeyIndicators': 'Generate Key Indicators', + 'askAI': 'Pitajte AI ...', + 'askAIPrompt': 'Kako vam mogu pomoći danas?', + 'continueAsk': 'Nastavi sa pitanjima', + 'todoList': 'Lista obaveza', + 'extractConclusion': 'Izdvoji zaključak', + 'generateKeyIndicators': 'Generiši ključne pokazatelje', // Meeting模块 - 分享与导出 - 'shareLink': 'Share Link', - 'copyTranscript': 'Copy Transcript', - 'copySummary': 'Copy Summary', - 'exportAudio': 'Export Audio', - 'exportTranscript': 'Export Transcript', - 'shareMeetingAudio': 'Share Meeting Audio', - 'exportSummary': 'Export Summary', - 'exportAs': 'Export As', - 'exportingPDF': 'Exporting PDF...', - 'export': 'Izvezi', + 'shareLink': 'Podeli link', + 'copyTranscript': 'Kopiraj transkript', + 'copySummary': 'Kopiraj sažetak', + 'exportAudio': 'Izvezi zvuk', + 'exportTranscript': 'Izvezi transkript', + 'shareMeetingAudio': 'Podeli audio sastanka', + 'exportSummary': 'Izvezi sažetak', + 'exportAs': 'Izvezi kao', + 'exportingPDF': 'Izvoz PDF-a...', + 'export': 'Izvezi', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Primeni na sve pasuse ovog govornika', 'summaryWillBeUpdatedAutomatically': 'Sažetak će se automatski ažurirati prema šablonu', - 'nameCurrentSpeaker': 'Name Current Speaker', - 'recentlyUsedNames': 'Recently Used Names', - 'applyToCurrentParagraph': 'Apply to Current Paragraph', - 'totalTime': 'Total Time', + 'nameCurrentSpeaker': 'Imenuj trenutnog govornika', + 'recentlyUsedNames': 'Nedavno korišćena imena', + 'applyToCurrentParagraph': 'Primeni na trenutni pasus', + 'totalTime': 'Ukupno vreme', 'summarySpeakerWillBeUpdatedAutomatically': - 'Summary speakers will be updated automatically', + 'Govornici u sažetku će biti automatski ažurirani', // Meeting模块 - 云端同步 - 'syncToCloud': 'Sync to Cloud', + 'syncToCloud': 'Sinhronizuj u oblak', 'syncToCloudTip': - '自动将你的录音同步到云端,你可以通过任意VOITRANS APP或VOITRANS Web(web.voitrans.com)播放、管理和分享录音。', - 'syncToVoitransApp': 'Sync VOITRANS APP', - 'transcriptionRecord': 'Transcription Record', + 'Automatski sinhronizujte snimke u oblak, možete ih reprodukovati, upravljati njima i deliti ih putem bilo koje VOITRANS aplikacije ili VOITRANS Web-a (web.voitrans.com).', + 'syncToVoitransApp': 'Sinhronizuj VOITRANS APP', + 'transcriptionRecord': 'Zapis transkripcije', // Meeting模块 - 我的页面 - 'transcriptionRecords': 'Transcription Records', - 'templateCommunity': 'Template Community', - 'comingSoon': 'Coming Soon', - 'integration': 'Integration', - 'voitransPrivateCloud': 'VOITRANS PRIVATE CLOUD', - 'enabled': 'Enabled', - 'disabled': 'Disabled', - 'myVoitransDevice': 'My VOITRANS Device', - 'helpAndFeedback': 'Help & Feedback', - 'aboutVoitrans': 'About VOITRANS', - 'meetingDays': 'Days', - 'meetingHours': 'Hours', - 'voitransAiMember': 'Voitrans AI Member', - 'unlockStarterMember': 'Unlock Starter Member', - 'bindDeviceToActivate': 'Bind Voitrans device to activate Starter membership', - 'unlockNow': 'Unlock Now', + 'transcriptionRecords': 'Zapisi transkripcije', + 'templateCommunity': 'Zajednica šablona', + 'comingSoon': 'Uskoro', + 'integration': 'Integracija', + 'voitransPrivateCloud': 'VOITRANS PRIVATNI OBLAK', + 'enabled': 'Omogućeno', + 'disabled': 'Onemogućeno', + 'myVoitransDevice': 'Moj VOITRANS uređaj', + 'helpAndFeedback': 'Pomoć i povratne informacije', + 'aboutVoitrans': 'O VOITRANS-u', + 'meetingDays': 'Dana', + 'meetingHours': 'Sati', + 'voitransAiMember': 'Voitrans AI član', + 'unlockStarterMember': 'Otključajte početno članstvo', + 'bindDeviceToActivate': 'Povežite Voitrans uređaj da aktivirate početno članstvo', + 'unlockNow': 'Otključaj sada', // Meeting模块 - 会员与升级 - 'comparison': 'Comparison', - 'detailedInfo': 'Detailed Information', - 'monthlyTranscriptionTime': 'Monthly Transcription Time', - 'unlimited': 'Unlimited', - 'professionalTemplates': 'Professional Templates', - 'limited': 'Limited', - 'fullTemplates': 'Full Templates', - 'professionalTerms': 'Professional Terms', - 'customTemplates': 'Custom Templates', - 'visualMindMap': 'Visual Mind Map', - 'speakerIdentification': 'Speaker Identification', - 'aiVoiceEnhancement': 'AI Voice Enhancement', - 'audioImport': 'Audio Import', - 'multipleExportFormats': 'Multiple Export Formats', - 'professionalSummaryTemplates': 'Professional Summary Templates', + 'comparison': 'Poređenje', + 'detailedInfo': 'Detaljne informacije', + 'monthlyTranscriptionTime': 'Mesečno vreme transkripcije', + 'unlimited': 'Neograničeno', + 'professionalTemplates': 'Profesionalni šabloni', + 'limited': 'Ograničeno', + 'fullTemplates': 'Svi šabloni', + 'professionalTerms': 'Profesionalni termini', + 'customTemplates': 'Prilagođeni šabloni', + 'visualMindMap': 'Vizuelna mentalna mapa', + 'speakerIdentification': 'Identifikacija govornika', + 'aiVoiceEnhancement': 'AI poboljšanje glasa', + 'audioImport': 'Uvoz zvuka', + 'multipleExportFormats': 'Više formata izvoza', + 'professionalSummaryTemplates': 'Profesionalni šabloni za sažetke', 'professionalTemplateDesc': - 'Professional template design to improve your work efficiency. Customized according to industry needs.', + 'Profesionalni dizajn šablona za poboljšanje efikasnosti vašeg rada. Prilagođeni prema potrebama industrije.', 'customTemplateDesc': - 'You can customize summary prompts according to your needs and use them to generate the required summaries.', + 'Možete prilagoditi uputstva za sažetak prema vašim potrebama i koristiti ih za generisanje potrebnih sažetaka.', 'askAiDesc': - 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', + 'Inteligentno izdvajanje dubljih informacija iz snimaka, generisanje tabela podataka, ključnih zaključaka diskusije, liste obaveza, izveštaja e-pošte i drugog formatiranog sadržaja jednim klikom.', 'visualMindMapDesc': - 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', + 'Izvan sažetaka — organizujte i vizualizujte ključne tačke pomoću mentalnih mapa za efikasnije razumevanje celog teksta.', 'templateCommunityDesc': - 'Discover, share, and get inspiration from the template library created by users.', + 'Otkrijte, podelite i dobijte inspiraciju iz biblioteke šablona kreiranih od strane korisnika.', 'speakerIdentificationDesc': - 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', + 'Audio transkripcija će podržavati identifikaciju govornika, intuitivnije rekonstruisanje sadržaja sastanka ili telefonskog poziva. Istovremeno, sažetak će biti precizniji.', 'privateCloudSyncDesc': - 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', + 'Vaši snimci i transkripcije biće bezbedno pohranjeni na namenskim serverima u oblaku, sa potpunom enkripcijom tokom slanja i preuzimanja kako bi se osigurala privatnost i bezbednost.', 'aiVoiceEnhancementDesc': - 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', + 'AI poboljšanje glasa podržava više podešavanja za smanjenje buke, inteligentno eliminiše pozadinsku buku, poboljšava jasnoću glasa i kvalitet reprodukcije zvuka.', 'audioImportDesc': - 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', + 'Lako uvezite audio datoteke iz lokalne memorije ili aplikacija trećih strana, kao što su glasovne beleške, Google Drive, itd.', 'multipleExportFormatsDesc': - 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', - 'upgradeMembership': 'Upgrade Your Membership', - 'yearlySubscription': 'Yearly Subscription', - 'monthlySubscription': 'Monthly Subscription', - 'proMonthly': 'Pro ¥60/month', + 'Izvezite audio snimke, tekst transkripcije i sažetke u raznim formatima (TXT, PDF, JPEG) kako biste zadovoljili vaše potrebe.', + 'upgradeMembership': 'Nadogradite svoje članstvo', + 'yearlySubscription': 'Godišnja pretplata', + 'monthlySubscription': 'Mesečna pretplata', + 'proMonthly': 'Pro ¥60/mesec', 'proMonthlyDesc': - '7-day free trial, then ¥800/year. Cancel anytime before trial ends.', - 'sevenDayTrial': '7-day Free Trial', - 'unlimitedMonthly': 'Unlimited ¥120/month', + '7-dnevni besplatni probni period, zatim ¥800/godišnje. Otkažite bilo kada pre isteka probnog perioda.', + 'sevenDayTrial': '7-dnevni besplatni probni period', + 'unlimitedMonthly': 'Neograničeno ¥120/mesec', 'unlimitedMonthlyDesc': - '7-day free trial, then ¥1600/year. Cancel anytime before trial ends.', - 'trialNote': '*Free trial for 7 days, then charged annually, cancel anytime.', + '7-dnevni besplatni probni period, zatim ¥1600/godišnje. Otkažite bilo kada pre isteka probnog perioda.', + 'trialNote': '*Besplatni probni period 7 dana, zatim se naplaćuje godišnje, otkažite bilo kada.', 'proPrice': 'Pro ¥120', - 'proMonthlyPrice': '¥120/month', - 'subscribe': 'Subscribe', - 'unlimitedPrice': 'Unlimited ¥198', - 'unlimitedMonthlyPrice': '¥198/month', + 'proMonthlyPrice': '¥120/mesec', + 'subscribe': 'Pretplati se', + 'unlimitedPrice': 'Neograničeno ¥198', + 'unlimitedMonthlyPrice': '¥198/mesec', 'upgradeNote': - '*After upgrading subscription, the remaining days of the original subscription will be automatically calculated and refunded to your payment account', - 'buyMoreTranscriptionTime': 'Buy More Transcription Time', - 'sixThousandMinutes': '6,000 minutes', - 'threeThousandMinutes': '3,000 minutes', - 'sixHundredMinutes': '600 minutes', - 'oneHundredTwentyMinutes': '120 minutes', - 'validityPeriod': '*Validity Period: ', + '*Nakon nadogradnje pretplate, preostali dani originalne pretplate biće automatski izračunati i vraćeni na vaš račun za plaćanje', + 'buyMoreTranscriptionTime': 'Kupite više vremena za transkripciju', + 'sixThousandMinutes': '6.000 minuta', + 'threeThousandMinutes': '3.000 minuta', + 'sixHundredMinutes': '600 minuta', + 'oneHundredTwentyMinutes': '120 minuta', + 'validityPeriod': '*Period važenja: ', 'validityNote': - 'Activated immediately after purchase, valid for 2 years after activation.', - 'purchase': 'Purchase', + 'Aktivira se odmah nakon kupovine, važi 2 godine nakon aktivacije.', + 'purchase': 'Kupi', // Meeting模块 - 录音语言 - 'recordLanguage': 'Recording Language', - 'cantonese': 'Cantonese', - 'sichuan': 'Sichuan Dialect', - 'shanghai': 'Shanghai Dialect', + 'recordLanguage': 'Jezik snimanja', + 'cantonese': 'Kantonski', + 'sichuan': 'Sečuanski dijalekt', + 'shanghai': 'Šangajski dijalekt', // Meeting模块 - 错误提示 - 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Analiza nije uspela, pokušajte ponovo kasnije', - 'transcriptionFailed': 'Transkripcija nije uspela, pokušajte ponovo kasnije', - 'summaryFailed': 'Sažetak nije uspeo, pokušajte ponovo kasnije', - 'summaryFailedShort': 'Sažetak nije uspeo', - 'transcriptionFailedShort': 'Transkripcija nije uspela', + 'meetingUnknownLanguage': 'Nepoznat jezik', + 'analysisFailed': 'Analiza nije uspela, pokušajte ponovo kasnije', + 'transcriptionFailed': 'Transkripcija nije uspela, pokušajte ponovo kasnije', + 'summaryFailed': 'Sažetak nije uspeo, pokušajte ponovo kasnije', + 'summaryFailedShort': 'Sažetak nije uspeo', + 'transcriptionFailedShort': 'Transkripcija nije uspela', // Meeting模块 - 播放器 - 'playerNotReady': 'Audio plejer nije spreman, molimo sačekajte', - 'playFailed': 'Reprodukcija nije uspela', - 'audioFileNotFound': 'Audio datoteka nije pronađena', - 'fetchingAudio': 'Preuzimanje audio zapisa iz oblaka...', - 'playerLoadFailed': 'Audio plejer nije uspeo da se učita', + 'playerNotReady': 'Audio plejer nije spreman, molimo sačekajte', + 'playFailed': 'Reprodukcija nije uspela', + 'audioFileNotFound': 'Audio datoteka nije pronađena', + 'fetchingAudio': 'Preuzimanje audio zapisa iz oblaka...', + 'playerLoadFailed': 'Audio plejer nije uspeo da se učita', // 设置页 "systemSettings": "Sistemska podešavanja", - "vipRecharge": "Nákup premium člana", + "vipRecharge": "Kupovina premium članstva", "aiRecharge": "Premium član", - "translationRecharge": "Nákup prevajanja", - "meetingAssistantRecharge": "Nákup asistenta sastanka", - "cloudSync": "Nákup sinkronizacije u oblaku", - "memberService": "Member Service", - "bindRewardTitle": "Rewards", + "translationRecharge": "Kupovina prevođenja", + "meetingAssistantRecharge": "Kupovina asistenta sastanka", + "cloudSync": "Kupovina sinhronizacije u oblaku", + "memberService": "Usluga za članove", + "bindRewardTitle": "Nagrade", "bindRewardSimpleDesc": - "First bind device reward has been issued. Tap OK to close.", + "Nagrada za prvo povezivanje uređaja je dodeljena. Dodirnite OK da zatvorite.", "joinDevice": "Povezan uređaj:", "accountId": "ID naloga:", "systemSetting": "Sistemsko podešavanje", @@ -781,19 +811,19 @@ const Map srRS = { "loading": "Učitavanje...", // 设备管理模块 - "deviceTypeUnknown": "Unknown Device", - "deviceTypeClassicBluetoothHeadset": "Classic Bluetooth Headset", - "deviceTypeBleBluetoothHeadset": "BLE Bluetooth Headset", - "deviceTypeSmartVoiceRecorder": "Smart Voice Recorder", - "deviceTypeSmartEye": "Smart Glasses", + "deviceTypeUnknown": "Nepoznat uređaj", + "deviceTypeClassicBluetoothHeadset": "Klasične Bluetooth slušalice", + "deviceTypeBleBluetoothHeadset": "BLE Bluetooth slušalice", + "deviceTypeSmartVoiceRecorder": "Pametni diktafon", + "deviceTypeSmartEye": "Pametne naočare", "unbind": "Prekini vezu", - "noDevicesBound": "No devices bound yet", - "pleaseBindDeviceFirst": "Please bind a device first to manage", - "noMacAddress": "No MAC Address", - "licenseCode": "License Code", - "confirmUnbind": "Confirm Unbind", - "confirmUnbindMessage": "Are you sure you want to unbind device \\", - "confirmUnbindAction": "Confirm Unbind", + "noDevicesBound": "Još nema povezanih uređaja", + "pleaseBindDeviceFirst": "Prvo povežite uređaj za upravljanje", + "noMacAddress": "Nema MAC adrese", + "licenseCode": "Licencni kod", + "confirmUnbind": "Potvrdite prekid veze", + "confirmUnbindMessage": "Da li ste sigurni da želite da prekinete vezu sa uređajem \\", + "confirmUnbindAction": "Potvrdi prekid veze", // Agent模块 - 主界面 "Lily": "Lily", @@ -823,30 +853,31 @@ const Map srRS = { "loadMoreMessages": "Učitaj još poruka...", "loadFailedClickRetry": "Neuspešno učitavanje, kliknite da pokušate ponovo", "swipeUpForMore": "Prevucite nagore za više", - "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! - "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Kada je uključeno: AI neće biti prekinut vašim glasom dok govori i može da obradi samo jedan krug razgovora. Da biste započeli novi krug, samo izgovorite reč za buđenje.', + "callingTool": "Pomažem vam, molimo sačekajte!", // 正在帮您,请稍等! + "voice_interrupt": "Prekid", // 语音打断 + 'voice_interrupt_tip': + 'Kada je uključeno: AI neće biti prekinut vašim glasom dok govori i može da obradi samo jedan krug razgovora. Da biste započeli novi krug, samo izgovorite reč za buđenje.', // Agent模块 - 预设提示词 - "presetMusic": "Play some music", // 来点音乐 - "presetNavigation": "Navigation to", // 导航 - "presetWeather": "Today's weather", // 今日天气 - "presetNews": "Today's news", // 今日新闻 - "presetFood": "Nearby food", // 美食 - "playSomeMusic": "Play some popular music", // 播放一些流行音乐 - "navigationTo": "Please help me navigate to", // 导航到 - "todayWeather": "How's the weather today?", // 今日天气 - "todayNews": "What's the news today?", // 今日新闻 - "nearbyFood": "What delicious food is nearby?", // 美食 + "presetMusic": "Pusti muziku", // 来点音乐 + "presetNavigation": "Navigacija do", // 导航 + "presetWeather": "Današnje vreme", // 今日天气 + "presetNews": "Današnje vesti", // 今日新闻 + "presetFood": "Hrana u blizini", // 美食 + "playSomeMusic": "Pusti popularnu muziku", // 播放一些流行音乐 + "navigationTo": "Molim vas navigirajte me do", // 导航到 + "todayWeather": "Kakvo je vreme danas?", // 今日天气 + "todayNews": "Koje su vesti danas?", // 今日新闻 + "nearbyFood": "Koja ukusna hrana je u blizini?", // 美食 // Agent模块 - 欢迎消息与权限 - 'welcomeMessage': '你好!我是**Lily**,我能帮你:\n\n' - '• 回答问题和提供信息\n\n' - '• 实时语音翻译\n\n' - '• 推荐音乐和播客\n\n' - '• 语音备忘录和提醒\n\n' - '• 控制耳机功能\n\n' - '有什么我可以帮你的吗?', + 'welcomeMessage': 'Zdravo! Ja sam **Lily**, mogu vam pomoći sa:\n\n' + '• Odgovaranje na pitanja i pružanje informacija\n\n' + '• Glasovno prevođenje u realnom vremenu\n\n' + '• Preporuke muzike i podkastova\n\n' + '• Glasovni podsetnici i beleške\n\n' + '• Kontrola funkcija slušalica\n\n' + 'Kako vam mogu pomoći?', 'microphonePermission': 'Mikrofon', 'voiceRecognitionPermissionText': 'Funkcija prepoznavanja govora zahteva pristup mikrofonu.', @@ -881,6 +912,13 @@ const Map srRS = { 'Želimo da znamo razlog vaše prijave, možete opisati problem sa kojim ste se suočili.', 'generatedByAi': 'Generisano od strane AI', + // Agent模块 - 工具调用 + 'toolCall': 'Poziv alata', + 'noResult': 'Nema rezultata', + 'noToolCallContentToCopy': 'Nema sadržaja poziva alata za kopiranje', + 'toolCallDetails': 'Detalji poziva alata:', + 'toolCallContentCopied': 'Sadržaj poziva alata kopiran u međuspremnik', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Evo nekoliko preporučenih pesama:', 'playList': 'Lista pesama', @@ -901,6 +939,29 @@ const Map srRS = { "bicycling": "Biciklizam", "tsransit": "Javni prevoz", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Izaberite navigacionu aplikaciju', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigiraj pomoću Amap-a', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigiraj pomoću Baidu Maps-a', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigiraj pomoću Google Maps-a', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigiraj pomoću Apple Maps-a', + 'builtInNavigation': 'Ugrađena navigacija', + 'useBuiltInNavigation': 'Navigiraj pomoću ugrađene mape', + 'navigationStartFailed': 'Pokretanje navigacije nije uspelo', + 'cannotPlayMusicListRetryLater': + 'Nije moguće reprodukovati listu pesama, pokušajte ponovo kasnije', + 'cannotPlaySong': 'Nije moguće reprodukovati pesmu', + 'openMapError': 'Greška pri otvaranju mape', + 'pleaseInstallAmapApp': 'Molimo prvo instalirajte Amap aplikaciju', + 'pleaseInstallBaiduMapApp': 'Molimo prvo instalirajte Baidu Maps aplikaciju', + 'appleMapStartFailed': 'Apple Maps nije uspeo da se pokrene', + 'appleMapUnavailable': 'Apple Maps nije dostupan', + 'openAppleMapError': 'Greška pri otvaranju Apple Maps-a', + // Agent模块 - 天气卡片 'weatherQuery': 'Upit o vremenskim uslovima:', 'highest': 'Najviša', @@ -953,8 +1014,8 @@ const Map srRS = { "strongWind": "Jak vetar", // 翻译模块 - 中间层 - "pictureTranslation": "Picture Translation", - "textTranslation": "Text Translation", + "pictureTranslation": "Prevod slike", + "textTranslation": "Prevod teksta", // 翻译模块 - 主页 "translationHistory": "Istorija prevođenja", @@ -964,22 +1025,33 @@ const Map srRS = { "phoneUser": "Korisnik telefona", "selectSourceLanguage": "Izaberi izvorni jezik", "selectTargetLanguage": "Izaberi ciljni jezik", - "me": "Me", - "counterPart": "Counterpart", + "me": "Ja", + "counterPart": "Sagovornik", "bluetoothCallStateError": - "Please make sure the Bluetooth headset is connected to the phone and in a call state", - "autoDetect": "Auto Detect", // 自动检测 + "Uverite se da su Bluetooth slušalice povezane sa telefonom i u stanju poziva", + "autoDetect": "Automatska detekcija", // 自动检测 // 翻译模块 - 文本翻译 - "languageDetectionFailed": "Language detection failed", - "translationFailed": "Translation failed", - "pleaseInputText": "Please input text", - "textTooLong": "Text too long, max 5000 characters", + "languageDetectionFailed": "Detekcija jezika nije uspela", + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Onemogući plutajući prozor', + 'enableFloatingWindow': 'Omogući plutajući prozor', + 'permissionTip': 'Savet o dozvoli', + 'micPermissionRequiredForRecording': + 'Dozvola za mikrofon je potrebna za snimanje', + 'deleteTranslationRecordError': 'Greška pri brisanju zapisa prevoda: @error', + "translationFailed": "Prevod nije uspeo", + "translating": "Prevođenje", + "translate": "Prevedi", + "pleaseInputText": "Molimo unesite tekst", + "inputTextToTranslate": "Unesite tekst za prevod", + "textTooLong": "Tekst je predugačak, maksimalno 5000 karaktera", // 翻译模块 - 历史记录 "noTranslationHistory": "Nema istorije", - "historyRecords": "History Records", - "clearResults": "Clear Results", + "historyRecords": "Istorijski zapisi", + "clearResults": "Obriši rezultate", "clearHistory": "Obriši istoriju", "clearHistoryConfirm": "Da li ste sigurni da želite da obrišete celu istoriju prevođenja? Ova radnja se ne može opozvati.", @@ -989,55 +1061,55 @@ const Map srRS = { "Da li ste sigurni da želite da obrišete sve zapise prevođenja za ovu sesiju? Ova radnja se ne može opozvati.", // 翻译模块 - 图片翻译 - "selectImageSource": "Select Image Source", - "imagePreview": "Image Preview", - "translationResult": "Translation Result", - "recognitionResult": "Recognition Result", - "translatedImagePreview": "Translated Image Preview", - "translatedImageLoadFailed": "Failed to load translated image", - "pleaseSelectImage": "Please select an image", - "imageLoadFailed": "Image load failed", - "imageQuality": "Image Quality", - "maxSize": "Max Size", - "close": "Close", - "setImageQuality": "Set Image Quality", - "currentQuality": "Current quality: @value%", - "setMaxSize": "Set Max Size", - "currentMaxSize": "Current: @pxpx", - "waitingForAction": "Waiting for action", - "pleaseSelectImageToStart": "Please select an image to start", - "chooseImage": "Choose Image", - "openingCamera": "Opening camera...", - "openingPhotoAlbum": "Opening photo album...", - "cancelled": "Cancelled", - "userCancelledSelection": "User cancelled selection", - "translatingImage": "Translating Image", - "callingImageTranslateService": "Calling image translation service...", - "savingRecord": "Saving Record", - "savingTranslationResult": "Saving translation result...", - "translationCompleted": "Translation Completed", - "allStepsCompleted": "All steps completed", - "processingFailed": "Processing Failed", + "selectImageSource": "Izaberite izvor slike", + "imagePreview": "Pregled slike", + "translationResult": "Rezultat prevoda", + "recognitionResult": "Rezultat prepoznavanja", + "translatedImagePreview": "Pregled prevedene slike", + "translatedImageLoadFailed": "Učitavanje prevedene slike nije uspelo", + "pleaseSelectImage": "Molimo izaberite sliku", + "imageLoadFailed": "Učitavanje slike nije uspelo", + "imageQuality": "Kvalitet slike", + "maxSize": "Maksimalna veličina", + "close": "Zatvori", + "setImageQuality": "Podesi kvalitet slike", + "currentQuality": "Trenutni kvalitet: @value%", + "setMaxSize": "Podesi maksimalnu veličinu", + "currentMaxSize": "Trenutno: @pxpx", + "waitingForAction": "Čekanje na radnju", + "pleaseSelectImageToStart": "Molimo izaberite sliku za početak", + "chooseImage": "Izaberite sliku", + "openingCamera": "Otvaranje kamere...", + "openingPhotoAlbum": "Otvaranje albuma...", + "cancelled": "Otkazano", + "userCancelledSelection": "Korisnik je otkazao izbor", + "translatingImage": "Prevođenje slike", + "callingImageTranslateService": "Pozivanje servisa za prevod slike...", + "savingRecord": "Čuvanje zapisa", + "savingTranslationResult": "Čuvanje rezultata prevoda...", + "translationCompleted": "Prevod završen", + "allStepsCompleted": "Svi koraci su završeni", + "processingFailed": "Obrada nije uspela", "imageProcessingOrTranslationFailed": - "Image processing or translation failed. Please retry.\nError: {error}", - "imageTooLarge": "Image size exceeds 4MB limit", + "Obrada slike ili prevod nije uspeo. Pokušajte ponovo.\nGreška: {error}", + "imageTooLarge": "Veličina slike premašuje ograničenje od 4MB", "imageTooLargeHint": - "Image size exceeds 4MB. Reduce quality or dimensions and retry", - "emptyTranslationResult": "Image translation API returned empty result", + "Veličina slike premašuje 4MB. Smanjite kvalitet ili dimenzije i pokušajte ponovo", + "emptyTranslationResult": "API za prevod slike vratio je prazan rezultat", "imageTranslationFailedTryLater": - "Image translation failed. Network issue or rate limit. Please try later", + "Prevod slike nije uspeo. Problem sa mrežom ili ograničenje brzine. Pokušajte kasnije", "imageTranslationApiException": - "Image translation API exception. Check network and retry", - "permissionRequired": "Permission Required", - "cameraPermissionRequired": "Camera permission required to take photos", + "Izuzetak API-ja za prevod slike. Proverite mrežu i pokušajte ponovo", + "permissionRequired": "Potrebna dozvola", + "cameraPermissionRequired": "Dozvola za kameru je potrebna za fotografisanje", "photoAlbumPermissionRequired": - "Photo album permission required to pick images", - "translationDetails": "Translation Details", - "originalImage": "Original Image", - "sourceLanguage": "Source Language", - "targetLanguage": "Target Language", - "translationTime": "Translation Time", - "shareInDevelopment": "Sharing feature under development", + "Dozvola za album je potrebna za izbor slika", + "translationDetails": "Detalji prevoda", + "originalImage": "Originalna slika", + "sourceLanguage": "Izvorni jezik", + "targetLanguage": "Ciljni jezik", + "translationTime": "Vreme prevoda", + "shareInDevelopment": "Funkcija deljenja je u razvoju", // 翻译模块 - 录音文件 "translateAudioFiles": "Prevedi audio datoteke", @@ -1090,8 +1162,8 @@ const Map srRS = { 'deleteAccount': 'Obriši nalog', 'deleteAccountTips': 'Da li ste sigurni da želite trajno da obrišete svoj nalog? Ova radnja se ne može opozvati', - 'clean': 'Clear Cache', - 'cleanTips': 'Are you sure you want to clear personal cache?', + 'clean': 'Obriši keš', + 'cleanTips': 'Da li ste sigurni da želite da obrišete lični keš?', 'networkConnectionFailed': 'Neuspešna mrežna veza, proverite podešavanja mreže i pokušajte ponovo', 'serverTemporarilyUnavailable': @@ -1135,24 +1207,24 @@ const Map srRS = { 'AccountService je inicijalizovan', // AccountService 已初始化 // 权限模块 - 'meetingStoragePermission': 'Storage', + 'meetingStoragePermission': 'Skladište', 'meetingStoragePermissionExplanation': - 'We need access to storage permissions so you can select and upload audio files.', + 'Potreban nam je pristup dozvoli za skladište kako biste mogli da izaberete i otpremite audio datoteke.', 'meetingStoragePermissionPermanentDenial': - '检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。', + 'Otkriveno je da ste trajno odbili dozvolu za skladište. Ako želite da nastavite da koristite ovu funkciju, idite u podešavanja aplikacije i ručno omogućite dozvolu za skladište.', 'getPermissionStatusFailed': 'Neuspešno dobijanje statusa dozvole', 'communicationPermissions': 'Dozvole za komunikaciju', - 'bluetoothPermissions': 'Bluetooth Permissions', - 'notificationPermissions': 'Notification Permissions', - 'storagePermissions': 'Storage Permissions', - 'microphonePermissions': 'Microphone Permissions', - 'alarmPermissions': 'Alarm Permissions', + 'bluetoothPermissions': 'Bluetooth dozvole', + 'notificationPermissions': 'Dozvole za obaveštenja', + 'storagePermissions': 'Dozvole za skladište', + 'microphonePermissions': 'Dozvole za mikrofon', + 'alarmPermissions': 'Dozvole za alarm', 'calendarPermissions': 'Dozvole za kalendar', 'locationPermissions': 'Dozvole za lokaciju', 'phone': 'Telefon', 'sms': 'SMS', - 'contacts': 'Contacts', - 'notification': 'Notification', + 'contacts': 'Kontakti', + 'notification': 'Obaveštenje', 'alarm': 'Alarm', 'calendarWrite': 'Pisanje u kalendar', 'calendarFullAccess': 'Potpuni pristup kalendaru', @@ -1160,7 +1232,7 @@ const Map srRS = { 'phonePermissionDesc': 'Koristi se za funkciju pozivanja', 'smsPermissionDesc': 'Koristi se za funkciju slanja SMS-a', 'alarmPermissionDesc': - 'Used to set exact alarms to ensure reminders trigger on time', + 'Koristi se za podešavanje tačnih alarma kako bi se podsetnici aktivirali na vreme', 'calendarWritePermissionDesc': 'Koristi se za kreiranje događaja i podsetnika u kalendaru', 'calendarFullAccessPermissionDesc': @@ -1179,86 +1251,88 @@ const Map srRS = { 'phonePermissionDetailDesc': 'Funkcija pozivanja zahteva dozvolu za telefon', 'smsPermissionDetailDesc': 'Funkcija slanja SMS-a zahteva dozvolu za SMS', 'alarmPermissionDetailDesc': - 'This permission is required to set exact alarms and ensure reminders trigger on time', + 'Ova dozvola je potrebna za podešavanje tačnih alarma i obezbeđivanje aktiviranja podsetnika na vreme', 'calendarWritePermissionDetailDesc': 'Kreiranje događaja u kalendaru zahteva dozvolu za pisanje u kalendar', 'calendarFullAccessPermissionDetailDesc': 'Upravljanje događajima u kalendaru zahteva potpunu dozvolu za kalendar', 'locationPermissionDetailDesc': 'Dobijanje informacija o lokaciji zahteva dozvolu za lokaciju', - 'contactsPermissionDesc': 'Used for accessing contact information', + 'contactsPermissionDesc': 'Koristi se za pristup kontakt informacijama', 'contactsPermissionDetailDesc': - 'Phone call and SMS functionality requires contacts permission to select contacts', + 'Funkcija pozivanja i SMS-a zahteva dozvolu za kontakte radi izbora kontakata', 'bluetoothPermissionDesc': - 'Used for connecting and managing Bluetooth devices', + 'Koristi se za povezivanje i upravljanje Bluetooth uređajima', 'bluetoothPermissionDetailDesc': - 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', - 'bluetoothScanPermissionDesc': 'Used for scanning nearby Bluetooth devices', + 'Povezivanje sa Bluetooth slušalicama i drugim uređajima zahteva dozvolu za Bluetooth', + 'bluetoothScanPermissionDesc': 'Koristi se za skeniranje Bluetooth uređaja u blizini', 'bluetoothScanPermissionDetailDesc': - 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', - 'bluetoothConnectPermissionDesc': 'Used for connecting to Bluetooth devices', + 'Skeniranje Bluetooth uređaja u blizini zahteva dozvolu za Bluetooth skeniranje', + 'bluetoothConnectPermissionDesc': 'Koristi se za povezivanje sa Bluetooth uređajima', 'bluetoothConnectPermissionDetailDesc': - 'Connecting to Bluetooth devices requires Bluetooth connect permission', - 'notificationPermissionDesc': 'Used for sending notification messages', + 'Povezivanje sa Bluetooth uređajima zahteva dozvolu za Bluetooth povezivanje', + 'notificationPermissionDesc': 'Koristi se za slanje obaveštenja', 'notificationPermissionDetailDesc': - 'App needs notification permission to send you important alerts and messages', + 'Aplikacija zahteva dozvolu za obaveštenja kako bi vam slala važna upozorenja i poruke', 'appNeedsPermissionForFullFunction': 'Aplikacija zahteva ovu dozvolu za punu funkcionalnost', 'permanentDenialText': 'Trajno ste odbili dozvolu za {permission}, idite u podešavanja aplikacije da biste je omogućili', 'goToSettings': 'Idi na podešavanja', - 'bluetoothScan': 'Bluetooth Scan', - 'bluetoothConnect': 'Bluetooth Connect', + 'bluetoothScan': 'Bluetooth skeniranje', + 'bluetoothConnect': 'Bluetooth povezivanje', 'bluetoothScanExplanation': - 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', + 'Aplikaciji je potrebna dozvola za Bluetooth skeniranje kako bi skenirala Bluetooth uređaje u blizini.', 'bluetoothConnectExplanation': - 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', + 'Aplikaciji je potrebna dozvola za Bluetooth povezivanje kako bi se povezala sa Bluetooth uređajima.', 'locationForBluetoothExplanation': - 'The app needs location permission to scan Bluetooth devices.', + 'Aplikaciji je potrebna dozvola za lokaciju kako bi skenirala Bluetooth uređaje.', 'bluetoothScanPermanentDenial': - 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', + 'Dozvola za Bluetooth skeniranje je trajno odbijena, molimo idite u podešavanja da biste je ručno omogućili.', 'bluetoothConnectPermanentDenial': - 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', + 'Dozvola za Bluetooth povezivanje je trajno odbijena, molimo idite u podešavanja da biste je ručno omogućili.', 'locationPermanentDenial': - 'Location permission has been permanently denied, please go to settings to enable it manually.', - 'notificationPermission': 'Notification', - 'locationPermission': 'Location', + 'Dozvola za lokaciju je trajno odbijena, molimo idite u podešavanja da biste je ručno omogućili.', + 'notificationPermission': 'Obaveštenje', + 'locationPermission': 'Lokacija', 'notificationPermissionExplanation': - 'Notification permission is required to display music playback status.', + 'Dozvola za obaveštenja je potrebna za prikaz statusa reprodukcije muzike.', 'locationPermissionExplanation': - 'Location permission is required to get current location.', + 'Dozvola za lokaciju je potrebna za dobijanje trenutne lokacije.', 'notificationPermissionPermanentDenial': - 'You have permanently denied notification permission, please go to settings to enable it.', + 'Trajno ste odbili dozvolu za obaveštenja, molimo idite u podešavanja da biste je omogućili.', 'locationPermissionPermanentDenial': - 'You have permanently denied location permission, please go to settings to enable it.', - 'storagePermission': 'Storage', + 'Trajno ste odbili dozvolu za lokaciju, molimo idite u podešavanja da biste je omogućili.', + 'storagePermission': 'Skladište', 'microphonePermissionExplanation': - 'We need microphone permission to record audio content.', + 'Potrebna nam je dozvola za mikrofon da bismo snimali audio sadržaj.', 'storagePermissionExplanation': - 'We need storage permission so you can select and upload audio files.', + 'Potrebna nam je dozvola za skladište kako biste mogli da izaberete i otpremite audio datoteke.', 'microphonePermissionPermanentDenial': - '检测到您已永久拒绝录音权限。如需继续使用此功能,请前往应用设置中手动开启麦克风权限。', + 'Otkriveno je da ste trajno odbili dozvolu za mikrofon. Ako želite da nastavite da koristite ovu funkciju, idite u podešavanja aplikacije i ručno omogućite dozvolu za mikrofon.', 'storagePermissionPermanentDenial': - '检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。', - 'permissionUtilNeed': 'Need ', - 'permissionUtilPermission': ' Permission', - 'permissionUtilRestricted': ' Permission Restricted', + 'Otkriveno je da ste trajno odbili dozvolu za skladište. Ako želite da nastavite da koristite ovu funkciju, idite u podešavanja aplikacije i ručno omogućite dozvolu za skladište.', + 'permissionUtilNeed': 'Potrebna ', + 'permissionUtilPermission': ' dozvola', + 'permissionUtilRestricted': ' Dozvola ograničena', 'permissionUtilRestrictedMessage': - 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', - 'permissionUtilConfirm': 'OK', + 'Ova funkcija nije dostupna ili je ograničena na trenutnom uređaju, molimo proverite podešavanja uređaja ili sistemska ograničenja', + 'permissionUtilConfirm': 'U redu', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigacija u toku', - 'native.notification.navigation.keepRunning': 'Navigacija, držite aplikaciju pokrenutom', - 'native.notification.bleAgent.running': 'Glasovni asistent radi', - 'native.notification.audioRecording.recording': 'Snimanje zvuka, dodirnite za povratak u aplikaciju', - 'native.notification.music.waiting': 'Čekanje na reprodukciju', - 'native.notification.music.previous': 'Prethodna', - 'native.notification.music.next': 'Sledeća', - 'native.notification.music.play': 'Reprodukuj', - 'native.notification.music.pause': 'Pauza', - 'native.notification.qqMusic.playing': 'Reprodukcija muzike', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigacija u toku', + 'native.notification.navigation.keepRunning': + 'Navigacija, držite aplikaciju pokrenutom', + 'native.notification.bleAgent.running': 'Glasovni asistent radi', + 'native.notification.audioRecording.recording': + 'Snimanje zvuka, dodirnite za povratak u aplikaciju', + 'native.notification.music.waiting': 'Čekanje na reprodukciju', + 'native.notification.music.previous': 'Prethodna', + 'native.notification.music.next': 'Sledeća', + 'native.notification.music.play': 'Reprodukuj', + 'native.notification.music.pause': 'Pauza', + 'native.notification.qqMusic.playing': 'Reprodukcija muzike', // 版本更新 'newVersionFound': 'Pronađena nova verzija', // 版本更新对话框标题 @@ -1332,28 +1406,28 @@ const Map srRS = { 'bleConnectionFailed': 'Neuspešna BLE veza', 'deviceAuthorizationFailedCheckCode': 'Neuspešna autorizacija uređaja, proverite autorizacioni kod', - 'bluetoothGuideTitle': 'Manual Bluetooth Activation Required', // 需要手动开启蓝牙 - 'bluetoothGuideSteps': 'Please follow these steps:', // 请按照以下步骤操作: + 'bluetoothGuideTitle': 'Potrebno je ručno uključivanje Bluetooth-a', // 需要手动开启蓝牙 + 'bluetoothGuideSteps': 'Molimo pratite sledeće korake:', // 请按照以下步骤操作: 'bluetoothGuideStep1': - 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 + 'Uključite Bluetooth: Podešavanja → Bluetooth → Uključi', // 开启蓝牙:设置 → 蓝牙 → 开启 'bluetoothGuideStep2': - 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 + 'Povežite uređaj: Pronađite svoj uređaj u „Moji uređaji" i dodirnite da biste se povezali', // 连接设备:在"我的设备"中找到您的设备并点击连接 'bluetoothGuideStep3': - 'Return to app to continue pairing process', // 返回应用继续配对流程 + 'Vratite se u aplikaciju da nastavite proces uparivanja', // 返回应用继续配对流程 'bluetoothGuideTip': - 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 - 'iKnow': 'I Know', // 我知道了 + 'Savet: Takođe možete dugo pritisnuti ikonu Bluetooth-a u Kontrolnom centru za brz pristup Bluetooth podešavanjima', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 + 'iKnow': 'Razumem', // 我知道了 // 配对模块 - 绑定奖励 - "firstBindRewardTitle": "Welcome Reward", - "firstBindRewardDesc": "You've received binding rewards.", - "vipLevelLabel": "VIP Level:", - "expiryLabel": "Expiration:", - "notActivated": "Not activated", - "aiChatCreditsLabel": "AI Chat Credits:", - "translationCreditsLabel": "Translation Credits:", - "meetingCreditsLabel": "Meeting Credits:", - "ok": "OK", + "firstBindRewardTitle": "Nagrada dobrodošlice", + "firstBindRewardDesc": "Dobili ste nagrade za povezivanje.", + "vipLevelLabel": "VIP nivo:", + "expiryLabel": "Istek:", + "notActivated": "Nije aktivirano", + "aiChatCreditsLabel": "AI ćaskanje krediti:", + "translationCreditsLabel": "Krediti za prevođenje:", + "meetingCreditsLabel": "Krediti za sastanke:", + "ok": "U redu", // 用户反馈模块 "feedback": "Povratne informacije korisnika", @@ -1384,13 +1458,13 @@ const Map srRS = { "connectionFailed": "Neuspešno povezivanje", "retryConnection": "Pokušaj ponovo povezivanje", "ota_updateNow": "Ažuriraj sada", - "otaVersionInfoFailed": "Failed to get version info. Please try again later.", + "otaVersionInfoFailed": "Dobijanje informacija o verziji nije uspelo. Pokušajte ponovo kasnije.", "otaDeviceInfoUnavailable": - "Unable to get device info. Please check the connection and retry.", + "Nije moguće dobiti informacije o uređaju. Proverite vezu i pokušajte ponovo.", "otaProductInfoUnavailable": - "Unable to identify the device. Please reconnect and retry.", + "Nije moguće identifikovati uređaj. Ponovo povežite i pokušajte ponovo.", "otaFirmwareVersionInvalid": - "Firmware version is abnormal. Please reconnect and retry.", + "Verzija firmvera je nenormalna. Ponovo povežite i pokušajte ponovo.", "keepConnectedDontClose": "Držite uređaj povezanim, ne zatvarajte aplikaciju", "doNotDisconnect": "Ne prekidajte vezu", "charging": "Punjenje", @@ -1398,6 +1472,59 @@ const Map srRS = { "removeEarbudsEnsureBattery": "Izvadite obe slušalice i uverite se da je baterija obe iznad 20%", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Pronađena nova verzija @version', + 'otaConfirmUpdateNow': 'Ažurirajte sada?', + 'otaUpdate': 'Ažuriraj', + 'otaUpgradeSuccess': 'Nadogradnja uspešna', + 'otaUpgradeCompleteRepair': + 'Nadogradnja firmvera je završena!\n\nUređaj mora biti ponovo uparen da bi ispravno radio. Idite na stranicu za uparivanje sada?', + 'otaPairLater': 'Upari kasnije', + 'otaPairNow': 'Upari sada', + 'okConfirm': 'U redu', + + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Greška pri proveri BLE veze: @error', + 'otaBleNotConnected': 'BLE uređaj nije povezan', + 'otaBleNeedConnection': + 'Nadogradnja firmvera zahteva BLE vezu sa uređajem\nUverite se da je uređaj pravilno povezan i pokušajte ponovo', + 'otaDeviceInfoUnavailableTitle': 'Informacije o uređaju nedostupne', + 'otaCannotGetDeviceInfo': + 'Nije moguće dobiti informacije o uređaju\nPonovo povežite uređaj ili pokušajte ponovo kasnije', + 'otaBleCheckFailed': 'Provera BLE veze nije uspela', + 'otaCannotGetDeviceInfoCheckConnection': + 'Nije moguće dobiti informacije o uređaju, proverite vezu sa uređajem', + 'otaCannotGetProductInfoWithName': + 'Nije moguće dobiti informacije o proizvodu, naziv uređaja: @deviceName', + 'otaCannotGetBatteryInfo': 'Nije moguće dobiti validne informacije o bateriji', + 'otaLowBattery': 'Slab nivo baterije', + 'otaSingleBatteryLow': + 'Nivo baterije uređaja je prenizak za nadogradnju firmvera\nUslov: baterija mora biti iznad 20%\nTrenutno: @ear @battery%\nMolimo napunite i pokušajte ponovo', + 'otaDoubleBatteryLow': + 'Nivo baterije uređaja je prenizak za nadogradnju firmvera\nUslov: obe slušalice moraju biti iznad 20%\nTrenutno: Leva @left%, Desna @right%\nMolimo napunite i pokušajte ponovo', + 'otaBatteryCheckFailed': 'Provera baterije nije uspela', + + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'Ovo ažuriranje uključuje optimizacije performansi i ispravke grešaka.', + 'otaGetLatestVersionFailed': 'Dobijanje informacija o najnovijoj verziji nije uspelo', + 'otaGetVersionInfoFailed': 'Dobijanje informacija o verziji nije uspelo', + 'otaCheckingDeviceStatus': 'Provera statusa uređaja...', + 'otaDownloadFailedCheckNetwork': + 'Preuzimanje nije uspelo, proverite mrežnu vezu', + 'otaDownloadFailed': 'Preuzimanje nije uspelo', + 'otaPreparingConnection': 'Pripremanje veze sa uređajem...', + 'otaConnectingDevice': 'Povezivanje sa uređajem...', + 'otaUpgradeStarted': 'OTA nadogradnja je započeta...', + 'otaUpgradeProgressWithPercent': 'Napredak nadogradnje: @percent%', + 'otaUpgradeSuccessComplete': 'Nadogradnja je uspešno završena', + 'otaUpgradeFailedWithCode': 'Nadogradnja nije uspela, kod greške: @code', + 'otaUpgradeFailedTitle': 'Nadogradnja nije uspela', + 'otaUpgradeFailedDesc': + 'Proverite vezu sa uređajem ili paket ažuriranja, kod greške: @code', + 'otaDeviceDisconnected': 'Uređaj je isključen', + 'otaDeviceConnected': 'Uređaj je povezan', + // 音乐模块 "noMusic": "Nema muzike", // 暂无音乐 "noPlayingMusic": "Nema muzike koja se reprodukuje", // 暂无播放音乐 @@ -1553,15 +1680,15 @@ const Map srRS = { "东帝汶": "Istočni Timor", "斐济": "Fidži", "所罗门群岛": "Solomonska Ostrva", - "刚果民主共和国": "Democratic Republic of the Congo", + "刚果民主共和国": "Demokratska Republika Kongo", "安哥拉": "Angola", "苏丹": "Sudan", - "马尔代夫": "Maldives", - "不丹": "Bhutan", - "摩纳哥": "Monaco", + "马尔代夫": "Maldivi", + "不丹": "Butan", + "摩纳哥": "Monako", "圣马力诺": "San Marino", - "牙买加": "Jamaica", - "巴哈马": "Bahamas", - "巴布亚新几内亚": "Papua New Guinea", + "牙买加": "Jamajka", + "巴哈马": "Bahami", + "巴布亚新几内亚": "Papua Nova Gvineja", "萨摩亚": "Samoa", }; diff --git a/lib/core/translations/language/sv_se.dart b/lib/core/translations/language/sv_se.dart index 4df7005a5..e29719e0c 100644 --- a/lib/core/translations/language/sv_se.dart +++ b/lib/core/translations/language/sv_se.dart @@ -161,6 +161,26 @@ const Map svSE = { 'right': 'Höger', 'checkConnectionStatusFailed': 'Kontroll av anslutningsstatus misslyckades', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth-initiering misslyckades: @error', + 'needBluetoothAndLocationPermission': 'Bluetooth- och platsbehörigheter krävs för att söka enheter', + 'permissionRequestFailedWithError': 'Behörighetsförfrågan misslyckades: @error', + 'needPermission': 'Behörighet krävs', + 'blePermissionDialogContent': 'Appen behöver Bluetooth- och platsbehörigheter för att söka enheter. Aktivera dem i Inställningar.', + 'needEnableBluetooth': 'Aktivera Bluetooth', + 'enableBluetoothDialogContent': 'Aktivera Bluetooth för att söka och ansluta enheter.', + 'bleScanFailedWithError': 'Sökning misslyckades: @error', + 'bleConnectionSuccess': 'Anslutningen lyckades', + 'bleConnectedToDevice': 'Ansluten till @device', + 'bleConnectionFailedWithError': 'Anslutning misslyckades: @error', + 'bleDisconnected': 'Frånkopplad', + 'bleDeviceDisconnected': 'Enheten frånkopplad', + 'bleDisconnectFailedWithError': 'Frånkoppling misslyckades: @error', + 'signalStrong': 'Stark signal', + 'signalMedium': 'Medelsignal', + 'signalWeak': 'Svag signal', + 'signalVeryWeak': 'Mycket svag signal', + // 发现页 "searchAi": "Sök AI-funktioner...", "exploreSlogan": "Smarta hörlurar, oändliga möjligheter", @@ -823,6 +843,13 @@ const Map svSE = { 'reportDescriptionHint': 'Vi vill veta varför du anmäler, du kan beskriva problemet du stött på.', 'generatedByAi': 'Genererad av AI', + // Agent模块 - 工具调用 + 'toolCall': 'Verktygsamtal', + 'noResult': 'Inget resultat', + 'noToolCallContentToCopy': 'Inget verktygsamtal att kopiera', + 'toolCallDetails': 'Detaljer om verktygsamtal:', + 'toolCallContentCopied': 'Verktygsamtal kopierat till urklipp', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Här är några rekommenderade låtar:', 'playList': 'Spellista', @@ -843,6 +870,28 @@ const Map svSE = { "bicycling": "Cykling", "tsransit": "Kollektivtrafik", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Välj navigeringsapp', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigera med Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigera med Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigera med Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigera med Apple Maps', + 'builtInNavigation': 'Inbyggd navigation', + 'useBuiltInNavigation': 'Navigera med inbyggd karta', + 'navigationStartFailed': 'Kunde inte starta navigering', + 'cannotPlayMusicListRetryLater': 'Kan inte spela musiklistan, försök igen senare', + 'cannotPlaySong': 'Kan inte spela låten', + 'openMapError': 'Fel vid öppning av karta', + 'pleaseInstallAmapApp': 'Installera Amap-appen först', + 'pleaseInstallBaiduMapApp': 'Installera Baidu Maps-appen först', + 'appleMapStartFailed': 'Apple Maps kunde inte startas', + 'appleMapUnavailable': 'Apple Maps är inte tillgängligt', + 'openAppleMapError': 'Fel vid öppning av Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Söker väderinformation:', 'highest': 'Högsta', @@ -903,10 +952,20 @@ const Map svSE = { "bluetoothCallStateError": "Please make sure the Bluetooth headset is connected to the phone and in a call state", "autoDetect": "Auto Detect", // 自动检测 + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Inaktivera flytande fönster', + 'enableFloatingWindow': 'Aktivera flytande fönster', + 'permissionTip': 'Behörighetstips', + 'micPermissionRequiredForRecording': 'Mikrofonbehörighet krävs för inspelning', + 'deleteTranslationRecordError': 'Fel vid radering av översättningspost: @error', + // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", "translationFailed": "Translation failed", + "translating": "Översätter", + "translate": "Översätt", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Ange texten som ska översättas", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -1253,6 +1312,47 @@ const Map svSE = { "updateContent": "Uppdateringsinnehåll", "removeEarbudsEnsureBattery": "Ta ut båda hörlurarna och se till att batterinivån är över 20 % på båda", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Ny version @version hittad', + 'otaConfirmUpdateNow': 'Uppdatera nu?', + 'otaUpdate': 'Uppdatera', + 'otaUpgradeSuccess': 'Uppgradering lyckades', + 'otaUpgradeCompleteRepair': 'Firmware-uppgradering klar!\n\nEnheten måste parkopplas igen. Gå till parkopplingssidan?', + 'otaPairLater': 'Parkoppla senare', + 'otaPairNow': 'Parkoppla nu', + 'okConfirm': 'OK', + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Fel vid BLE-kontroll: @error', + 'otaBleNotConnected': 'BLE-enhet inte ansluten', + 'otaBleNeedConnection': 'Firmware-uppgradering kräver BLE-anslutning\nSäkerställ att enheten är ansluten och försök igen', + 'otaDeviceInfoUnavailableTitle': 'Enhetsinformation otillgänglig', + 'otaCannotGetDeviceInfo': 'Kan inte hämta enhetsinformation\nÅteranslut enheten eller försök igen senare', + 'otaBleCheckFailed': 'BLE-kontroll misslyckades', + 'otaCannotGetDeviceInfoCheckConnection': 'Kan inte hämta enhetsinformation, kontrollera anslutningen', + 'otaCannotGetProductInfoWithName': 'Kan inte hämta produktinfo, enhetsnamn: @deviceName', + 'otaCannotGetBatteryInfo': 'Kan inte hämta batteriinformation', + 'otaLowBattery': 'Låg batterinivå', + 'otaSingleBatteryLow': 'Batterinivå för låg för uppgradering\nKrav: batteri över 20%\nNuvarande: @ear @battery%\nLadda och försök igen', + 'otaDoubleBatteryLow': 'Batterinivå för låg för uppgradering\nKrav: båda öronsnäckorna över 20%\nNuvarande: Vänster @left%, Höger @right%\nLadda och försök igen', + 'otaBatteryCheckFailed': 'Batterikontroll misslyckades', + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': 'Uppdateringen innehåller prestandaförbättringar och felkorrigeringar.', + 'otaGetLatestVersionFailed': 'Kunde inte hämta senaste versionen', + 'otaGetVersionInfoFailed': 'Kunde inte hämta versionsinformation', + 'otaCheckingDeviceStatus': 'Kontrollerar enhetsstatus...', + 'otaDownloadFailedCheckNetwork': 'Nedladdning misslyckades, kontrollera nätverksanslutningen', + 'otaDownloadFailed': 'Nedladdning misslyckades', + 'otaPreparingConnection': 'Förbereder enhetsanslutning...', + 'otaConnectingDevice': 'Ansluter till enhet...', + 'otaUpgradeStarted': 'OTA-uppgradering startad...', + 'otaUpgradeProgressWithPercent': 'Uppgraderingsförlopp: @percent%', + 'otaUpgradeSuccessComplete': 'Uppgradering slutförd', + 'otaUpgradeFailedWithCode': 'Uppgradering misslyckades, felkod: @code', + 'otaUpgradeFailedTitle': 'Uppgradering misslyckades', + 'otaUpgradeFailedDesc': 'Kontrollera anslutning eller uppdateringspaket, felkod: @code', + 'otaDeviceDisconnected': 'Enheten frånkopplad', + 'otaDeviceConnected': 'Enheten ansluten', + // 音乐模块 "noMusic": "Ingen musik", // 暂无音乐 "noPlayingMusic": "Ingen musik spelas", // 暂无播放音乐 diff --git a/lib/core/translations/language/th_th.dart b/lib/core/translations/language/th_th.dart index 3e99a65b2..e54dfd6e6 100644 --- a/lib/core/translations/language/th_th.dart +++ b/lib/core/translations/language/th_th.dart @@ -1,5 +1,4 @@ const Map thTH = { - // 通用 'continue': 'ดำเนินการต่อ', 'confirm': 'ยืนยัน', @@ -99,14 +98,16 @@ const Map thTH = { "tip": "เคล็ดลับ", "pleaseEnterCompleteCode": "กรุณากรอกรหัสยืนยันให้ครบถ้วน", "loginFailed": "เข้าสู่ระบบล้มเหลว กรุณาลองใหม่", - 'pleaseAcceptPrivacyPolicy': 'กรุณาอ่านและยอมรับนโยบายความเป็นส่วนตัวและข้อตกลงผู้ใช้ก่อน', + 'pleaseAcceptPrivacyPolicy': + 'กรุณาอ่านและยอมรับนโยบายความเป็นส่วนตัวและข้อตกลงผู้ใช้ก่อน', "enterVerificationCode": "กรอกรหัสยืนยัน", "verificationCodeSentTo": "รหัสยืนยันถูกส่งไปยัง", "resendVerificationCode": "ส่งรหัสยืนยันอีกครั้ง", "login": "เข้าสู่ระบบ", "usePasswordLogin": "เข้าสู่ระบบด้วยรหัสผ่าน", "loginDeclaration": "คำประกาศของ Voitrans", // Voitrans 声明 - "welcomeToThisApp": "ยินดีต้อนรับสู่ Voitrans กรุณาอ่านอย่างละเอียด", // 欢迎使用Voitrans,请充分阅读 + "welcomeToThisApp": + "ยินดีต้อนรับสู่ Voitrans กรุณาอ่านอย่างละเอียด", // 欢迎使用Voitrans,请充分阅读 "privacyPolicyText": ",点击'同意并进入'表示您已充分阅读并同意上述协议。点击'不同意'将退出应用。", // ,点击"同意并进入"表示您已充分阅读并同意上述协议。点击"不同意"将退出应用。 "disagree": "ไม่ยอมรับ", // 不同意 @@ -126,7 +127,8 @@ const Map thTH = { "aiAssistant": "ผู้ช่วย AI รอบด้าน", "aiAssistantInfo": "ที่ปรึกษาส่วนตัว 24 ชั่วโมง ตอบคำถาม ให้คำแนะนำ", "interpretation": "การแปลภาษาพร้อมกัน", - "simultaneousInterpretationInfo": "แปลหลายภาษาแบบเรียลไทม์ เดินทางต่างประเทศไร้กังวล", + "simultaneousInterpretationInfo": + "แปลหลายภาษาแบบเรียลไทม์ เดินทางต่างประเทศไร้กังวล", "aiCompanion": "เพื่อนคู่คิดสำหรับครอบครัว", "aiCompanionInfo": "เข้าใจคุณ อยู่เคียงข้างอย่างอบอุ่น", "homeSlogan": "เชื่อมต่อโลก เหนือกว่าเสียง", @@ -161,6 +163,29 @@ const Map thTH = { 'right': 'ขวา', 'checkConnectionStatusFailed': 'ตรวจสอบสถานะการเชื่อมต่อล้มเหลว', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth initialization failed: @error', + 'needBluetoothAndLocationPermission': + 'Bluetooth and location permissions are required to scan devices', + 'permissionRequestFailedWithError': 'Permission request failed: @error', + 'needPermission': 'Permission Required', + 'blePermissionDialogContent': + 'This app requires Bluetooth and location permissions to scan devices. Please enable them in Settings.', + 'needEnableBluetooth': 'Enable Bluetooth', + 'enableBluetoothDialogContent': + 'Please enable Bluetooth to scan and connect devices.', + 'bleScanFailedWithError': 'Scan failed: @error', + 'bleConnectionSuccess': 'Connection Successful', + 'bleConnectedToDevice': 'Connected to @device', + 'bleConnectionFailedWithError': 'Connection failed: @error', + 'bleDisconnected': 'Disconnected', + 'bleDeviceDisconnected': 'Device disconnected', + 'bleDisconnectFailedWithError': 'Disconnect failed: @error', + 'signalStrong': 'Strong', + 'signalMedium': 'Medium', + 'signalWeak': 'Weak', + 'signalVeryWeak': 'Very Weak', + // 发现页 "searchAi": "ค้นหาฟังก์ชัน AI...", "exploreSlogan": "หูฟังอัจฉริยะ ความเป็นไปได้ไม่สิ้นสุด", @@ -222,7 +247,8 @@ const Map thTH = { "audioFileSize": "Audio File Size", "transcriptBytes": "Transcript Bytes", "loadFailed": "Load Failed", - "statsLoadFailedTryLater": "Statistics failed to load. Please try again later.", + "statsLoadFailedTryLater": + "Statistics failed to load. Please try again later.", "cleanupComplete": "Cleanup Complete", "cleanedOldData": "Cleaned data older than 90 days", "exportFeature": "Export Feature", @@ -234,64 +260,69 @@ const Map thTH = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'ชำระเงินสำเร็จ', - 'paymentFailed': 'การชำระเงินล้มเหลว', - 'gotIt': 'เข้าใจแล้ว', - 'paymentFailedTryAgain': 'การชำระเงินล้มเหลว กรุณาลองใหม่อีกครั้ง', - 'selectPaymentMethod': 'เลือกวิธีการชำระเงิน', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'ไม่สามารถสร้างคำสั่งซื้อ WeChat ได้', - 'alipayOrderCreateFailed': 'ไม่สามารถสร้างคำสั่งซื้อ Alipay ได้', - 'appleOrderCreateFailed': 'ไม่สามารถสร้างคำสั่งซื้อ Apple ได้', - 'googleOrderCreateFailed': 'ไม่สามารถสร้างคำสั่งซื้อ Google ได้', - 'paypalOrderCreateFailed': 'ไม่สามารถสร้างคำสั่งซื้อ PayPal ได้', - 'paymentException': 'การชำระเงินผิดปกติ', - 'paymentLaunchFailed': 'ไม่สามารถเปิดการชำระเงินได้', - 'paymentExceptionWithError': 'การชำระเงินผิดปกติ: @error', - 'paymentProcessingCheckLater': 'คำสั่งซื้อของคุณกำลังดำเนินการ กรุณาตรวจสอบภายหลัง', - 'paymentResultQueryException': 'ไม่สามารถสอบถามผลการชำระเงินได้: @error', - 'orderConfirmedQuotaRefreshed': 'ยืนยันคำสั่งซื้อแล้ว โควตาของคุณได้รับการรีเฟรชแล้ว', - 'paymentCompletedConfirming': 'ชำระเงินเสร็จสิ้น กำลังยืนยัน…', - 'paymentCancelled': 'ยกเลิกการชำระเงินแล้ว', - 'paypalOpenedCompleteInBrowser': 'PayPal เปิดแล้ว กรุณาชำระเงินในเบราว์เซอร์', - 'paypalOpenFailed': 'ไม่สามารถเปิดหน้าชำระเงิน PayPal ได้', - 'paymentTestTitle': 'ทดสอบการชำระเงิน', - 'paymentTestOrderInfo': 'ข้อมูลคำสั่งซื้อทดสอบ', - 'paymentTestProductId': 'รหัสสินค้า', - 'paymentTestProductDescription': 'คำอธิบายสินค้า', - 'paymentTestWechatDescription': 'ทดสอบการชำระเงินผ่าน WeChat', - 'paymentTestAlipayDescription': 'ทดสอบการชำระเงินผ่าน Alipay', - 'paymentTestAmount': 'จำนวนเงิน', - 'paymentTestSelectAmount': 'เลือกจำนวนเงินทดสอบ', - 'paying': 'กำลังชำระเงิน...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'สถานะการชำระเงิน', - 'errorInfoWithMessage': 'ข้อผิดพลาด: @message', - 'retest': 'ทดสอบอีกครั้ง', - 'paymentTestInstructionsTitle': 'คำแนะนำ', - 'paymentTestInstructionsContent': '1. เลือกจำนวนเงินทดสอบ (แนะนำ: ¥0.01)\n2. กดปุ่มชำระเงินเพื่อเริ่มต้น\n3. ชำระเงินในแอปชำระเงิน\n4. กลับมาตรวจสอบผลลัพธ์', - 'startingWechatPayment': 'กำลังเปิด WeChat Pay...', - 'startingAlipayPayment': 'กำลังเปิด Alipay...', - 'wechatPaymentSuccess': 'ชำระเงินผ่าน WeChat Pay สำเร็จ!', - 'wechatPaymentFailed': 'การชำระเงินผ่าน WeChat Pay ล้มเหลว', - 'wechatPaymentLaunchFailed': 'ไม่สามารถเปิด WeChat Pay ได้', - 'cannotLaunchWechatPayment': 'ไม่สามารถเปิด WeChat Pay ได้', - 'wechatPaymentException': 'WeChat Pay ผิดปกติ', - 'wechatPaymentTestCompleted': 'การทดสอบชำระเงินผ่าน WeChat Pay เสร็จสิ้น', - 'alipayPaymentSuccess': 'ชำระเงินผ่าน Alipay สำเร็จ!', - 'alipayPaymentFailed': 'การชำระเงินผ่าน Alipay ล้มเหลว', - 'alipayPaymentLaunchFailed': 'ไม่สามารถเปิด Alipay ได้', - 'cannotLaunchAlipayPayment': 'ไม่สามารถเปิด Alipay ได้', - 'alipayPaymentException': 'Alipay ผิดปกติ', + 'paymentSuccess': 'ชำระเงินสำเร็จ', + 'paymentFailed': 'การชำระเงินล้มเหลว', + 'gotIt': 'เข้าใจแล้ว', + 'paymentFailedTryAgain': 'การชำระเงินล้มเหลว กรุณาลองใหม่อีกครั้ง', + 'selectPaymentMethod': 'เลือกวิธีการชำระเงิน', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'ไม่สามารถสร้างคำสั่งซื้อ WeChat ได้', + 'alipayOrderCreateFailed': 'ไม่สามารถสร้างคำสั่งซื้อ Alipay ได้', + 'appleOrderCreateFailed': 'ไม่สามารถสร้างคำสั่งซื้อ Apple ได้', + 'googleOrderCreateFailed': 'ไม่สามารถสร้างคำสั่งซื้อ Google ได้', + 'paypalOrderCreateFailed': 'ไม่สามารถสร้างคำสั่งซื้อ PayPal ได้', + 'paymentException': 'การชำระเงินผิดปกติ', + 'paymentLaunchFailed': 'ไม่สามารถเปิดการชำระเงินได้', + 'paymentExceptionWithError': 'การชำระเงินผิดปกติ: @error', + 'paymentProcessingCheckLater': + 'คำสั่งซื้อของคุณกำลังดำเนินการ กรุณาตรวจสอบภายหลัง', + 'paymentResultQueryException': 'ไม่สามารถสอบถามผลการชำระเงินได้: @error', + 'orderConfirmedQuotaRefreshed': + 'ยืนยันคำสั่งซื้อแล้ว โควตาของคุณได้รับการรีเฟรชแล้ว', + 'paymentCompletedConfirming': 'ชำระเงินเสร็จสิ้น กำลังยืนยัน…', + 'paymentCancelled': 'ยกเลิกการชำระเงินแล้ว', + 'paypalOpenedCompleteInBrowser': 'PayPal เปิดแล้ว กรุณาชำระเงินในเบราว์เซอร์', + 'paypalOpenFailed': 'ไม่สามารถเปิดหน้าชำระเงิน PayPal ได้', + 'paymentTestTitle': 'ทดสอบการชำระเงิน', + 'paymentTestOrderInfo': 'ข้อมูลคำสั่งซื้อทดสอบ', + 'paymentTestProductId': 'รหัสสินค้า', + 'paymentTestProductDescription': 'คำอธิบายสินค้า', + 'paymentTestWechatDescription': 'ทดสอบการชำระเงินผ่าน WeChat', + 'paymentTestAlipayDescription': 'ทดสอบการชำระเงินผ่าน Alipay', + 'paymentTestAmount': 'จำนวนเงิน', + 'paymentTestSelectAmount': 'เลือกจำนวนเงินทดสอบ', + 'paying': 'กำลังชำระเงิน...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'สถานะการชำระเงิน', + 'errorInfoWithMessage': 'ข้อผิดพลาด: @message', + 'retest': 'ทดสอบอีกครั้ง', + 'paymentTestInstructionsTitle': 'คำแนะนำ', + 'paymentTestInstructionsContent': + '1. เลือกจำนวนเงินทดสอบ (แนะนำ: ¥0.01)\n2. กดปุ่มชำระเงินเพื่อเริ่มต้น\n3. ชำระเงินในแอปชำระเงิน\n4. กลับมาตรวจสอบผลลัพธ์', + 'startingWechatPayment': 'กำลังเปิด WeChat Pay...', + 'startingAlipayPayment': 'กำลังเปิด Alipay...', + 'wechatPaymentSuccess': 'ชำระเงินผ่าน WeChat Pay สำเร็จ!', + 'wechatPaymentFailed': 'การชำระเงินผ่าน WeChat Pay ล้มเหลว', + 'wechatPaymentLaunchFailed': 'ไม่สามารถเปิด WeChat Pay ได้', + 'cannotLaunchWechatPayment': 'ไม่สามารถเปิด WeChat Pay ได้', + 'wechatPaymentException': 'WeChat Pay ผิดปกติ', + 'wechatPaymentTestCompleted': 'การทดสอบชำระเงินผ่าน WeChat Pay เสร็จสิ้น', + 'alipayPaymentSuccess': 'ชำระเงินผ่าน Alipay สำเร็จ!', + 'alipayPaymentFailed': 'การชำระเงินผ่าน Alipay ล้มเหลว', + 'alipayPaymentLaunchFailed': 'ไม่สามารถเปิด Alipay ได้', + 'cannotLaunchAlipayPayment': 'ไม่สามารถเปิด Alipay ได้', + 'alipayPaymentException': 'Alipay ผิดปกติ', "insufficientIntegral": "Insufficient integral", - "insufficientBalanceDesc": "Insufficient balance, please go to the corresponding recharge page to recharge.", + "insufficientBalanceDesc": + "Insufficient balance, please go to the corresponding recharge page to recharge.", "recharge": "Go to Recharge", - "aiMemberExpiredDesc": "AI membership expired, please go to the membership recharge page to renew.", + "aiMemberExpiredDesc": + "AI membership expired, please go to the membership recharge page to renew.", // 商品模块 - AI商品页 'musicAndRecommendation': 'Music & Recommendation', @@ -299,11 +330,15 @@ const Map thTH = { 'nearbySearch': 'Nearby Search', 'newsInformation': 'News', 'communicationAssistant': 'Communication Assistant', - 'aiHeaderDesc1': 'Longer conversation quota, more tool calls, extended context length.', - 'aiHeaderDesc2': 'Suitable for agent Q&A, summarization, analysis, and task execution.', + 'aiHeaderDesc1': + 'Longer conversation quota, more tool calls, extended context length.', + 'aiHeaderDesc2': + 'Suitable for agent Q&A, summarization, analysis, and task execution.', 'musicSearchPlaybackControl': 'Music library search and playback control', - 'smartPlaylistAndSimilarRecommendations': 'Smart playlist and similar song recommendations', - 'routePlanningAndCongestionAvoidance': 'Route planning and congestion avoidance', + 'smartPlaylistAndSimilarRecommendations': + 'Smart playlist and similar song recommendations', + 'routePlanningAndCongestionAvoidance': + 'Route planning and congestion avoidance', 'voiceBroadcastAndWaypoints': 'Voice broadcast and waypoint settings', 'realTimeWeatherForecast': 'Real-time weather and forecast', 'clothingAdviceAndTravelReminders': 'Clothing advice and travel reminders', @@ -312,32 +347,39 @@ const Map thTH = { 'hotNewsAndTopicOverview': 'Hot news and topic overview', 'longArticleSummariesAndKeyPoints': 'Long-article summaries and key points', 'helpCallAndSMS': 'Help with calls and SMS', - 'templatedMessagesAndScheduleReminders': 'Template messages and schedule reminders', - 'aiDisclaimer': 'Features depend on device permissions, service availability, and network conditions.', + 'templatedMessagesAndScheduleReminders': + 'Template messages and schedule reminders', + 'aiDisclaimer': + 'Features depend on device permissions, service availability, and network conditions.', // 商品模块 - 翻译商品页 'realtimeTranscription': 'Real-time Transcription', 'sceneLexicon': 'Scenario Glossary', 'subtitleDisplay': 'Subtitles', - 'transHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'transHeaderDesc1': + 'Real-time simultaneous interpretation and text translation with low-latency voice.', 'transHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', 'translateZhEn': 'Chinese-English translation', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'termOptimizationContextPreserve': + 'Terminology optimization and context preservation', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', 'personalVocabularyMemory': 'Personal vocabulary memory', 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', 'colorHighContrast': 'High color contrast', - 'transDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + 'transDisclaimer': + 'Translation performance depends on microphone, network latency, and ambient noise.', // 商品模块 - 会议商品页 'meetingRecording': 'Meeting Recording', 'transcriptionAndSummary': 'Transcription & Summary', 'keywordSearch': 'Keyword Search', 'collaborationSharing': 'Collaboration & Sharing', - 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', - 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingHeaderDesc1': + 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', + 'meetingHeaderDesc2': + 'Suitable for business meetings, class notes, and interview minutes.', 'meetingAutoRecording': 'Auto recording and segmentation', 'meetingSpeakerTagging': 'Speaker labeling', 'meetingLongAudioTranscription': 'Long audio transcription', @@ -346,7 +388,8 @@ const Map thTH = { 'meetingTimelineJump': 'Timeline jump', 'meetingExportSummary': 'Export minutes', 'meetingMultiPlatformShare': 'Share across platforms', - 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + 'meetingDisclaimer': + 'Use in quiet environments; performance depends on microphone and network.', // 商品模块 - VIP会员页 'benefitsOverview': 'Benefits overview', @@ -361,7 +404,8 @@ const Map thTH = { 'generalPrivileges': 'General privileges', 'earlyAccessNewFeatures': 'Early access to new features', 'crossDeviceSync': 'Cross-device sync', - 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', + 'vipDisclaimer': + 'Actual benefits depend on the package details and may change with versions.', // 商品模块 - 商品名称与描述 'ai_001_name': 'AI Basic 100', @@ -411,7 +455,8 @@ const Map thTH = { 'guideNavInput': 'Navigate to Shenzhen Airport', 'guideNavSend': 'Lily will plan the route', 'guideNavEnd': 'Navigation set—try other commands', - 'guideMeetingStart': 'Tell Lily: “Create a meeting reminder for 3pm tomorrow”', + 'guideMeetingStart': + 'Tell Lily: “Create a meeting reminder for 3pm tomorrow”', 'guideMeetingInput': 'Create a meeting reminder for 3pm tomorrow', 'guideMeetingSend': 'Lily will create a meeting reminder', 'guideMeetingEnd': 'Reminder created—try other commands', @@ -459,7 +504,8 @@ const Map thTH = { 'downloadingFiles': 'Downloading files...', 'downloadingFileProgress': 'Total {total} files, downloading file {current}', 'downloadComplete': 'Download complete', - 'downloadCompleteInfo': 'Download complete, {count} files in total, returning automatically in 2 seconds', + 'downloadCompleteInfo': + 'Download complete, {count} files in total, returning automatically in 2 seconds', // Meeting模块 - 录音功能 'startRecording': 'Start Recording', @@ -472,11 +518,15 @@ const Map thTH = { 'meetingRecordEndAndSave': 'จบและบันทึก', // 结束录音并保存 'meetingRecordEndWithoutSave': 'จบโดยไม่บันทึก', // 结束录音不保存 'meetingRecordContinueInBackground': 'บันทึกต่อในพื้นหลัง', // 后台继续录音 - 'meetingRecordStopTimeout': 'หมดเวลาหยุดการบันทึก โปรดลองอีกครั้ง', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'หยุดการบันทึกไม่สำเร็จ โปรดลองอีกครั้ง', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'บันทึกการบันทึกไม่สำเร็จ โปรดลองอีกครั้ง', // 保存录音失败,请重试 + 'meetingRecordStopTimeout': + 'หมดเวลาหยุดการบันทึก โปรดลองอีกครั้ง', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'หยุดการบันทึกไม่สำเร็จ โปรดลองอีกครั้ง', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'บันทึกการบันทึกไม่สำเร็จ โปรดลองอีกครั้ง', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'กำลังบันทึก', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'กำลังบันทึกในพื้นหลัง แตะเพื่อกลับไปที่แอป', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'กำลังบันทึกในพื้นหลัง แตะเพื่อกลับไปที่แอป', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'สิทธิ์หน้าต่างลอย', // 悬浮窗权限 'overlayPermissionTranslationDesc': 'เพื่อแสดงผลการแปลระหว่างการโทรหรือการแปลเสียง/วิดีโอ เราต้องใช้สิทธิ์แสดงทับแอปอื่น ซึ่งจะทำให้คุณเห็นคำแปลแบบเรียลไทม์ขณะใช้แอปอื่นได้', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 @@ -508,27 +558,29 @@ const Map thTH = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'สร้าง', - 'templateDetails': 'รายละเอียดเทมเพลต', - 'tag': 'แท็ก', - 'description': 'คำอธิบาย', - 'template': 'เทมเพลต', - 'deleteTemplate': 'ลบเทมเพลต', - 'deleteTemplateConfirm': 'คุณแน่ใจหรือไม่ว่าต้องการลบเทมเพลตนี้?', - 'editTemplate': 'แก้ไขเทมเพลต', - 'createTemplate': 'สร้างเทมเพลต', - 'name': 'ชื่อ', - 'templateContentHint': 'กรุณาป้อนเนื้อหาเทมเพลต! เคล็ดลับ: กดปุ่ม AI ด้านบนเพื่อสร้างเนื้อหาเทมเพลตอย่างรวดเร็วตามชื่อและคำอธิบายที่คุณป้อน', - 'inputNameHint': 'กรุณาป้อนชื่อ', - 'inputDescHint': 'กรุณาป้อนคำอธิบาย', - 'custom': 'กำหนดเอง', - 'pleaseEnter': 'กรุณากรอก', + 'create': 'สร้าง', + 'templateDetails': 'รายละเอียดเทมเพลต', + 'tag': 'แท็ก', + 'description': 'คำอธิบาย', + 'template': 'เทมเพลต', + 'deleteTemplate': 'ลบเทมเพลต', + 'deleteTemplateConfirm': 'คุณแน่ใจหรือไม่ว่าต้องการลบเทมเพลตนี้?', + 'editTemplate': 'แก้ไขเทมเพลต', + 'createTemplate': 'สร้างเทมเพลต', + 'name': 'ชื่อ', + 'templateContentHint': + 'กรุณาป้อนเนื้อหาเทมเพลต! เคล็ดลับ: กดปุ่ม AI ด้านบนเพื่อสร้างเนื้อหาเทมเพลตอย่างรวดเร็วตามชื่อและคำอธิบายที่คุณป้อน', + 'inputNameHint': 'กรุณาป้อนชื่อ', + 'inputDescHint': 'กรุณาป้อนคำอธิบาย', + 'custom': 'กำหนดเอง', + 'pleaseEnter': 'กรุณากรอก', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', 'meetingGenerateNow': 'Generate Now', 'keyEventsAnalyzed': 'Analyzed {count} key events.', - 'aiAnalysisDesc': 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', + 'aiAnalysisDesc': + 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', // Meeting模块 - 文件操作 'importing': 'Importing...', @@ -544,7 +596,7 @@ const Map thTH = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'บันทึกแผนผังความคิด', + 'saveMindMap': 'บันทึกแผนผังความคิด', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -566,7 +618,7 @@ const Map thTH = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'ส่งออก', + 'export': 'ส่งออก', // Meeting模块 - 发言者 'applyToAllParagraphs': 'นำไปใช้กับทุกย่อหน้าของผู้พูดคนนี้', @@ -575,7 +627,8 @@ const Map thTH = { 'recentlyUsedNames': 'Recently Used Names', 'applyToCurrentParagraph': 'Apply to Current Paragraph', 'totalTime': 'Total Time', - 'summarySpeakerWillBeUpdatedAutomatically': 'Summary speakers will be updated automatically', + 'summarySpeakerWillBeUpdatedAutomatically': + 'Summary speakers will be updated automatically', // Meeting模块 - 云端同步 'syncToCloud': 'Sync to Cloud', @@ -618,38 +671,52 @@ const Map thTH = { 'audioImport': 'Audio Import', 'multipleExportFormats': 'Multiple Export Formats', 'professionalSummaryTemplates': 'Professional Summary Templates', - 'professionalTemplateDesc': 'Professional template design to improve your work efficiency. Customized according to industry needs.', - 'customTemplateDesc': 'You can customize summary prompts according to your needs and use them to generate the required summaries.', - 'askAiDesc': 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', - 'visualMindMapDesc': 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', - 'templateCommunityDesc': 'Discover, share, and get inspiration from the template library created by users.', - 'speakerIdentificationDesc': 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', - 'privateCloudSyncDesc': 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', - 'aiVoiceEnhancementDesc': 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', - 'audioImportDesc': 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', - 'multipleExportFormatsDesc': 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', + 'professionalTemplateDesc': + 'Professional template design to improve your work efficiency. Customized according to industry needs.', + 'customTemplateDesc': + 'You can customize summary prompts according to your needs and use them to generate the required summaries.', + 'askAiDesc': + 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', + 'visualMindMapDesc': + 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', + 'templateCommunityDesc': + 'Discover, share, and get inspiration from the template library created by users.', + 'speakerIdentificationDesc': + 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', + 'privateCloudSyncDesc': + 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', + 'aiVoiceEnhancementDesc': + 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', + 'audioImportDesc': + 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', + 'multipleExportFormatsDesc': + 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', 'upgradeMembership': 'Upgrade Your Membership', 'yearlySubscription': 'Yearly Subscription', 'monthlySubscription': 'Monthly Subscription', 'proMonthly': 'Pro ¥60/month', - 'proMonthlyDesc': '7-day free trial, then ¥800/year. Cancel anytime before trial ends.', + 'proMonthlyDesc': + '7-day free trial, then ¥800/year. Cancel anytime before trial ends.', 'sevenDayTrial': '7-day Free Trial', 'unlimitedMonthly': 'Unlimited ¥120/month', - 'unlimitedMonthlyDesc': '7-day free trial, then ¥1600/year. Cancel anytime before trial ends.', + 'unlimitedMonthlyDesc': + '7-day free trial, then ¥1600/year. Cancel anytime before trial ends.', 'trialNote': '*Free trial for 7 days, then charged annually, cancel anytime.', 'proPrice': 'Pro ¥120', 'proMonthlyPrice': '¥120/month', 'subscribe': 'Subscribe', 'unlimitedPrice': 'Unlimited ¥198', 'unlimitedMonthlyPrice': '¥198/month', - 'upgradeNote': '*After upgrading subscription, the remaining days of the original subscription will be automatically calculated and refunded to your payment account', + 'upgradeNote': + '*After upgrading subscription, the remaining days of the original subscription will be automatically calculated and refunded to your payment account', 'buyMoreTranscriptionTime': 'Buy More Transcription Time', 'sixThousandMinutes': '6,000 minutes', 'threeThousandMinutes': '3,000 minutes', 'sixHundredMinutes': '600 minutes', 'oneHundredTwentyMinutes': '120 minutes', 'validityPeriod': '*Validity Period: ', - 'validityNote': 'Activated immediately after purchase, valid for 2 years after activation.', + 'validityNote': + 'Activated immediately after purchase, valid for 2 years after activation.', 'purchase': 'Purchase', // Meeting模块 - 录音语言 @@ -660,18 +727,18 @@ const Map thTH = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'การวิเคราะห์ล้มเหลว กรุณาลองใหม่ภายหลัง', - 'transcriptionFailed': 'การถอดเสียงล้มเหลว กรุณาลองใหม่ภายหลัง', - 'summaryFailed': 'สรุปล้มเหลว กรุณาลองใหม่ภายหลัง', - 'summaryFailedShort': 'สรุปล้มเหลว', - 'transcriptionFailedShort': 'การถอดเสียงล้มเหลว', + 'analysisFailed': 'การวิเคราะห์ล้มเหลว กรุณาลองใหม่ภายหลัง', + 'transcriptionFailed': 'การถอดเสียงล้มเหลว กรุณาลองใหม่ภายหลัง', + 'summaryFailed': 'สรุปล้มเหลว กรุณาลองใหม่ภายหลัง', + 'summaryFailedShort': 'สรุปล้มเหลว', + 'transcriptionFailedShort': 'การถอดเสียงล้มเหลว', // Meeting模块 - 播放器 - 'playerNotReady': 'เครื่องเล่นเสียงยังไม่พร้อม กรุณารอสักครู่', - 'playFailed': 'เล่นไม่สำเร็จ', - 'audioFileNotFound': 'ไม่พบไฟล์เสียง', - 'fetchingAudio': 'กำลังดึงเสียงจากคลาวด์...', - 'playerLoadFailed': 'โหลดเครื่องเล่นเสียงไม่สำเร็จ', + 'playerNotReady': 'เครื่องเล่นเสียงยังไม่พร้อม กรุณารอสักครู่', + 'playFailed': 'เล่นไม่สำเร็จ', + 'audioFileNotFound': 'ไม่พบไฟล์เสียง', + 'fetchingAudio': 'กำลังดึงเสียงจากคลาวด์...', + 'playerLoadFailed': 'โหลดเครื่องเล่นเสียงไม่สำเร็จ', // 设置页 "systemSettings": "การตั้งค่าระบบ", @@ -682,7 +749,8 @@ const Map thTH = { "cloudSync": "การเติมเงินการ đồng bộ hóaคลาวด์", "memberService": "Member Service", "bindRewardTitle": "Rewards", - "bindRewardSimpleDesc": "First bind device reward has been issued. Tap OK to close.", + "bindRewardSimpleDesc": + "First bind device reward has been issued. Tap OK to close.", "joinDevice": "อุปกรณ์ที่เชื่อมต่อ:", "accountId": "ID บัญชี:", "systemSetting": "การตั้งค่าระบบ", @@ -695,7 +763,8 @@ const Map thTH = { "privacySettings": "การตั้งค่าความเป็นส่วนตัว", "privacySettingsInfo": "จัดการการรวบรวมข้อมูลและสิทธิ์", "permissionManagement": "การจัดการสิทธิ์", // 权限管理 - "permissionManagementInfo": "จัดการการตั้งค่าสิทธิ์ของแอปพลิเคชัน", // 管理应用权限设置 + "permissionManagementInfo": + "จัดการการตั้งค่าสิทธิ์ของแอปพลิเคชัน", // 管理应用权限设置 "aboutApplication": "เกี่ยวกับแอปพลิเคชัน", "versions": "เวอร์ชัน", "checkUpdates": "ตรวจสอบการอัปเดต", @@ -704,9 +773,11 @@ const Map thTH = { "voiceServiceInfo": "เลือกบริการรู้จำและสังเคราะห์เสียง", "selectVoiceService": "เลือกบริการเสียง", "azureVoiceService": "บริการเสียง Azure", - "azureVoiceServiceInfo": "บริการเสียงบนคลาวด์ของ Microsoft รองรับการสังเคราะห์และรู้จำเสียงคุณภาพสูง", + "azureVoiceServiceInfo": + "บริการเสียงบนคลาวด์ของ Microsoft รองรับการสังเคราะห์และรู้จำเสียงคุณภาพสูง", "flutterVoiceService": "บริการเสียงในเครื่อง Flutter", - "flutterVoiceServiceInfo": "บริการเสียงในเครื่องของอุปกรณ์ สามารถใช้งานได้โดยไม่ต้องเชื่อมต่ออินเทอร์เน็ต", + "flutterVoiceServiceInfo": + "บริการเสียงในเครื่องของอุปกรณ์ สามารถใช้งานได้โดยไม่ต้องเชื่อมต่ออินเทอร์เน็ต", 'timbreService': 'บริการโทนเสียง', 'timbreServiceInfo': 'เลือกบริการสังเคราะห์เสียงด้วยโทนเสียง', 'defaultTimbre': 'โทนเสียงเริ่มต้น', @@ -724,7 +795,8 @@ const Map thTH = { 'checkUpdateFailed': 'ตรวจสอบการอัปเดตล้มเหลว', 'networkErrorRetry': 'ข้อผิดพลาดเครือข่าย กรุณาลองใหม่ในภายหลัง', "realtimeVoiceChat": "แชทเสียงแบบเรียลไทม์", - "realtimeVoiceChatInfo": "สัมผัสประสบการณ์การโต้ตอบด้วยเสียงอัจฉริยะ (ตัวอย่างฟังก์ชัน)", + "realtimeVoiceChatInfo": + "สัมผัสประสบการณ์การโต้ตอบด้วยเสียงอัจฉริยะ (ตัวอย่างฟังก์ชัน)", "loading": "กำลังโหลด...", // 设备管理模块 @@ -772,7 +844,8 @@ const Map thTH = { "swipeUpForMore": "ปัดขึ้นเพื่อดูเพิ่มเติม", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'เมื่อเปิดใช้งาน: AI จะไม่ถูกขัดจังหวะโดยเสียงของคุณขณะพูด และสามารถจัดการได้เพียงหนึ่งรอบการสนทนา หากต้องการเริ่มรอบใหม่ เพียงพูดคำปลุก', + 'voice_interrupt_tip': + 'เมื่อเปิดใช้งาน: AI จะไม่ถูกขัดจังหวะโดยเสียงของคุณขณะพูด และสามารถจัดการได้เพียงหนึ่งรอบการสนทนา หากต้องการเริ่มรอบใหม่ เพียงพูดคำปลุก', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -795,10 +868,14 @@ const Map thTH = { '• 控制耳机功能\n\n' '有什么我可以帮你的吗?', 'microphonePermission': 'ไมโครโฟน', - 'voiceRecognitionPermissionText': 'ฟังก์ชันรู้จำเสียงต้องการการเข้าถึงไมโครโฟน', - 'voiceTranslationPermissionText': 'ฟังก์ชันรู้จำและแปลเสียงต้องการการเข้าถึงไมโครโฟน', - 'phoneCallPermissionText': 'ฟังก์ชันโทรออกต้องการการเข้าถึงไมโครโฟนสำหรับการโทรด้วยเสียง', - 'permissionDeniedText': 'คุณได้ปฏิเสธการอนุญาตใช้ไมโครโฟนอย่างถาวร โปรดไปที่การตั้งค่าระบบเพื่อเปิดใช้งาน', + 'voiceRecognitionPermissionText': + 'ฟังก์ชันรู้จำเสียงต้องการการเข้าถึงไมโครโฟน', + 'voiceTranslationPermissionText': + 'ฟังก์ชันรู้จำและแปลเสียงต้องการการเข้าถึงไมโครโฟน', + 'phoneCallPermissionText': + 'ฟังก์ชันโทรออกต้องการการเข้าถึงไมโครโฟนสำหรับการโทรด้วยเสียง', + 'permissionDeniedText': + 'คุณได้ปฏิเสธการอนุญาตใช้ไมโครโฟนอย่างถาวร โปรดไปที่การตั้งค่าระบบเพื่อเปิดใช้งาน', 'startVoiceInput': 'เริ่มการป้อนข้อมูลด้วยเสียง', 'startPhoneCallMode': 'เริ่มโหมดโทรศัพท์ เริ่มการป้อนข้อมูลด้วยเสียง', @@ -820,9 +897,17 @@ const Map thTH = { 'privacyRelated': 'เกี่ยวกับความเป็นส่วนตัว', 'copyrightViolation': 'ละเมิดลิขสิทธิ์ ชื่อเสียง ฯลฯ ของฉัน', 'other': 'อื่นๆ', - 'reportDescriptionHint': 'เราต้องการทราบเหตุผลที่คุณรายงาน คุณสามารถอธิบายปัญหาที่คุณพบได้', + 'reportDescriptionHint': + 'เราต้องการทราบเหตุผลที่คุณรายงาน คุณสามารถอธิบายปัญหาที่คุณพบได้', 'generatedByAi': 'สร้างโดย AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'นี่คือเพลงที่แนะนำบางส่วน:', 'playList': 'เพลย์ลิสต์', @@ -843,19 +928,49 @@ const Map thTH = { "bicycling": "ขี่จักรยาน", "tsransit": "ขนส่งสาธารณะ", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Failed to start navigation', + 'cannotPlayMusicListRetryLater': + 'Cannot play music list, please try again later', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Error opening map', + 'pleaseInstallAmapApp': 'Please install the Amap app first', + 'pleaseInstallBaiduMapApp': 'Please install the Baidu Maps app first', + 'appleMapStartFailed': 'Apple Maps failed to start', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Error opening Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'กำลังสอบถามสภาพอากาศ:', 'highest': 'สูงสุด', 'lowest': 'ต่ำสุด', 'futureForecast': 'พยากรณ์อากาศล่วงหน้า', 'hotWeatherTip': 'วันนี้อากาศร้อน โปรดระวังโรคลมแดด ดื่มน้ำมากๆ', - 'coldWeatherTip': 'วันนี้อากาศเย็น โปรดใส่ใจเรื่องความอบอุ่นเมื่อออกไปข้างนอก ระวังเป็นหวัด', - 'rainyWeatherTip': 'วันนี้มีฝน โปรดพกร่มเมื่อออกไปข้างนอก ระมัดระวังในการเดินทาง', - 'snowyWeatherTip': 'วันนี้มีหิมะ ถนนลื่นโปรดระวังความปลอดภัย เตรียมมาตรการป้องกันความหนาว', - 'foggyWeatherTip': 'วันนี้มีหมอก ทัศนวิสัยต่ำ โปรดสวมหน้ากากเมื่อออกไปข้างนอก', - 'windyWeatherTip': 'วันนี้ลมแรง โปรดระวังความปลอดภัยเมื่อออกไปข้างนอก ยึดของให้แน่น', - 'sunnyWeatherTip': 'วันนี้แดดจัด รังสียูวีแรง โปรดป้องกันแสงแดดเมื่อออกไปข้างนอก', - 'temperatureDifferenceTip': 'วันนี้อุณหภูมิต่างกันมากระหว่างกลางวันและกลางคืน โปรดเพิ่มหรือลดเสื้อผ้าให้เหมาะสม', + 'coldWeatherTip': + 'วันนี้อากาศเย็น โปรดใส่ใจเรื่องความอบอุ่นเมื่อออกไปข้างนอก ระวังเป็นหวัด', + 'rainyWeatherTip': + 'วันนี้มีฝน โปรดพกร่มเมื่อออกไปข้างนอก ระมัดระวังในการเดินทาง', + 'snowyWeatherTip': + 'วันนี้มีหิมะ ถนนลื่นโปรดระวังความปลอดภัย เตรียมมาตรการป้องกันความหนาว', + 'foggyWeatherTip': + 'วันนี้มีหมอก ทัศนวิสัยต่ำ โปรดสวมหน้ากากเมื่อออกไปข้างนอก', + 'windyWeatherTip': + 'วันนี้ลมแรง โปรดระวังความปลอดภัยเมื่อออกไปข้างนอก ยึดของให้แน่น', + 'sunnyWeatherTip': + 'วันนี้แดดจัด รังสียูวีแรง โปรดป้องกันแสงแดดเมื่อออกไปข้างนอก', + 'temperatureDifferenceTip': + 'วันนี้อุณหภูมิต่างกันมากระหว่างกลางวันและกลางคืน โปรดเพิ่มหรือลดเสื้อผ้าให้เหมาะสม', 'comfortableWeatherTip': 'วันนี้อากาศดี เป็นเวลาที่ดีสำหรับกิจกรรมกลางแจ้ง', "monday": "จ.", "tuesday": "อ.", @@ -900,13 +1015,25 @@ const Map thTH = { "selectTargetLanguage": "เลือกภาษาเป้าหมาย", "me": "Me", "counterPart": "Counterpart", - "bluetoothCallStateError": "Please make sure the Bluetooth headset is connected to the phone and in a call state", + "bluetoothCallStateError": + "Please make sure the Bluetooth headset is connected to the phone and in a call state", "autoDetect": "Auto Detect", // 自动检测 + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Disable Floating Window', + 'enableFloatingWindow': 'Enable Floating Window', + 'permissionTip': 'Permission Tip', + 'micPermissionRequiredForRecording': + 'Microphone permission is required for recording', + 'deleteTranslationRecordError': 'Error deleting translation record: @error', + // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", "translationFailed": "Translation failed", + "translating": "Translating", + "translate": "Translate", "pleaseInputText": "Please input text", + "inputTextToTranslate": "กรุณากรอกข้อความที่ต้องการแปล", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -914,10 +1041,12 @@ const Map thTH = { "historyRecords": "History Records", "clearResults": "Clear Results", "clearHistory": "ล้างประวัติ", - "clearHistoryConfirm": "คุณแน่ใจหรือไม่ว่าต้องการล้างประวัติการแปลทั้งหมด การกระทำนี้ไม่สามารถย้อนกลับได้", + "clearHistoryConfirm": + "คุณแน่ใจหรือไม่ว่าต้องการล้างประวัติการแปลทั้งหมด การกระทำนี้ไม่สามารถย้อนกลับได้", "unknownLanguage": "ภาษาที่ไม่รู้จัก", "deleteSessionRecord": "ลบบันทึกเซสชัน", - "deleteSessionConfirm": "คุณแน่ใจหรือไม่ว่าต้องการลบบันทึกการแปลทั้งหมดของเซสชันนี้ การกระทำนี้ไม่สามารถย้อนกลับได้", + "deleteSessionConfirm": + "คุณแน่ใจหรือไม่ว่าต้องการลบบันทึกการแปลทั้งหมดของเซสชันนี้ การกระทำนี้ไม่สามารถย้อนกลับได้", // 翻译模块 - 图片翻译 "selectImageSource": "Select Image Source", @@ -949,15 +1078,20 @@ const Map thTH = { "translationCompleted": "Translation Completed", "allStepsCompleted": "All steps completed", "processingFailed": "Processing Failed", - "imageProcessingOrTranslationFailed": "Image processing or translation failed. Please retry.\nError: {error}", + "imageProcessingOrTranslationFailed": + "Image processing or translation failed. Please retry.\nError: {error}", "imageTooLarge": "Image size exceeds 4MB limit", - "imageTooLargeHint": "Image size exceeds 4MB. Reduce quality or dimensions and retry", + "imageTooLargeHint": + "Image size exceeds 4MB. Reduce quality or dimensions and retry", "emptyTranslationResult": "Image translation API returned empty result", - "imageTranslationFailedTryLater": "Image translation failed. Network issue or rate limit. Please try later", - "imageTranslationApiException": "Image translation API exception. Check network and retry", + "imageTranslationFailedTryLater": + "Image translation failed. Network issue or rate limit. Please try later", + "imageTranslationApiException": + "Image translation API exception. Check network and retry", "permissionRequired": "Permission Required", "cameraPermissionRequired": "Camera permission required to take photos", - "photoAlbumPermissionRequired": "Photo album permission required to pick images", + "photoAlbumPermissionRequired": + "Photo album permission required to pick images", "translationDetails": "Translation Details", "originalImage": "Original Image", "sourceLanguage": "Source Language", @@ -988,9 +1122,11 @@ const Map thTH = { "summaryGenerated": "สร้างสรุปแล้ว", "generating": "กำลังสร้าง...", "regenerate": "สร้างใหม่", - "summaryTimeoutMessage": "คำขอสร้างสรุปหมดเวลา อาจเป็นเพราะปัญหาเครือข่ายหรือเซิร์ฟเวอร์ไม่ว่าง", + "summaryTimeoutMessage": + "คำขอสร้างสรุปหมดเวลา อาจเป็นเพราะปัญหาเครือข่ายหรือเซิร์ฟเวอร์ไม่ว่าง", "deleteTranslationRecord": "ลบบันทึกการแปล", - "deleteTranslationConfirm": "คุณแน่ใจหรือไม่ว่าต้องการลบบันทึกการแปลนี้ การกระทำนี้ไม่สามารถย้อนกลับได้", + "deleteTranslationConfirm": + "คุณแน่ใจหรือไม่ว่าต้องการลบบันทึกการแปลนี้ การกระทำนี้ไม่สามารถย้อนกลับได้", "originalText": "ข้อความต้นฉบับ", "translatedText": "ข้อความที่แปลแล้ว", "sessionSummary": "สรุปเซสชัน", @@ -1010,20 +1146,27 @@ const Map thTH = { "logout": "ออกจากระบบ", "logoutTips": "คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบบัญชีปัจจุบัน", 'deleteAccount': 'ลบบัญชี', - 'deleteAccountTips': 'คุณแน่ใจหรือไม่ว่าต้องการลบบัญชีของคุณอย่างถาวร การกระทำนี้ไม่สามารถย้อนกลับได้', + 'deleteAccountTips': + 'คุณแน่ใจหรือไม่ว่าต้องการลบบัญชีของคุณอย่างถาวร การกระทำนี้ไม่สามารถย้อนกลับได้', 'clean': 'Clear Cache', 'cleanTips': 'Are you sure you want to clear personal cache?', - 'networkConnectionFailed': 'การเชื่อมต่อเครือข่ายล้มเหลว โปรดตรวจสอบการตั้งค่าเครือข่ายแล้วลองใหม่', - 'serverTemporarilyUnavailable': 'เซิร์ฟเวอร์ไม่สามารถตอบสนองได้ชั่วคราว โปรดลองใหม่ในภายหลัง', - 'loginExpiredPleaseRelogin': 'การเข้าสู่ระบบหมดอายุแล้ว โปรดเข้าสู่ระบบอีกครั้ง', + 'networkConnectionFailed': + 'การเชื่อมต่อเครือข่ายล้มเหลว โปรดตรวจสอบการตั้งค่าเครือข่ายแล้วลองใหม่', + 'serverTemporarilyUnavailable': + 'เซิร์ฟเวอร์ไม่สามารถตอบสนองได้ชั่วคราว โปรดลองใหม่ในภายหลัง', + 'loginExpiredPleaseRelogin': + 'การเข้าสู่ระบบหมดอายุแล้ว โปรดเข้าสู่ระบบอีกครั้ง', 'noPermissionForThisOperation': 'ไม่มีสิทธิ์ดำเนินการนี้', 'requestedResourceNotFound': 'ไม่พบทรัพยากรที่ร้องขอ', - 'imageProcessingFailedPleaseReselect': 'การประมวลผลรูปภาพล้มเหลว โปรดเลือกรูปภาพอีกครั้ง', + 'imageProcessingFailedPleaseReselect': + 'การประมวลผลรูปภาพล้มเหลว โปรดเลือกรูปภาพอีกครั้ง', 'operationFailedPleaseRetry': 'การดำเนินการล้มเหลว โปรดลองใหม่', 'serverReturnedError': 'เซิร์ฟเวอร์ส่งคืนข้อผิดพลาด', 'serverError': 'ข้อผิดพลาดของเซิร์ฟเวอร์', - 'networkConnectionFailedCheckSettings': 'การเชื่อมต่อเครือข่ายล้มเหลว โปรดตรวจสอบการตั้งค่าเครือข่าย', - 'serverInternalErrorRetryLater': 'ข้อผิดพลาดภายในเซิร์ฟเวอร์ โปรดลองใหม่ในภายหลัง', + 'networkConnectionFailedCheckSettings': + 'การเชื่อมต่อเครือข่ายล้มเหลว โปรดตรวจสอบการตั้งค่าเครือข่าย', + 'serverInternalErrorRetryLater': + 'ข้อผิดพลาดภายในเซิร์ฟเวอร์ โปรดลองใหม่ในภายหลัง', 'imageCompressionFailed': 'การบีบอัดรูปภาพล้มเหลว', 'avatarUpdateFailed': 'อัปเดตอวาตาร์ล้มเหลว', 'usernameCannotBeEmpty': 'ชื่อผู้ใช้ต้องไม่ว่างเปล่า', @@ -1039,14 +1182,17 @@ const Map thTH = { 'thirdPartyLogoutSuccess': 'ออกจากระบบบุคคลที่สามสำเร็จ', // 第三方登录退出成功 'thirdPartyLogoutFailed': 'ออกจากระบบบุคคลที่สามล้มเหลว', // 第三方登录退出失败 'signOutProcessError': 'เกิดข้อผิดพลาดระหว่างกระบวนการออกจากระบบ', // 登出过程发生错误 - 'deleteAccountProcessError': 'เกิดข้อผิดพลาดระหว่างกระบวนการลบบัญชี', // 删除账号过程发生错误 + 'deleteAccountProcessError': + 'เกิดข้อผิดพลาดระหว่างกระบวนการลบบัญชี', // 删除账号过程发生错误 'userDataClearSuccess': 'ล้างข้อมูลผู้ใช้สำเร็จ', // 用户数据清理成功 'allUserDataClearSuccess': 'ล้างข้อมูลผู้ใช้ทั้งหมดสำเร็จ', // 所有用户数据清理成功 - 'accountServiceInitialized': 'AccountService ได้รับการเริ่มต้นแล้ว', // AccountService 已初始化 + 'accountServiceInitialized': + 'AccountService ได้รับการเริ่มต้นแล้ว', // AccountService 已初始化 // 权限模块 'meetingStoragePermission': 'Storage', - 'meetingStoragePermissionExplanation': 'We need access to storage permissions so you can select and upload audio files.', + 'meetingStoragePermissionExplanation': + 'We need access to storage permissions so you can select and upload audio files.', 'meetingStoragePermissionPermanentDenial': '检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。', 'getPermissionStatusFailed': 'รับสถานะสิทธิ์ล้มเหลว', @@ -1068,9 +1214,11 @@ const Map thTH = { 'locationInfo': 'ข้อมูลตำแหน่ง', 'phonePermissionDesc': 'ใช้สำหรับฟังก์ชันการโทรออก', 'smsPermissionDesc': 'ใช้สำหรับฟังก์ชันการส่ง SMS', - 'alarmPermissionDesc': 'Used to set exact alarms to ensure reminders trigger on time', + 'alarmPermissionDesc': + 'Used to set exact alarms to ensure reminders trigger on time', 'calendarWritePermissionDesc': 'ใช้สำหรับสร้างกิจกรรมและการแจ้งเตือนในปฏิทิน', - 'calendarFullAccessPermissionDesc': 'ใช้สำหรับอ่านและจัดการกิจกรรมและการแจ้งเตือนในปฏิทิน', + 'calendarFullAccessPermissionDesc': + 'ใช้สำหรับอ่านและจัดการกิจกรรมและการแจ้งเตือนในปฏิทิน', 'locationPermissionDesc': 'ใช้สำหรับรับข้อมูลตำแหน่งปัจจุบัน', 'appFunctionNeeds': 'ฟังก์ชันแอปพลิเคชันต้องการ', 'authorized': 'ได้รับอนุญาต', @@ -1082,40 +1230,63 @@ const Map thTH = { 'permissionRequestError': 'เกิดข้อผิดพลาดขณะขอสิทธิ์', 'phonePermissionDetailDesc': 'ฟังก์ชันโทรออกต้องการสิทธิ์โทรศัพท์', 'smsPermissionDetailDesc': 'ฟังก์ชันส่ง SMS ต้องการสิทธิ์ SMS', - 'alarmPermissionDetailDesc': 'This permission is required to set exact alarms and ensure reminders trigger on time', - 'calendarWritePermissionDetailDesc': 'การสร้างกิจกรรมในปฏิทินต้องการสิทธิ์เขียนปฏิทิน', - 'calendarFullAccessPermissionDetailDesc': 'การจัดการกิจกรรมในปฏิทินต้องการสิทธิ์เข้าถึงปฏิทินเต็มรูปแบบ', + 'alarmPermissionDetailDesc': + 'This permission is required to set exact alarms and ensure reminders trigger on time', + 'calendarWritePermissionDetailDesc': + 'การสร้างกิจกรรมในปฏิทินต้องการสิทธิ์เขียนปฏิทิน', + 'calendarFullAccessPermissionDetailDesc': + 'การจัดการกิจกรรมในปฏิทินต้องการสิทธิ์เข้าถึงปฏิทินเต็มรูปแบบ', 'locationPermissionDetailDesc': 'การรับข้อมูลตำแหน่งต้องการสิทธิ์ตำแหน่ง', 'contactsPermissionDesc': 'Used for accessing contact information', - 'contactsPermissionDetailDesc': 'Phone call and SMS functionality requires contacts permission to select contacts', - 'bluetoothPermissionDesc': 'Used for connecting and managing Bluetooth devices', - 'bluetoothPermissionDetailDesc': 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', + 'contactsPermissionDetailDesc': + 'Phone call and SMS functionality requires contacts permission to select contacts', + 'bluetoothPermissionDesc': + 'Used for connecting and managing Bluetooth devices', + 'bluetoothPermissionDetailDesc': + 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', 'bluetoothScanPermissionDesc': 'Used for scanning nearby Bluetooth devices', - 'bluetoothScanPermissionDetailDesc': 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', + 'bluetoothScanPermissionDetailDesc': + 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', 'bluetoothConnectPermissionDesc': 'Used for connecting to Bluetooth devices', - 'bluetoothConnectPermissionDetailDesc': 'Connecting to Bluetooth devices requires Bluetooth connect permission', + 'bluetoothConnectPermissionDetailDesc': + 'Connecting to Bluetooth devices requires Bluetooth connect permission', 'notificationPermissionDesc': 'Used for sending notification messages', - 'notificationPermissionDetailDesc': 'App needs notification permission to send you important alerts and messages', - 'appNeedsPermissionForFullFunction': 'แอปพลิเคชันต้องการสิทธิ์นี้เพื่อให้บริการเต็มรูปแบบ', - 'permanentDenialText': 'คุณได้ปฏิเสธสิทธิ์ {permission} อย่างถาวร โปรดไปที่การตั้งค่าแอปเพื่อเปิดใช้งาน', + 'notificationPermissionDetailDesc': + 'App needs notification permission to send you important alerts and messages', + 'appNeedsPermissionForFullFunction': + 'แอปพลิเคชันต้องการสิทธิ์นี้เพื่อให้บริการเต็มรูปแบบ', + 'permanentDenialText': + 'คุณได้ปฏิเสธสิทธิ์ {permission} อย่างถาวร โปรดไปที่การตั้งค่าแอปเพื่อเปิดใช้งาน', 'goToSettings': 'ไปที่การตั้งค่า', 'bluetoothScan': 'Bluetooth Scan', 'bluetoothConnect': 'Bluetooth Connect', - 'bluetoothScanExplanation': 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', - 'bluetoothConnectExplanation': 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', - 'locationForBluetoothExplanation': 'The app needs location permission to scan Bluetooth devices.', - 'bluetoothScanPermanentDenial': 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', - 'bluetoothConnectPermanentDenial': 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', - 'locationPermanentDenial': 'Location permission has been permanently denied, please go to settings to enable it manually.', + 'bluetoothScanExplanation': + 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', + 'bluetoothConnectExplanation': + 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', + 'locationForBluetoothExplanation': + 'The app needs location permission to scan Bluetooth devices.', + 'bluetoothScanPermanentDenial': + 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', + 'bluetoothConnectPermanentDenial': + 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', + 'locationPermanentDenial': + 'Location permission has been permanently denied, please go to settings to enable it manually.', 'notificationPermission': 'Notification', 'locationPermission': 'Location', - 'notificationPermissionExplanation': 'Notification permission is required to display music playback status.', - 'locationPermissionExplanation': 'Location permission is required to get current location.', - 'notificationPermissionPermanentDenial': 'You have permanently denied notification permission, please go to settings to enable it.', - 'locationPermissionPermanentDenial': 'You have permanently denied location permission, please go to settings to enable it.', + 'notificationPermissionExplanation': + 'Notification permission is required to display music playback status.', + 'locationPermissionExplanation': + 'Location permission is required to get current location.', + 'notificationPermissionPermanentDenial': + 'You have permanently denied notification permission, please go to settings to enable it.', + 'locationPermissionPermanentDenial': + 'You have permanently denied location permission, please go to settings to enable it.', 'storagePermission': 'Storage', - 'microphonePermissionExplanation': 'We need microphone permission to record audio content.', - 'storagePermissionExplanation': 'We need storage permission so you can select and upload audio files.', + 'microphonePermissionExplanation': + 'We need microphone permission to record audio content.', + 'storagePermissionExplanation': + 'We need storage permission so you can select and upload audio files.', 'microphonePermissionPermanentDenial': '检测到您已永久拒绝录音权限。如需继续使用此功能,请前往应用设置中手动开启麦克风权限。', 'storagePermissionPermanentDenial': @@ -1123,21 +1294,23 @@ const Map thTH = { 'permissionUtilNeed': 'Need ', 'permissionUtilPermission': ' Permission', 'permissionUtilRestricted': ' Permission Restricted', - 'permissionUtilRestrictedMessage': 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', + 'permissionUtilRestrictedMessage': + 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'กำลังนำทาง', - 'native.notification.navigation.keepRunning': 'กำลังนำทาง โปรดเปิดแอปไว้', - 'native.notification.bleAgent.running': 'ตัวช่วยเสียงกำลังทำงาน', - 'native.notification.audioRecording.recording': 'กำลังบันทึกเสียง แตะเพื่อกลับไปที่แอป', - 'native.notification.music.waiting': 'กำลังรอเล่น', - 'native.notification.music.previous': 'ก่อนหน้า', - 'native.notification.music.next': 'ถัดไป', - 'native.notification.music.play': 'เล่น', - 'native.notification.music.pause': 'หยุดชั่วคราว', - 'native.notification.qqMusic.playing': 'กำลังเล่นเพลง', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'กำลังนำทาง', + 'native.notification.navigation.keepRunning': 'กำลังนำทาง โปรดเปิดแอปไว้', + 'native.notification.bleAgent.running': 'ตัวช่วยเสียงกำลังทำงาน', + 'native.notification.audioRecording.recording': + 'กำลังบันทึกเสียง แตะเพื่อกลับไปที่แอป', + 'native.notification.music.waiting': 'กำลังรอเล่น', + 'native.notification.music.previous': 'ก่อนหน้า', + 'native.notification.music.next': 'ถัดไป', + 'native.notification.music.play': 'เล่น', + 'native.notification.music.pause': 'หยุดชั่วคราว', + 'native.notification.qqMusic.playing': 'กำลังเล่นเพลง', // 版本更新 'newVersionFound': 'พบเวอร์ชันใหม่', // 版本更新对话框标题 @@ -1145,8 +1318,10 @@ const Map thTH = { 'updateNow': 'อัปเดตทันที', // 立即更新按钮 'checkUpdate': 'ตรวจสอบการอัปเดต', // 检查更新按钮 'updateFailed': 'อัปเดตล้มเหลว', // 更新失败提示 - 'cannotOpenAppStore': 'ไม่สามารถเปิด App Store ได้ โปรดไปที่ App Store เพื่ออัปเดตด้วยตนเอง', // 无法打开应用商店提示 - 'updateErrorRetry': 'เกิดข้อผิดพลาดระหว่างการอัปเดต โปรดลองใหม่ในภายหลัง', // 更新错误重试提示 + 'cannotOpenAppStore': + 'ไม่สามารถเปิด App Store ได้ โปรดไปที่ App Store เพื่ออัปเดตด้วยตนเอง', // 无法打开应用商店提示 + 'updateErrorRetry': + 'เกิดข้อผิดพลาดระหว่างการอัปเดต โปรดลองใหม่ในภายหลัง', // 更新错误重试提示 // 配对模块 "devicePairing": "การจับคู่อุปกรณ์", @@ -1164,23 +1339,29 @@ const Map thTH = { 'bluetooth': 'บลูทูธ', "readyToPair": "พร้อมที่จะจับคู่", "preparingPairingEnvironment": "กำลังเตรียมสภาพแวดล้อมการจับคู่...", - "connectDeepSoundViaSystemBluetooth": "กรุณาเชื่อมต่อกับอุปกรณ์ Voitrans ผ่านบลูทูธของระบบก่อน", + "connectDeepSoundViaSystemBluetooth": + "กรุณาเชื่อมต่อกับอุปกรณ์ Voitrans ผ่านบลูทูธของระบบก่อน", "deviceBindingConfirm": "ยืนยันการผูกอุปกรณ์...", "establishingDeviceAssociation": "กำลังสร้างการเชื่อมโยงอุปกรณ์...", "waitingCompletePairing": "กรุณารอสักครู่ กำลังทำการจับคู่ให้เสร็จสิ้น...", - "pairingSuccessRedirecting": "การจับคู่สำเร็จ! กำลังเปลี่ยนเส้นทางไปยังหน้าหลัก...", - "ensureConnectedDeepSoundDevice": "โปรดตรวจสอบให้แน่ใจว่าคุณเชื่อมต่อกับอุปกรณ์ Voitrans", + "pairingSuccessRedirecting": + "การจับคู่สำเร็จ! กำลังเปลี่ยนเส้นทางไปยังหน้าหลัก...", + "ensureConnectedDeepSoundDevice": + "โปรดตรวจสอบให้แน่ใจว่าคุณเชื่อมต่อกับอุปกรณ์ Voitrans", "deviceAlreadyBoundToOtherAccount": "อุปกรณ์นี้ถูกผูกไว้กับบัญชีอื่นแล้ว", "deviceAssociationFailed": "การเชื่อมโยงอุปกรณ์ล้มเหลว โปรดลองอีกครั้ง", - "scanTimeoutEnsureDeviceNearby": "การสแกนหมดเวลา โปรดตรวจสอบให้แน่ใจว่าอุปกรณ์อยู่ใกล้ๆ", + "scanTimeoutEnsureDeviceNearby": + "การสแกนหมดเวลา โปรดตรวจสอบให้แน่ใจว่าอุปกรณ์อยู่ใกล้ๆ", "networkError": "ข้อผิดพลาดเครือข่าย", - "authorizationFailedCheckCode": "การอนุญาตล้มเหลว โปรดตรวจสอบว่ารหัสอนุญาตถูกต้องหรือไม่", + "authorizationFailedCheckCode": + "การอนุญาตล้มเหลว โปรดตรวจสอบว่ารหัสอนุญาตถูกต้องหรือไม่", "pairingFailedRetry": "การจับคู่ล้มเหลว โปรดลองอีกครั้ง", 'pleaseEnableBluetooth': 'กรุณาเปิดใช้งานบลูทูธ', 'deviceDisconnected': 'อุปกรณ์ตัดการเชื่อมต่อแล้ว', 'readyToStartPairing': 'พร้อมที่จะเริ่มการจับคู่', 'checkingEnvironment': 'กำลังตรวจสอบสภาพแวดล้อม...', - 'ensureHeadsetOnAndPairingMode': 'โปรดตรวจสอบให้แน่ใจว่าหูฟังเปิดอยู่และอยู่ในโหมดจับคู่', + 'ensureHeadsetOnAndPairingMode': + 'โปรดตรวจสอบให้แน่ใจว่าหูฟังเปิดอยู่และอยู่ในโหมดจับคู่', 'establishingSecureConnection': 'กำลังสร้างการเชื่อมต่อที่ปลอดภัย...', 'needManualBindingAuthCode': 'ต้องใช้รหัสอนุญาตการผูกด้วยตนเอง...', 'pairingSuccessful': 'การจับคู่สำเร็จ!', @@ -1198,13 +1379,18 @@ const Map thTH = { 'bleConnectionTimeoutRetry': 'การเชื่อมต่อ BLE หมดเวลา โปรดลองอีกครั้ง', 'blePairingStartupFailed': 'การเริ่มต้นการจับคู่ BLE ล้มเหลว', 'bleConnectionFailed': 'การเชื่อมต่อ BLE ล้มเหลว', - 'deviceAuthorizationFailedCheckCode': 'การอนุญาตอุปกรณ์ล้มเหลว โปรดตรวจสอบรหัสอนุญาต', + 'deviceAuthorizationFailedCheckCode': + 'การอนุญาตอุปกรณ์ล้มเหลว โปรดตรวจสอบรหัสอนุญาต', 'bluetoothGuideTitle': 'Manual Bluetooth Activation Required', // 需要手动开启蓝牙 'bluetoothGuideSteps': 'Please follow these steps:', // 请按照以下步骤操作: - 'bluetoothGuideStep1': 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 - 'bluetoothGuideStep2': 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 - 'bluetoothGuideStep3': 'Return to app to continue pairing process', // 返回应用继续配对流程 - 'bluetoothGuideTip': 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 + 'bluetoothGuideStep1': + 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 + 'bluetoothGuideStep2': + 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 + 'bluetoothGuideStep3': + 'Return to app to continue pairing process', // 返回应用继续配对流程 + 'bluetoothGuideTip': + 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 'iKnow': 'I Know', // 我知道了 // 配对模块 - 绑定奖励 @@ -1227,11 +1413,13 @@ const Map thTH = { 'contactInfo': 'ข้อมูลติดต่อ', 'contactHint': 'อีเมล/หมายเลขโทรศัพท์ เพื่อให้เราสามารถติดต่อคุณได้', 'submit': 'ส่ง', - 'feedbackSubmitSuccess': 'ส่งความคิดเห็นสำเร็จ ขอบคุณสำหรับความคิดเห็นของคุณ!', + 'feedbackSubmitSuccess': + 'ส่งความคิดเห็นสำเร็จ ขอบคุณสำหรับความคิดเห็นของคุณ!', 'feedbackSubmitFailed': 'ส่งความคิดเห็นล้มเหลว โปรดลองใหม่ในภายหลัง', // OTA升级模块 - "upgradeExitConfirm": "กำลังอัปเกรด การออกจะขัดจังหวะกระบวนการอัปเกรด คุณแน่ใจหรือไม่ว่าต้องการออก", + "upgradeExitConfirm": + "กำลังอัปเกรด การออกจะขัดจังหวะกระบวนการอัปเกรด คุณแน่ใจหรือไม่ว่าต้องการออก", "deviceModel": "รุ่นอุปกรณ์", "unknownDevice": "อุปกรณ์ที่ไม่รู้จัก", "currentFirmwareVersion": "เวอร์ชันเฟิร์มแวร์ปัจจุบัน", @@ -1244,14 +1432,70 @@ const Map thTH = { "retryConnection": "ลองเชื่อมต่อใหม่", "ota_updateNow": "อัปเดตทันที", "otaVersionInfoFailed": "Failed to get version info. Please try again later.", - "otaDeviceInfoUnavailable": "Unable to get device info. Please check the connection and retry.", - "otaProductInfoUnavailable": "Unable to identify the device. Please reconnect and retry.", - "otaFirmwareVersionInvalid": "Firmware version is abnormal. Please reconnect and retry.", - "keepConnectedDontClose": "โปรดให้อุปกรณ์เชื่อมต่ออยู่เสมอ อย่าปิดแอปพลิเคชัน", + "otaDeviceInfoUnavailable": + "Unable to get device info. Please check the connection and retry.", + "otaProductInfoUnavailable": + "Unable to identify the device. Please reconnect and retry.", + "otaFirmwareVersionInvalid": + "Firmware version is abnormal. Please reconnect and retry.", + "keepConnectedDontClose": + "โปรดให้อุปกรณ์เชื่อมต่ออยู่เสมอ อย่าปิดแอปพลิเคชัน", "doNotDisconnect": "โปรดอย่าตัดการเชื่อมต่อ", "charging": "กำลังชาร์จ", "updateContent": "เนื้อหาการอัปเดต", - "removeEarbudsEnsureBattery": "ถอดหูฟังทั้งสองข้างออก และตรวจสอบให้แน่ใจว่าแบตเตอรี่ทั้งสองข้างมีพลังงานมากกว่า 20%", + "removeEarbudsEnsureBattery": + "ถอดหูฟังทั้งสองข้างออก และตรวจสอบให้แน่ใจว่าแบตเตอรี่ทั้งสองข้างมีพลังงานมากกว่า 20%", + + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Upgrade Successful', + 'otaUpgradeCompleteRepair': + 'Firmware upgrade complete!\n\nDevice needs to be re-paired to work properly. Go to pairing page now?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': + 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': + 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': + 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', // 音乐模块 "noMusic": "ไม่มีเพลง", // 暂无音乐 diff --git a/lib/core/translations/language/tl_ph.dart b/lib/core/translations/language/tl_ph.dart index 596e785cc..f37018bb2 100644 --- a/lib/core/translations/language/tl_ph.dart +++ b/lib/core/translations/language/tl_ph.dart @@ -1,11 +1,10 @@ const Map tlPH = { - // 通用 'continue': 'Magpatuloy', 'confirm': 'Kumpirmahin', 'cancel': 'Kanselahin', 'retry': 'Subukang muli', - 'error': 'Error', + 'error': 'Kamalian', 'success': 'Tagumpay', 'connected': 'Konektado', 'connecting': 'Kumokonekta...', @@ -19,11 +18,11 @@ const Map tlPH = { "unknownError": "Hindi Malamang Error", "asrConnectionFailed": "Nabigo ang koneksyon sa speech recognition service. Pakisuri ang network at subukang muli mamaya.", - "justNow": "Just now", - "minutesAgo": "@minutes minutes ago", - "yesterday": "Yesterday", - "daysAgo": "@days days ago", - "hoursAgo": "@hours hours ago", + "justNow": "Katatapos lang", + "minutesAgo": "@minutes minuto ang nakalipas", + "yesterday": "Kahapon", + "daysAgo": "@days araw ang nakalipas", + "hoursAgo": "@hours oras ang nakalipas", // 启动页 "slogan": "Ikonekta ang mundo, higit pa sa tunog", @@ -80,7 +79,8 @@ const Map tlPH = { // 登录模块 "welcome": "Maligayang pagdating", - "loginTips": "Mangyaring mag-login o mag-signup gamit ang iyong numero ng telepono o email", + "loginTips": + "Mangyaring mag-login o mag-signup gamit ang iyong numero ng telepono o email", "accountNumber": "Numero ng Telepono o Email", "verificationCode": "Verification Code", "getCode": "Kunin ang Code", @@ -99,14 +99,16 @@ const Map tlPH = { "tip": "Paalala", "pleaseEnterCompleteCode": "Pakilagay ang kumpletong verification code", "loginFailed": "Nabigo ang pag-login, pakisubukang muli", - 'pleaseAcceptPrivacyPolicy': 'Pakibasa at sumang-ayon muna sa Patakaran sa Privacy at Kasunduan ng User', + 'pleaseAcceptPrivacyPolicy': + 'Pakibasa at sumang-ayon muna sa Patakaran sa Privacy at Kasunduan ng User', "enterVerificationCode": "Ilagay ang Verification Code", "verificationCodeSentTo": "Ang verification code ay ipinadala sa", "resendVerificationCode": "Ipadala muli ang verification code", "login": "Mag-login", "usePasswordLogin": "Gamitin ang password para mag-login", "loginDeclaration": "Pahayag ng Voitrans", // Voitrans 声明 - "welcomeToThisApp": "Maligayang pagdating sa Voitrans, mangyaring basahin nang mabuti", // 欢迎使用Voitrans,请充分阅读 + "welcomeToThisApp": + "Maligayang pagdating sa Voitrans, mangyaring basahin nang mabuti", // 欢迎使用Voitrans,请充分阅读 "privacyPolicyText": ",点击'同意并进入'表示您已充分阅读并同意上述协议。点击'不同意'将退出应用。", // ,点击"同意并进入"表示您已充分阅读并同意上述协议。点击"不同意"将退出应用。 "disagree": "Hindi Sumasang-ayon", // 不同意 @@ -118,26 +120,32 @@ const Map tlPH = { "connectingDevice": "Kumokonekta sa device...", "connectedTo": "Konektado sa", "signal": "Signal", - "deviceId": "Device ID", + "deviceId": "ID ng device", "firmwareVersion": "Bersyon ng Firmware", - "disconnectedDevice": "Walang device na konektado, i-click ang button sa ibaba para kumonekta", + "disconnectedDevice": + "Walang device na konektado, i-click ang button sa ibaba para kumonekta", "connectDevice": "Ikonekta ang Device", "topAiExperiences": "Mga Nangungunang Karanasan sa AI", "aiAssistant": "AI All-in-One Assistant", - "aiAssistantInfo": "24/7 na eksklusibong consultant, sumasagot sa mga tanong, nagbibigay ng payo", + "aiAssistantInfo": + "24/7 na eksklusibong consultant, sumasagot sa mga tanong, nagbibigay ng payo", "interpretation": "Sabayang Pagsasalin", - "simultaneousInterpretationInfo": "Real-time na pagsasalin sa maraming wika, walang alalahanin sa paglalakbay sa ibang bansa", + "simultaneousInterpretationInfo": + "Real-time na pagsasalin sa maraming wika, walang alalahanin sa paglalakbay sa ibang bansa", "aiCompanion": "Kasama ng Pamilya", "aiCompanionInfo": "Nakakaintindi sa iyo, mainit na samahan", "homeSlogan": "Ikonekta ang mundo, lampas sa tunog", - "turnEarphones": "Pakibuksan ang charging case ng earphones, at ilagay ang earphones sa iyong mga tainga", + "turnEarphones": + "Pakibuksan ang charging case ng earphones, at ilagay ang earphones sa iyong mga tainga", "currentlyConnected": "Kasalukuyang konektado:", "unsystemSetup": "Pumunta sa Mga Setting ng System", "talkLater": "Mamaya na", "initializing": "Nag-i-initialize...", - "bluetoothInitializationFailure": "Nabigo ang pag-initialize ng serbisyo ng Bluetooth", + "bluetoothInitializationFailure": + "Nabigo ang pag-initialize ng serbisyo ng Bluetooth", "checkingPermissions": "Sinusuri ang mga pahintulot...", - "lackPermissions": "Kulang sa mga pahintulot ng Bluetooth at sumasang-ayon ka sa lokasyon", + "lackPermissions": + "Kulang sa mga pahintulot ng Bluetooth at sumasang-ayon ka sa lokasyon", "searchingDevice": "Naghahanap ng mga device...", "findConnectedDevice": "Natagpuan ang konektadong device", "notFound": "Walang natagpuang konektadong Bluetooth device", @@ -156,11 +164,35 @@ const Map tlPH = { 'bluetoothOff': 'Naka-off ang Bluetooth', 'leftEar': 'Kaliwang Tainga', 'rightEar': 'Kanang Tainga', - 'chargingCase': 'Charging Case', + 'chargingCase': 'Kaso ng pag-charge', 'left': 'Kaliwa', 'right': 'Kanan', 'checkConnectionStatusFailed': 'Nabigong suriin ang katayuan ng koneksyon', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Nabigo ang pag-initialize ng Bluetooth: @error', + 'needBluetoothAndLocationPermission': + 'Kailangan ang mga pahintulot sa Bluetooth at lokasyon para mag-scan ng mga device', + 'permissionRequestFailedWithError': + 'Nabigo ang paghingi ng pahintulot: @error', + 'needPermission': 'Kailangan ng pahintulot', + 'blePermissionDialogContent': + 'Kailangan ng app na ito ang mga pahintulot sa Bluetooth at lokasyon para mag-scan ng mga device. Paki-enable ito sa Settings.', + 'needEnableBluetooth': 'I-enable ang Bluetooth', + 'enableBluetoothDialogContent': + 'Paki-enable ang Bluetooth para mag-scan at kumonekta sa mga device.', + 'bleScanFailedWithError': 'Nabigo ang pag-scan: @error', + 'bleConnectionSuccess': 'Matagumpay ang koneksyon', + 'bleConnectedToDevice': 'Nakakonekta sa @device', + 'bleConnectionFailedWithError': 'Nabigo ang koneksyon: @error', + 'bleDisconnected': 'Na-disconnect', + 'bleDeviceDisconnected': 'Na-disconnect ang device', + 'bleDisconnectFailedWithError': 'Nabigo ang pag-disconnect: @error', + 'signalStrong': 'Malakas', + 'signalMedium': 'Katamtaman', + 'signalWeak': 'Mahina', + 'signalVeryWeak': 'Napakahina', + // 发现页 "searchAi": "Maghanap ng mga function ng AI...", "exploreSlogan": "Mga matalinong earphone, walang katapusang posibilidad", @@ -169,7 +201,8 @@ const Map tlPH = { "exploreAi": "Galugarin ang mga function ng AI na inaalok ng Voitrans", "aiFunction": "Mga Function ng AI", "allRoundAssistant": "All-in-One Assistant", - "allRoundAssistantInfo": "Tumutulong sa iyong malutas ang iba't ibang problema", + "allRoundAssistantInfo": + "Tumutulong sa iyong malutas ang iba't ibang problema", "simultaneousTranslation": "Sabayang Pagsasalin", "faceToFaceTranslation": "Pagsasalin ng Harapan", 'audioVideoTranslation': 'Pagsasalin ng Audio at Video', @@ -180,53 +213,55 @@ const Map tlPH = { "healthConsultant": "Multi-functional na AI Chat", "healthConsultantInfo": "Nagbibigay ng mas maraming function ng AI chat", "conferenceAssistant": "Business Meeting Assistant", - "conferenceAssistantInfo": "Real-time na pagtatala ng mga minuto ng pulong, pagsasalin sa maraming wika", - "usageStats": "Usage Statistics", - "usageStatsInfo": "View your usage statistics", + "conferenceAssistantInfo": + "Real-time na pagtatala ng mga minuto ng pulong, pagsasalin sa maraming wika", + "usageStats": "Istatistika ng Paggamit", + "usageStatsInfo": "Tingnan ang iyong istatistika ng paggamit", "scene": "Eksena", // 用量统计模块 "aiChat": "AI Chat", - "translationStats": "Translation Statistics", - "meetingStats": "Meeting Statistics", - "today": "Today", - "thisWeek": "This Week", - "thisMonth": "This Month", - "history": "History", - "currentSessionStats": "Current Session Stats", - "translationCount": "Translation Count", - "sessionDuration": "Session Duration", - "characters": "Characters", - "recordingDuration": "Recording Duration", - "totalApiCalls": "Total API Calls", - "sessionCount": "Session Count", - "totalCharacters": "Total Characters", - "apiCallStats": "API Call Stats", - "translationApi": "Translation API", + "translationStats": "Istatistika ng Pagsasalin", + "meetingStats": "Istatistika ng Pulong", + "today": "Ngayon", + "thisWeek": "Ngayong linggo", + "thisMonth": "Ngayong buwan", + "history": "Kasaysayan", + "currentSessionStats": "Istatistika ng kasalukuyang session", + "translationCount": "Bilang ng pagsasalin", + "sessionDuration": "Tagal ng session", + "characters": "Mga karakter", + "recordingDuration": "Tagal ng pagre-record", + "totalApiCalls": "Kabuuang tawag sa API", + "sessionCount": "Bilang ng session", + "totalCharacters": "Kabuuang karakter", + "apiCallStats": "Istatistika ng tawag sa API", + "translationApi": "API ng pagsasalin", "asr": "ASR", "tts": "TTS", - "dataVolumeStats": "Data Volume Stats", - "sourceTextCharacters": "Source Text Characters", - "ttsTextCharacters": "TTS Text Characters", - "effectiveAudioDuration": "Effective Audio Duration", - "totalSessionDuration": "Total Session Duration", - "costStats": "Cost Stats", - "estimatedCost": "Estimated Cost", - "dailyCostThreshold": "Daily Cost Threshold", - "monthlyCostThreshold": "Monthly Cost Threshold", - "usageBehaviorStats": "Usage Behavior Stats", - "mostUsedLanguagePair": "Most-used language pair", - "mostUsedMode": "Most-used mode", - "asrApiCalls": "ASR Calls", - "totalAudioDuration": "Total Audio Duration", - "audioFileSize": "Audio File Size", - "transcriptBytes": "Transcript Bytes", - "loadFailed": "Load Failed", - "statsLoadFailedTryLater": "Statistics failed to load. Please try again later.", - "cleanupComplete": "Cleanup Complete", - "cleanedOldData": "Cleaned data older than 90 days", - "exportFeature": "Export Feature", - "exportInDevelopment": "Data export is under development", + "dataVolumeStats": "Istatistika ng dami ng data", + "sourceTextCharacters": "Mga karakter ng source text", + "ttsTextCharacters": "Mga karakter ng TTS text", + "effectiveAudioDuration": "Epektibong tagal ng audio", + "totalSessionDuration": "Kabuuang tagal ng session", + "costStats": "Istatistika ng gastos", + "estimatedCost": "Tinatayang gastos", + "dailyCostThreshold": "Arawang limit ng gastos", + "monthlyCostThreshold": "Buwanang limit ng gastos", + "usageBehaviorStats": "Istatistika ng gawi sa paggamit", + "mostUsedLanguagePair": "Pinakagamit na pares ng wika", + "mostUsedMode": "Pinakagamit na mode", + "asrApiCalls": "Mga tawag sa ASR", + "totalAudioDuration": "Kabuuang tagal ng audio", + "audioFileSize": "Laki ng audio file", + "transcriptBytes": "Mga byte ng transcript", + "loadFailed": "Nabigong i-load", + "statsLoadFailedTryLater": + "Nabigong i-load ang istatistika. Pakisubukang muli mamaya.", + "cleanupComplete": "Tapos na ang paglilinis", + "cleanedOldData": "Nilinis ang data na mas luma sa 90 araw", + "exportFeature": "Feature ng export", + "exportInDevelopment": "Ginagawa pa ang pag-export ng data", // 商品模块 - 通用 'availablePackages': 'Available Packages', @@ -234,64 +269,72 @@ const Map tlPH = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Matagumpay ang pagbabayad', - 'paymentFailed': 'Nabigo ang pagbabayad', - 'gotIt': 'Naintindihan', - 'paymentFailedTryAgain': 'Nabigo ang pagbabayad. Pakisubukang muli.', - 'selectPaymentMethod': 'Pumili ng paraan ng pagbabayad', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Hindi nagawa ang order sa WeChat', - 'alipayOrderCreateFailed': 'Hindi nagawa ang order sa Alipay', - 'appleOrderCreateFailed': 'Hindi nagawa ang order sa Apple', - 'googleOrderCreateFailed': 'Hindi nagawa ang order sa Google', - 'paypalOrderCreateFailed': 'Hindi nagawa ang order sa PayPal', - 'paymentException': 'May problema sa pagbabayad', - 'paymentLaunchFailed': 'Hindi mabukas ang pagbabayad', - 'paymentExceptionWithError': 'May problema sa pagbabayad: @error', - 'paymentProcessingCheckLater': 'Pinoproseso ang iyong order. Pakitingnan mamaya.', - 'paymentResultQueryException': 'Hindi makuha ang resulta ng pagbabayad: @error', - 'orderConfirmedQuotaRefreshed': 'Nakumpirma ang order. Na-refresh na ang iyong quota.', - 'paymentCompletedConfirming': 'Tapos na ang pagbabayad. Kinukumpirma…', - 'paymentCancelled': 'Kinansela ang pagbabayad', - 'paypalOpenedCompleteInBrowser': 'Nabuksan na ang PayPal. Pakikumpleto ang pagbabayad sa browser.', - 'paypalOpenFailed': 'Hindi mabukas ang pahina ng pagbabayad sa PayPal', - 'paymentTestTitle': 'Pagsubok ng Pagbabayad', - 'paymentTestOrderInfo': 'Impormasyon ng Test Order', - 'paymentTestProductId': 'Product ID', - 'paymentTestProductDescription': 'Paglalarawan ng produkto', - 'paymentTestWechatDescription': 'Pagsubok ng pagbabayad sa WeChat', - 'paymentTestAlipayDescription': 'Pagsubok ng pagbabayad sa Alipay', - 'paymentTestAmount': 'Halaga', - 'paymentTestSelectAmount': 'Pumili ng halaga para sa pagsubok', - 'paying': 'Nagbabayad...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Status ng pagbabayad', - 'errorInfoWithMessage': 'Error: @message', - 'retest': 'Subukang muli', - 'paymentTestInstructionsTitle': 'Mga Tagubilin', - 'paymentTestInstructionsContent': '1. Pumili ng halaga para sa pagsubok (inirerekomenda: ¥0.01)\n2. Pindutin ang button ng pagbabayad para magsimula\n3. Kumpletuhin ang pagbabayad sa payment app\n4. Bumalik para tingnan ang resulta', - 'startingWechatPayment': 'Binubuksan ang WeChat Pay...', - 'startingAlipayPayment': 'Binubuksan ang Alipay...', - 'wechatPaymentSuccess': 'Matagumpay ang pagbabayad sa WeChat Pay!', - 'wechatPaymentFailed': 'Nabigo ang pagbabayad sa WeChat Pay', - 'wechatPaymentLaunchFailed': 'Hindi mabukas ang WeChat Pay', - 'cannotLaunchWechatPayment': 'Hindi mabukas ang WeChat Pay', - 'wechatPaymentException': 'May problema sa WeChat Pay', - 'wechatPaymentTestCompleted': 'Tapos na ang pagsubok ng pagbabayad sa WeChat Pay', - 'alipayPaymentSuccess': 'Matagumpay ang pagbabayad sa Alipay!', - 'alipayPaymentFailed': 'Nabigo ang pagbabayad sa Alipay', - 'alipayPaymentLaunchFailed': 'Hindi mabukas ang Alipay', - 'cannotLaunchAlipayPayment': 'Hindi mabukas ang Alipay', - 'alipayPaymentException': 'May problema sa Alipay', + 'paymentSuccess': 'Matagumpay ang pagbabayad', + 'paymentFailed': 'Nabigo ang pagbabayad', + 'gotIt': 'Naintindihan', + 'paymentFailedTryAgain': 'Nabigo ang pagbabayad. Pakisubukang muli.', + 'selectPaymentMethod': 'Pumili ng paraan ng pagbabayad', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Hindi nagawa ang order sa WeChat', + 'alipayOrderCreateFailed': 'Hindi nagawa ang order sa Alipay', + 'appleOrderCreateFailed': 'Hindi nagawa ang order sa Apple', + 'googleOrderCreateFailed': 'Hindi nagawa ang order sa Google', + 'paypalOrderCreateFailed': 'Hindi nagawa ang order sa PayPal', + 'paymentException': 'May problema sa pagbabayad', + 'paymentLaunchFailed': 'Hindi mabukas ang pagbabayad', + 'paymentExceptionWithError': 'May problema sa pagbabayad: @error', + 'paymentProcessingCheckLater': + 'Pinoproseso ang iyong order. Pakitingnan mamaya.', + 'paymentResultQueryException': + 'Hindi makuha ang resulta ng pagbabayad: @error', + 'orderConfirmedQuotaRefreshed': + 'Nakumpirma ang order. Na-refresh na ang iyong quota.', + 'paymentCompletedConfirming': 'Tapos na ang pagbabayad. Kinukumpirma…', + 'paymentCancelled': 'Kinansela ang pagbabayad', + 'paypalOpenedCompleteInBrowser': + 'Nabuksan na ang PayPal. Pakikumpleto ang pagbabayad sa browser.', + 'paypalOpenFailed': 'Hindi mabukas ang pahina ng pagbabayad sa PayPal', + 'paymentTestTitle': 'Pagsubok ng Pagbabayad', + 'paymentTestOrderInfo': 'Impormasyon ng Test Order', + 'paymentTestProductId': 'Product ID', + 'paymentTestProductDescription': 'Paglalarawan ng produkto', + 'paymentTestWechatDescription': 'Pagsubok ng pagbabayad sa WeChat', + 'paymentTestAlipayDescription': 'Pagsubok ng pagbabayad sa Alipay', + 'paymentTestAmount': 'Halaga', + 'paymentTestSelectAmount': 'Pumili ng halaga para sa pagsubok', + 'paying': 'Nagbabayad...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Status ng pagbabayad', + 'errorInfoWithMessage': 'Kamalian: @message', + 'retest': 'Subukang muli', + 'paymentTestInstructionsTitle': 'Mga Tagubilin', + 'paymentTestInstructionsContent': + '1. Pumili ng halaga para sa pagsubok (inirerekomenda: ¥0.01)\n2. Pindutin ang button ng pagbabayad para magsimula\n3. Kumpletuhin ang pagbabayad sa payment app\n4. Bumalik para tingnan ang resulta', + 'startingWechatPayment': 'Binubuksan ang WeChat Pay...', + 'startingAlipayPayment': 'Binubuksan ang Alipay...', + 'wechatPaymentSuccess': 'Matagumpay ang pagbabayad sa WeChat Pay!', + 'wechatPaymentFailed': 'Nabigo ang pagbabayad sa WeChat Pay', + 'wechatPaymentLaunchFailed': 'Hindi mabukas ang WeChat Pay', + 'cannotLaunchWechatPayment': 'Hindi mabukas ang WeChat Pay', + 'wechatPaymentException': 'May problema sa WeChat Pay', + 'wechatPaymentTestCompleted': + 'Tapos na ang pagsubok ng pagbabayad sa WeChat Pay', + 'alipayPaymentSuccess': 'Matagumpay ang pagbabayad sa Alipay!', + 'alipayPaymentFailed': 'Nabigo ang pagbabayad sa Alipay', + 'alipayPaymentLaunchFailed': 'Hindi mabukas ang Alipay', + 'cannotLaunchAlipayPayment': 'Hindi mabukas ang Alipay', + 'alipayPaymentException': 'May problema sa Alipay', "insufficientIntegral": "Insufficient integral", - "insufficientBalanceDesc": "Insufficient balance, please go to the corresponding recharge page to recharge.", - "recharge": "Go to Recharge", - "aiMemberExpiredDesc": "AI membership expired, please go to the membership recharge page to renew.", + "insufficientBalanceDesc": + "Kulang ang balanse, mangyaring pumunta sa kaukulang pahina ng pag-recharge upang mag-recharge.", + "recharge": "Pumunta sa Pag-recharge", + "aiMemberExpiredDesc": + "Nag-expire na ang AI membership, mangyaring pumunta sa pahina ng membership recharge upang mag-renew.", // 商品模块 - AI商品页 'musicAndRecommendation': 'Music & Recommendation', @@ -299,11 +342,15 @@ const Map tlPH = { 'nearbySearch': 'Nearby Search', 'newsInformation': 'News', 'communicationAssistant': 'Communication Assistant', - 'aiHeaderDesc1': 'Longer conversation quota, more tool calls, extended context length.', - 'aiHeaderDesc2': 'Suitable for agent Q&A, summarization, analysis, and task execution.', + 'aiHeaderDesc1': + 'Longer conversation quota, more tool calls, extended context length.', + 'aiHeaderDesc2': + 'Suitable for agent Q&A, summarization, analysis, and task execution.', 'musicSearchPlaybackControl': 'Music library search and playback control', - 'smartPlaylistAndSimilarRecommendations': 'Smart playlist and similar song recommendations', - 'routePlanningAndCongestionAvoidance': 'Route planning and congestion avoidance', + 'smartPlaylistAndSimilarRecommendations': + 'Smart playlist and similar song recommendations', + 'routePlanningAndCongestionAvoidance': + 'Route planning and congestion avoidance', 'voiceBroadcastAndWaypoints': 'Voice broadcast and waypoint settings', 'realTimeWeatherForecast': 'Real-time weather and forecast', 'clothingAdviceAndTravelReminders': 'Clothing advice and travel reminders', @@ -312,33 +359,42 @@ const Map tlPH = { 'hotNewsAndTopicOverview': 'Hot news and topic overview', 'longArticleSummariesAndKeyPoints': 'Long-article summaries and key points', 'helpCallAndSMS': 'Help with calls and SMS', - 'templatedMessagesAndScheduleReminders': 'Template messages and schedule reminders', - 'aiDisclaimer': 'Features depend on device permissions, service availability, and network conditions.', + 'templatedMessagesAndScheduleReminders': + 'Template messages and schedule reminders', + 'aiDisclaimer': + 'Nakadepende ang mga feature sa mga pahintulot ng device, availability ng serbisyo, at kondisyon ng network.', // 商品模块 - 翻译商品页 - 'realtimeTranscription': 'Real-time Transcription', - 'sceneLexicon': 'Scenario Glossary', - 'subtitleDisplay': 'Subtitles', - 'transHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'transHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', + 'realtimeTranscription': 'Real-time na transkripsyon', + 'sceneLexicon': 'Glossary ng eksena', + 'subtitleDisplay': 'Mga subtitle', + 'transHeaderDesc1': + 'Real-time na sabayang interpretasyon at pagsasalin ng teksto na may mababang latency na boses.', + 'transHeaderDesc2': + 'Angkop para sa paglalakbay, negosyo, talumpati, at pagtuturo.', + 'translateZhEn': 'Pagsasaling Tsino-Ingles', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'multiLangTextTranslation': 'Pagsasaling teksto sa maraming wika', + 'termOptimizationContextPreserve': + 'Pag-optimize ng termino at pagpapanatili ng konteksto', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', - 'personalVocabularyMemory': 'Personal vocabulary memory', - 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', - 'colorHighContrast': 'High color contrast', - 'transDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + 'personalVocabularyMemory': 'Personal na memorya ng bokabularyo', + 'conversationSubtitleLargeText': + 'Mga subtitle ng usapan / Malaking-teksto na mode', + 'colorHighContrast': 'Mataas na contrast ng kulay', + 'transDisclaimer': + 'Nakadepende ang kalidad ng pagsasalin sa mikropono, latency ng network, at ingay sa paligid.', // 商品模块 - 会议商品页 - 'meetingRecording': 'Meeting Recording', + 'meetingRecording': 'Pagre-record ng pulong', 'transcriptionAndSummary': 'Transcription & Summary', 'keywordSearch': 'Keyword Search', 'collaborationSharing': 'Collaboration & Sharing', - 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', - 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', - 'meetingAutoRecording': 'Auto recording and segmentation', + 'meetingHeaderDesc1': + 'Audio recording, transcription, keyword search, at auto summary para mapabilis ang kahusayan ng pulong.', + 'meetingHeaderDesc2': + 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingAutoRecording': 'Awtomatikong pagre-record at pagse-segment', 'meetingSpeakerTagging': 'Speaker labeling', 'meetingLongAudioTranscription': 'Long audio transcription', 'meetingKeyPointSummary': 'Key point extraction', @@ -346,22 +402,24 @@ const Map tlPH = { 'meetingTimelineJump': 'Timeline jump', 'meetingExportSummary': 'Export minutes', 'meetingMultiPlatformShare': 'Share across platforms', - 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + 'meetingDisclaimer': + 'Gamitin sa tahimik na lugar; nakadepende ang performance sa mikropono at network.', // 商品模块 - VIP会员页 - 'benefitsOverview': 'Benefits overview', - 'higherQuota': 'Higher usage quota', - 'lowerUnitPrice': 'Lower unit price', - 'priorityService': 'Priority service', - 'exclusiveSupportChannel': 'Dedicated support channel', - 'fastResponse': 'Fast issue response', - 'eventsAndDiscounts': 'Events and discounts', - 'memberExclusiveEvents': 'Member-exclusive events', - 'longTermDiscountPlan': 'Long-term discount plan', - 'generalPrivileges': 'General privileges', - 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', - 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', + 'benefitsOverview': 'Pangkalahatang benepisyo', + 'higherQuota': 'Mas mataas na quota ng paggamit', + 'lowerUnitPrice': 'Mas mababang presyo kada unit', + 'priorityService': 'Priyoridad na serbisyo', + 'exclusiveSupportChannel': 'Dedicated na support channel', + 'fastResponse': 'Mabilis na tugon sa isyu', + 'eventsAndDiscounts': 'Mga event at diskwento', + 'memberExclusiveEvents': 'Mga event para sa miyembro lamang', + 'longTermDiscountPlan': 'Pangmatagalang planong may diskwento', + 'generalPrivileges': 'Pangkalahatang pribilehiyo', + 'earlyAccessNewFeatures': 'Maagang access sa mga bagong feature', + 'crossDeviceSync': 'Pag-sync sa iba’t ibang device', + 'vipDisclaimer': + 'Actual benefits depend on the package details and may change with versions.', // 商品模块 - 商品名称与描述 'ai_001_name': 'AI Basic 100', @@ -370,18 +428,18 @@ const Map tlPH = { 'meet_001_name': 'Meeting Basic 100', 'meet_002_name': 'Meeting Basic 500', 'meet_003_name': 'Meeting Basic 1000', - 'trans_001_name': 'Translation Basic 100', - 'trans_002_name': 'Translation Basic 500', - 'trans_003_name': 'Translation Basic 1000', + 'trans_001_name': 'Pangunahing Pagsasalin 100', + 'trans_002_name': 'Pangunahing Pagsasalin 500', + 'trans_003_name': 'Pangunahing Pagsasalin 1000', 'ai_001_desc': 'Includes 100 uses. Access core AI features.', 'ai_002_desc': 'Includes 500 uses. Access core AI features.', 'ai_003_desc': 'Includes 1000 uses. Access core AI features.', - 'meet_001_desc': 'Includes 100 meeting recordings/transcriptions.', - 'meet_002_desc': 'Includes 500 meeting recordings/transcriptions.', - 'meet_003_desc': 'Includes 1000 meeting recordings/transcriptions.', - 'trans_001_desc': 'Includes 100 translations (voice/text).', - 'trans_002_desc': 'Includes 500 translations (voice/text).', - 'trans_003_desc': 'Includes 1000 translations (voice/text).', + 'meet_001_desc': 'Kasama ang 100 pagre-record/pag-transcribe ng meeting.', + 'meet_002_desc': 'Kasama ang 500 pagre-record/pag-transcribe ng meeting.', + 'meet_003_desc': 'Kasama ang 1000 pagre-record/pag-transcribe ng meeting.', + 'trans_001_desc': 'Kasama ang 100 pagsasalin (boses/teksto).', + 'trans_002_desc': 'Kasama ang 500 pagsasalin (boses/teksto).', + 'trans_003_desc': 'Kasama ang 1000 pagsasalin (boses/teksto).', // 商品模块 - 页脚 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', @@ -411,7 +469,8 @@ const Map tlPH = { 'guideNavInput': 'Navigate to Shenzhen Airport', 'guideNavSend': 'Lily will plan the route', 'guideNavEnd': 'Navigation set—try other commands', - 'guideMeetingStart': 'Tell Lily: “Create a meeting reminder for 3pm tomorrow”', + 'guideMeetingStart': + 'Tell Lily: “Create a meeting reminder for 3pm tomorrow”', 'guideMeetingInput': 'Create a meeting reminder for 3pm tomorrow', 'guideMeetingSend': 'Lily will create a meeting reminder', 'guideMeetingEnd': 'Reminder created—try other commands', @@ -438,45 +497,53 @@ const Map tlPH = { 'meetingTranscript': 'Transkripsyon ng Pulong', 'files': 'Files', 'mine': 'Mine', - 'connect': 'Connect', + 'connect': 'Kumonekta', 'allFiles': 'All Files', 'searchInAllFiles': 'Search in all files', - 'from': 'From', - 'sortBy': 'Sort by', - 'creationTime': 'Creation Time', - 'bluetoothConnection': 'Bluetooth Connection', - 'meetingReconnect': 'Reconnect', + 'from': 'Mula', + 'sortBy': 'Iayos ayon sa', + 'creationTime': 'Oras ng paggawa', + 'bluetoothConnection': 'Koneksyon sa Bluetooth', + 'meetingReconnect': 'Kumonekta muli', 'searching': 'Searching...', - 'searchFailed': 'Search failed, please check if Bluetooth is enabled', - 'aiPenNotFound': 'AI PEN device not found', - 'connectedToAiPen': 'Connected to AI PEN device', - 'checkingNewFiles': 'Checking for new files to import', + 'searchFailed': + 'Nabigo ang paghahanap, pakisuri kung naka-enable ang Bluetooth', + 'aiPenNotFound': 'Hindi nakita ang AI PEN device', + 'connectedToAiPen': 'Nakakonekta sa AI PEN device', + 'checkingNewFiles': 'Sinusuri ang mga bagong file na i-import', 'startingWifi': 'Starting Wi-Fi...', 'newFilesDetected': 'New files detected, preparing to import', 'noNewFiles': 'No new files to import', - 'connectingWifi': 'Connecting to Wi-Fi...', - 'wifiConnected': 'Wi-Fi connected successfully', - 'downloadingFiles': 'Downloading files...', - 'downloadingFileProgress': 'Total {total} files, downloading file {current}', - 'downloadComplete': 'Download complete', - 'downloadCompleteInfo': 'Download complete, {count} files in total, returning automatically in 2 seconds', + 'connectingWifi': 'Kumokonekta sa Wi‑Fi...', + 'wifiConnected': 'Matagumpay na nakakonekta sa Wi‑Fi', + 'downloadingFiles': 'Nagda-download ng mga file...', + 'downloadingFileProgress': + 'Kabuuang {total} file, dina-download ang file {current}', + 'downloadComplete': 'Tapos na ang pag-download', + 'downloadCompleteInfo': + 'Tapos na ang pag-download, kabuuang {count} file, babalik nang awtomatiko sa loob ng 2 segundo', // Meeting模块 - 录音功能 - 'startRecording': 'Start Recording', - 'liveRecording': 'Live Recording', - 'audioVideoRecording': 'Audio/Video Recording', - 'callRecording': 'Call Recording', + 'startRecording': 'Simulan ang pagre-record', + 'liveRecording': 'Live na pagre-record', + 'audioVideoRecording': 'Pagre-record ng audio/video', + 'callRecording': 'Pagre-record ng tawag', 'importAudio': 'Import Audio', 'meetingRecordExitTitle': 'Lumabas sa Pag-record', // 退出录音 'meetingRecordExitMessage': 'Pumili ng aksyon pagkatapos umalis', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Tapusin at I-save', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Tapusin nang Hindi Ise-save', // 结束录音不保存 - 'meetingRecordContinueInBackground': 'Ituloy ang pag-record sa background', // 后台继续录音 - 'meetingRecordStopTimeout': 'Nag-timeout ang paghinto ng record, pakisubukang muli', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'Nabigong ihinto ang pag-record, pakisubukang muli', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'Nabigong i-save ang pag-record, pakisubukang muli', // 保存录音失败,请重试 + 'meetingRecordContinueInBackground': + 'Ituloy ang pag-record sa background', // 后台继续录音 + 'meetingRecordStopTimeout': + 'Nag-timeout ang paghinto ng record, pakisubukang muli', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'Nabigong ihinto ang pag-record, pakisubukang muli', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'Nabigong i-save ang pag-record, pakisubukang muli', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'Nagre-record', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Nagre-record sa background, i-tap para bumalik', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'Nagre-record sa background, i-tap para bumalik', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Pahintulot sa Floating Window', // 悬浮窗权限 'overlayPermissionTranslationDesc': 'Para maipakita ang mga resulta ng pagsasalin habang tumatawag o nagsasalin ng audio/video, kailangan namin ang overlay permission. Pinapayagan ka nitong makita ang real-time na pagsasalin habang gumagamit ng ibang mga app.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 @@ -508,45 +575,50 @@ const Map tlPH = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Gumawa', - 'templateDetails': 'Mga Detalye ng Template', - 'tag': 'Tag', - 'description': 'Paglalarawan', - 'template': 'Template', - 'deleteTemplate': 'Tanggalin ang Template', - 'deleteTemplateConfirm': 'Sigurado ka bang gusto mong tanggalin ang template na ito?', - 'editTemplate': 'I-edit ang Template', - 'createTemplate': 'Gumawa ng Template', - 'name': 'Pangalan', - 'templateContentHint': 'Pakiusap maglagay ng nilalaman ng template! Tip: Pindutin ang AI button sa itaas para mabilis na bumuo ng nilalaman ng template batay sa pangalan at paglalarawan na inilagay mo', - 'inputNameHint': 'Pakiusap maglagay ng pangalan', - 'inputDescHint': 'Pakiusap maglagay ng paglalarawan', - 'custom': 'Pasadya', - 'pleaseEnter': 'Mangyaring ilagay', - 'viewAll': 'View All', - 'recordingLanguage': 'Recording Language', + 'create': 'Gumawa', + 'templateDetails': 'Mga Detalye ng Template', + 'tag': 'Tag', + 'description': 'Paglalarawan', + 'template': 'Template', + 'deleteTemplate': 'Tanggalin ang Template', + 'deleteTemplateConfirm': + 'Sigurado ka bang gusto mong tanggalin ang template na ito?', + 'editTemplate': 'I-edit ang Template', + 'createTemplate': 'Gumawa ng Template', + 'name': 'Pangalan', + 'templateContentHint': + 'Pakiusap maglagay ng nilalaman ng template! Tip: Pindutin ang AI button sa itaas para mabilis na bumuo ng nilalaman ng template batay sa pangalan at paglalarawan na inilagay mo', + 'inputNameHint': 'Pakiusap maglagay ng pangalan', + 'inputDescHint': 'Pakiusap maglagay ng paglalarawan', + 'custom': 'Pasadya', + 'pleaseEnter': 'Mangyaring ilagay', + 'viewAll': 'Tingnan lahat', + 'recordingLanguage': 'Wika ng pagre-record', 'chineseSimplified': 'Chinese Mandarin (Simplified)', 'meetingGenerateNow': 'Generate Now', 'keyEventsAnalyzed': 'Analyzed {count} key events.', - 'aiAnalysisDesc': 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', + 'aiAnalysisDesc': + 'Tinutukoy ng AI analysis ang mga pangunahing pangyayari sa mga recording, na nagbibigay-daan sa iyo na pumili ng mahahalagang pangyayari para sa AI generation.', // Meeting模块 - 文件操作 'importing': 'Importing...', 'batchImporting': 'Batch importing...', - 'importingLocalRecordings': 'Importing local recordings...', - 'importFailed': 'Import file failed: {filePath}, error: {error}', - 'importSuccess': 'Successfully imported {count} local recordings', - 'importError': 'Import failed: {error}', - 'pleaseSelectAudioFile': 'Please select audio file', + 'importingLocalRecordings': 'Ini-import ang mga lokal na recording...', + 'importFailed': + 'Nabigo ang pag-import ng file: {filePath}, kamalian: {error}', + 'importSuccess': 'Matagumpay na na-import ang {count} lokal na recording', + 'importError': 'Nabigo ang pag-import: {error}', + 'pleaseSelectAudioFile': 'Mangyaring pumili ng audio file', 'shareAudio': 'Share Meeting Audio', 'shareComplete': 'Share complete!', - 'shareFailed': 'Share failed: {error}', - 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', + 'shareFailed': 'Nabigo ang pag-share: {error}', + 'fileProcessingFailed': + 'Nabigo ang pagproseso ng file: {filePath}, kamalian: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'I-save ang Mind Map', + 'saveMindMap': 'I-save ang Mind Map', 'shareMindMap': 'Share Mind Map', - 'shareSuccess': 'Share Success', + 'shareSuccess': 'Matagumpay ang pag-share', // Meeting模块 - AI问答 'askAI': 'Ask AI ...', @@ -566,40 +638,43 @@ const Map tlPH = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'I-export', + 'export': 'I-export', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Ilapat sa lahat ng talata ng tagapagsalitang ito', - 'summaryWillBeUpdatedAutomatically': 'Awtomatikong maa-update ang buod batay sa template', + 'summaryWillBeUpdatedAutomatically': + 'Awtomatikong maa-update ang buod batay sa template', 'nameCurrentSpeaker': 'Name Current Speaker', 'recentlyUsedNames': 'Recently Used Names', 'applyToCurrentParagraph': 'Apply to Current Paragraph', 'totalTime': 'Total Time', - 'summarySpeakerWillBeUpdatedAutomatically': 'Summary speakers will be updated automatically', + 'summarySpeakerWillBeUpdatedAutomatically': + 'Summary speakers will be updated automatically', // Meeting模块 - 云端同步 'syncToCloud': 'Sync to Cloud', 'syncToCloudTip': '自动将你的录音同步到云端,你可以通过任意VOITRANS APP或VOITRANS Web(web.voitrans.com)播放、管理和分享录音。', 'syncToVoitransApp': 'Sync VOITRANS APP', - 'transcriptionRecord': 'Transcription Record', + 'transcriptionRecord': 'Record ng transkripsyon', // Meeting模块 - 我的页面 - 'transcriptionRecords': 'Transcription Records', + 'transcriptionRecords': 'Mga record ng transkripsyon', 'templateCommunity': 'Template Community', 'comingSoon': 'Coming Soon', 'integration': 'Integration', 'voitransPrivateCloud': 'VOITRANS PRIVATE CLOUD', - 'enabled': 'Enabled', - 'disabled': 'Disabled', - 'myVoitransDevice': 'My VOITRANS Device', + 'enabled': 'Naka-enable', + 'disabled': 'Naka-disable', + 'myVoitransDevice': 'Aking VOITRANS device', 'helpAndFeedback': 'Help & Feedback', 'aboutVoitrans': 'About VOITRANS', 'meetingDays': 'Days', 'meetingHours': 'Hours', 'voitransAiMember': 'Voitrans AI Member', 'unlockStarterMember': 'Unlock Starter Member', - 'bindDeviceToActivate': 'Bind Voitrans device to activate Starter membership', + 'bindDeviceToActivate': + 'I-bind ang Voitrans device para i-activate ang Starter membership', 'unlockNow': 'Unlock Now', // Meeting模块 - 会员与升级 @@ -618,60 +693,74 @@ const Map tlPH = { 'audioImport': 'Audio Import', 'multipleExportFormats': 'Multiple Export Formats', 'professionalSummaryTemplates': 'Professional Summary Templates', - 'professionalTemplateDesc': 'Professional template design to improve your work efficiency. Customized according to industry needs.', - 'customTemplateDesc': 'You can customize summary prompts according to your needs and use them to generate the required summaries.', - 'askAiDesc': 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', - 'visualMindMapDesc': 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', - 'templateCommunityDesc': 'Discover, share, and get inspiration from the template library created by users.', - 'speakerIdentificationDesc': 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', - 'privateCloudSyncDesc': 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', - 'aiVoiceEnhancementDesc': 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', - 'audioImportDesc': 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', - 'multipleExportFormatsDesc': 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', + 'professionalTemplateDesc': + 'Professional template design to improve your work efficiency. Customized according to industry needs.', + 'customTemplateDesc': + 'You can customize summary prompts according to your needs and use them to generate the required summaries.', + 'askAiDesc': + 'Matalinong kumuha ng mas malalim na impormasyon mula sa mga recording, gumawa ng mga data table, pangunahing konklusyon ng diskusyon, To-Do list, report email at iba pang naka-format na nilalaman sa isang click.', + 'visualMindMapDesc': + 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', + 'templateCommunityDesc': + 'Discover, share, and get inspiration from the template library created by users.', + 'speakerIdentificationDesc': + 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', + 'privateCloudSyncDesc': + 'Ang iyong mga recording at transcription ay ligtas na iiimbak sa mga dedikadong cloud server, na may ganap na encryption sa pag-upload at pag-download upang matiyak ang privacy at seguridad.', + 'aiVoiceEnhancementDesc': + 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', + 'audioImportDesc': + 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', + 'multipleExportFormatsDesc': + 'I-export ang iyong mga audio recording, transcription text at summary sa iba\'t ibang format (TXT, PDF, JPEG) upang matugunan ang iyong mga pangangailangan.', 'upgradeMembership': 'Upgrade Your Membership', 'yearlySubscription': 'Yearly Subscription', 'monthlySubscription': 'Monthly Subscription', 'proMonthly': 'Pro ¥60/month', - 'proMonthlyDesc': '7-day free trial, then ¥800/year. Cancel anytime before trial ends.', + 'proMonthlyDesc': + '7-day free trial, then ¥800/year. Cancel anytime before trial ends.', 'sevenDayTrial': '7-day Free Trial', 'unlimitedMonthly': 'Unlimited ¥120/month', - 'unlimitedMonthlyDesc': '7-day free trial, then ¥1600/year. Cancel anytime before trial ends.', + 'unlimitedMonthlyDesc': + '7-day free trial, then ¥1600/year. Cancel anytime before trial ends.', 'trialNote': '*Free trial for 7 days, then charged annually, cancel anytime.', 'proPrice': 'Pro ¥120', 'proMonthlyPrice': '¥120/month', 'subscribe': 'Subscribe', 'unlimitedPrice': 'Unlimited ¥198', 'unlimitedMonthlyPrice': '¥198/month', - 'upgradeNote': '*After upgrading subscription, the remaining days of the original subscription will be automatically calculated and refunded to your payment account', + 'upgradeNote': + '*After upgrading subscription, the remaining days of the original subscription will be automatically calculated and refunded to your payment account', 'buyMoreTranscriptionTime': 'Buy More Transcription Time', 'sixThousandMinutes': '6,000 minutes', 'threeThousandMinutes': '3,000 minutes', 'sixHundredMinutes': '600 minutes', 'oneHundredTwentyMinutes': '120 minutes', 'validityPeriod': '*Validity Period: ', - 'validityNote': 'Activated immediately after purchase, valid for 2 years after activation.', + 'validityNote': + 'Activated immediately after purchase, valid for 2 years after activation.', 'purchase': 'Purchase', // Meeting模块 - 录音语言 - 'recordLanguage': 'Recording Language', + 'recordLanguage': 'Wika ng pagre-record', 'cantonese': 'Cantonese', 'sichuan': 'Sichuan Dialect', 'shanghai': 'Shanghai Dialect', // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Nabigo ang pagsusuri, pakisubukang muli mamaya', - 'transcriptionFailed': 'Nabigo ang transcription, pakisubukang muli mamaya', - 'summaryFailed': 'Nabigo ang buod, pakisubukang muli mamaya', - 'summaryFailedShort': 'Nabigo ang buod', - 'transcriptionFailedShort': 'Nabigo ang transcription', + 'analysisFailed': 'Nabigo ang pagsusuri, pakisubukang muli mamaya', + 'transcriptionFailed': 'Nabigo ang transcription, pakisubukang muli mamaya', + 'summaryFailed': 'Nabigo ang buod, pakisubukang muli mamaya', + 'summaryFailedShort': 'Nabigo ang buod', + 'transcriptionFailedShort': 'Nabigo ang transcription', // Meeting模块 - 播放器 - 'playerNotReady': 'Hindi pa handa ang audio player, pakihintay', - 'playFailed': 'Nabigo ang pag-play', - 'audioFileNotFound': 'Hindi nahanap ang audio file', - 'fetchingAudio': 'Kinukuha ang audio mula sa cloud...', - 'playerLoadFailed': 'Hindi na-load ang audio player', + 'playerNotReady': 'Hindi pa handa ang audio player, pakihintay', + 'playFailed': 'Nabigo ang pag-play', + 'audioFileNotFound': 'Hindi nahanap ang audio file', + 'fetchingAudio': 'Kinukuha ang audio mula sa cloud...', + 'playerLoadFailed': 'Hindi na-load ang audio player', // 设置页 "systemSettings": "Mga Setting ng System", @@ -682,7 +771,8 @@ const Map tlPH = { "cloudSync": "Pagsasalin ng Recharge ng Cloud", "memberService": "Member Service", "bindRewardTitle": "Rewards", - "bindRewardSimpleDesc": "First bind device reward has been issued. Tap OK to close.", + "bindRewardSimpleDesc": + "Na-issue na ang gantimpala para sa unang pag-bind ng device. I-tap ang OK upang isara.", "joinDevice": "Konektadong device:", "accountId": "Account ID:", "systemSetting": "Setting ng System", @@ -695,18 +785,22 @@ const Map tlPH = { "privacySettings": "Mga Setting ng Privacy", "privacySettingsInfo": "Pamahalaan ang koleksyon ng data at mga pahintulot", "permissionManagement": "Pamamahala ng Pahintulot", // 权限管理 - "permissionManagementInfo": "Pamahalaan ang mga setting ng pahintulot ng app", // 管理应用权限设置 + "permissionManagementInfo": + "Pamahalaan ang mga setting ng pahintulot ng app", // 管理应用权限设置 "aboutApplication": "Tungkol sa App", "versions": "Bersyon", "checkUpdates": "Suriin kung may mga Update", "selectLanguage": "Pumili ng Wika", "voiceService": "Serbisyo ng Boses", - "voiceServiceInfo": "Pumili ng serbisyo para sa pagkilala at pag-synthesize ng boses", + "voiceServiceInfo": + "Pumili ng serbisyo para sa pagkilala at pag-synthesize ng boses", "selectVoiceService": "Pumili ng Serbisyo ng Boses", "azureVoiceService": "Azure Voice Service", - "azureVoiceServiceInfo": "Serbisyo ng boses sa cloud ng Microsoft, sumusuporta sa mataas na kalidad na voice synthesis at recognition", + "azureVoiceServiceInfo": + "Serbisyo ng boses sa cloud ng Microsoft, sumusuporta sa mataas na kalidad na voice synthesis at recognition", "flutterVoiceService": "Flutter Local Voice Service", - "flutterVoiceServiceInfo": "Lokal na serbisyo ng boses sa device, maaaring gamitin nang walang koneksyon sa internet", + "flutterVoiceServiceInfo": + "Lokal na serbisyo ng boses sa device, maaaring gamitin nang walang koneksyon sa internet", 'timbreService': 'Serbisyo ng Timbre', 'timbreServiceInfo': 'Pumili ng serbisyo ng voice synthesis na may timbre', 'defaultTimbre': 'Default na Timbre', @@ -717,25 +811,27 @@ const Map tlPH = { 'pleaseRead': 'Pakibasa nang malakas', 'completeRecording': 'Kumpletuhin ang Pag-record', "firmwareUpgrade": "Pag-upgrade ng Firmware", - "bleHeadsetFirmwareUpgrade": "Pag-upgrade ng Bersyon ng Firmware ng BLE Headset", + "bleHeadsetFirmwareUpgrade": + "Pag-upgrade ng Bersyon ng Firmware ng BLE Headset", "deviceManagement": "Pamamahala ng Device", "manageConnectedDevices": "Pamahalaan ang mga naka-pair na Bluetooth device", 'currentLatestVersion': 'Nasa pinakabagong bersyon ka na {version}', 'checkUpdateFailed': 'Nabigong suriin kung may mga update', 'networkErrorRetry': 'Error sa network, pakisubukang muli mamaya', "realtimeVoiceChat": "Real-time na Voice Chat", - "realtimeVoiceChatInfo": "Damhin ang matalinong voice interaction function (feature preview)", + "realtimeVoiceChatInfo": + "Damhin ang matalinong voice interaction function (feature preview)", "loading": "Naglo-load...", // 设备管理模块 - "deviceTypeUnknown": "Unknown Device", - "deviceTypeClassicBluetoothHeadset": "Classic Bluetooth Headset", - "deviceTypeBleBluetoothHeadset": "BLE Bluetooth Headset", - "deviceTypeSmartVoiceRecorder": "Smart Voice Recorder", - "deviceTypeSmartEye": "Smart Glasses", + "deviceTypeUnknown": "Hindi kilalang device", + "deviceTypeClassicBluetoothHeadset": "Klasikong Bluetooth headset", + "deviceTypeBleBluetoothHeadset": "BLE Bluetooth headset", + "deviceTypeSmartVoiceRecorder": "Matalinong voice recorder", + "deviceTypeSmartEye": "Matalinong salamin", "unbind": "Alisin sa pagkaka-bind", - "noDevicesBound": "No devices bound yet", - "pleaseBindDeviceFirst": "Please bind a device first to manage", + "noDevicesBound": "Wala pang naka-bind na device", + "pleaseBindDeviceFirst": "Mangyaring mag-bind muna ng device para pamahalaan", "noMacAddress": "No MAC Address", "licenseCode": "License Code", "confirmUnbind": "Confirm Unbind", @@ -751,7 +847,8 @@ const Map tlPH = { "inputMessage": "Mag-type ng mensahe...", "imListening": "Nakikinig...", "canStartTalking": "Maaari ka nang magsalita", - "addQuestionAboutImage": "Magdagdag ng tanong o paglalarawan tungkol sa larawan...", + "addQuestionAboutImage": + "Magdagdag ng tanong o paglalarawan tungkol sa larawan...", "summarizeImageContent": "Ibuod ang nilalaman ng larawan", "extractImageText": "I-extract ang teksto sa imahe", "translateImageText": "Isalin ang teksto sa imahe", @@ -770,9 +867,10 @@ const Map tlPH = { "loadMoreMessages": "Mag-load ng mas maraming mensahe...", "loadFailedClickRetry": "Nabigo ang pag-load, i-click para subukang muli", "swipeUpForMore": "Mag-swipe pataas para sa higit pa", - "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! + "callingTool": "Tinutulungan kita, pakihintay!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Kapag naka-enable: Hindi maaantala ng iyong boses ang AI habang nagsasalita at isang round lang ng usapan ang kayang i-handle. Para magsimula ng bagong round, sabihin lang ang wake-up word.', + 'voice_interrupt_tip': + 'Kapag naka-enable: Hindi maaantala ng iyong boses ang AI habang nagsasalita at isang round lang ng usapan ang kayang i-handle. Para magsimula ng bagong round, sabihin lang ang wake-up word.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -781,7 +879,7 @@ const Map tlPH = { "presetNews": "Today's news", // 今日新闻 "presetFood": "Nearby food", // 美食 "playSomeMusic": "Play some popular music", // 播放一些流行音乐 - "navigationTo": "Please help me navigate to", // 导航到 + "navigationTo": "Pakitulungan akong mag-navigate sa", // 导航到 "todayWeather": "How's the weather today?", // 今日天气 "todayNews": "What's the news today?", // 今日新闻 "nearbyFood": "What delicious food is nearby?", // 美食 @@ -795,10 +893,14 @@ const Map tlPH = { '• 控制耳机功能\n\n' '有什么我可以帮你的吗?', 'microphonePermission': 'Mikropono', - 'voiceRecognitionPermissionText': 'Ang pagkilala sa boses ay nangangailangan ng access sa mikropono.', - 'voiceTranslationPermissionText': 'Ang pagkilala at pagsasalin ng boses ay nangangailangan ng access sa mikropono.', - 'phoneCallPermissionText': 'Ang pagtawag ay nangangailangan ng access sa mikropono para sa mga voice call.', - 'permissionDeniedText': 'Permanenteng tinanggihan mo ang pahintulot sa mikropono, mangyaring pumunta sa mga setting ng system para paganahin ito.', + 'voiceRecognitionPermissionText': + 'Ang pagkilala sa boses ay nangangailangan ng access sa mikropono.', + 'voiceTranslationPermissionText': + 'Ang pagkilala at pagsasalin ng boses ay nangangailangan ng access sa mikropono.', + 'phoneCallPermissionText': + 'Ang pagtawag ay nangangailangan ng access sa mikropono para sa mga voice call.', + 'permissionDeniedText': + 'Permanenteng tinanggihan mo ang pahintulot sa mikropono, mangyaring pumunta sa mga setting ng system para paganahin ito.', 'startVoiceInput': 'Simulan ang voice input', 'startPhoneCallMode': 'Simulan ang mode ng pagtawag, simulan ang voice input', @@ -812,7 +914,8 @@ const Map tlPH = { 'report': 'I-report', 'submitSuccess': 'Matagumpay na naisumite', 'submitFailed': 'Nabigo ang pagsusumite', - 'reportSubmitted': 'Naisumite na ang report, ipoproseso namin ito sa lalong madaling panahon', + 'reportSubmitted': + 'Naisumite na ang report, ipoproseso namin ito sa lalong madaling panahon', 'harmfulUnsafe': 'Nakapipinsala/Hindi Ligtas', 'pornographicVulgar': 'Pornograpiko/Bastos', 'misleadingAttack': 'Mapanlinlang/Pag-atake', @@ -820,9 +923,17 @@ const Map tlPH = { 'privacyRelated': 'May kaugnayan sa Privacy', 'copyrightViolation': 'Lumabag sa aking copyright, reputasyon, atbp.', 'other': 'Iba pa', - 'reportDescriptionHint': 'Gusto naming malaman kung bakit ka nagre-report, maaari mong ilarawan ang problemang iyong naranasan.', + 'reportDescriptionHint': + 'Gusto naming malaman kung bakit ka nagre-report, maaari mong ilarawan ang problemang iyong naranasan.', 'generatedByAi': 'Nilikha ng AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Narito ang ilang inirerekomendang musika:', 'playList': 'Playlist', @@ -843,20 +954,52 @@ const Map tlPH = { "bicycling": "Pagbibisikleta", "tsransit": "Pampublikong Sasakyan", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Pumili ng navigation app', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Mag-navigate gamit ang Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Mag-navigate gamit ang Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Mag-navigate gamit ang Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Mag-navigate gamit ang Apple Maps', + 'builtInNavigation': 'Built-in na navigation', + 'useBuiltInNavigation': 'Mag-navigate gamit ang built-in na mapa', + 'navigationStartFailed': 'Nabigong simulan ang navigation', + 'cannotPlayMusicListRetryLater': + 'Hindi mapatugtog ang listahan ng musika, pakisubukang muli mamaya', + 'cannotPlaySong': 'Hindi mapatugtog ang kanta', + 'openMapError': 'Nabigo ang pagbukas ng mapa', + 'pleaseInstallAmapApp': 'Paki-install muna ang Amap app', + 'pleaseInstallBaiduMapApp': 'Paki-install muna ang Baidu Maps app', + 'appleMapStartFailed': 'Nabigong simulan ang Apple Maps', + 'appleMapUnavailable': 'Hindi available ang Apple Maps', + 'openAppleMapError': 'Nabigo ang pagbukas ng Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Nagtatanong ng lagay ng panahon:', 'highest': 'Pinakamataas', 'lowest': 'Pinakamababa', 'futureForecast': 'Pagtataya sa Hinaharap', - 'hotWeatherTip': 'Mainit ngayon, mag-ingat sa heatstroke, uminom ng maraming tubig', - 'coldWeatherTip': 'Malamig ang temperatura ngayon, magsuot ng mainit na damit kapag lalabas para maiwasan ang sipon', - 'rainyWeatherTip': 'May ulan ngayon, magdala ng payong kapag lalabas, mag-ingat sa paglalakbay', - 'snowyWeatherTip': 'May snow ngayon, madulas ang daan, mag-ingat at magsuot ng panlamig', - 'foggyWeatherTip': 'May hamog ngayon, mababa ang visibility, magsuot ng mask kapag lalabas', - 'windyWeatherTip': 'Mahangin ngayon, mag-ingat kapag lalabas, i-secure ang mga gamit', - 'sunnyWeatherTip': 'Maaraw at malakas ang UV rays ngayon, maglagay ng sunscreen kapag lalabas', - 'temperatureDifferenceTip': 'Malaki ang pagkakaiba ng temperatura sa araw at gabi, magsuot ng damit na angkop', - 'comfortableWeatherTip': 'Maganda ang panahon ngayon, magandang oras para sa mga aktibidad sa labas', + 'hotWeatherTip': + 'Mainit ngayon, mag-ingat sa heatstroke, uminom ng maraming tubig', + 'coldWeatherTip': + 'Malamig ang temperatura ngayon, magsuot ng mainit na damit kapag lalabas para maiwasan ang sipon', + 'rainyWeatherTip': + 'May ulan ngayon, magdala ng payong kapag lalabas, mag-ingat sa paglalakbay', + 'snowyWeatherTip': + 'May snow ngayon, madulas ang daan, mag-ingat at magsuot ng panlamig', + 'foggyWeatherTip': + 'May hamog ngayon, mababa ang visibility, magsuot ng mask kapag lalabas', + 'windyWeatherTip': + 'Mahangin ngayon, mag-ingat kapag lalabas, i-secure ang mga gamit', + 'sunnyWeatherTip': + 'Maaraw at malakas ang UV rays ngayon, maglagay ng sunscreen kapag lalabas', + 'temperatureDifferenceTip': + 'Malaki ang pagkakaiba ng temperatura sa araw at gabi, magsuot ng damit na angkop', + 'comfortableWeatherTip': + 'Maganda ang panahon ngayon, magandang oras para sa mga aktibidad sa labas', "monday": "Lunes", "tuesday": "Martes", "wednesday": "Miyerkules", @@ -887,8 +1030,8 @@ const Map tlPH = { "strongWind": "Malakas na Hangin", // 翻译模块 - 中间层 - "pictureTranslation": "Picture Translation", - "textTranslation": "Text Translation", + "pictureTranslation": "Pagsasalin ng larawan", + "textTranslation": "Pagsasalin ng teksto", // 翻译模块 - 主页 "translationHistory": "Kasaysayan ng Pagsasalin", @@ -898,72 +1041,95 @@ const Map tlPH = { "phoneUser": "User ng Telepono", "selectSourceLanguage": "Pumili ng pinagmulang wika", "selectTargetLanguage": "Pumili ng target na wika", - "me": "Me", - "counterPart": "Counterpart", - "bluetoothCallStateError": "Please make sure the Bluetooth headset is connected to the phone and in a call state", - "autoDetect": "Auto Detect", // 自动检测 + "me": "Ako", + "counterPart": "Kausap", + "bluetoothCallStateError": + "Pakisiguro na nakakonekta ang Bluetooth headset sa telepono at nasa estado ng tawag", + "autoDetect": "Awtomatikong pagtukoy", // 自动检测 + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'I-disable ang floating window', + 'enableFloatingWindow': 'I-enable ang floating window', + 'permissionTip': 'Paalaala sa pahintulot', + 'micPermissionRequiredForRecording': + 'Kailangan ang pahintulot sa mikropono para sa pagre-record', + 'deleteTranslationRecordError': + 'Nabigo ang pagtanggal ng translation record: @error', // 翻译模块 - 文本翻译 - "languageDetectionFailed": "Language detection failed", - "translationFailed": "Translation failed", - "pleaseInputText": "Please input text", - "textTooLong": "Text too long, max 5000 characters", + "languageDetectionFailed": "Nabigo ang pagtukoy ng wika", + "translationFailed": "Nabigo ang pagsasalin", + "translating": "Isinasalin", + "translate": "Isalin", + "pleaseInputText": "Pakilagay ang teksto", + "inputTextToTranslate": "Pakilagay ang tekstong isasalin", + "textTooLong": "Masyadong mahaba ang teksto, max 5000 character", // 翻译模块 - 历史记录 "noTranslationHistory": "Wala pang kasaysayan", - "historyRecords": "History Records", - "clearResults": "Clear Results", + "historyRecords": "Mga tala sa kasaysayan", + "clearResults": "I-clear ang mga resulta", "clearHistory": "Burahin ang Kasaysayan", - "clearHistoryConfirm": "Sigurado ka bang gusto mong burahin ang lahat ng kasaysayan ng pagsasalin? Hindi na ito maibabalik.", + "clearHistoryConfirm": + "Sigurado ka bang gusto mong burahin ang lahat ng kasaysayan ng pagsasalin? Hindi na ito maibabalik.", "unknownLanguage": "Hindi Kilalang Wika", "deleteSessionRecord": "Burahin ang Record ng Session", - "deleteSessionConfirm": "Sigurado ka bang gusto mong burahin ang lahat ng record ng pagsasalin para sa session na ito? Hindi na ito maibabalik.", + "deleteSessionConfirm": + "Sigurado ka bang gusto mong burahin ang lahat ng record ng pagsasalin para sa session na ito? Hindi na ito maibabalik.", // 翻译模块 - 图片翻译 - "selectImageSource": "Select Image Source", - "imagePreview": "Image Preview", - "translationResult": "Translation Result", - "recognitionResult": "Recognition Result", - "translatedImagePreview": "Translated Image Preview", - "translatedImageLoadFailed": "Failed to load translated image", - "pleaseSelectImage": "Please select an image", - "imageLoadFailed": "Image load failed", - "imageQuality": "Image Quality", - "maxSize": "Max Size", - "close": "Close", - "setImageQuality": "Set Image Quality", - "currentQuality": "Current quality: @value%", - "setMaxSize": "Set Max Size", - "currentMaxSize": "Current: @pxpx", - "waitingForAction": "Waiting for action", - "pleaseSelectImageToStart": "Please select an image to start", - "chooseImage": "Choose Image", - "openingCamera": "Opening camera...", - "openingPhotoAlbum": "Opening photo album...", - "cancelled": "Cancelled", - "userCancelledSelection": "User cancelled selection", - "translatingImage": "Translating Image", - "callingImageTranslateService": "Calling image translation service...", - "savingRecord": "Saving Record", - "savingTranslationResult": "Saving translation result...", - "translationCompleted": "Translation Completed", - "allStepsCompleted": "All steps completed", - "processingFailed": "Processing Failed", - "imageProcessingOrTranslationFailed": "Image processing or translation failed. Please retry.\nError: {error}", + "selectImageSource": "Pumili ng pinagmulan ng larawan", + "imagePreview": "Preview ng larawan", + "translationResult": "Resulta ng pagsasalin", + "recognitionResult": "Resulta ng pagkilala", + "translatedImagePreview": "Preview ng isinaling larawan", + "translatedImageLoadFailed": "Nabigong i-load ang isinaling larawan", + "pleaseSelectImage": "Mangyaring pumili ng larawan", + "imageLoadFailed": "Nabigong i-load ang larawan", + "imageQuality": "Kalidad ng larawan", + "maxSize": "Pinakamalaking sukat", + "close": "Isara", + "setImageQuality": "Itakda ang kalidad ng larawan", + "currentQuality": "Kasalukuyang kalidad: @value%", + "setMaxSize": "Itakda ang max na sukat", + "currentMaxSize": "Kasalukuyan: @pxpx", + "waitingForAction": "Naghihintay ng aksyon", + "pleaseSelectImageToStart": "Mangyaring pumili ng larawan upang magsimula", + "chooseImage": "Pumili ng larawan", + "openingCamera": "Binubuksan ang kamera...", + "openingPhotoAlbum": "Binubuksan ang photo album...", + "cancelled": "Nakansela", + "userCancelledSelection": "Kinansela ng user ang pagpili", + "translatingImage": "Isinasalin ang larawan", + "callingImageTranslateService": + "Tinatawag ang serbisyo ng pagsasalin ng larawan...", + "savingRecord": "Sine-save ang record", + "savingTranslationResult": "Sine-save ang resulta ng pagsasalin...", + "translationCompleted": "Tapos na ang pagsasalin", + "allStepsCompleted": "Tapos na ang lahat ng hakbang", + "processingFailed": "Nabigo ang pagproseso", + "imageProcessingOrTranslationFailed": + "Nabigo ang pagproseso ng larawan o pagsasalin. Mangyaring subukan muli.\nError: {error}", "imageTooLarge": "Image size exceeds 4MB limit", - "imageTooLargeHint": "Image size exceeds 4MB. Reduce quality or dimensions and retry", - "emptyTranslationResult": "Image translation API returned empty result", - "imageTranslationFailedTryLater": "Image translation failed. Network issue or rate limit. Please try later", - "imageTranslationApiException": "Image translation API exception. Check network and retry", - "permissionRequired": "Permission Required", - "cameraPermissionRequired": "Camera permission required to take photos", - "photoAlbumPermissionRequired": "Photo album permission required to pick images", - "translationDetails": "Translation Details", + "imageTooLargeHint": + "Image size exceeds 4MB. Reduce quality or dimensions and retry", + "emptyTranslationResult": + "Walang ibinalik na resulta ang image translation API", + "imageTranslationFailedTryLater": + "Nabigo ang pagsasalin ng larawan. Problema sa network o rate limit. Mangyaring subukan muli mamaya", + "imageTranslationApiException": + "May exception sa image translation API. Suriin ang network at subukan muli", + "permissionRequired": "Kailangan ng pahintulot", + "cameraPermissionRequired": + "Kailangan ng pahintulot sa kamera para kumuha ng larawan", + "photoAlbumPermissionRequired": + "Kailangan ng pahintulot sa photo album para pumili ng mga larawan", + "translationDetails": "Detalye ng pagsasalin", "originalImage": "Original Image", "sourceLanguage": "Source Language", "targetLanguage": "Target Language", - "translationTime": "Translation Time", - "shareInDevelopment": "Sharing feature under development", + "translationTime": "Oras ng pagsasalin", + "shareInDevelopment": "Ginagawa pa ang feature na pag-share", // 翻译模块 - 录音文件 "translateAudioFiles": "Isalin ang mga Audio File", @@ -980,7 +1146,8 @@ const Map tlPH = { // 翻译模块 - 翻译详情 "originalRecord": "Orihinal na Record", "recordSummary": "Buod ng Record", - "clickToGenerateSummary": "I-click ang button sa ibaba para bumuo ng buod ng session", + "clickToGenerateSummary": + "I-click ang button sa ibaba para bumuo ng buod ng session", "summaryContent": "Nilalaman ng Buod", "copied": "Nakopya", "summaryCopiledToClipboard": "Nakopya ang buod sa clipboard", @@ -988,9 +1155,11 @@ const Map tlPH = { "summaryGenerated": "Nabuong buod", "generating": "Gumagawa...", "regenerate": "Muling buuin", - "summaryTimeoutMessage": "Nag-time out ang kahilingan sa pagbuo ng buod, maaaring dahil sa problema sa network o abala ang server.", + "summaryTimeoutMessage": + "Nag-time out ang kahilingan sa pagbuo ng buod, maaaring dahil sa problema sa network o abala ang server.", "deleteTranslationRecord": "Burahin ang Record ng Pagsasalin", - "deleteTranslationConfirm": "Sigurado ka bang gusto mong burahin ang record ng pagsasalin na ito? Hindi na ito maibabalik.", + "deleteTranslationConfirm": + "Sigurado ka bang gusto mong burahin ang record ng pagsasalin na ito? Hindi na ito maibabalik.", "originalText": "Orihinal na Teksto", "translatedText": "Isinaling Teksto", "sessionSummary": "Buod ng Session", @@ -1008,22 +1177,31 @@ const Map tlPH = { "notSet": "Hindi Naitakda", "accountSetting": "Setting ng Account", "logout": "Mag-logout", - "logoutTips": "Sigurado ka bang gusto mong mag-logout sa kasalukuyang account?", + "logoutTips": + "Sigurado ka bang gusto mong mag-logout sa kasalukuyang account?", 'deleteAccount': 'Burahin ang Account', - 'deleteAccountTips': 'Sigurado ka bang gusto mong permanenteng burahin ang iyong account? Hindi na ito maibabalik.', + 'deleteAccountTips': + 'Sigurado ka bang gusto mong permanenteng burahin ang iyong account? Hindi na ito maibabalik.', 'clean': 'Clear Cache', 'cleanTips': 'Are you sure you want to clear personal cache?', - 'networkConnectionFailed': 'Nabigo ang koneksyon sa network, pakisuri ang iyong mga setting ng network at subukang muli', - 'serverTemporarilyUnavailable': 'Pansamantalang hindi available ang server, pakisubukang muli mamaya', - 'loginExpiredPleaseRelogin': 'Nag-expire na ang iyong pag-login, mangyaring mag-login muli', - 'noPermissionForThisOperation': 'Walang pahintulot na gawin ang operasyong ito', + 'networkConnectionFailed': + 'Nabigo ang koneksyon sa network, pakisuri ang iyong mga setting ng network at subukang muli', + 'serverTemporarilyUnavailable': + 'Pansamantalang hindi available ang server, pakisubukang muli mamaya', + 'loginExpiredPleaseRelogin': + 'Nag-expire na ang iyong pag-login, mangyaring mag-login muli', + 'noPermissionForThisOperation': + 'Walang pahintulot na gawin ang operasyong ito', 'requestedResourceNotFound': 'Hindi natagpuan ang hiniling na mapagkukunan', - 'imageProcessingFailedPleaseReselect': 'Nabigo ang pagproseso ng imahe, mangyaring pumili muli ng imahe', + 'imageProcessingFailedPleaseReselect': + 'Nabigo ang pagproseso ng imahe, mangyaring pumili muli ng imahe', 'operationFailedPleaseRetry': 'Nabigo ang operasyon, pakisubukang muli', 'serverReturnedError': 'Nagbalik ng error ang server', 'serverError': 'Error sa Server', - 'networkConnectionFailedCheckSettings': 'Nabigo ang koneksyon sa network, pakisuri ang iyong mga setting ng network', - 'serverInternalErrorRetryLater': 'Internal na error sa server, pakisubukang muli mamaya', + 'networkConnectionFailedCheckSettings': + 'Nabigo ang koneksyon sa network, pakisuri ang iyong mga setting ng network', + 'serverInternalErrorRetryLater': + 'Internal na error sa server, pakisubukang muli mamaya', 'imageCompressionFailed': 'Nabigo ang pag-compress ng imahe', 'avatarUpdateFailed': 'Nabigo ang pag-update ng avatar', 'usernameCannotBeEmpty': 'Hindi maaaring walang laman ang username', @@ -1036,26 +1214,32 @@ const Map tlPH = { 'deleteAccountFailedRetry': 'Nabigong burahin ang account, pakisubukang muli', 'clearUserDataFailed': 'Nabigong i-clear ang data ng user', // 清理用户数据失败 'deleteUserDataFailed': 'Nabigong burahin ang data ng user', // 删除用户数据失败 - 'thirdPartyLogoutSuccess': 'Matagumpay na naka-logout sa third-party', // 第三方登录退出成功 + 'thirdPartyLogoutSuccess': + 'Matagumpay na naka-logout sa third-party', // 第三方登录退出成功 'thirdPartyLogoutFailed': 'Nabigo ang pag-logout sa third-party', // 第三方登录退出失败 - 'signOutProcessError': 'Nagkaroon ng error sa proseso ng pag-sign out', // 登出过程发生错误 - 'deleteAccountProcessError': 'Nagkaroon ng error sa proseso ng pagbura ng account', // 删除账号过程发生错误 + 'signOutProcessError': + 'Nagkaroon ng error sa proseso ng pag-sign out', // 登出过程发生错误 + 'deleteAccountProcessError': + 'Nagkaroon ng error sa proseso ng pagbura ng account', // 删除账号过程发生错误 'userDataClearSuccess': 'Matagumpay na na-clear ang data ng user', // 用户数据清理成功 - 'allUserDataClearSuccess': 'Matagumpay na na-clear ang lahat ng data ng user', // 所有用户数据清理成功 - 'accountServiceInitialized': 'Naisimulan na ang AccountService', // AccountService 已初始化 + 'allUserDataClearSuccess': + 'Matagumpay na na-clear ang lahat ng data ng user', // 所有用户数据清理成功 + 'accountServiceInitialized': + 'Naisimulan na ang AccountService', // AccountService 已初始化 // 权限模块 'meetingStoragePermission': 'Storage', - 'meetingStoragePermissionExplanation': 'We need access to storage permissions so you can select and upload audio files.', + 'meetingStoragePermissionExplanation': + 'Kailangan namin ng access sa storage permission para makapili at makapag-upload ka ng mga audio file.', 'meetingStoragePermissionPermanentDenial': '检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。', 'getPermissionStatusFailed': 'Nabigong makuha ang katayuan ng pahintulot', 'communicationPermissions': 'Mga Pahintulot sa Komunikasyon', - 'bluetoothPermissions': 'Bluetooth Permissions', - 'notificationPermissions': 'Notification Permissions', - 'storagePermissions': 'Storage Permissions', - 'microphonePermissions': 'Microphone Permissions', - 'alarmPermissions': 'Alarm Permissions', + 'bluetoothPermissions': 'Mga pahintulot sa Bluetooth', + 'notificationPermissions': 'Mga pahintulot sa notification', + 'storagePermissions': 'Mga pahintulot sa storage', + 'microphonePermissions': 'Mga pahintulot sa mikropono', + 'alarmPermissions': 'Mga pahintulot sa alarm', 'calendarPermissions': 'Mga Pahintulot sa Kalendaryo', 'locationPermissions': 'Mga Pahintulot sa Lokasyon', 'phone': 'Telepono', @@ -1068,10 +1252,14 @@ const Map tlPH = { 'locationInfo': 'Impormasyon sa Lokasyon', 'phonePermissionDesc': 'Ginagamit para sa function ng pagtawag', 'smsPermissionDesc': 'Ginagamit para sa function ng pagpapadala ng SMS', - 'alarmPermissionDesc': 'Used to set exact alarms to ensure reminders trigger on time', - 'calendarWritePermissionDesc': 'Ginagamit para sa paglikha ng mga kaganapan at paalala sa kalendaryo', - 'calendarFullAccessPermissionDesc': 'Ginagamit para sa pagbabasa at pamamahala ng mga kaganapan at paalala sa kalendaryo', - 'locationPermissionDesc': 'Ginagamit para sa pagkuha ng kasalukuyang impormasyon sa lokasyon', + 'alarmPermissionDesc': + 'Used to set exact alarms to ensure reminders trigger on time', + 'calendarWritePermissionDesc': + 'Ginagamit para sa paglikha ng mga kaganapan at paalala sa kalendaryo', + 'calendarFullAccessPermissionDesc': + 'Ginagamit para sa pagbabasa at pamamahala ng mga kaganapan at paalala sa kalendaryo', + 'locationPermissionDesc': + 'Ginagamit para sa pagkuha ng kasalukuyang impormasyon sa lokasyon', 'appFunctionNeeds': 'Kailangan ng function ng app', 'authorized': 'Pinahintulutan', 'unauthorized': 'Hindi Pinahintulutan', @@ -1080,64 +1268,95 @@ const Map tlPH = { 'unknownStatus': 'Hindi Malamang Katayuan', 'permissionGranted': 'Naibigay na ang pahintulot', 'permissionRequestError': 'Error sa paghiling ng pahintulot', - 'phonePermissionDetailDesc': 'Ang function ng pagtawag ay nangangailangan ng pahintulot sa telepono', - 'smsPermissionDetailDesc': 'Ang function ng pagpapadala ng SMS ay nangangailangan ng pahintulot sa SMS', - 'alarmPermissionDetailDesc': 'This permission is required to set exact alarms and ensure reminders trigger on time', - 'calendarWritePermissionDetailDesc': 'Ang paglikha ng mga kaganapan sa kalendaryo ay nangangailangan ng pahintulot sa pagsulat sa kalendaryo', - 'calendarFullAccessPermissionDetailDesc': 'Ang pamamahala ng mga kaganapan sa kalendaryo ay nangangailangan ng buong pahintulot sa kalendaryo', - 'locationPermissionDetailDesc': 'Ang pagkuha ng impormasyon sa lokasyon ay nangangailangan ng pahintulot sa lokasyon', - 'contactsPermissionDesc': 'Used for accessing contact information', - 'contactsPermissionDetailDesc': 'Phone call and SMS functionality requires contacts permission to select contacts', - 'bluetoothPermissionDesc': 'Used for connecting and managing Bluetooth devices', - 'bluetoothPermissionDetailDesc': 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', - 'bluetoothScanPermissionDesc': 'Used for scanning nearby Bluetooth devices', - 'bluetoothScanPermissionDetailDesc': 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', - 'bluetoothConnectPermissionDesc': 'Used for connecting to Bluetooth devices', - 'bluetoothConnectPermissionDetailDesc': 'Connecting to Bluetooth devices requires Bluetooth connect permission', + 'phonePermissionDetailDesc': + 'Ang function ng pagtawag ay nangangailangan ng pahintulot sa telepono', + 'smsPermissionDetailDesc': + 'Ang function ng pagpapadala ng SMS ay nangangailangan ng pahintulot sa SMS', + 'alarmPermissionDetailDesc': + 'Kailangan ang pahintulot na ito para magtakda ng eksaktong alarm at matiyak na mag-trigger ang mga paalala sa tamang oras', + 'calendarWritePermissionDetailDesc': + 'Ang paglikha ng mga kaganapan sa kalendaryo ay nangangailangan ng pahintulot sa pagsulat sa kalendaryo', + 'calendarFullAccessPermissionDetailDesc': + 'Ang pamamahala ng mga kaganapan sa kalendaryo ay nangangailangan ng buong pahintulot sa kalendaryo', + 'locationPermissionDetailDesc': + 'Ang pagkuha ng impormasyon sa lokasyon ay nangangailangan ng pahintulot sa lokasyon', + 'contactsPermissionDesc': 'Ginagamit para sa pag-access ng impormasyon sa contacts', + 'contactsPermissionDetailDesc': + 'Ang function ng pagtawag at SMS ay nangangailangan ng pahintulot sa contacts para pumili ng contacts', + 'bluetoothPermissionDesc': + 'Ginagamit para sa pagkonekta at pamamahala ng mga Bluetooth device', + 'bluetoothPermissionDetailDesc': + 'Ang pagkonekta sa Bluetooth headphones at iba pang device ay nangangailangan ng pahintulot sa Bluetooth', + 'bluetoothScanPermissionDesc': + 'Ginagamit para mag-scan ng mga kalapit na Bluetooth device', + 'bluetoothScanPermissionDetailDesc': + 'Ang pag-scan ng mga kalapit na Bluetooth device ay nangangailangan ng pahintulot sa Bluetooth scan', + 'bluetoothConnectPermissionDesc': + 'Ginagamit para kumonekta sa mga Bluetooth device', + 'bluetoothConnectPermissionDetailDesc': + 'Ang pagkonekta sa mga Bluetooth device ay nangangailangan ng pahintulot sa Bluetooth connect', 'notificationPermissionDesc': 'Used for sending notification messages', - 'notificationPermissionDetailDesc': 'App needs notification permission to send you important alerts and messages', - 'appNeedsPermissionForFullFunction': 'Kailangan ng app ang pahintulot na ito para sa buong paggana', - 'permanentDenialText': 'Permanenteng tinanggihan mo ang pahintulot sa {permission}, mangyaring pumunta sa mga setting ng app para paganahin ito', + 'notificationPermissionDetailDesc': + 'Kailangan ng app ang pahintulot sa notification para magpadala ng mahahalagang alerto at mensahe sa iyo', + 'appNeedsPermissionForFullFunction': + 'Kailangan ng app ang pahintulot na ito para sa buong paggana', + 'permanentDenialText': + 'Permanenteng tinanggihan mo ang pahintulot sa {permission}, mangyaring pumunta sa mga setting ng app para paganahin ito', 'goToSettings': 'Pumunta sa Mga Setting', 'bluetoothScan': 'Bluetooth Scan', - 'bluetoothConnect': 'Bluetooth Connect', - 'bluetoothScanExplanation': 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', - 'bluetoothConnectExplanation': 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', - 'locationForBluetoothExplanation': 'The app needs location permission to scan Bluetooth devices.', - 'bluetoothScanPermanentDenial': 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', - 'bluetoothConnectPermanentDenial': 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', - 'locationPermanentDenial': 'Location permission has been permanently denied, please go to settings to enable it manually.', + 'bluetoothConnect': 'Kumonekta sa Bluetooth', + 'bluetoothScanExplanation': + 'Kailangan ng app ang pahintulot sa Bluetooth scan para mag-scan ng mga kalapit na Bluetooth device.', + 'bluetoothConnectExplanation': + 'Kailangan ng app ang pahintulot sa Bluetooth connect para kumonekta sa mga Bluetooth device.', + 'locationForBluetoothExplanation': + 'Kailangan ng app ang pahintulot sa lokasyon para mag-scan ng mga Bluetooth device.', + 'bluetoothScanPermanentDenial': + 'Permanenteng tinanggihan ang pahintulot sa Bluetooth scan, mangyaring pumunta sa mga setting para paganahin ito nang manu-mano.', + 'bluetoothConnectPermanentDenial': + 'Permanenteng tinanggihan ang pahintulot sa Bluetooth connect, mangyaring pumunta sa mga setting para paganahin ito nang manu-mano.', + 'locationPermanentDenial': + 'Permanenteng tinanggihan ang pahintulot sa lokasyon, mangyaring pumunta sa mga setting para paganahin ito nang manu-mano.', 'notificationPermission': 'Notification', 'locationPermission': 'Location', - 'notificationPermissionExplanation': 'Notification permission is required to display music playback status.', - 'locationPermissionExplanation': 'Location permission is required to get current location.', - 'notificationPermissionPermanentDenial': 'You have permanently denied notification permission, please go to settings to enable it.', - 'locationPermissionPermanentDenial': 'You have permanently denied location permission, please go to settings to enable it.', + 'notificationPermissionExplanation': + 'Kailangan ang pahintulot sa notification para ipakita ang status ng pagpe-play ng musika.', + 'locationPermissionExplanation': + 'Kailangan ang pahintulot sa lokasyon para makuha ang kasalukuyang lokasyon.', + 'notificationPermissionPermanentDenial': + 'Permanenteng tinanggihan mo ang pahintulot sa notification, mangyaring pumunta sa mga setting para paganahin ito.', + 'locationPermissionPermanentDenial': + 'Permanenteng tinanggihan mo ang pahintulot sa lokasyon, mangyaring pumunta sa mga setting para paganahin ito.', 'storagePermission': 'Storage', - 'microphonePermissionExplanation': 'We need microphone permission to record audio content.', - 'storagePermissionExplanation': 'We need storage permission so you can select and upload audio files.', + 'microphonePermissionExplanation': + 'Kailangan namin ang pahintulot sa mikropono para mag-record ng audio content.', + 'storagePermissionExplanation': + 'Kailangan namin ang pahintulot sa storage para makapili at makapag-upload ka ng mga audio file.', 'microphonePermissionPermanentDenial': '检测到您已永久拒绝录音权限。如需继续使用此功能,请前往应用设置中手动开启麦克风权限。', 'storagePermissionPermanentDenial': '检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。', - 'permissionUtilNeed': 'Need ', - 'permissionUtilPermission': ' Permission', - 'permissionUtilRestricted': ' Permission Restricted', - 'permissionUtilRestrictedMessage': 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', + 'permissionUtilNeed': 'Kailangan ', + 'permissionUtilPermission': ' pahintulot', + 'permissionUtilRestricted': ' ay may restriksyon', + 'permissionUtilRestrictedMessage': + 'Hindi available o may restriksyon ang feature na ito sa kasalukuyang device, mangyaring suriin ang mga setting ng device o mga restriksyon ng system', 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Nagna-navigate', - 'native.notification.navigation.keepRunning': 'Nagna-navigate, panatilihing bukas ang app', - 'native.notification.bleAgent.running': 'Tumatakbo ang voice assistant agent', - 'native.notification.audioRecording.recording': 'Nagre-record ng audio, i-tap para bumalik sa app', - 'native.notification.music.waiting': 'Naghihintay na mag-play', - 'native.notification.music.previous': 'Nakaraang', - 'native.notification.music.next': 'Susunod', - 'native.notification.music.play': 'I-play', - 'native.notification.music.pause': 'I-pause', - 'native.notification.qqMusic.playing': 'Nagpe-play ng musika', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Nagna-navigate', + 'native.notification.navigation.keepRunning': + 'Nagna-navigate, panatilihing bukas ang app', + 'native.notification.bleAgent.running': 'Tumatakbo ang voice assistant agent', + 'native.notification.audioRecording.recording': + 'Nagre-record ng audio, i-tap para bumalik sa app', + 'native.notification.music.waiting': 'Naghihintay na mag-play', + 'native.notification.music.previous': 'Nakaraang', + 'native.notification.music.next': 'Susunod', + 'native.notification.music.play': 'I-play', + 'native.notification.music.pause': 'I-pause', + 'native.notification.qqMusic.playing': 'Nagpe-play ng musika', // 版本更新 'newVersionFound': 'May Natagpuang Bagong Bersyon', // 版本更新对话框标题 @@ -1145,8 +1364,10 @@ const Map tlPH = { 'updateNow': 'I-update Ngayon', // 立即更新按钮 'checkUpdate': 'Suriin kung may Update', // 检查更新按钮 'updateFailed': 'Nabigo ang Pag-update', // 更新失败提示 - 'cannotOpenAppStore': 'Hindi mabuksan ang app store, mangyaring pumunta nang manu-mano sa app store para mag-update', // 无法打开应用商店提示 - 'updateErrorRetry': 'Nagkaroon ng error habang nag-a-update, pakisubukang muli mamaya', // 更新错误重试提示 + 'cannotOpenAppStore': + 'Hindi mabuksan ang app store, mangyaring pumunta nang manu-mano sa app store para mag-update', // 无法打开应用商店提示 + 'updateErrorRetry': + 'Nagkaroon ng error habang nag-a-update, pakisubukang muli mamaya', // 更新错误重试提示 // 配对模块 "devicePairing": "Pag-pair ng Device", @@ -1163,49 +1384,68 @@ const Map tlPH = { "goToBluetoothSettings": "Pumunta sa Mga Setting ng Bluetooth", 'bluetooth': 'Bluetooth', "readyToPair": "Handa nang i-pair", - "preparingPairingEnvironment": "Inihahanda ang kapaligiran para sa pag-pair...", - "connectDeepSoundViaSystemBluetooth": "Mangyaring kumonekta muna sa Voitrans device sa pamamagitan ng system Bluetooth", + "preparingPairingEnvironment": + "Inihahanda ang kapaligiran para sa pag-pair...", + "connectDeepSoundViaSystemBluetooth": + "Mangyaring kumonekta muna sa Voitrans device sa pamamagitan ng system Bluetooth", "deviceBindingConfirm": "Kumpirmasyon sa pag-bind ng device...", "establishingDeviceAssociation": "Itinatatag ang ugnayan ng device...", "waitingCompletePairing": "Pakihintay, kinukumpleto ang pag-pair...", - "pairingSuccessRedirecting": "Matagumpay ang pag-pair! Papunta na sa home page...", - "ensureConnectedDeepSoundDevice": "Pakitiyak na konektado ka sa isang Voitrans device", - "deviceAlreadyBoundToOtherAccount": "Ang device na ito ay naka-bind na sa ibang account", - "deviceAssociationFailed": "Nabigo ang pag-uugnay ng device, pakisubukang muli", - "scanTimeoutEnsureDeviceNearby": "Nag-time out ang pag-scan, pakitiyak na malapit ang device", + "pairingSuccessRedirecting": + "Matagumpay ang pag-pair! Papunta na sa home page...", + "ensureConnectedDeepSoundDevice": + "Pakitiyak na konektado ka sa isang Voitrans device", + "deviceAlreadyBoundToOtherAccount": + "Ang device na ito ay naka-bind na sa ibang account", + "deviceAssociationFailed": + "Nabigo ang pag-uugnay ng device, pakisubukang muli", + "scanTimeoutEnsureDeviceNearby": + "Nag-time out ang pag-scan, pakitiyak na malapit ang device", "networkError": "Error sa Network", - "authorizationFailedCheckCode": "Nabigo ang awtorisasyon, pakisuri kung tama ang authorization code", + "authorizationFailedCheckCode": + "Nabigo ang awtorisasyon, pakisuri kung tama ang authorization code", "pairingFailedRetry": "Nabigo ang pag-pair, pakisubukang muli", 'pleaseEnableBluetooth': 'Paki-enable ang Bluetooth', 'deviceDisconnected': 'Nadiskonekta ang device', 'readyToStartPairing': 'Handa nang simulan ang pag-pair', 'checkingEnvironment': 'Sinusuri ang kapaligiran...', - 'ensureHeadsetOnAndPairingMode': 'Pakitiyak na naka-on ang headset at nasa pairing mode', + 'ensureHeadsetOnAndPairingMode': + 'Pakitiyak na naka-on ang headset at nasa pairing mode', 'establishingSecureConnection': 'Itinatatag ang secure na koneksyon...', - 'needManualBindingAuthCode': 'Kailangan ng manual binding authorization code...', + 'needManualBindingAuthCode': + 'Kailangan ng manual binding authorization code...', 'pairingSuccessful': 'Matagumpay ang pag-pair!', 'enableBluetooth': 'Paganahin ang Bluetooth', 'grantPermissions': 'Magbigay ng mga Pahintulot', 'retryAssociation': 'Muling iugnay', 'retryAuthorization': 'Muling pahintulutan', - 'pleaseGrantNecessaryPermissions': 'Pakibigay ang mga kinakailangang pahintulot', + 'pleaseGrantNecessaryPermissions': + 'Pakibigay ang mga kinakailangang pahintulot', 'checkFailedRetry': 'Nabigo ang pagsuri, pakisubukang muli', 'pleaseConnectDeepSoundDevice': 'Pakikonekta ang isang Voitrans device', 'verificationFailedRetry': 'Nabigo ang pag-verify, pakisubukang muli', 'invalidDeviceAddress': 'Hindi wastong address ng device', 'bleDeviceAssociationFailed': 'Nabigo ang pag-uugnay ng BLE device', - 'deviceAssociationFailedRetry': 'Nabigo ang pag-uugnay ng device, pakisubukang muli', - 'bleConnectionTimeoutRetry': 'Nag-time out ang koneksyon ng BLE, pakisubukang muli', + 'deviceAssociationFailedRetry': + 'Nabigo ang pag-uugnay ng device, pakisubukang muli', + 'bleConnectionTimeoutRetry': + 'Nag-time out ang koneksyon ng BLE, pakisubukang muli', 'blePairingStartupFailed': 'Nabigo ang pagsisimula ng BLE pairing', 'bleConnectionFailed': 'Nabigo ang koneksyon ng BLE', - 'deviceAuthorizationFailedCheckCode': 'Nabigo ang awtorisasyon ng device, pakisuri ang authorization code', - 'bluetoothGuideTitle': 'Manual Bluetooth Activation Required', // 需要手动开启蓝牙 - 'bluetoothGuideSteps': 'Please follow these steps:', // 请按照以下步骤操作: - 'bluetoothGuideStep1': 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 - 'bluetoothGuideStep2': 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 - 'bluetoothGuideStep3': 'Return to app to continue pairing process', // 返回应用继续配对流程 - 'bluetoothGuideTip': 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 - 'iKnow': 'I Know', // 我知道了 + 'deviceAuthorizationFailedCheckCode': + 'Nabigo ang awtorisasyon ng device, pakisuri ang authorization code', + 'bluetoothGuideTitle': + 'Kailangang i-on ang Bluetooth nang manu-mano', // 需要手动开启蓝牙 + 'bluetoothGuideSteps': 'Sundin ang mga hakbang na ito:', // 请按照以下步骤操作: + 'bluetoothGuideStep1': + 'I-enable ang Bluetooth: Settings → Bluetooth → I-on', // 开启蓝牙:设置 → 蓝牙 → 开启 + 'bluetoothGuideStep2': + 'Ikonekta ang device: Hanapin ang iyong device sa "My Devices" at i-tap para kumonekta', // 连接设备:在"我的设备"中找到您的设备并点击连接 + 'bluetoothGuideStep3': + 'Bumalik sa app para ipagpatuloy ang pairing', // 返回应用继续配对流程 + 'bluetoothGuideTip': + 'Tip: Maaari ring i-long press ang Bluetooth icon sa Control Center para mabilis na mabuksan ang Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 + 'iKnow': 'Naiintindihan ko', // 我知道了 // 配对模块 - 绑定奖励 "firstBindRewardTitle": "Welcome Reward", @@ -1221,17 +1461,21 @@ const Map tlPH = { // 用户反馈模块 "feedback": "Feedback ng User", 'feedbackInfo': 'Magbigay ng feedback o suhestiyon', - 'feedbackDescription': 'Pakilarawan ang problemang naranasan o ang iyong suhestiyon', + 'feedbackDescription': + 'Pakilarawan ang problemang naranasan o ang iyong suhestiyon', 'feedbackHint': 'Pakilagay ang iyong feedback...', 'feedbackRequired': 'Pakilagay ang nilalaman ng feedback', 'contactInfo': 'Impormasyon sa Pakikipag-ugnayan', 'contactHint': 'Email/Numero ng telepono, para makontak ka namin', 'submit': 'Isumite', - 'feedbackSubmitSuccess': 'Matagumpay na naisumite ang feedback, salamat sa iyong feedback!', - 'feedbackSubmitFailed': 'Nabigong isumite ang feedback, pakisubukang muli mamaya', + 'feedbackSubmitSuccess': + 'Matagumpay na naisumite ang feedback, salamat sa iyong feedback!', + 'feedbackSubmitFailed': + 'Nabigong isumite ang feedback, pakisubukang muli mamaya', // OTA升级模块 - "upgradeExitConfirm": "Kasalukuyang nag-a-upgrade, ang pag-exit ay makakaantala sa proseso, sigurado ka bang gusto mong mag-exit?", + "upgradeExitConfirm": + "Kasalukuyang nag-a-upgrade, ang pag-exit ay makakaantala sa proseso, sigurado ka bang gusto mong mag-exit?", "deviceModel": "Modelo ng Device", "unknownDevice": "Hindi Kilalang Device", "currentFirmwareVersion": "Kasalukuyang Bersyon ng Firmware", @@ -1243,15 +1487,74 @@ const Map tlPH = { "connectionFailed": "Nabigo ang Koneksyon", "retryConnection": "Muling kumonekta", "ota_updateNow": "I-update Ngayon", - "otaVersionInfoFailed": "Failed to get version info. Please try again later.", - "otaDeviceInfoUnavailable": "Unable to get device info. Please check the connection and retry.", - "otaProductInfoUnavailable": "Unable to identify the device. Please reconnect and retry.", - "otaFirmwareVersionInvalid": "Firmware version is abnormal. Please reconnect and retry.", - "keepConnectedDontClose": "Panatilihing konektado ang device, huwag isara ang app", + "otaVersionInfoFailed": + "Nabigong kunin ang impormasyon ng bersyon. Pakisubukang muli mamaya.", + "otaDeviceInfoUnavailable": + "Hindi makuha ang impormasyon ng device. Mangyaring suriin ang koneksyon at subukan muli.", + "otaProductInfoUnavailable": + "Hindi matukoy ang device. Mangyaring muling kumonekta at subukan muli.", + "otaFirmwareVersionInvalid": + "Abnormal ang firmware version. Mangyaring muling kumonekta at subukan muli.", + "keepConnectedDontClose": + "Panatilihing konektado ang device, huwag isara ang app", "doNotDisconnect": "Huwag idiskonekta", "charging": "Nagcha-charge", "updateContent": "Nilalaman ng Update", - "removeEarbudsEnsureBattery": "Alisin ang parehong earbuds, at tiyaking parehong may 20% o higit pang baterya", + "removeEarbudsEnsureBattery": + "Alisin ang parehong earbuds, at tiyaking parehong may 20% o higit pang baterya", + + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Matagumpay ang pag-upgrade', + 'otaUpgradeCompleteRepair': + 'Kumpleto na ang firmware upgrade!\n\nKailangan i-re-pair ang device para gumana nang maayos. Pumunta sa pahina ng pairing ngayon?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': + 'Kamalian sa pag-check ng koneksyon ng BLE: @error', + 'otaBleNotConnected': 'Hindi nakakonekta ang BLE device', + 'otaBleNeedConnection': + 'Kailangan ng koneksyon sa BLE device para sa firmware upgrade\nMangyaring tiyaking maayos na nakakonekta ang device at subukan muli', + 'otaDeviceInfoUnavailableTitle': 'Hindi available ang impormasyon ng device', + 'otaCannotGetDeviceInfo': + 'Hindi makuha ang impormasyon ng device\nMangyaring muling ikonekta ang device o subukan muli mamaya', + 'otaBleCheckFailed': 'Nabigo ang pag-check ng koneksyon ng BLE', + 'otaCannotGetDeviceInfoCheckConnection': + 'Hindi makuha ang impormasyon ng device, mangyaring suriin ang koneksyon ng device', + 'otaCannotGetProductInfoWithName': + 'Hindi makuha ang impormasyon ng produkto, pangalan ng device: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Masyadong mababa ang baterya ng device para sa firmware upgrade\nKinakailangan: dapat higit sa 20% ang baterya\nKasalukuyan: @ear @battery%\nMangyaring i-charge at subukan muli', + 'otaDoubleBatteryLow': + 'Masyadong mababa ang baterya ng device para sa firmware upgrade\nKinakailangan: parehong earbuds ay dapat higit sa 20%\nKasalukuyan: Kaliwa @left%, Kanan @right%\nMangyaring i-charge at subukan muli', + 'otaBatteryCheckFailed': 'Nabigo ang pag-check ng baterya', + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': + 'Nabigong kunin ang pinakabagong impormasyon ng bersyon', + 'otaGetVersionInfoFailed': 'Nabigong kunin ang impormasyon ng bersyon', + 'otaCheckingDeviceStatus': 'Tinitingnan ang estado ng device...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Nabigo ang pag-download', + 'otaPreparingConnection': 'Inihahanda ang koneksyon ng device...', + 'otaConnectingDevice': 'Kumokonekta sa device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Matagumpay na natapos ang pag-upgrade', + 'otaUpgradeFailedWithCode': 'Nabigo ang pag-upgrade, code ng error: @code', + 'otaUpgradeFailedTitle': 'Nabigo ang pag-upgrade', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Na-disconnect ang device', + 'otaDeviceConnected': 'Nakakonekta ang device', // 音乐模块 "noMusic": "Walang Musika", // 暂无音乐 diff --git a/lib/core/translations/language/tr_tr.dart b/lib/core/translations/language/tr_tr.dart index 44a87bfed..9b8b24cff 100644 --- a/lib/core/translations/language/tr_tr.dart +++ b/lib/core/translations/language/tr_tr.dart @@ -1,5 +1,4 @@ const Map trTR = { - // 通用 'continue': 'Devam Et', 'confirm': 'Onayla', @@ -80,7 +79,8 @@ const Map trTR = { // 登录模块 "welcome": "Hoş Geldiniz", - "loginTips": "Lütfen telefon numaranızı veya e-postanızı kullanarak giriş yapın veya hesap oluşturun", + "loginTips": + "Lütfen telefon numaranızı veya e-postanızı kullanarak giriş yapın veya hesap oluşturun", "accountNumber": "Telefon Numarası veya E-posta", "verificationCode": "Doğrulama Kodu", "getCode": "Kodu Al", @@ -99,14 +99,16 @@ const Map trTR = { "tip": "İpucu", "pleaseEnterCompleteCode": "Lütfen tam doğrulama kodunu girin", "loginFailed": "Giriş başarısız, lütfen tekrar deneyin", - 'pleaseAcceptPrivacyPolicy': 'Lütfen önce Gizlilik Politikasını ve Kullanıcı Sözleşmesini okuyup kabul edin', + 'pleaseAcceptPrivacyPolicy': + 'Lütfen önce Gizlilik Politikasını ve Kullanıcı Sözleşmesini okuyup kabul edin', "enterVerificationCode": "Doğrulama kodunu girin", "verificationCodeSentTo": "Doğrulama kodu şuraya gönderildi:", "resendVerificationCode": "Doğrulama kodunu tekrar gönder", "login": "Giriş Yap", "usePasswordLogin": "Parolayla Giriş Yap", "loginDeclaration": "Voitrans Beyanı", // Voitrans 声明 - "welcomeToThisApp": "Voitrans'a hoş geldiniz, lütfen dikkatlice okuyun", // 欢迎使用Voitrans,请充分阅读 + "welcomeToThisApp": + "Voitrans'a hoş geldiniz, lütfen dikkatlice okuyun", // 欢迎使用Voitrans,请充分阅读 "privacyPolicyText": ",点击'同意并进入'表示您已充分阅读并同意上述协议。点击'不同意'将退出应用。", // ,点击"同意并进入"表示您已充分阅读并同意上述协议。点击"不同意"将退出应用。 "disagree": "Reddet", // 不同意 @@ -120,17 +122,20 @@ const Map trTR = { "signal": "Sinyal", "deviceId": "Cihaz Kimliği", "firmwareVersion": "Donanım Yazılımı Sürümü", - "disconnectedDevice": "Bağlı cihaz yok, bağlanmak için aşağıdaki düğmeye tıklayın", + "disconnectedDevice": + "Bağlı cihaz yok, bağlanmak için aşağıdaki düğmeye tıklayın", "connectDevice": "Cihaz Bağla", "topAiExperiences": "En İyi Yapay Zeka Deneyimleri", "aiAssistant": "Her Şey Dahil Yapay Zeka Asistanı", "aiAssistantInfo": "Sorular ve tavsiyeler için 7/24 özel danışman", "interpretation": "Simultane Çeviri", - "simultaneousInterpretationInfo": "Birden çok dil için gerçek zamanlı çeviri, sorunsuz yurt dışı seyahati", + "simultaneousInterpretationInfo": + "Birden çok dil için gerçek zamanlı çeviri, sorunsuz yurt dışı seyahati", "aiCompanion": "Aile Arkadaşı", "aiCompanionInfo": "Sizi anlar ve sıcak bir arkadaşlık sunar", "homeSlogan": "Dünyayla bağlan, sesin ötesine geç", - "turnEarphones": "Lütfen kulaklık şarj kutusunu açın ve kulaklıkları kulaklarınıza takın", + "turnEarphones": + "Lütfen kulaklık şarj kutusunu açın ve kulaklıkları kulaklarınıza takın", "currentlyConnected": "Şu anda bağlı:", "unsystemSetup": "Sistem ayarlarına git", "talkLater": "Daha Sonra", @@ -161,6 +166,29 @@ const Map trTR = { 'right': 'Sağ', 'checkConnectionStatusFailed': 'Bağlantı durumu kontrol edilemedi', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Bluetooth initialization failed: @error', + 'needBluetoothAndLocationPermission': + 'Bluetooth and location permissions are required to scan devices', + 'permissionRequestFailedWithError': 'Permission request failed: @error', + 'needPermission': 'Permission Required', + 'blePermissionDialogContent': + 'This app requires Bluetooth and location permissions to scan devices. Please enable them in Settings.', + 'needEnableBluetooth': 'Enable Bluetooth', + 'enableBluetoothDialogContent': + 'Please enable Bluetooth to scan and connect devices.', + 'bleScanFailedWithError': 'Scan failed: @error', + 'bleConnectionSuccess': 'Connection Successful', + 'bleConnectedToDevice': 'Connected to @device', + 'bleConnectionFailedWithError': 'Connection failed: @error', + 'bleDisconnected': 'Disconnected', + 'bleDeviceDisconnected': 'Device disconnected', + 'bleDisconnectFailedWithError': 'Disconnect failed: @error', + 'signalStrong': 'Strong', + 'signalMedium': 'Medium', + 'signalWeak': 'Weak', + 'signalVeryWeak': 'Very Weak', + // 发现页 "searchAi": "Yapay zeka özelliklerini ara...", "exploreSlogan": "Akıllı Kulaklıklar, Sonsuz Olasılıklar", @@ -180,7 +208,8 @@ const Map trTR = { "healthConsultant": "Çok Fonksiyonlu Yapay Zeka Sohbeti", "healthConsultantInfo": "Daha fazla yapay zeka sohbet özelliği sunar", "conferenceAssistant": "İş Toplantısı Asistanı", - "conferenceAssistantInfo": "Gerçek zamanlı toplantı tutanakları, çok dilli çeviri", + "conferenceAssistantInfo": + "Gerçek zamanlı toplantı tutanakları, çok dilli çeviri", "usageStats": "Kullanım İstatistikleri", "usageStatsInfo": "Kullanım istatistiklerinizi görüntüleyin", "scene": "Senaryo", @@ -222,7 +251,8 @@ const Map trTR = { "audioFileSize": "Audio File Size", "transcriptBytes": "Transcript Bytes", "loadFailed": "Load Failed", - "statsLoadFailedTryLater": "Statistics failed to load. Please try again later.", + "statsLoadFailedTryLater": + "Statistics failed to load. Please try again later.", "cleanupComplete": "Cleanup Complete", "cleanedOldData": "Cleaned data older than 90 days", "exportFeature": "Export Feature", @@ -234,64 +264,69 @@ const Map trTR = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Ödeme başarılı', - 'paymentFailed': 'Ödeme başarısız', - 'gotIt': 'Anladım', - 'paymentFailedTryAgain': 'Ödeme başarısız oldu. Lütfen tekrar deneyin.', - 'selectPaymentMethod': 'Ödeme yöntemini seçin', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'WeChat Pay siparişi oluşturulamadı', - 'alipayOrderCreateFailed': 'Alipay siparişi oluşturulamadı', - 'appleOrderCreateFailed': 'Apple siparişi oluşturulamadı', - 'googleOrderCreateFailed': 'Google siparişi oluşturulamadı', - 'paypalOrderCreateFailed': 'PayPal siparişi oluşturulamadı', - 'paymentException': 'Ödeme istisnası', - 'paymentLaunchFailed': 'Ödeme başlatılamadı', - 'paymentExceptionWithError': 'Ödeme istisnası: @error', - 'paymentProcessingCheckLater': 'Siparişiniz işleniyor. Lütfen daha sonra kontrol edin.', - 'paymentResultQueryException': 'Ödeme sonucu sorgulanamadı: @error', - 'orderConfirmedQuotaRefreshed': 'Sipariş onaylandı. Kotanız yenilendi.', - 'paymentCompletedConfirming': 'Ödeme tamamlandı. Onaylanıyor…', - 'paymentCancelled': 'Ödeme iptal edildi', - 'paypalOpenedCompleteInBrowser': 'PayPal açıldı. Lütfen tarayıcınızda ödemeyi tamamlayın.', - 'paypalOpenFailed': 'PayPal ödeme sayfası açılamıyor', - 'paymentTestTitle': 'Ödeme Testi', - 'paymentTestOrderInfo': 'Test Sipariş Bilgisi', - 'paymentTestProductId': 'Ürün Kimliği', - 'paymentTestProductDescription': 'Ürün açıklaması', - 'paymentTestWechatDescription': 'WeChat Pay ödeme testi', - 'paymentTestAlipayDescription': 'Alipay ödeme testi', - 'paymentTestAmount': 'Tutar', - 'paymentTestSelectAmount': 'Test tutarını seçin', - 'paying': 'Ödeniyor...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Ödeme durumu', - 'errorInfoWithMessage': 'Hata: @message', - 'retest': 'Yeniden Test Et', - 'paymentTestInstructionsTitle': 'Talimatlar', - 'paymentTestInstructionsContent': '1. Bir test tutarı seçin (önerilen: ¥0,01)\n2. Başlatmak için ödeme düğmesine tıklayın\n3. Ödeme uygulamasında ödemeyi tamamlayın\n4. Sonucu kontrol etmek için geri dönün', - 'startingWechatPayment': 'WeChat Pay başlatılıyor...', - 'startingAlipayPayment': 'Alipay başlatılıyor...', - 'wechatPaymentSuccess': 'WeChat Pay başarılı!', - 'wechatPaymentFailed': 'WeChat Pay başarısız', - 'wechatPaymentLaunchFailed': 'WeChat Pay başlatılamadı', - 'cannotLaunchWechatPayment': 'WeChat Pay başlatılamıyor', - 'wechatPaymentException': 'WeChat Pay istisnası', - 'wechatPaymentTestCompleted': 'WeChat Pay testi tamamlandı', - 'alipayPaymentSuccess': 'Alipay başarılı!', - 'alipayPaymentFailed': 'Alipay başarısız', - 'alipayPaymentLaunchFailed': 'Alipay başlatılamadı', - 'cannotLaunchAlipayPayment': 'Alipay başlatılamıyor', - 'alipayPaymentException': 'Alipay istisnası', + 'paymentSuccess': 'Ödeme başarılı', + 'paymentFailed': 'Ödeme başarısız', + 'gotIt': 'Anladım', + 'paymentFailedTryAgain': 'Ödeme başarısız oldu. Lütfen tekrar deneyin.', + 'selectPaymentMethod': 'Ödeme yöntemini seçin', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'WeChat Pay siparişi oluşturulamadı', + 'alipayOrderCreateFailed': 'Alipay siparişi oluşturulamadı', + 'appleOrderCreateFailed': 'Apple siparişi oluşturulamadı', + 'googleOrderCreateFailed': 'Google siparişi oluşturulamadı', + 'paypalOrderCreateFailed': 'PayPal siparişi oluşturulamadı', + 'paymentException': 'Ödeme istisnası', + 'paymentLaunchFailed': 'Ödeme başlatılamadı', + 'paymentExceptionWithError': 'Ödeme istisnası: @error', + 'paymentProcessingCheckLater': + 'Siparişiniz işleniyor. Lütfen daha sonra kontrol edin.', + 'paymentResultQueryException': 'Ödeme sonucu sorgulanamadı: @error', + 'orderConfirmedQuotaRefreshed': 'Sipariş onaylandı. Kotanız yenilendi.', + 'paymentCompletedConfirming': 'Ödeme tamamlandı. Onaylanıyor…', + 'paymentCancelled': 'Ödeme iptal edildi', + 'paypalOpenedCompleteInBrowser': + 'PayPal açıldı. Lütfen tarayıcınızda ödemeyi tamamlayın.', + 'paypalOpenFailed': 'PayPal ödeme sayfası açılamıyor', + 'paymentTestTitle': 'Ödeme Testi', + 'paymentTestOrderInfo': 'Test Sipariş Bilgisi', + 'paymentTestProductId': 'Ürün Kimliği', + 'paymentTestProductDescription': 'Ürün açıklaması', + 'paymentTestWechatDescription': 'WeChat Pay ödeme testi', + 'paymentTestAlipayDescription': 'Alipay ödeme testi', + 'paymentTestAmount': 'Tutar', + 'paymentTestSelectAmount': 'Test tutarını seçin', + 'paying': 'Ödeniyor...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Ödeme durumu', + 'errorInfoWithMessage': 'Hata: @message', + 'retest': 'Yeniden Test Et', + 'paymentTestInstructionsTitle': 'Talimatlar', + 'paymentTestInstructionsContent': + '1. Bir test tutarı seçin (önerilen: ¥0,01)\n2. Başlatmak için ödeme düğmesine tıklayın\n3. Ödeme uygulamasında ödemeyi tamamlayın\n4. Sonucu kontrol etmek için geri dönün', + 'startingWechatPayment': 'WeChat Pay başlatılıyor...', + 'startingAlipayPayment': 'Alipay başlatılıyor...', + 'wechatPaymentSuccess': 'WeChat Pay başarılı!', + 'wechatPaymentFailed': 'WeChat Pay başarısız', + 'wechatPaymentLaunchFailed': 'WeChat Pay başlatılamadı', + 'cannotLaunchWechatPayment': 'WeChat Pay başlatılamıyor', + 'wechatPaymentException': 'WeChat Pay istisnası', + 'wechatPaymentTestCompleted': 'WeChat Pay testi tamamlandı', + 'alipayPaymentSuccess': 'Alipay başarılı!', + 'alipayPaymentFailed': 'Alipay başarısız', + 'alipayPaymentLaunchFailed': 'Alipay başlatılamadı', + 'cannotLaunchAlipayPayment': 'Alipay başlatılamıyor', + 'alipayPaymentException': 'Alipay istisnası', "insufficientIntegral": "Insufficient integral", - "insufficientBalanceDesc": "Insufficient balance, please go to the corresponding recharge page to recharge.", + "insufficientBalanceDesc": + "Insufficient balance, please go to the corresponding recharge page to recharge.", "recharge": "Go to Recharge", - "aiMemberExpiredDesc": "AI membership expired, please go to the membership recharge page to renew.", + "aiMemberExpiredDesc": + "AI membership expired, please go to the membership recharge page to renew.", // 商品模块 - AI商品页 'musicAndRecommendation': 'Music & Recommendation', @@ -299,11 +334,15 @@ const Map trTR = { 'nearbySearch': 'Nearby Search', 'newsInformation': 'News', 'communicationAssistant': 'Communication Assistant', - 'aiHeaderDesc1': 'Longer conversation quota, more tool calls, extended context length.', - 'aiHeaderDesc2': 'Suitable for agent Q&A, summarization, analysis, and task execution.', + 'aiHeaderDesc1': + 'Longer conversation quota, more tool calls, extended context length.', + 'aiHeaderDesc2': + 'Suitable for agent Q&A, summarization, analysis, and task execution.', 'musicSearchPlaybackControl': 'Music library search and playback control', - 'smartPlaylistAndSimilarRecommendations': 'Smart playlist and similar song recommendations', - 'routePlanningAndCongestionAvoidance': 'Route planning and congestion avoidance', + 'smartPlaylistAndSimilarRecommendations': + 'Smart playlist and similar song recommendations', + 'routePlanningAndCongestionAvoidance': + 'Route planning and congestion avoidance', 'voiceBroadcastAndWaypoints': 'Voice broadcast and waypoint settings', 'realTimeWeatherForecast': 'Real-time weather and forecast', 'clothingAdviceAndTravelReminders': 'Clothing advice and travel reminders', @@ -312,32 +351,39 @@ const Map trTR = { 'hotNewsAndTopicOverview': 'Hot news and topic overview', 'longArticleSummariesAndKeyPoints': 'Long-article summaries and key points', 'helpCallAndSMS': 'Help with calls and SMS', - 'templatedMessagesAndScheduleReminders': 'Template messages and schedule reminders', - 'aiDisclaimer': 'Features depend on device permissions, service availability, and network conditions.', + 'templatedMessagesAndScheduleReminders': + 'Template messages and schedule reminders', + 'aiDisclaimer': + 'Features depend on device permissions, service availability, and network conditions.', // 商品模块 - 翻译商品页 'realtimeTranscription': 'Real-time Transcription', 'sceneLexicon': 'Scenario Glossary', 'subtitleDisplay': 'Subtitles', - 'transHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'transHeaderDesc1': + 'Real-time simultaneous interpretation and text translation with low-latency voice.', 'transHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', 'translateZhEn': 'Chinese-English translation', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'termOptimizationContextPreserve': + 'Terminology optimization and context preservation', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', 'personalVocabularyMemory': 'Personal vocabulary memory', 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', 'colorHighContrast': 'High color contrast', - 'transDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + 'transDisclaimer': + 'Translation performance depends on microphone, network latency, and ambient noise.', // 商品模块 - 会议商品页 'meetingRecording': 'Meeting Recording', 'transcriptionAndSummary': 'Transcription & Summary', 'keywordSearch': 'Keyword Search', 'collaborationSharing': 'Collaboration & Sharing', - 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', - 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingHeaderDesc1': + 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', + 'meetingHeaderDesc2': + 'Suitable for business meetings, class notes, and interview minutes.', 'meetingAutoRecording': 'Auto recording and segmentation', 'meetingSpeakerTagging': 'Speaker labeling', 'meetingLongAudioTranscription': 'Long audio transcription', @@ -346,7 +392,8 @@ const Map trTR = { 'meetingTimelineJump': 'Timeline jump', 'meetingExportSummary': 'Export minutes', 'meetingMultiPlatformShare': 'Share across platforms', - 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + 'meetingDisclaimer': + 'Use in quiet environments; performance depends on microphone and network.', // 商品模块 - VIP会员页 'benefitsOverview': 'Benefits overview', @@ -361,7 +408,8 @@ const Map trTR = { 'generalPrivileges': 'General privileges', 'earlyAccessNewFeatures': 'Early access to new features', 'crossDeviceSync': 'Cross-device sync', - 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', + 'vipDisclaimer': + 'Actual benefits depend on the package details and may change with versions.', // 商品模块 - 商品名称与描述 'ai_001_name': 'AI Basic 100', @@ -411,7 +459,8 @@ const Map trTR = { 'guideNavInput': 'Navigate to Shenzhen Airport', 'guideNavSend': 'Lily will plan the route', 'guideNavEnd': 'Navigation set—try other commands', - 'guideMeetingStart': 'Tell Lily: “Create a meeting reminder for 3pm tomorrow”', + 'guideMeetingStart': + 'Tell Lily: “Create a meeting reminder for 3pm tomorrow”', 'guideMeetingInput': 'Create a meeting reminder for 3pm tomorrow', 'guideMeetingSend': 'Lily will create a meeting reminder', 'guideMeetingEnd': 'Reminder created—try other commands', @@ -459,7 +508,8 @@ const Map trTR = { 'downloadingFiles': 'Downloading files...', 'downloadingFileProgress': 'Total {total} files, downloading file {current}', 'downloadComplete': 'Download complete', - 'downloadCompleteInfo': 'Download complete, {count} files in total, returning automatically in 2 seconds', + 'downloadCompleteInfo': + 'Download complete, {count} files in total, returning automatically in 2 seconds', // Meeting模块 - 录音功能 'startRecording': 'Start Recording', @@ -468,15 +518,20 @@ const Map trTR = { 'callRecording': 'Call Recording', 'importAudio': 'Import Audio', 'meetingRecordExitTitle': 'Kayıttan Çık', // 退出录音 - 'meetingRecordExitMessage': 'Lütfen ayrıldıktan sonra bir işlem seçin', // 请选择离开后的操作 + 'meetingRecordExitMessage': + 'Lütfen ayrıldıktan sonra bir işlem seçin', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Bitir ve Kaydet', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Kaydetmeden Bitir', // 结束录音不保存 'meetingRecordContinueInBackground': 'Arka planda kayda devam et', // 后台继续录音 - 'meetingRecordStopTimeout': 'Kayıt durdurma zaman aşımı, lütfen tekrar deneyin', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'Kayıt durdurulamadı, lütfen tekrar deneyin', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'Kayıt kaydedilemedi, lütfen tekrar deneyin', // 保存录音失败,请重试 + 'meetingRecordStopTimeout': + 'Kayıt durdurma zaman aşımı, lütfen tekrar deneyin', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'Kayıt durdurulamadı, lütfen tekrar deneyin', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'Kayıt kaydedilemedi, lütfen tekrar deneyin', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'Kayıt yapılıyor', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Arka planda kaydediliyor, uygulamaya dönmek için dokunun', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'Arka planda kaydediliyor, uygulamaya dönmek için dokunun', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Yüzen Pencere İzni', // 悬浮窗权限 'overlayPermissionTranslationDesc': 'Aramalar sırasında veya ses/video çevirisi yaparken çeviri sonuçlarını göstermek için diğer uygulamaların üzerine çizme iznine ihtiyacımız var. Bu sayede diğer uygulamaları kullanırken gerçek zamanlı çevirileri görebilirsiniz.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 @@ -508,27 +563,29 @@ const Map trTR = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Oluştur', - 'templateDetails': 'Şablon Detayları', - 'tag': 'Etiket', - 'description': 'Açıklama', - 'template': 'Şablon', - 'deleteTemplate': 'Şablonu Sil', - 'deleteTemplateConfirm': 'Bu şablonu silmek istediğinizden emin misiniz?', - 'editTemplate': 'Şablonu Düzenle', - 'createTemplate': 'Şablon Oluştur', - 'name': 'Ad', - 'templateContentHint': 'Lütfen şablon içeriğini girin! İpucu: Girdiğiniz ad ve açıklamaya göre hızlıca şablon içeriği oluşturmak için yukarıdaki AI düğmesine tıklayın', - 'inputNameHint': 'Lütfen ad girin', - 'inputDescHint': 'Lütfen açıklama girin', - 'custom': 'Özel', - 'pleaseEnter': 'Lütfen girin', + 'create': 'Oluştur', + 'templateDetails': 'Şablon Detayları', + 'tag': 'Etiket', + 'description': 'Açıklama', + 'template': 'Şablon', + 'deleteTemplate': 'Şablonu Sil', + 'deleteTemplateConfirm': 'Bu şablonu silmek istediğinizden emin misiniz?', + 'editTemplate': 'Şablonu Düzenle', + 'createTemplate': 'Şablon Oluştur', + 'name': 'Ad', + 'templateContentHint': + 'Lütfen şablon içeriğini girin! İpucu: Girdiğiniz ad ve açıklamaya göre hızlıca şablon içeriği oluşturmak için yukarıdaki AI düğmesine tıklayın', + 'inputNameHint': 'Lütfen ad girin', + 'inputDescHint': 'Lütfen açıklama girin', + 'custom': 'Özel', + 'pleaseEnter': 'Lütfen girin', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', 'meetingGenerateNow': 'Generate Now', 'keyEventsAnalyzed': 'Analyzed {count} key events.', - 'aiAnalysisDesc': 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', + 'aiAnalysisDesc': + 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', // Meeting模块 - 文件操作 'importing': 'Importing...', @@ -544,7 +601,7 @@ const Map trTR = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Zihin Haritasını Kaydet', + 'saveMindMap': 'Zihin Haritasını Kaydet', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -566,16 +623,18 @@ const Map trTR = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Dışa Aktar', + 'export': 'Dışa Aktar', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Bu konuşmacının tüm paragraflarına uygula', - 'summaryWillBeUpdatedAutomatically': 'Özet, şablona göre otomatik olarak güncellenecektir', + 'summaryWillBeUpdatedAutomatically': + 'Özet, şablona göre otomatik olarak güncellenecektir', 'nameCurrentSpeaker': 'Name Current Speaker', 'recentlyUsedNames': 'Recently Used Names', 'applyToCurrentParagraph': 'Apply to Current Paragraph', 'totalTime': 'Total Time', - 'summarySpeakerWillBeUpdatedAutomatically': 'Summary speakers will be updated automatically', + 'summarySpeakerWillBeUpdatedAutomatically': + 'Summary speakers will be updated automatically', // Meeting模块 - 云端同步 'syncToCloud': 'Sync to Cloud', @@ -618,38 +677,52 @@ const Map trTR = { 'audioImport': 'Audio Import', 'multipleExportFormats': 'Multiple Export Formats', 'professionalSummaryTemplates': 'Professional Summary Templates', - 'professionalTemplateDesc': 'Professional template design to improve your work efficiency. Customized according to industry needs.', - 'customTemplateDesc': 'You can customize summary prompts according to your needs and use them to generate the required summaries.', - 'askAiDesc': 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', - 'visualMindMapDesc': 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', - 'templateCommunityDesc': 'Discover, share, and get inspiration from the template library created by users.', - 'speakerIdentificationDesc': 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', - 'privateCloudSyncDesc': 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', - 'aiVoiceEnhancementDesc': 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', - 'audioImportDesc': 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', - 'multipleExportFormatsDesc': 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', + 'professionalTemplateDesc': + 'Professional template design to improve your work efficiency. Customized according to industry needs.', + 'customTemplateDesc': + 'You can customize summary prompts according to your needs and use them to generate the required summaries.', + 'askAiDesc': + 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', + 'visualMindMapDesc': + 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', + 'templateCommunityDesc': + 'Discover, share, and get inspiration from the template library created by users.', + 'speakerIdentificationDesc': + 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', + 'privateCloudSyncDesc': + 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', + 'aiVoiceEnhancementDesc': + 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', + 'audioImportDesc': + 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', + 'multipleExportFormatsDesc': + 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', 'upgradeMembership': 'Upgrade Your Membership', 'yearlySubscription': 'Yearly Subscription', 'monthlySubscription': 'Monthly Subscription', 'proMonthly': 'Pro ¥60/month', - 'proMonthlyDesc': '7-day free trial, then ¥800/year. Cancel anytime before trial ends.', + 'proMonthlyDesc': + '7-day free trial, then ¥800/year. Cancel anytime before trial ends.', 'sevenDayTrial': '7-day Free Trial', 'unlimitedMonthly': 'Unlimited ¥120/month', - 'unlimitedMonthlyDesc': '7-day free trial, then ¥1600/year. Cancel anytime before trial ends.', + 'unlimitedMonthlyDesc': + '7-day free trial, then ¥1600/year. Cancel anytime before trial ends.', 'trialNote': '*Free trial for 7 days, then charged annually, cancel anytime.', 'proPrice': 'Pro ¥120', 'proMonthlyPrice': '¥120/month', 'subscribe': 'Subscribe', 'unlimitedPrice': 'Unlimited ¥198', 'unlimitedMonthlyPrice': '¥198/month', - 'upgradeNote': '*After upgrading subscription, the remaining days of the original subscription will be automatically calculated and refunded to your payment account', + 'upgradeNote': + '*After upgrading subscription, the remaining days of the original subscription will be automatically calculated and refunded to your payment account', 'buyMoreTranscriptionTime': 'Buy More Transcription Time', 'sixThousandMinutes': '6,000 minutes', 'threeThousandMinutes': '3,000 minutes', 'sixHundredMinutes': '600 minutes', 'oneHundredTwentyMinutes': '120 minutes', 'validityPeriod': '*Validity Period: ', - 'validityNote': 'Activated immediately after purchase, valid for 2 years after activation.', + 'validityNote': + 'Activated immediately after purchase, valid for 2 years after activation.', 'purchase': 'Purchase', // Meeting模块 - 录音语言 @@ -660,18 +733,19 @@ const Map trTR = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Analiz başarısız oldu, lütfen daha sonra tekrar deneyin', - 'transcriptionFailed': 'Transkripsiyon başarısız oldu, lütfen daha sonra tekrar deneyin', - 'summaryFailed': 'Özet başarısız oldu, lütfen daha sonra tekrar deneyin', - 'summaryFailedShort': 'Özet başarısız', - 'transcriptionFailedShort': 'Transkripsiyon başarısız', + 'analysisFailed': 'Analiz başarısız oldu, lütfen daha sonra tekrar deneyin', + 'transcriptionFailed': + 'Transkripsiyon başarısız oldu, lütfen daha sonra tekrar deneyin', + 'summaryFailed': 'Özet başarısız oldu, lütfen daha sonra tekrar deneyin', + 'summaryFailedShort': 'Özet başarısız', + 'transcriptionFailedShort': 'Transkripsiyon başarısız', // Meeting模块 - 播放器 - 'playerNotReady': 'Ses oynatıcı hazır değil, lütfen bekleyin', - 'playFailed': 'Oynatma başarısız', - 'audioFileNotFound': 'Ses dosyası bulunamadı', - 'fetchingAudio': 'Buluttan ses alınıyor...', - 'playerLoadFailed': 'Ses oynatıcı yüklenemedi', + 'playerNotReady': 'Ses oynatıcı hazır değil, lütfen bekleyin', + 'playFailed': 'Oynatma başarısız', + 'audioFileNotFound': 'Ses dosyası bulunamadı', + 'fetchingAudio': 'Buluttan ses alınıyor...', + 'playerLoadFailed': 'Ses oynatıcı yüklenemedi', // 设置页 "systemSettings": "Sistem Ayarları", @@ -682,13 +756,15 @@ const Map trTR = { "cloudSync": "Bulut Sincronizasyonu", "memberService": "Member Service", "bindRewardTitle": "Rewards", - "bindRewardSimpleDesc": "First bind device reward has been issued. Tap OK to close.", + "bindRewardSimpleDesc": + "First bind device reward has been issued. Tap OK to close.", "joinDevice": "Bağlı cihaz:", "accountId": "Hesap Kimliği:", "systemSetting": "Sistem Ayarları", "languageSetting": "Dil Ayarları", "darkMode": "Karanlık Mod", - "darkModeInfo": "Uygulamanın aydınlık ve karanlık temaları arasında geçiş yapın", + "darkModeInfo": + "Uygulamanın aydınlık ve karanlık temaları arasında geçiş yapın", "backups": "Yedekle ve Geri Yükle", "backupsInfo": "Ayarları ve yapay zeka etkileşim geçmişini yedekleyin", "lastBackup": "Son yedekleme:", @@ -704,9 +780,11 @@ const Map trTR = { "voiceServiceInfo": "Ses tanıma ve sentezleme hizmetini seçin", "selectVoiceService": "Ses Hizmeti Seç", "azureVoiceService": "Azure Ses Hizmeti", - "azureVoiceServiceInfo": "Yüksek kaliteli ses sentezi ve tanımayı destekleyen Microsoft bulut ses hizmeti", + "azureVoiceServiceInfo": + "Yüksek kaliteli ses sentezi ve tanımayı destekleyen Microsoft bulut ses hizmeti", "flutterVoiceService": "Flutter Yerel Ses Hizmeti", - "flutterVoiceServiceInfo": "Cihazın yerel ses hizmeti, internet bağlantısı olmadan kullanılabilir", + "flutterVoiceServiceInfo": + "Cihazın yerel ses hizmeti, internet bağlantısı olmadan kullanılabilir", 'timbreService': 'Ses Tonu Hizmeti', 'timbreServiceInfo': 'Ses sentezi için ses tonu hizmeti seçin', 'defaultTimbre': 'Varsayılan Ses Tonu', @@ -717,14 +795,16 @@ const Map trTR = { 'pleaseRead': 'Lütfen Yüksek Sesle Okuyun', 'completeRecording': 'Kaydı Tamamla', "firmwareUpgrade": "Donanım Yazılımı Güncellemesi", - "bleHeadsetFirmwareUpgrade": "BLE Kulaklık Donanım Yazılımı Sürüm Güncellemesi", + "bleHeadsetFirmwareUpgrade": + "BLE Kulaklık Donanım Yazılımı Sürüm Güncellemesi", "deviceManagement": "Cihaz Yönetimi", "manageConnectedDevices": "Bağlı Bluetooth cihazlarını yönetin", 'currentLatestVersion': 'Şu anda en son sürümdesiniz {version}', 'checkUpdateFailed': 'Güncellemeler kontrol edilemedi', 'networkErrorRetry': 'Ağ hatası, lütfen daha sonra tekrar deneyin', "realtimeVoiceChat": "Gerçek Zamanlı Sesli Sohbet", - "realtimeVoiceChatInfo": "Akıllı sesli etkileşim özelliğini deneyimleyin (Özellik Önizlemesi)", + "realtimeVoiceChatInfo": + "Akıllı sesli etkileşim özelliğini deneyimleyin (Özellik Önizlemesi)", "loading": "Yükleniyor...", // 设备管理模块 @@ -772,7 +852,8 @@ const Map trTR = { "swipeUpForMore": "Daha fazlası için yukarı kaydırın", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Etkinleştirildiğinde: AI konuşurken sesiniz tarafından kesintiye uğramaz ve aynı anda yalnızca bir konuşma turunu işleyebilir. Yeni bir tur başlatmak için uyandırma kelimesini söyleyin.', + 'voice_interrupt_tip': + 'Etkinleştirildiğinde: AI konuşurken sesiniz tarafından kesintiye uğramaz ve aynı anda yalnızca bir konuşma turunu işleyebilir. Yeni bir tur başlatmak için uyandırma kelimesini söyleyin.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -795,10 +876,14 @@ const Map trTR = { '• 控制耳机功能\n\n' '有什么我可以帮你的吗?', 'microphonePermission': 'Mikrofon', - 'voiceRecognitionPermissionText': 'Ses tanıma özelliği mikrofon erişimi gerektirir.', - 'voiceTranslationPermissionText': 'Ses tanıma ve çeviri özelliği mikrofon erişimi gerektirir.', - 'phoneCallPermissionText': 'Arama yapma özelliği sesli aramalar için mikrofon erişimi gerektirir.', - 'permissionDeniedText': 'Mikrofon iznini kalıcı olarak reddettiniz, lütfen sistem ayarlarından izni etkinleştirin.', + 'voiceRecognitionPermissionText': + 'Ses tanıma özelliği mikrofon erişimi gerektirir.', + 'voiceTranslationPermissionText': + 'Ses tanıma ve çeviri özelliği mikrofon erişimi gerektirir.', + 'phoneCallPermissionText': + 'Arama yapma özelliği sesli aramalar için mikrofon erişimi gerektirir.', + 'permissionDeniedText': + 'Mikrofon iznini kalıcı olarak reddettiniz, lütfen sistem ayarlarından izni etkinleştirin.', 'startVoiceInput': 'Sesli girişi başlat', 'startPhoneCallMode': 'Arama modunu başlat, sesli girişi başlat', @@ -820,9 +905,17 @@ const Map trTR = { 'privacyRelated': 'Gizlilikle İlgili', 'copyrightViolation': 'Telif hakkımı, itibarımı vb. ihlal ediyor', 'other': 'Diğer', - 'reportDescriptionHint': 'Şikayet nedeninizi öğrenmek istiyoruz, karşılaştığınız sorunu açıklayabilirsiniz.', + 'reportDescriptionHint': + 'Şikayet nedeninizi öğrenmek istiyoruz, karşılaştığınız sorunu açıklayabilirsiniz.', 'generatedByAi': 'Yapay Zeka tarafından oluşturuldu', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'İşte bazı önerilen müzikler:', 'playList': 'Çalma Listesi', @@ -843,20 +936,52 @@ const Map trTR = { "bicycling": "Bisiklet", "tsransit": "Toplu Taşıma", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Failed to start navigation', + 'cannotPlayMusicListRetryLater': + 'Cannot play music list, please try again later', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Error opening map', + 'pleaseInstallAmapApp': 'Please install the Amap app first', + 'pleaseInstallBaiduMapApp': 'Please install the Baidu Maps app first', + 'appleMapStartFailed': 'Apple Maps failed to start', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Error opening Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Hava durumu sorgulanıyor:', 'highest': 'En Yüksek', 'lowest': 'En Düşük', 'futureForecast': 'Gelecek Tahmini', - 'hotWeatherTip': 'Bugün hava sıcak, lütfen serin kalmaya ve güneş çarpmasını önlemek için bol su içmeye dikkat edin', - 'coldWeatherTip': 'Bugün hava soğuk, dışarı çıkarken üşütmemek için sıkı giyinin', - 'rainyWeatherTip': 'Bugün yağmurlu, dışarı çıkarken şemsiye alın ve dikkatli olun', - 'snowyWeatherTip': 'Bugün karlı, yollar kaygan, lütfen dikkatli olun ve sıcak kalmak için önlem alın', - 'foggyWeatherTip': 'Bugün sisli, görüş mesafesi düşük, dışarı çıkarken maske takın', - 'windyWeatherTip': 'Bugün rüzgarlı, dışarı çıkarken dikkatli olun ve eşyalarınızı sabitleyin', - 'sunnyWeatherTip': 'Bugün güneşli ve UV ışınları güçlü, dışarı çıkarken güneş kremi kullanın', - 'temperatureDifferenceTip': 'Bugün gece ile gündüz arasında büyük sıcaklık farkı var, giysilerinizi buna göre ayarlayın', - 'comfortableWeatherTip': 'Bugün hava güzel, dışarıda vakit geçirmek için harika bir zaman', + 'hotWeatherTip': + 'Bugün hava sıcak, lütfen serin kalmaya ve güneş çarpmasını önlemek için bol su içmeye dikkat edin', + 'coldWeatherTip': + 'Bugün hava soğuk, dışarı çıkarken üşütmemek için sıkı giyinin', + 'rainyWeatherTip': + 'Bugün yağmurlu, dışarı çıkarken şemsiye alın ve dikkatli olun', + 'snowyWeatherTip': + 'Bugün karlı, yollar kaygan, lütfen dikkatli olun ve sıcak kalmak için önlem alın', + 'foggyWeatherTip': + 'Bugün sisli, görüş mesafesi düşük, dışarı çıkarken maske takın', + 'windyWeatherTip': + 'Bugün rüzgarlı, dışarı çıkarken dikkatli olun ve eşyalarınızı sabitleyin', + 'sunnyWeatherTip': + 'Bugün güneşli ve UV ışınları güçlü, dışarı çıkarken güneş kremi kullanın', + 'temperatureDifferenceTip': + 'Bugün gece ile gündüz arasında büyük sıcaklık farkı var, giysilerinizi buna göre ayarlayın', + 'comfortableWeatherTip': + 'Bugün hava güzel, dışarıda vakit geçirmek için harika bir zaman', "monday": "Pzt", "tuesday": "Sal", "wednesday": "Çar", @@ -900,13 +1025,25 @@ const Map trTR = { "selectTargetLanguage": "Hedef Dil Seç", "me": "Me", "counterPart": "Counterpart", - "bluetoothCallStateError": "Please make sure the Bluetooth headset is connected to the phone and in a call state", + "bluetoothCallStateError": + "Please make sure the Bluetooth headset is connected to the phone and in a call state", "autoDetect": "Auto Detect", // 自动检测 + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Disable Floating Window', + 'enableFloatingWindow': 'Enable Floating Window', + 'permissionTip': 'Permission Tip', + 'micPermissionRequiredForRecording': + 'Microphone permission is required for recording', + 'deleteTranslationRecordError': 'Error deleting translation record: @error', + // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", "translationFailed": "Translation failed", + "translating": "Translating", + "translate": "Translate", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Lütfen çevrilecek metni girin", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -914,10 +1051,12 @@ const Map trTR = { "historyRecords": "History Records", "clearResults": "Clear Results", "clearHistory": "Geçmişi Temizle", - "clearHistoryConfirm": "Tüm çeviri geçmişini temizlemek istediğinizden emin misiniz? Bu işlem geri alınamaz.", + "clearHistoryConfirm": + "Tüm çeviri geçmişini temizlemek istediğinizden emin misiniz? Bu işlem geri alınamaz.", "unknownLanguage": "Bilinmeyen Dil", "deleteSessionRecord": "Oturum Kaydını Sil", - "deleteSessionConfirm": "Bu oturumun tüm çeviri kayıtlarını silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.", + "deleteSessionConfirm": + "Bu oturumun tüm çeviri kayıtlarını silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.", // 翻译模块 - 图片翻译 "selectImageSource": "Select Image Source", @@ -949,15 +1088,20 @@ const Map trTR = { "translationCompleted": "Translation Completed", "allStepsCompleted": "All steps completed", "processingFailed": "Processing Failed", - "imageProcessingOrTranslationFailed": "Image processing or translation failed. Please retry.\nError: {error}", + "imageProcessingOrTranslationFailed": + "Image processing or translation failed. Please retry.\nError: {error}", "imageTooLarge": "Image size exceeds 4MB limit", - "imageTooLargeHint": "Image size exceeds 4MB. Reduce quality or dimensions and retry", + "imageTooLargeHint": + "Image size exceeds 4MB. Reduce quality or dimensions and retry", "emptyTranslationResult": "Image translation API returned empty result", - "imageTranslationFailedTryLater": "Image translation failed. Network issue or rate limit. Please try later", - "imageTranslationApiException": "Image translation API exception. Check network and retry", + "imageTranslationFailedTryLater": + "Image translation failed. Network issue or rate limit. Please try later", + "imageTranslationApiException": + "Image translation API exception. Check network and retry", "permissionRequired": "Permission Required", "cameraPermissionRequired": "Camera permission required to take photos", - "photoAlbumPermissionRequired": "Photo album permission required to pick images", + "photoAlbumPermissionRequired": + "Photo album permission required to pick images", "translationDetails": "Translation Details", "originalImage": "Original Image", "sourceLanguage": "Source Language", @@ -980,7 +1124,8 @@ const Map trTR = { // 翻译模块 - 翻译详情 "originalRecord": "Orijinal Kayıt", "recordSummary": "Kayıt Özeti", - "clickToGenerateSummary": "Oturum özeti oluşturmak için aşağıdaki düğmeye tıklayın", + "clickToGenerateSummary": + "Oturum özeti oluşturmak için aşağıdaki düğmeye tıklayın", "summaryContent": "Özet İçeriği", "copied": "Kopyalandı", "summaryCopiledToClipboard": "Özet panoya kopyalandı", @@ -988,9 +1133,11 @@ const Map trTR = { "summaryGenerated": "Özet oluşturuldu", "generating": "Oluşturuluyor...", "regenerate": "Yeniden Oluştur", - "summaryTimeoutMessage": "Özet oluşturma isteği zaman aşımına uğradı. Ağ sorunları veya sunucu yoğunluğu olabilir.", + "summaryTimeoutMessage": + "Özet oluşturma isteği zaman aşımına uğradı. Ağ sorunları veya sunucu yoğunluğu olabilir.", "deleteTranslationRecord": "Çeviri Kaydını Sil", - "deleteTranslationConfirm": "Bu çeviri kaydını silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.", + "deleteTranslationConfirm": + "Bu çeviri kaydını silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.", "originalText": "Orijinal Metin", "translatedText": "Çevrilmiş Metin", "sessionSummary": "Oturum Özeti", @@ -1010,20 +1157,26 @@ const Map trTR = { "logout": "Çıkış Yap", "logoutTips": "Mevcut hesaptan çıkmak istediğinizden emin misiniz?", 'deleteAccount': 'Hesabı Sil', - 'deleteAccountTips': 'Hesabınızı kalıcı olarak silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.', + 'deleteAccountTips': + 'Hesabınızı kalıcı olarak silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.', 'clean': 'Clear Cache', 'cleanTips': 'Are you sure you want to clear personal cache?', - 'networkConnectionFailed': 'Ağ bağlantısı başarısız, lütfen ağ ayarlarını kontrol edip tekrar deneyin', - 'serverTemporarilyUnavailable': 'Sunucu geçici olarak yanıt vermiyor, lütfen daha sonra tekrar deneyin', + 'networkConnectionFailed': + 'Ağ bağlantısı başarısız, lütfen ağ ayarlarını kontrol edip tekrar deneyin', + 'serverTemporarilyUnavailable': + 'Sunucu geçici olarak yanıt vermiyor, lütfen daha sonra tekrar deneyin', 'loginExpiredPleaseRelogin': 'Oturum süresi doldu, lütfen tekrar giriş yapın', 'noPermissionForThisOperation': 'Bu işlemi gerçekleştirmek için izniniz yok', 'requestedResourceNotFound': 'İstenen kaynak bulunamadı', - 'imageProcessingFailedPleaseReselect': 'Resim işlenemedi, lütfen resmi yeniden seçin', + 'imageProcessingFailedPleaseReselect': + 'Resim işlenemedi, lütfen resmi yeniden seçin', 'operationFailedPleaseRetry': 'İşlem başarısız, lütfen tekrar deneyin', 'serverReturnedError': 'Sunucu bir hata döndürdü', 'serverError': 'Sunucu Hatası', - 'networkConnectionFailedCheckSettings': 'Ağ bağlantısı başarısız, lütfen ağ ayarlarını kontrol edin', - 'serverInternalErrorRetryLater': 'Sunucu iç hatası, lütfen daha sonra tekrar deneyin', + 'networkConnectionFailedCheckSettings': + 'Ağ bağlantısı başarısız, lütfen ağ ayarlarını kontrol edin', + 'serverInternalErrorRetryLater': + 'Sunucu iç hatası, lütfen daha sonra tekrar deneyin', 'imageCompressionFailed': 'Resim sıkıştırılamadı', 'avatarUpdateFailed': 'Avatar güncellenemedi', 'usernameCannotBeEmpty': 'Kullanıcı adı boş olamaz', @@ -1036,17 +1189,23 @@ const Map trTR = { 'deleteAccountFailedRetry': 'Hesap silinemedi, lütfen tekrar deneyin', 'clearUserDataFailed': 'Kullanıcı verileri temizlenemedi', // 清理用户数据失败 'deleteUserDataFailed': 'Kullanıcı verileri silinemedi', // 删除用户数据失败 - 'thirdPartyLogoutSuccess': 'Üçüncü taraf oturumu başarıyla kapatıldı', // 第三方登录退出成功 + 'thirdPartyLogoutSuccess': + 'Üçüncü taraf oturumu başarıyla kapatıldı', // 第三方登录退出成功 'thirdPartyLogoutFailed': 'Üçüncü taraf oturumu kapatılamadı', // 第三方登录退出失败 - 'signOutProcessError': 'Oturum kapatma işlemi sırasında bir hata oluştu', // 登出过程发生错误 - 'deleteAccountProcessError': 'Hesap silme işlemi sırasında bir hata oluştu', // 删除账号过程发生错误 + 'signOutProcessError': + 'Oturum kapatma işlemi sırasında bir hata oluştu', // 登出过程发生错误 + 'deleteAccountProcessError': + 'Hesap silme işlemi sırasında bir hata oluştu', // 删除账号过程发生错误 'userDataClearSuccess': 'Kullanıcı verileri başarıyla temizlendi', // 用户数据清理成功 - 'allUserDataClearSuccess': 'Tüm kullanıcı verileri başarıyla temizlendi', // 所有用户数据清理成功 - 'accountServiceInitialized': 'Hesap Hizmeti başlatıldı', // AccountService 已初始化 + 'allUserDataClearSuccess': + 'Tüm kullanıcı verileri başarıyla temizlendi', // 所有用户数据清理成功 + 'accountServiceInitialized': + 'Hesap Hizmeti başlatıldı', // AccountService 已初始化 // 权限模块 'meetingStoragePermission': 'Storage', - 'meetingStoragePermissionExplanation': 'We need access to storage permissions so you can select and upload audio files.', + 'meetingStoragePermissionExplanation': + 'We need access to storage permissions so you can select and upload audio files.', 'meetingStoragePermissionPermanentDenial': '检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。', 'getPermissionStatusFailed': 'İzin durumu alınamadı', @@ -1068,9 +1227,12 @@ const Map trTR = { 'locationInfo': 'Konum Bilgisi', 'phonePermissionDesc': 'Telefon arama özelliği için kullanılır', 'smsPermissionDesc': 'SMS gönderme özelliği için kullanılır', - 'alarmPermissionDesc': 'Used to set exact alarms to ensure reminders trigger on time', - 'calendarWritePermissionDesc': 'Takvim etkinlikleri ve hatırlatıcılar oluşturmak için kullanılır', - 'calendarFullAccessPermissionDesc': 'Takvim etkinliklerini ve hatırlatıcıları okumak ve yönetmek için kullanılır', + 'alarmPermissionDesc': + 'Used to set exact alarms to ensure reminders trigger on time', + 'calendarWritePermissionDesc': + 'Takvim etkinlikleri ve hatırlatıcılar oluşturmak için kullanılır', + 'calendarFullAccessPermissionDesc': + 'Takvim etkinliklerini ve hatırlatıcıları okumak ve yönetmek için kullanılır', 'locationPermissionDesc': 'Mevcut konum bilgisini almak için kullanılır', 'appFunctionNeeds': 'Uygulama özelliğinin ihtiyacı var', 'authorized': 'Yetkilendirildi', @@ -1082,40 +1244,63 @@ const Map trTR = { 'permissionRequestError': 'İzin istenirken hata oluştu', 'phonePermissionDetailDesc': 'Arama özelliği telefon izni gerektirir', 'smsPermissionDetailDesc': 'SMS gönderme özelliği SMS izni gerektirir', - 'alarmPermissionDetailDesc': 'This permission is required to set exact alarms and ensure reminders trigger on time', - 'calendarWritePermissionDetailDesc': 'Takvim etkinliği oluşturma takvime yazma izni gerektirir', - 'calendarFullAccessPermissionDetailDesc': 'Takvim etkinliklerini yönetme tam takvim erişimi gerektirir', + 'alarmPermissionDetailDesc': + 'This permission is required to set exact alarms and ensure reminders trigger on time', + 'calendarWritePermissionDetailDesc': + 'Takvim etkinliği oluşturma takvime yazma izni gerektirir', + 'calendarFullAccessPermissionDetailDesc': + 'Takvim etkinliklerini yönetme tam takvim erişimi gerektirir', 'locationPermissionDetailDesc': 'Konum bilgisi alma konum izni gerektirir', 'contactsPermissionDesc': 'Used for accessing contact information', - 'contactsPermissionDetailDesc': 'Phone call and SMS functionality requires contacts permission to select contacts', - 'bluetoothPermissionDesc': 'Used for connecting and managing Bluetooth devices', - 'bluetoothPermissionDetailDesc': 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', + 'contactsPermissionDetailDesc': + 'Phone call and SMS functionality requires contacts permission to select contacts', + 'bluetoothPermissionDesc': + 'Used for connecting and managing Bluetooth devices', + 'bluetoothPermissionDetailDesc': + 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', 'bluetoothScanPermissionDesc': 'Used for scanning nearby Bluetooth devices', - 'bluetoothScanPermissionDetailDesc': 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', + 'bluetoothScanPermissionDetailDesc': + 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', 'bluetoothConnectPermissionDesc': 'Used for connecting to Bluetooth devices', - 'bluetoothConnectPermissionDetailDesc': 'Connecting to Bluetooth devices requires Bluetooth connect permission', + 'bluetoothConnectPermissionDetailDesc': + 'Connecting to Bluetooth devices requires Bluetooth connect permission', 'notificationPermissionDesc': 'Used for sending notification messages', - 'notificationPermissionDetailDesc': 'App needs notification permission to send you important alerts and messages', - 'appNeedsPermissionForFullFunction': 'Uygulamanın tam işlevsellik için bu izne ihtiyacı var', - 'permanentDenialText': '{permission} iznini kalıcı olarak reddettiniz, lütfen etkinleştirmek için uygulama ayarlarına gidin', + 'notificationPermissionDetailDesc': + 'App needs notification permission to send you important alerts and messages', + 'appNeedsPermissionForFullFunction': + 'Uygulamanın tam işlevsellik için bu izne ihtiyacı var', + 'permanentDenialText': + '{permission} iznini kalıcı olarak reddettiniz, lütfen etkinleştirmek için uygulama ayarlarına gidin', 'goToSettings': 'Ayarlara Git', 'bluetoothScan': 'Bluetooth Scan', 'bluetoothConnect': 'Bluetooth Connect', - 'bluetoothScanExplanation': 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', - 'bluetoothConnectExplanation': 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', - 'locationForBluetoothExplanation': 'The app needs location permission to scan Bluetooth devices.', - 'bluetoothScanPermanentDenial': 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', - 'bluetoothConnectPermanentDenial': 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', - 'locationPermanentDenial': 'Location permission has been permanently denied, please go to settings to enable it manually.', + 'bluetoothScanExplanation': + 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', + 'bluetoothConnectExplanation': + 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', + 'locationForBluetoothExplanation': + 'The app needs location permission to scan Bluetooth devices.', + 'bluetoothScanPermanentDenial': + 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', + 'bluetoothConnectPermanentDenial': + 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', + 'locationPermanentDenial': + 'Location permission has been permanently denied, please go to settings to enable it manually.', 'notificationPermission': 'Notification', 'locationPermission': 'Location', - 'notificationPermissionExplanation': 'Notification permission is required to display music playback status.', - 'locationPermissionExplanation': 'Location permission is required to get current location.', - 'notificationPermissionPermanentDenial': 'You have permanently denied notification permission, please go to settings to enable it.', - 'locationPermissionPermanentDenial': 'You have permanently denied location permission, please go to settings to enable it.', + 'notificationPermissionExplanation': + 'Notification permission is required to display music playback status.', + 'locationPermissionExplanation': + 'Location permission is required to get current location.', + 'notificationPermissionPermanentDenial': + 'You have permanently denied notification permission, please go to settings to enable it.', + 'locationPermissionPermanentDenial': + 'You have permanently denied location permission, please go to settings to enable it.', 'storagePermission': 'Storage', - 'microphonePermissionExplanation': 'We need microphone permission to record audio content.', - 'storagePermissionExplanation': 'We need storage permission so you can select and upload audio files.', + 'microphonePermissionExplanation': + 'We need microphone permission to record audio content.', + 'storagePermissionExplanation': + 'We need storage permission so you can select and upload audio files.', 'microphonePermissionPermanentDenial': '检测到您已永久拒绝录音权限。如需继续使用此功能,请前往应用设置中手动开启麦克风权限。', 'storagePermissionPermanentDenial': @@ -1123,21 +1308,24 @@ const Map trTR = { 'permissionUtilNeed': 'Need ', 'permissionUtilPermission': ' Permission', 'permissionUtilRestricted': ' Permission Restricted', - 'permissionUtilRestrictedMessage': 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', + 'permissionUtilRestrictedMessage': + 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Navigasyon devam ediyor', - 'native.notification.navigation.keepRunning': 'Navigasyon yapılıyor, uygulamayı açık tutun', - 'native.notification.bleAgent.running': 'Sesli asistan ajanı çalışıyor', - 'native.notification.audioRecording.recording': 'Ses kaydediliyor, uygulamaya dönmek için dokunun', - 'native.notification.music.waiting': 'Oynatma bekleniyor', - 'native.notification.music.previous': 'Önceki', - 'native.notification.music.next': 'Sonraki', - 'native.notification.music.play': 'Oynat', - 'native.notification.music.pause': 'Duraklat', - 'native.notification.qqMusic.playing': 'Müzik çalınıyor', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Navigasyon devam ediyor', + 'native.notification.navigation.keepRunning': + 'Navigasyon yapılıyor, uygulamayı açık tutun', + 'native.notification.bleAgent.running': 'Sesli asistan ajanı çalışıyor', + 'native.notification.audioRecording.recording': + 'Ses kaydediliyor, uygulamaya dönmek için dokunun', + 'native.notification.music.waiting': 'Oynatma bekleniyor', + 'native.notification.music.previous': 'Önceki', + 'native.notification.music.next': 'Sonraki', + 'native.notification.music.play': 'Oynat', + 'native.notification.music.pause': 'Duraklat', + 'native.notification.qqMusic.playing': 'Müzik çalınıyor', // 版本更新 'newVersionFound': 'Yeni Sürüm Bulundu', // 版本更新对话框标题 @@ -1145,8 +1333,10 @@ const Map trTR = { 'updateNow': 'Şimdi Güncelle', // 立即更新按钮 'checkUpdate': 'Güncellemeleri Kontrol Et', // 检查更新按钮 'updateFailed': 'Güncelleme Başarısız', // 更新失败提示 - 'cannotOpenAppStore': 'Uygulama mağazası açılamıyor, lütfen güncellemek için manuel olarak gidin', // 无法打开应用商店提示 - 'updateErrorRetry': 'Güncelleme sırasında bir hata oluştu, lütfen daha sonra tekrar deneyin', // 更新错误重试提示 + 'cannotOpenAppStore': + 'Uygulama mağazası açılamıyor, lütfen güncellemek için manuel olarak gidin', // 无法打开应用商店提示 + 'updateErrorRetry': + 'Güncelleme sırasında bir hata oluştu, lütfen daha sonra tekrar deneyin', // 更新错误重试提示 // 配对模块 "devicePairing": "Cihaz Eşleştirme", @@ -1164,23 +1354,29 @@ const Map trTR = { 'bluetooth': 'Bluetooth', "readyToPair": "Eşleştirmeye hazır", "preparingPairingEnvironment": "Eşleştirme ortamı hazırlanıyor...", - "connectDeepSoundViaSystemBluetooth": "Lütfen önce sistem Bluetooth'u üzerinden Voitrans cihazına bağlanın", + "connectDeepSoundViaSystemBluetooth": + "Lütfen önce sistem Bluetooth'u üzerinden Voitrans cihazına bağlanın", "deviceBindingConfirm": "Cihaz bağlama onayı...", "establishingDeviceAssociation": "Cihaz ilişkisi kuruluyor...", "waitingCompletePairing": "Lütfen bekleyin, eşleştirme tamamlanıyor...", - "pairingSuccessRedirecting": "Eşleştirme başarılı! Ana sayfaya yönlendiriliyor...", - "ensureConnectedDeepSoundDevice": "Lütfen bir Voitrans cihazına bağlı olduğunuzdan emin olun", + "pairingSuccessRedirecting": + "Eşleştirme başarılı! Ana sayfaya yönlendiriliyor...", + "ensureConnectedDeepSoundDevice": + "Lütfen bir Voitrans cihazına bağlı olduğunuzdan emin olun", "deviceAlreadyBoundToOtherAccount": "Bu cihaz başka bir hesaba zaten bağlı", "deviceAssociationFailed": "Cihaz ilişkisi kurulamadı, lütfen tekrar deneyin", - "scanTimeoutEnsureDeviceNearby": "Tarama zaman aşımına uğradı, lütfen cihazın yakında olduğundan emin olun", + "scanTimeoutEnsureDeviceNearby": + "Tarama zaman aşımına uğradı, lütfen cihazın yakında olduğundan emin olun", "networkError": "Ağ Hatası", - "authorizationFailedCheckCode": "Yetkilendirme başarısız, lütfen yetkilendirme kodunun doğru olup olmadığını kontrol edin", + "authorizationFailedCheckCode": + "Yetkilendirme başarısız, lütfen yetkilendirme kodunun doğru olup olmadığını kontrol edin", "pairingFailedRetry": "Eşleştirme başarısız, lütfen tekrar deneyin", 'pleaseEnableBluetooth': 'Lütfen Bluetooth\\', 'deviceDisconnected': 'Cihaz bağlantısı kesildi', 'readyToStartPairing': 'Eşleştirmeye başlamaya hazır', 'checkingEnvironment': 'Ortam kontrol ediliyor...', - 'ensureHeadsetOnAndPairingMode': 'Lütfen kulaklığın açık ve eşleştirme modunda olduğundan emin olun', + 'ensureHeadsetOnAndPairingMode': + 'Lütfen kulaklığın açık ve eşleştirme modunda olduğundan emin olun', 'establishingSecureConnection': 'Güvenli bağlantı kuruluyor...', 'needManualBindingAuthCode': 'Manuel bağlama yetkilendirme kodu gerekli...', 'pairingSuccessful': 'Eşleştirme başarılı!', @@ -1194,17 +1390,24 @@ const Map trTR = { 'verificationFailedRetry': 'Doğrulama başarısız, lütfen tekrar deneyin', 'invalidDeviceAddress': 'Geçersiz cihaz adresi', 'bleDeviceAssociationFailed': 'BLE cihaz ilişkisi kurulamadı', - 'deviceAssociationFailedRetry': 'Cihaz ilişkisi kurulamadı, lütfen tekrar deneyin', - 'bleConnectionTimeoutRetry': 'BLE bağlantısı zaman aşımına uğradı, lütfen tekrar deneyin', + 'deviceAssociationFailedRetry': + 'Cihaz ilişkisi kurulamadı, lütfen tekrar deneyin', + 'bleConnectionTimeoutRetry': + 'BLE bağlantısı zaman aşımına uğradı, lütfen tekrar deneyin', 'blePairingStartupFailed': 'BLE eşleştirmesi başlatılamadı', 'bleConnectionFailed': 'BLE bağlantısı başarısız', - 'deviceAuthorizationFailedCheckCode': 'Cihaz yetkilendirmesi başarısız, lütfen yetkilendirme kodunu kontrol edin', + 'deviceAuthorizationFailedCheckCode': + 'Cihaz yetkilendirmesi başarısız, lütfen yetkilendirme kodunu kontrol edin', 'bluetoothGuideTitle': 'Manual Bluetooth Activation Required', // 需要手动开启蓝牙 'bluetoothGuideSteps': 'Please follow these steps:', // 请按照以下步骤操作: - 'bluetoothGuideStep1': 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 - 'bluetoothGuideStep2': 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 - 'bluetoothGuideStep3': 'Return to app to continue pairing process', // 返回应用继续配对流程 - 'bluetoothGuideTip': 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 + 'bluetoothGuideStep1': + 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 + 'bluetoothGuideStep2': + 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 + 'bluetoothGuideStep3': + 'Return to app to continue pairing process', // 返回应用继续配对流程 + 'bluetoothGuideTip': + 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 'iKnow': 'I Know', // 我知道了 // 配对模块 - 绑定奖励 @@ -1221,17 +1424,21 @@ const Map trTR = { // 用户反馈模块 "feedback": "Kullanıcı Geri Bildirimi", 'feedbackInfo': 'Geri bildirim veya öneri sağlayın', - 'feedbackDescription': 'Lütfen karşılaştığınız sorunu veya önerinizi açıklayın', + 'feedbackDescription': + 'Lütfen karşılaştığınız sorunu veya önerinizi açıklayın', 'feedbackHint': 'Lütfen geri bildiriminizi girin...', 'feedbackRequired': 'Lütfen geri bildirim içeriğini girin', 'contactInfo': 'İletişim Bilgileri', 'contactHint': 'E-posta/Telefon, sizinle iletişime geçebilmemiz için', 'submit': 'Gönder', - 'feedbackSubmitSuccess': 'Geri bildirim başarıyla gönderildi, geri bildiriminiz için teşekkür ederiz!', - 'feedbackSubmitFailed': 'Geri bildirim gönderilemedi, lütfen daha sonra tekrar deneyin', + 'feedbackSubmitSuccess': + 'Geri bildirim başarıyla gönderildi, geri bildiriminiz için teşekkür ederiz!', + 'feedbackSubmitFailed': + 'Geri bildirim gönderilemedi, lütfen daha sonra tekrar deneyin', // OTA升级模块 - "upgradeExitConfirm": "Yükseltme devam ediyor. Çıkmak işlemi kesecektir, çıkmak istediğinizden emin misiniz?", + "upgradeExitConfirm": + "Yükseltme devam ediyor. Çıkmak işlemi kesecektir, çıkmak istediğinizden emin misiniz?", "deviceModel": "Cihaz Modeli", "unknownDevice": "Bilinmeyen Cihaz", "currentFirmwareVersion": "Mevcut Donanım Yazılımı Sürümü", @@ -1244,14 +1451,70 @@ const Map trTR = { "retryConnection": "Yeniden Dene", "ota_updateNow": "Şimdi Güncelle", "otaVersionInfoFailed": "Failed to get version info. Please try again later.", - "otaDeviceInfoUnavailable": "Unable to get device info. Please check the connection and retry.", - "otaProductInfoUnavailable": "Unable to identify the device. Please reconnect and retry.", - "otaFirmwareVersionInvalid": "Firmware version is abnormal. Please reconnect and retry.", - "keepConnectedDontClose": "Lütfen cihazı bağlı tutun ve uygulamayı kapatmayın", + "otaDeviceInfoUnavailable": + "Unable to get device info. Please check the connection and retry.", + "otaProductInfoUnavailable": + "Unable to identify the device. Please reconnect and retry.", + "otaFirmwareVersionInvalid": + "Firmware version is abnormal. Please reconnect and retry.", + "keepConnectedDontClose": + "Lütfen cihazı bağlı tutun ve uygulamayı kapatmayın", "doNotDisconnect": "Bağlantıyı kesmeyin", "charging": "Şarj oluyor", "updateContent": "Güncelleme İçeriği", - "removeEarbudsEnsureBattery": "Her iki kulaklığı da çıkarın ve pil seviyelerinin %20'un üzerinde olduğundan emin olun", + "removeEarbudsEnsureBattery": + "Her iki kulaklığı da çıkarın ve pil seviyelerinin %20'un üzerinde olduğundan emin olun", + + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Upgrade Successful', + 'otaUpgradeCompleteRepair': + 'Firmware upgrade complete!\n\nDevice needs to be re-paired to work properly. Go to pairing page now?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': + 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': + 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': + 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', // 音乐模块 "noMusic": "Müzik Yok", // 暂无音乐 diff --git a/lib/core/translations/language/uk_ua.dart b/lib/core/translations/language/uk_ua.dart index 10ae3405d..c68d436c5 100644 --- a/lib/core/translations/language/uk_ua.dart +++ b/lib/core/translations/language/uk_ua.dart @@ -1,5 +1,4 @@ const Map ukUA = { - // 通用 'continue': 'Продовжити', 'confirm': 'Підтвердити', @@ -19,11 +18,11 @@ const Map ukUA = { "unknownError": "Невідома помилка", "asrConnectionFailed": "Не вдалося підключитися до служби розпізнавання мовлення. Перевірте мережу або спробуйте пізніше ще раз.", - "justNow": "Just now", - "minutesAgo": "@minutes minutes ago", - "yesterday": "Yesterday", - "daysAgo": "@days days ago", - "hoursAgo": "@hours hours ago", + "justNow": "Щойно", + "minutesAgo": "@minutes хв тому", + "yesterday": "Вчора", + "daysAgo": "@days дн. тому", + "hoursAgo": "@hours год тому", // 启动页 "slogan": "З'єднуючи світ, більше ніж просто звук", @@ -80,7 +79,8 @@ const Map ukUA = { // 登录模块 "welcome": "Ласкаво просимо", - "loginTips": "Увійдіть або зареєструйтеся за допомогою номера телефону або електронної пошти", + "loginTips": + "Увійдіть або зареєструйтеся за допомогою номера телефону або електронної пошти", "accountNumber": "Номер телефону або Email", "verificationCode": "Код підтвердження", "getCode": "Отримати код", @@ -99,14 +99,16 @@ const Map ukUA = { "tip": "Підказка", "pleaseEnterCompleteCode": "Будь ласка, введіть повний код підтвердження", "loginFailed": "Помилка входу, спробуйте ще раз", - 'pleaseAcceptPrivacyPolicy': 'Будь ласка, спочатку прочитайте та погодьтеся з Політикою конфіденційності та Угодою користувача', + 'pleaseAcceptPrivacyPolicy': + 'Будь ласка, спочатку прочитайте та погодьтеся з Політикою конфіденційності та Угодою користувача', "enterVerificationCode": "Введіть код підтвердження", "verificationCodeSentTo": "Код підтвердження надіслано на", "resendVerificationCode": "Надіслати код ще раз", "login": "Увійти", "usePasswordLogin": "Увійти за паролем", "loginDeclaration": "Декларація Voitrans", // Voitrans 声明 - "welcomeToThisApp": "Ласкаво просимо до Voitrans, будь ласка, уважно прочитайте", // 欢迎使用Voitrans,请充分阅读 + "welcomeToThisApp": + "Ласкаво просимо до Voitrans, будь ласка, уважно прочитайте", // 欢迎使用Voitrans,请充分阅读 "privacyPolicyText": ",点击'同意并进入'表示您已充分阅读并同意上述协议。点击'不同意'将退出应用。", // ,点击"同意并进入"表示您已充分阅读并同意上述协议。点击"不同意"将退出应用。 "disagree": "Не погоджуватися", // 不同意 @@ -120,24 +122,29 @@ const Map ukUA = { "signal": "Сигнал", "deviceId": "ID пристрою", "firmwareVersion": "Версія прошивки", - "disconnectedDevice": "Пристрій не підключено, натисніть кнопку нижче, щоб підключити", + "disconnectedDevice": + "Пристрій не підключено, натисніть кнопку нижче, щоб підключити", "connectDevice": "Підключити пристрій", "topAiExperiences": "Найкращі враження від AI", "aiAssistant": "Всемогутній помічник AI", - "aiAssistantInfo": "Ексклюзивний консультант 24/7, відповідає на запитання, надає поради", + "aiAssistantInfo": + "Ексклюзивний консультант 24/7, відповідає на запитання, надає поради", "interpretation": "Синхронний переклад", - "simultaneousInterpretationInfo": "Переклад у реальному часі багатьма мовами, безтурботні подорожі за кордон", + "simultaneousInterpretationInfo": + "Переклад у реальному часі багатьма мовами, безтурботні подорожі за кордон", "aiCompanion": "Сімейний компаньйон", "aiCompanionInfo": "Розуміє вас, тепла компанія", "homeSlogan": "З'єднуючи світ, перевершуючи звук", - "turnEarphones": "Будь ласка, відкрийте зарядний кейс для навушників і вставте навушники у вуха", + "turnEarphones": + "Будь ласка, відкрийте зарядний кейс для навушників і вставте навушники у вуха", "currentlyConnected": "Наразі підключено:", "unsystemSetup": "Перейти до налаштувань системи", "talkLater": "Пізніше", "initializing": "Ініціалізація...", "bluetoothInitializationFailure": "Помилка ініціалізації служби Bluetooth", "checkingPermissions": "Перевірка дозволів...", - "lackPermissions": "Відсутні дозволи Bluetooth і необхідно дозволити доступ до місцезнаходження", + "lackPermissions": + "Відсутні дозволи Bluetooth і необхідно дозволити доступ до місцезнаходження", "searchingDevice": "Пошук пристроїв...", "findConnectedDevice": "Знайдено підключений пристрій", "notFound": "Не знайдено підключеного пристрою Bluetooth", @@ -161,6 +168,29 @@ const Map ukUA = { 'right': 'Право', 'checkConnectionStatusFailed': 'Не вдалося перевірити статус підключення', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Помилка ініціалізації Bluetooth: @error', + 'needBluetoothAndLocationPermission': + 'Для сканування пристроїв потрібні дозволи Bluetooth та місцезнаходження', + 'permissionRequestFailedWithError': 'Не вдалося запросити дозвіл: @error', + 'needPermission': 'Потрібен дозвіл', + 'blePermissionDialogContent': + 'Цей додаток потребує дозволів Bluetooth та місцезнаходження для сканування пристроїв. Увімкніть їх у Налаштуваннях.', + 'needEnableBluetooth': 'Увімкніть Bluetooth', + 'enableBluetoothDialogContent': + 'Будь ласка, увімкніть Bluetooth для сканування та підключення пристроїв.', + 'bleScanFailedWithError': 'Помилка сканування: @error', + 'bleConnectionSuccess': 'Підключення успішне', + 'bleConnectedToDevice': 'Підключено до @device', + 'bleConnectionFailedWithError': 'Помилка підключення: @error', + 'bleDisconnected': 'Відключено', + 'bleDeviceDisconnected': 'Пристрій відключено', + 'bleDisconnectFailedWithError': 'Помилка відключення: @error', + 'signalStrong': 'Сильний', + 'signalMedium': 'Середній', + 'signalWeak': 'Слабкий', + 'signalVeryWeak': 'Дуже слабкий', + // 发现页 "searchAi": "Пошук функцій AI...", "exploreSlogan": "Розумні навушники, безмежні можливості", @@ -180,53 +210,55 @@ const Map ukUA = { "healthConsultant": "Багатофункціональний чат AI", "healthConsultantInfo": "Надає більше функцій чату AI", "conferenceAssistant": "Помічник для ділових зустрічей", - "conferenceAssistantInfo": "Запис протоколів у реальному часі, багатомовний переклад", + "conferenceAssistantInfo": + "Запис протоколів у реальному часі, багатомовний переклад", "usageStats": "Статистика використання", "usageStatsInfo": "Перегляньте статистику використання вашого пристрою", "scene": "Сценарій", // 用量统计模块 - "aiChat": "AI Chat", - "translationStats": "Translation Statistics", - "meetingStats": "Meeting Statistics", - "today": "Today", - "thisWeek": "This Week", - "thisMonth": "This Month", - "history": "History", - "currentSessionStats": "Current Session Stats", - "translationCount": "Translation Count", - "sessionDuration": "Session Duration", - "characters": "Characters", - "recordingDuration": "Recording Duration", - "totalApiCalls": "Total API Calls", - "sessionCount": "Session Count", - "totalCharacters": "Total Characters", - "apiCallStats": "API Call Stats", - "translationApi": "Translation API", + "aiChat": "AI-чат", + "translationStats": "Статистика перекладів", + "meetingStats": "Статистика зустрічей", + "today": "Сьогодні", + "thisWeek": "Цей тиждень", + "thisMonth": "Цей місяць", + "history": "Історія", + "currentSessionStats": "Статистика поточної сесії", + "translationCount": "Кількість перекладів", + "sessionDuration": "Тривалість сесії", + "characters": "Символи", + "recordingDuration": "Тривалість запису", + "totalApiCalls": "Загальна кількість API-викликів", + "sessionCount": "Кількість сесій", + "totalCharacters": "Загальна кількість символів", + "apiCallStats": "Статистика API-викликів", + "translationApi": "API перекладу", "asr": "ASR", "tts": "TTS", - "dataVolumeStats": "Data Volume Stats", - "sourceTextCharacters": "Source Text Characters", - "ttsTextCharacters": "TTS Text Characters", - "effectiveAudioDuration": "Effective Audio Duration", - "totalSessionDuration": "Total Session Duration", - "costStats": "Cost Stats", - "estimatedCost": "Estimated Cost", - "dailyCostThreshold": "Daily Cost Threshold", - "monthlyCostThreshold": "Monthly Cost Threshold", - "usageBehaviorStats": "Usage Behavior Stats", - "mostUsedLanguagePair": "Most-used language pair", - "mostUsedMode": "Most-used mode", - "asrApiCalls": "ASR Calls", - "totalAudioDuration": "Total Audio Duration", - "audioFileSize": "Audio File Size", - "transcriptBytes": "Transcript Bytes", - "loadFailed": "Load Failed", - "statsLoadFailedTryLater": "Statistics failed to load. Please try again later.", - "cleanupComplete": "Cleanup Complete", - "cleanedOldData": "Cleaned data older than 90 days", - "exportFeature": "Export Feature", - "exportInDevelopment": "Data export is under development", + "dataVolumeStats": "Статистика обсягу даних", + "sourceTextCharacters": "Символи вихідного тексту", + "ttsTextCharacters": "Символи тексту TTS", + "effectiveAudioDuration": "Ефективна тривалість аудіо", + "totalSessionDuration": "Загальна тривалість сесій", + "costStats": "Статистика витрат", + "estimatedCost": "Орієнтовна вартість", + "dailyCostThreshold": "Денний ліміт витрат", + "monthlyCostThreshold": "Місячний ліміт витрат", + "usageBehaviorStats": "Статистика використання", + "mostUsedLanguagePair": "Найчастіша мовна пара", + "mostUsedMode": "Найчастіший режим", + "asrApiCalls": "Виклики ASR", + "totalAudioDuration": "Загальна тривалість аудіо", + "audioFileSize": "Розмір аудіофайлу", + "transcriptBytes": "Обсяг транскрипту", + "loadFailed": "Не вдалося завантажити", + "statsLoadFailedTryLater": + "Не вдалося завантажити статистику. Спробуйте пізніше.", + "cleanupComplete": "Очищення завершено", + "cleanedOldData": "Очищено дані старші за 90 днів", + "exportFeature": "Функція експорту", + "exportInDevelopment": "Експорт даних у розробці", // 商品模块 - 通用 'availablePackages': 'Available Packages', @@ -234,64 +266,70 @@ const Map ukUA = { 'totalQuota': 'Total Quota', 'remaining': 'Remaining', 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Оплата пройшла успішно', - 'paymentFailed': 'Оплата не вдалася', - 'gotIt': 'Зрозуміло', - 'paymentFailedTryAgain': 'Оплата не вдалася. Спробуйте ще раз.', - 'selectPaymentMethod': 'Виберіть спосіб оплати', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Не вдалося створити замовлення WeChat', - 'alipayOrderCreateFailed': 'Не вдалося створити замовлення Alipay', - 'appleOrderCreateFailed': 'Не вдалося створити замовлення Apple', - 'googleOrderCreateFailed': 'Не вдалося створити замовлення Google', - 'paypalOrderCreateFailed': 'Не вдалося створити замовлення PayPal', - 'paymentException': 'Помилка оплати', - 'paymentLaunchFailed': 'Не вдалося запустити оплату', - 'paymentExceptionWithError': 'Помилка оплати: @error', - 'paymentProcessingCheckLater': 'Ваше замовлення обробляється. Перевірте пізніше.', - 'paymentResultQueryException': 'Не вдалося отримати результат оплати: @error', - 'orderConfirmedQuotaRefreshed': 'Замовлення підтверджено. Вашу квоту оновлено.', - 'paymentCompletedConfirming': 'Оплата завершена. Підтвердження…', - 'paymentCancelled': 'Оплату скасовано', - 'paypalOpenedCompleteInBrowser': 'PayPal відкрито. Завершіть оплату в браузері.', - 'paypalOpenFailed': 'Не вдалося відкрити сторінку оплати PayPal', - 'paymentTestTitle': 'Тест оплати', - 'paymentTestOrderInfo': 'Інформація про тестове замовлення', - 'paymentTestProductId': 'ID товару', - 'paymentTestProductDescription': 'Опис товару', - 'paymentTestWechatDescription': 'Тест оплати через WeChat', - 'paymentTestAlipayDescription': 'Тест оплати через Alipay', - 'paymentTestAmount': 'Сума', - 'paymentTestSelectAmount': 'Виберіть тестову суму', - 'paying': 'Оплата...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Статус оплати', - 'errorInfoWithMessage': 'Помилка: @message', - 'retest': 'Повторний тест', - 'paymentTestInstructionsTitle': 'Інструкція', - 'paymentTestInstructionsContent': '1. Виберіть тестову суму (рекомендовано: ¥0.01)\n2. Натисніть кнопку оплати для початку\n3. Завершіть оплату в додатку для оплати\n4. Поверніться, щоб перевірити результат', - 'startingWechatPayment': 'Запуск WeChat Pay...', - 'startingAlipayPayment': 'Запуск Alipay...', - 'wechatPaymentSuccess': 'Оплата через WeChat Pay пройшла успішно!', - 'wechatPaymentFailed': 'Оплата через WeChat Pay не вдалася', - 'wechatPaymentLaunchFailed': 'Не вдалося запустити WeChat Pay', - 'cannotLaunchWechatPayment': 'Неможливо запустити WeChat Pay', - 'wechatPaymentException': 'Помилка WeChat Pay', - 'wechatPaymentTestCompleted': 'Тест оплати WeChat Pay завершено', - 'alipayPaymentSuccess': 'Оплата через Alipay пройшла успішно!', - 'alipayPaymentFailed': 'Оплата через Alipay не вдалася', - 'alipayPaymentLaunchFailed': 'Не вдалося запустити Alipay', - 'cannotLaunchAlipayPayment': 'Неможливо запустити Alipay', - 'alipayPaymentException': 'Помилка Alipay', + 'paymentSuccess': 'Оплата пройшла успішно', + 'paymentFailed': 'Оплата не вдалася', + 'gotIt': 'Зрозуміло', + 'paymentFailedTryAgain': 'Оплата не вдалася. Спробуйте ще раз.', + 'selectPaymentMethod': 'Виберіть спосіб оплати', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Не вдалося створити замовлення WeChat', + 'alipayOrderCreateFailed': 'Не вдалося створити замовлення Alipay', + 'appleOrderCreateFailed': 'Не вдалося створити замовлення Apple', + 'googleOrderCreateFailed': 'Не вдалося створити замовлення Google', + 'paypalOrderCreateFailed': 'Не вдалося створити замовлення PayPal', + 'paymentException': 'Помилка оплати', + 'paymentLaunchFailed': 'Не вдалося запустити оплату', + 'paymentExceptionWithError': 'Помилка оплати: @error', + 'paymentProcessingCheckLater': + 'Ваше замовлення обробляється. Перевірте пізніше.', + 'paymentResultQueryException': 'Не вдалося отримати результат оплати: @error', + 'orderConfirmedQuotaRefreshed': + 'Замовлення підтверджено. Вашу квоту оновлено.', + 'paymentCompletedConfirming': 'Оплата завершена. Підтвердження…', + 'paymentCancelled': 'Оплату скасовано', + 'paypalOpenedCompleteInBrowser': + 'PayPal відкрито. Завершіть оплату в браузері.', + 'paypalOpenFailed': 'Не вдалося відкрити сторінку оплати PayPal', + 'paymentTestTitle': 'Тест оплати', + 'paymentTestOrderInfo': 'Інформація про тестове замовлення', + 'paymentTestProductId': 'ID товару', + 'paymentTestProductDescription': 'Опис товару', + 'paymentTestWechatDescription': 'Тест оплати через WeChat', + 'paymentTestAlipayDescription': 'Тест оплати через Alipay', + 'paymentTestAmount': 'Сума', + 'paymentTestSelectAmount': 'Виберіть тестову суму', + 'paying': 'Оплата...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Статус оплати', + 'errorInfoWithMessage': 'Помилка: @message', + 'retest': 'Повторний тест', + 'paymentTestInstructionsTitle': 'Інструкція', + 'paymentTestInstructionsContent': + '1. Виберіть тестову суму (рекомендовано: ¥0.01)\n2. Натисніть кнопку оплати для початку\n3. Завершіть оплату в додатку для оплати\n4. Поверніться, щоб перевірити результат', + 'startingWechatPayment': 'Запуск WeChat Pay...', + 'startingAlipayPayment': 'Запуск Alipay...', + 'wechatPaymentSuccess': 'Оплата через WeChat Pay пройшла успішно!', + 'wechatPaymentFailed': 'Оплата через WeChat Pay не вдалася', + 'wechatPaymentLaunchFailed': 'Не вдалося запустити WeChat Pay', + 'cannotLaunchWechatPayment': 'Неможливо запустити WeChat Pay', + 'wechatPaymentException': 'Помилка WeChat Pay', + 'wechatPaymentTestCompleted': 'Тест оплати WeChat Pay завершено', + 'alipayPaymentSuccess': 'Оплата через Alipay пройшла успішно!', + 'alipayPaymentFailed': 'Оплата через Alipay не вдалася', + 'alipayPaymentLaunchFailed': 'Не вдалося запустити Alipay', + 'cannotLaunchAlipayPayment': 'Неможливо запустити Alipay', + 'alipayPaymentException': 'Помилка Alipay', "insufficientIntegral": "Insufficient integral", - "insufficientBalanceDesc": "Insufficient balance, please go to the corresponding recharge page to recharge.", + "insufficientBalanceDesc": + "Insufficient balance, please go to the corresponding recharge page to recharge.", "recharge": "Go to Recharge", - "aiMemberExpiredDesc": "AI membership expired, please go to the membership recharge page to renew.", + "aiMemberExpiredDesc": + "AI membership expired, please go to the membership recharge page to renew.", // 商品模块 - AI商品页 'musicAndRecommendation': 'Music & Recommendation', @@ -299,11 +337,15 @@ const Map ukUA = { 'nearbySearch': 'Nearby Search', 'newsInformation': 'News', 'communicationAssistant': 'Communication Assistant', - 'aiHeaderDesc1': 'Longer conversation quota, more tool calls, extended context length.', - 'aiHeaderDesc2': 'Suitable for agent Q&A, summarization, analysis, and task execution.', + 'aiHeaderDesc1': + 'Longer conversation quota, more tool calls, extended context length.', + 'aiHeaderDesc2': + 'Suitable for agent Q&A, summarization, analysis, and task execution.', 'musicSearchPlaybackControl': 'Music library search and playback control', - 'smartPlaylistAndSimilarRecommendations': 'Smart playlist and similar song recommendations', - 'routePlanningAndCongestionAvoidance': 'Route planning and congestion avoidance', + 'smartPlaylistAndSimilarRecommendations': + 'Smart playlist and similar song recommendations', + 'routePlanningAndCongestionAvoidance': + 'Route planning and congestion avoidance', 'voiceBroadcastAndWaypoints': 'Voice broadcast and waypoint settings', 'realTimeWeatherForecast': 'Real-time weather and forecast', 'clothingAdviceAndTravelReminders': 'Clothing advice and travel reminders', @@ -312,32 +354,39 @@ const Map ukUA = { 'hotNewsAndTopicOverview': 'Hot news and topic overview', 'longArticleSummariesAndKeyPoints': 'Long-article summaries and key points', 'helpCallAndSMS': 'Help with calls and SMS', - 'templatedMessagesAndScheduleReminders': 'Template messages and schedule reminders', - 'aiDisclaimer': 'Features depend on device permissions, service availability, and network conditions.', + 'templatedMessagesAndScheduleReminders': + 'Template messages and schedule reminders', + 'aiDisclaimer': + 'Features depend on device permissions, service availability, and network conditions.', // 商品模块 - 翻译商品页 'realtimeTranscription': 'Real-time Transcription', 'sceneLexicon': 'Scenario Glossary', 'subtitleDisplay': 'Subtitles', - 'transHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', + 'transHeaderDesc1': + 'Real-time simultaneous interpretation and text translation with low-latency voice.', 'transHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', 'translateZhEn': 'Chinese-English translation', 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', + 'termOptimizationContextPreserve': + 'Terminology optimization and context preservation', 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', 'personalVocabularyMemory': 'Personal vocabulary memory', 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', 'colorHighContrast': 'High color contrast', - 'transDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + 'transDisclaimer': + 'Translation performance depends on microphone, network latency, and ambient noise.', // 商品模块 - 会议商品页 'meetingRecording': 'Meeting Recording', 'transcriptionAndSummary': 'Transcription & Summary', 'keywordSearch': 'Keyword Search', 'collaborationSharing': 'Collaboration & Sharing', - 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', - 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', + 'meetingHeaderDesc1': + 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', + 'meetingHeaderDesc2': + 'Suitable for business meetings, class notes, and interview minutes.', 'meetingAutoRecording': 'Auto recording and segmentation', 'meetingSpeakerTagging': 'Speaker labeling', 'meetingLongAudioTranscription': 'Long audio transcription', @@ -346,7 +395,8 @@ const Map ukUA = { 'meetingTimelineJump': 'Timeline jump', 'meetingExportSummary': 'Export minutes', 'meetingMultiPlatformShare': 'Share across platforms', - 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + 'meetingDisclaimer': + 'Use in quiet environments; performance depends on microphone and network.', // 商品模块 - VIP会员页 'benefitsOverview': 'Benefits overview', @@ -361,7 +411,8 @@ const Map ukUA = { 'generalPrivileges': 'General privileges', 'earlyAccessNewFeatures': 'Early access to new features', 'crossDeviceSync': 'Cross-device sync', - 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', + 'vipDisclaimer': + 'Actual benefits depend on the package details and may change with versions.', // 商品模块 - 商品名称与描述 'ai_001_name': 'AI Basic 100', @@ -411,7 +462,8 @@ const Map ukUA = { 'guideNavInput': 'Navigate to Shenzhen Airport', 'guideNavSend': 'Lily will plan the route', 'guideNavEnd': 'Navigation set—try other commands', - 'guideMeetingStart': 'Tell Lily: “Create a meeting reminder for 3pm tomorrow”', + 'guideMeetingStart': + 'Tell Lily: “Create a meeting reminder for 3pm tomorrow”', 'guideMeetingInput': 'Create a meeting reminder for 3pm tomorrow', 'guideMeetingSend': 'Lily will create a meeting reminder', 'guideMeetingEnd': 'Reminder created—try other commands', @@ -459,7 +511,8 @@ const Map ukUA = { 'downloadingFiles': 'Downloading files...', 'downloadingFileProgress': 'Total {total} files, downloading file {current}', 'downloadComplete': 'Download complete', - 'downloadCompleteInfo': 'Download complete, {count} files in total, returning automatically in 2 seconds', + 'downloadCompleteInfo': + 'Download complete, {count} files in total, returning automatically in 2 seconds', // Meeting模块 - 录音功能 'startRecording': 'Start Recording', @@ -468,15 +521,21 @@ const Map ukUA = { 'callRecording': 'Call Recording', 'importAudio': 'Import Audio', 'meetingRecordExitTitle': 'Вийти із запису', // 退出录音 - 'meetingRecordExitMessage': 'Будь ласка, виберіть дію після виходу', // 请选择离开后的操作 + 'meetingRecordExitMessage': + 'Будь ласка, виберіть дію після виходу', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Завершити та зберегти', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Завершити без збереження', // 结束录音不保存 - 'meetingRecordContinueInBackground': 'Продовжити запис у фоновому режимі', // 后台继续录音 - 'meetingRecordStopTimeout': 'Час зупинки запису минув, спробуйте ще раз', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'Не вдалося зупинити запис, спробуйте ще раз', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'Не вдалося зберегти запис, спробуйте ще раз', // 保存录音失败,请重试 + 'meetingRecordContinueInBackground': + 'Продовжити запис у фоновому режимі', // 后台继续录音 + 'meetingRecordStopTimeout': + 'Час зупинки запису минув, спробуйте ще раз', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'Не вдалося зупинити запис, спробуйте ще раз', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'Не вдалося зберегти запис, спробуйте ще раз', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'Запис триває', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Запис у фоновому режимі, натисніть, щоб повернутися', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'Запис у фоновому режимі, натисніть, щоб повернутися', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Дозвіл на плаваюче вікно', // 悬浮窗权限 'overlayPermissionTranslationDesc': 'Щоб показувати результати перекладу під час дзвінків або перекладу аудіо/відео, нам потрібен дозвіл на відображення поверх інших програм. Це дозволить бачити переклад у реальному часі під час використання інших додатків.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 @@ -508,27 +567,29 @@ const Map ukUA = { 'selectSummaryTemplate': 'Select Summary Template', 'useThisTemplate': 'Use This Template', 'lastUsed': 'Last Used', - 'create': 'Створити', - 'templateDetails': 'Деталі шаблону', - 'tag': 'Тег', - 'description': 'Опис', - 'template': 'Шаблон', - 'deleteTemplate': 'Видалити шаблон', - 'deleteTemplateConfirm': 'Ви впевнені, що хочете видалити цей шаблон?', - 'editTemplate': 'Редагувати шаблон', - 'createTemplate': 'Створити шаблон', - 'name': 'Назва', - 'templateContentHint': 'Будь ласка, введіть вміст шаблону! Порада: натисніть кнопку AI вище, щоб швидко згенерувати вміст шаблону на основі введеної назви та опису', - 'inputNameHint': 'Будь ласка, введіть назву', - 'inputDescHint': 'Будь ласка, введіть опис', - 'custom': 'Користувацький', - 'pleaseEnter': 'Будь ласка, введіть', + 'create': 'Створити', + 'templateDetails': 'Деталі шаблону', + 'tag': 'Тег', + 'description': 'Опис', + 'template': 'Шаблон', + 'deleteTemplate': 'Видалити шаблон', + 'deleteTemplateConfirm': 'Ви впевнені, що хочете видалити цей шаблон?', + 'editTemplate': 'Редагувати шаблон', + 'createTemplate': 'Створити шаблон', + 'name': 'Назва', + 'templateContentHint': + 'Будь ласка, введіть вміст шаблону! Порада: натисніть кнопку AI вище, щоб швидко згенерувати вміст шаблону на основі введеної назви та опису', + 'inputNameHint': 'Будь ласка, введіть назву', + 'inputDescHint': 'Будь ласка, введіть опис', + 'custom': 'Користувацький', + 'pleaseEnter': 'Будь ласка, введіть', 'viewAll': 'View All', 'recordingLanguage': 'Recording Language', 'chineseSimplified': 'Chinese Mandarin (Simplified)', 'meetingGenerateNow': 'Generate Now', 'keyEventsAnalyzed': 'Analyzed {count} key events.', - 'aiAnalysisDesc': 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', + 'aiAnalysisDesc': + 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', // Meeting模块 - 文件操作 'importing': 'Importing...', @@ -544,7 +605,7 @@ const Map ukUA = { 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Зберегти інтелект-карту', + 'saveMindMap': 'Зберегти інтелект-карту', 'shareMindMap': 'Share Mind Map', 'shareSuccess': 'Share Success', @@ -566,16 +627,18 @@ const Map ukUA = { 'exportSummary': 'Export Summary', 'exportAs': 'Export As', 'exportingPDF': 'Exporting PDF...', - 'export': 'Експорт', + 'export': 'Експорт', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Застосувати до всіх абзаців цього мовця', - 'summaryWillBeUpdatedAutomatically': 'Підсумок буде автоматично оновлюватися на основі шаблону', + 'summaryWillBeUpdatedAutomatically': + 'Підсумок буде автоматично оновлюватися на основі шаблону', 'nameCurrentSpeaker': 'Name Current Speaker', 'recentlyUsedNames': 'Recently Used Names', 'applyToCurrentParagraph': 'Apply to Current Paragraph', 'totalTime': 'Total Time', - 'summarySpeakerWillBeUpdatedAutomatically': 'Summary speakers will be updated automatically', + 'summarySpeakerWillBeUpdatedAutomatically': + 'Summary speakers will be updated automatically', // Meeting模块 - 云端同步 'syncToCloud': 'Sync to Cloud', @@ -618,38 +681,52 @@ const Map ukUA = { 'audioImport': 'Audio Import', 'multipleExportFormats': 'Multiple Export Formats', 'professionalSummaryTemplates': 'Professional Summary Templates', - 'professionalTemplateDesc': 'Professional template design to improve your work efficiency. Customized according to industry needs.', - 'customTemplateDesc': 'You can customize summary prompts according to your needs and use them to generate the required summaries.', - 'askAiDesc': 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', - 'visualMindMapDesc': 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', - 'templateCommunityDesc': 'Discover, share, and get inspiration from the template library created by users.', - 'speakerIdentificationDesc': 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', - 'privateCloudSyncDesc': 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', - 'aiVoiceEnhancementDesc': 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', - 'audioImportDesc': 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', - 'multipleExportFormatsDesc': 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', + 'professionalTemplateDesc': + 'Professional template design to improve your work efficiency. Customized according to industry needs.', + 'customTemplateDesc': + 'You can customize summary prompts according to your needs and use them to generate the required summaries.', + 'askAiDesc': + 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', + 'visualMindMapDesc': + 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', + 'templateCommunityDesc': + 'Discover, share, and get inspiration from the template library created by users.', + 'speakerIdentificationDesc': + 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', + 'privateCloudSyncDesc': + 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', + 'aiVoiceEnhancementDesc': + 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', + 'audioImportDesc': + 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', + 'multipleExportFormatsDesc': + 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', 'upgradeMembership': 'Upgrade Your Membership', 'yearlySubscription': 'Yearly Subscription', 'monthlySubscription': 'Monthly Subscription', 'proMonthly': 'Pro ¥60/month', - 'proMonthlyDesc': '7-day free trial, then ¥800/year. Cancel anytime before trial ends.', + 'proMonthlyDesc': + '7-day free trial, then ¥800/year. Cancel anytime before trial ends.', 'sevenDayTrial': '7-day Free Trial', 'unlimitedMonthly': 'Unlimited ¥120/month', - 'unlimitedMonthlyDesc': '7-day free trial, then ¥1600/year. Cancel anytime before trial ends.', + 'unlimitedMonthlyDesc': + '7-day free trial, then ¥1600/year. Cancel anytime before trial ends.', 'trialNote': '*Free trial for 7 days, then charged annually, cancel anytime.', 'proPrice': 'Pro ¥120', 'proMonthlyPrice': '¥120/month', 'subscribe': 'Subscribe', 'unlimitedPrice': 'Unlimited ¥198', 'unlimitedMonthlyPrice': '¥198/month', - 'upgradeNote': '*After upgrading subscription, the remaining days of the original subscription will be automatically calculated and refunded to your payment account', + 'upgradeNote': + '*After upgrading subscription, the remaining days of the original subscription will be automatically calculated and refunded to your payment account', 'buyMoreTranscriptionTime': 'Buy More Transcription Time', 'sixThousandMinutes': '6,000 minutes', 'threeThousandMinutes': '3,000 minutes', 'sixHundredMinutes': '600 minutes', 'oneHundredTwentyMinutes': '120 minutes', 'validityPeriod': '*Validity Period: ', - 'validityNote': 'Activated immediately after purchase, valid for 2 years after activation.', + 'validityNote': + 'Activated immediately after purchase, valid for 2 years after activation.', 'purchase': 'Purchase', // Meeting模块 - 录音语言 @@ -660,18 +737,18 @@ const Map ukUA = { // Meeting模块 - 错误提示 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Аналіз не вдався, спробуйте пізніше', - 'transcriptionFailed': 'Транскрипція не вдалася, спробуйте пізніше', - 'summaryFailed': 'Не вдалося створити підсумок, спробуйте пізніше', - 'summaryFailedShort': 'Підсумок не вдався', - 'transcriptionFailedShort': 'Транскрипція не вдалася', + 'analysisFailed': 'Аналіз не вдався, спробуйте пізніше', + 'transcriptionFailed': 'Транскрипція не вдалася, спробуйте пізніше', + 'summaryFailed': 'Не вдалося створити підсумок, спробуйте пізніше', + 'summaryFailedShort': 'Підсумок не вдався', + 'transcriptionFailedShort': 'Транскрипція не вдалася', // Meeting模块 - 播放器 - 'playerNotReady': 'Аудіоплеєр не готовий, зачекайте', - 'playFailed': 'Помилка відтворення', - 'audioFileNotFound': 'Аудіофайл не знайдено', - 'fetchingAudio': 'Отримання аудіо з хмари...', - 'playerLoadFailed': 'Не вдалося завантажити аудіоплеєр', + 'playerNotReady': 'Аудіоплеєр не готовий, зачекайте', + 'playFailed': 'Помилка відтворення', + 'audioFileNotFound': 'Аудіофайл не знайдено', + 'fetchingAudio': 'Отримання аудіо з хмари...', + 'playerLoadFailed': 'Не вдалося завантажити аудіоплеєр', // 设置页 "systemSettings": "Системні налаштування", @@ -682,7 +759,8 @@ const Map ukUA = { "cloudSync": "Увімкнути синхронізацію в хмарі", "memberService": "Member Service", "bindRewardTitle": "Rewards", - "bindRewardSimpleDesc": "First bind device reward has been issued. Tap OK to close.", + "bindRewardSimpleDesc": + "First bind device reward has been issued. Tap OK to close.", "joinDevice": "Підключений пристрій:", "accountId": "ID облікового запису:", "systemSetting": "Системні налаштування", @@ -695,7 +773,8 @@ const Map ukUA = { "privacySettings": "Налаштування конфіденційності", "privacySettingsInfo": "Керування збором даних та дозволами", "permissionManagement": "Керування дозволами", // 权限管理 - "permissionManagementInfo": "Керування налаштуваннями дозволів програми", // 管理应用权限设置 + "permissionManagementInfo": + "Керування налаштуваннями дозволів програми", // 管理应用权限设置 "aboutApplication": "Про програму", "versions": "Версія", "checkUpdates": "Перевірити оновлення", @@ -704,9 +783,11 @@ const Map ukUA = { "voiceServiceInfo": "Вибір служби розпізнавання та синтезу мовлення", "selectVoiceService": "Вибрати голосову службу", "azureVoiceService": "Голосова служба Azure", - "azureVoiceServiceInfo": "Хмарна голосова служба Microsoft, що підтримує високоякісний синтез та розпізнавання мовлення", + "azureVoiceServiceInfo": + "Хмарна голосова служба Microsoft, що підтримує високоякісний синтез та розпізнавання мовлення", "flutterVoiceService": "Локальна голосова служба Flutter", - "flutterVoiceServiceInfo": "Локальна голосова служба пристрою, яку можна використовувати без підключення до Інтернету", + "flutterVoiceServiceInfo": + "Локальна голосова служба пристрою, яку можна використовувати без підключення до Інтернету", 'timbreService': 'Служба тембрів', 'timbreServiceInfo': 'Вибір служби синтезу мовлення з різними тембрами', 'defaultTimbre': 'Стандартний тембр', @@ -724,7 +805,8 @@ const Map ukUA = { 'checkUpdateFailed': 'Не вдалося перевірити оновлення', 'networkErrorRetry': 'Помилка мережі, спробуйте ще раз пізніше', "realtimeVoiceChat": "Голосовий чат у реальному часі", - "realtimeVoiceChatInfo": "Спробуйте функцію інтелектуальної голосової взаємодії (попередній перегляд)", + "realtimeVoiceChatInfo": + "Спробуйте функцію інтелектуальної голосової взаємодії (попередній перегляд)", "loading": "Завантаження...", // 设备管理模块 @@ -772,7 +854,8 @@ const Map ukUA = { "swipeUpForMore": "Проведіть пальцем вгору, щоб побачити більше", "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'При увімкненні: ШІ не буде перериватися вашим голосом під час відповіді та зможе обробляти лише один раунд розмови за раз. Щоб почати новий раунд, просто скажіть слово активації.', + 'voice_interrupt_tip': + 'При увімкненні: ШІ не буде перериватися вашим голосом під час відповіді та зможе обробляти лише один раунд розмови за раз. Щоб почати новий раунд, просто скажіть слово активації.', // Agent模块 - 预设提示词 "presetMusic": "Play some music", // 来点音乐 @@ -795,10 +878,14 @@ const Map ukUA = { '• 控制耳机功能\n\n' '有什么我可以帮你的吗?', 'microphonePermission': 'Мікрофон', - 'voiceRecognitionPermissionText': 'Для розпізнавання мовлення потрібен доступ до мікрофона.', - 'voiceTranslationPermissionText': 'Для розпізнавання та перекладу мовлення потрібен доступ до мікрофона.', - 'phoneCallPermissionText': 'Для здійснення дзвінків потрібен доступ до мікрофона для голосових викликів.', - 'permissionDeniedText': 'Ви назавжди відмовили в доступі до мікрофона, будь ласка, увімкніть дозвіл у налаштуваннях системи.', + 'voiceRecognitionPermissionText': + 'Для розпізнавання мовлення потрібен доступ до мікрофона.', + 'voiceTranslationPermissionText': + 'Для розпізнавання та перекладу мовлення потрібен доступ до мікрофона.', + 'phoneCallPermissionText': + 'Для здійснення дзвінків потрібен доступ до мікрофона для голосових викликів.', + 'permissionDeniedText': + 'Ви назавжди відмовили в доступі до мікрофона, будь ласка, увімкніть дозвіл у налаштуваннях системи.', 'startVoiceInput': 'Почати голосове введення', 'startPhoneCallMode': 'Почати режим дзвінка, почати голосове введення', @@ -820,9 +907,17 @@ const Map ukUA = { 'privacyRelated': 'Пов\'язано з конфіденційністю', 'copyrightViolation': 'Порушення моїх авторських прав, репутації тощо', 'other': 'Інше', - 'reportDescriptionHint': 'Ми хочемо знати причину вашої скарги, ви можете описати проблему, з якою зіткнулися.', + 'reportDescriptionHint': + 'Ми хочемо знати причину вашої скарги, ви можете описати проблему, з якою зіткнулися.', 'generatedByAi': 'Згенеровано AI', + // Agent模块 - 工具调用 + 'toolCall': 'Tool Call', + 'noResult': 'No Result', + 'noToolCallContentToCopy': 'No tool call content to copy', + 'toolCallDetails': 'Tool Call Details:', + 'toolCallContentCopied': 'Tool call content copied to clipboard', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Ось кілька рекомендованих композицій:', 'playList': 'Список відтворення', @@ -843,20 +938,52 @@ const Map ukUA = { "bicycling": "Велосипедом", "tsransit": "Громадський транспорт", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Select Navigation App', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Navigate with Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Navigate with Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Navigate with Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Navigate with Apple Maps', + 'builtInNavigation': 'Built-in Navigation', + 'useBuiltInNavigation': 'Navigate with built-in map', + 'navigationStartFailed': 'Failed to start navigation', + 'cannotPlayMusicListRetryLater': + 'Cannot play music list, please try again later', + 'cannotPlaySong': 'Cannot play song', + 'openMapError': 'Error opening map', + 'pleaseInstallAmapApp': 'Please install the Amap app first', + 'pleaseInstallBaiduMapApp': 'Please install the Baidu Maps app first', + 'appleMapStartFailed': 'Apple Maps failed to start', + 'appleMapUnavailable': 'Apple Maps unavailable', + 'openAppleMapError': 'Error opening Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Запит погодних умов:', 'highest': 'Макс.', 'lowest': 'Мін.', 'futureForecast': 'Прогноз на майбутнє', - 'hotWeatherTip': 'Сьогодні спекотно, будь ласка, уникайте перегріву та пийте більше води, щоб уникнути сонячного удару', - 'coldWeatherTip': 'Сьогодні температура низька, будь ласка, тепло одягайтеся, виходячи на вулицю, щоб не застудитися', - 'rainyWeatherTip': 'Сьогодні дощ, будь ласка, візьміть з собою парасольку та будьте обережні під час поїздок', - 'snowyWeatherTip': 'Сьогодні сніг, дороги слизькі, будьте обережні та тепло одягайтеся', - 'foggyWeatherTip': 'Сьогодні туман, видимість обмежена, будь ласка, надягайте маску, виходячи на вулицю', - 'windyWeatherTip': 'Сьогодні сильний вітер, будь ласка, будьте обережні та закріпіть свої речі, виходячи на вулицю', - 'sunnyWeatherTip': 'Сьогодні сонячно та сильне ультрафіолетове випромінювання, будь ласка, використовуйте сонцезахисний крем, виходячи на вулицю', - 'temperatureDifferenceTip': 'Сьогодні велика різниця температур між днем і ніччю, будь ласка, одягайтеся відповідно', - 'comfortableWeatherTip': 'Сьогодні приємна погода, чудовий час для активного відпочинку на свіжому повітрі', + 'hotWeatherTip': + 'Сьогодні спекотно, будь ласка, уникайте перегріву та пийте більше води, щоб уникнути сонячного удару', + 'coldWeatherTip': + 'Сьогодні температура низька, будь ласка, тепло одягайтеся, виходячи на вулицю, щоб не застудитися', + 'rainyWeatherTip': + 'Сьогодні дощ, будь ласка, візьміть з собою парасольку та будьте обережні під час поїздок', + 'snowyWeatherTip': + 'Сьогодні сніг, дороги слизькі, будьте обережні та тепло одягайтеся', + 'foggyWeatherTip': + 'Сьогодні туман, видимість обмежена, будь ласка, надягайте маску, виходячи на вулицю', + 'windyWeatherTip': + 'Сьогодні сильний вітер, будь ласка, будьте обережні та закріпіть свої речі, виходячи на вулицю', + 'sunnyWeatherTip': + 'Сьогодні сонячно та сильне ультрафіолетове випромінювання, будь ласка, використовуйте сонцезахисний крем, виходячи на вулицю', + 'temperatureDifferenceTip': + 'Сьогодні велика різниця температур між днем і ніччю, будь ласка, одягайтеся відповідно', + 'comfortableWeatherTip': + 'Сьогодні приємна погода, чудовий час для активного відпочинку на свіжому повітрі', "monday": "Пн", "tuesday": "Вт", "wednesday": "Ср", @@ -900,13 +1027,25 @@ const Map ukUA = { "selectTargetLanguage": "Вибрати цільову мову", "me": "Me", "counterPart": "Counterpart", - "bluetoothCallStateError": "Please make sure the Bluetooth headset is connected to the phone and in a call state", + "bluetoothCallStateError": + "Please make sure the Bluetooth headset is connected to the phone and in a call state", "autoDetect": "Auto Detect", // 自动检测 + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Disable Floating Window', + 'enableFloatingWindow': 'Enable Floating Window', + 'permissionTip': 'Permission Tip', + 'micPermissionRequiredForRecording': + 'Microphone permission is required for recording', + 'deleteTranslationRecordError': 'Error deleting translation record: @error', + // 翻译模块 - 文本翻译 "languageDetectionFailed": "Language detection failed", "translationFailed": "Translation failed", + "translating": "Translating", + "translate": "Translate", "pleaseInputText": "Please input text", + "inputTextToTranslate": "Введіть текст для перекладу", "textTooLong": "Text too long, max 5000 characters", // 翻译模块 - 历史记录 @@ -914,10 +1053,12 @@ const Map ukUA = { "historyRecords": "History Records", "clearResults": "Clear Results", "clearHistory": "Очистити історію", - "clearHistoryConfirm": "Ви впевнені, що хочете очистити всю історію перекладів? Цю дію неможливо скасувати.", + "clearHistoryConfirm": + "Ви впевнені, що хочете очистити всю історію перекладів? Цю дію неможливо скасувати.", "unknownLanguage": "Невідома мова", "deleteSessionRecord": "Видалити запис сесії", - "deleteSessionConfirm": "Ви впевнені, що хочете видалити всі записи перекладів цієї сесії? Цю дію неможливо скасувати.", + "deleteSessionConfirm": + "Ви впевнені, що хочете видалити всі записи перекладів цієї сесії? Цю дію неможливо скасувати.", // 翻译模块 - 图片翻译 "selectImageSource": "Select Image Source", @@ -949,15 +1090,20 @@ const Map ukUA = { "translationCompleted": "Translation Completed", "allStepsCompleted": "All steps completed", "processingFailed": "Processing Failed", - "imageProcessingOrTranslationFailed": "Image processing or translation failed. Please retry.\nError: {error}", + "imageProcessingOrTranslationFailed": + "Image processing or translation failed. Please retry.\nError: {error}", "imageTooLarge": "Image size exceeds 4MB limit", - "imageTooLargeHint": "Image size exceeds 4MB. Reduce quality or dimensions and retry", + "imageTooLargeHint": + "Image size exceeds 4MB. Reduce quality or dimensions and retry", "emptyTranslationResult": "Image translation API returned empty result", - "imageTranslationFailedTryLater": "Image translation failed. Network issue or rate limit. Please try later", - "imageTranslationApiException": "Image translation API exception. Check network and retry", + "imageTranslationFailedTryLater": + "Image translation failed. Network issue or rate limit. Please try later", + "imageTranslationApiException": + "Image translation API exception. Check network and retry", "permissionRequired": "Permission Required", "cameraPermissionRequired": "Camera permission required to take photos", - "photoAlbumPermissionRequired": "Photo album permission required to pick images", + "photoAlbumPermissionRequired": + "Photo album permission required to pick images", "translationDetails": "Translation Details", "originalImage": "Original Image", "sourceLanguage": "Source Language", @@ -980,7 +1126,8 @@ const Map ukUA = { // 翻译模块 - 翻译详情 "originalRecord": "Оригінальний запис", "recordSummary": "Підсумок запису", - "clickToGenerateSummary": "Натисніть кнопку нижче, щоб згенерувати підсумок сесії", + "clickToGenerateSummary": + "Натисніть кнопку нижче, щоб згенерувати підсумок сесії", "summaryContent": "Зміст підсумку", "copied": "Скопійовано", "summaryCopiledToClipboard": "Підсумок скопійовано до буфера обміну", @@ -988,9 +1135,11 @@ const Map ukUA = { "summaryGenerated": "Підсумок згенеровано", "generating": "Генерація...", "regenerate": "Згенерувати знову", - "summaryTimeoutMessage": "Час очікування запиту на генерацію підсумку минув, можливо, через проблеми з мережею або завантаженість сервера.", + "summaryTimeoutMessage": + "Час очікування запиту на генерацію підсумку минув, можливо, через проблеми з мережею або завантаженість сервера.", "deleteTranslationRecord": "Видалити запис перекладу", - "deleteTranslationConfirm": "Ви впевнені, що хочете видалити цей запис перекладу? Цю дію неможливо скасувати.", + "deleteTranslationConfirm": + "Ви впевнені, що хочете видалити цей запис перекладу? Цю дію неможливо скасувати.", "originalText": "Оригінальний текст", "translatedText": "Перекладений текст", "sessionSummary": "Підсумок сесії", @@ -1010,20 +1159,27 @@ const Map ukUA = { "logout": "Вийти", "logoutTips": "Ви впевнені, що хочете вийти з поточного облікового запису?", 'deleteAccount': 'Видалити обліковий запис', - 'deleteAccountTips': 'Ви впевнені, що хочете назавжди видалити свій обліковий запис? Цю дію неможливо скасувати', + 'deleteAccountTips': + 'Ви впевнені, що хочете назавжди видалити свій обліковий запис? Цю дію неможливо скасувати', 'clean': 'Clear Cache', 'cleanTips': 'Are you sure you want to clear personal cache?', - 'networkConnectionFailed': 'Помилка мережевого підключення, перевірте налаштування мережі та спробуйте ще раз', - 'serverTemporarilyUnavailable': 'Сервер тимчасово недоступний, спробуйте ще раз пізніше', - 'loginExpiredPleaseRelogin': 'Термін дії сесії закінчився, будь ласка, увійдіть знову', + 'networkConnectionFailed': + 'Помилка мережевого підключення, перевірте налаштування мережі та спробуйте ще раз', + 'serverTemporarilyUnavailable': + 'Сервер тимчасово недоступний, спробуйте ще раз пізніше', + 'loginExpiredPleaseRelogin': + 'Термін дії сесії закінчився, будь ласка, увійдіть знову', 'noPermissionForThisOperation': 'Немає дозволу на виконання цієї операції', 'requestedResourceNotFound': 'Запитаний ресурс не знайдено', - 'imageProcessingFailedPleaseReselect': 'Не вдалося обробити зображення, будь ласка, виберіть інше зображення', + 'imageProcessingFailedPleaseReselect': + 'Не вдалося обробити зображення, будь ласка, виберіть інше зображення', 'operationFailedPleaseRetry': 'Операція не вдалася, спробуйте ще раз', 'serverReturnedError': 'Сервер повернув помилку', 'serverError': 'Помилка сервера', - 'networkConnectionFailedCheckSettings': 'Помилка мережевого підключення, перевірте налаштування мережі', - 'serverInternalErrorRetryLater': 'Внутрішня помилка сервера, спробуйте ще раз пізніше', + 'networkConnectionFailedCheckSettings': + 'Помилка мережевого підключення, перевірте налаштування мережі', + 'serverInternalErrorRetryLater': + 'Внутрішня помилка сервера, спробуйте ще раз пізніше', 'imageCompressionFailed': 'Не вдалося стиснути зображення', 'avatarUpdateFailed': 'Не вдалося оновити аватар', 'usernameCannotBeEmpty': 'Ім\'я користувача не може бути порожнім', @@ -1033,20 +1189,27 @@ const Map ukUA = { 'loggedOut': 'Ви вийшли з системи', 'logoutFailedRetry': 'Не вдалося вийти, спробуйте ще раз', 'accountPermanentlyDeleted': 'Обліковий запис було назавжди видалено', - 'deleteAccountFailedRetry': 'Не вдалося видалити обліковий запис, спробуйте ще раз', + 'deleteAccountFailedRetry': + 'Не вдалося видалити обліковий запис, спробуйте ще раз', 'clearUserDataFailed': 'Не вдалося очистити дані користувача', // 清理用户数据失败 'deleteUserDataFailed': 'Не вдалося видалити дані користувача', // 删除用户数据失败 - 'thirdPartyLogoutSuccess': 'Вихід зі стороннього сервісу успішний', // 第三方登录退出成功 - 'thirdPartyLogoutFailed': 'Не вдалося вийти зі стороннього сервісу', // 第三方登录退出失败 + 'thirdPartyLogoutSuccess': + 'Вихід зі стороннього сервісу успішний', // 第三方登录退出成功 + 'thirdPartyLogoutFailed': + 'Не вдалося вийти зі стороннього сервісу', // 第三方登录退出失败 'signOutProcessError': 'Сталася помилка під час виходу з системи', // 登出过程发生错误 - 'deleteAccountProcessError': 'Сталася помилка під час видалення облікового запису', // 删除账号过程发生错误 + 'deleteAccountProcessError': + 'Сталася помилка під час видалення облікового запису', // 删除账号过程发生错误 'userDataClearSuccess': 'Дані користувача успішно очищено', // 用户数据清理成功 - 'allUserDataClearSuccess': 'Усі дані користувача успішно очищено', // 所有用户数据清理成功 - 'accountServiceInitialized': 'Службу облікових записів ініціалізовано', // AccountService 已初始化 + 'allUserDataClearSuccess': + 'Усі дані користувача успішно очищено', // 所有用户数据清理成功 + 'accountServiceInitialized': + 'Службу облікових записів ініціалізовано', // AccountService 已初始化 // 权限模块 'meetingStoragePermission': 'Storage', - 'meetingStoragePermissionExplanation': 'We need access to storage permissions so you can select and upload audio files.', + 'meetingStoragePermissionExplanation': + 'We need access to storage permissions so you can select and upload audio files.', 'meetingStoragePermissionPermanentDenial': '检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。', 'getPermissionStatusFailed': 'Не вдалося отримати статус дозволів', @@ -1068,10 +1231,14 @@ const Map ukUA = { 'locationInfo': 'Інформація про місцезнаходження', 'phonePermissionDesc': 'Використовується для здійснення дзвінків', 'smsPermissionDesc': 'Використовується для надсилання SMS', - 'alarmPermissionDesc': 'Used to set exact alarms to ensure reminders trigger on time', - 'calendarWritePermissionDesc': 'Використовується для створення подій та нагадувань у календарі', - 'calendarFullAccessPermissionDesc': 'Використовується для читання та керування подіями та нагадуваннями у календарі', - 'locationPermissionDesc': 'Використовується для отримання інформації про поточне місцезнаходження', + 'alarmPermissionDesc': + 'Used to set exact alarms to ensure reminders trigger on time', + 'calendarWritePermissionDesc': + 'Використовується для створення подій та нагадувань у календарі', + 'calendarFullAccessPermissionDesc': + 'Використовується для читання та керування подіями та нагадуваннями у календарі', + 'locationPermissionDesc': + 'Використовується для отримання інформації про поточне місцезнаходження', 'appFunctionNeeds': 'Функції програми потребують', 'authorized': 'Дозволено', 'unauthorized': 'Не дозволено', @@ -1080,42 +1247,68 @@ const Map ukUA = { 'unknownStatus': 'Невідомий статус', 'permissionGranted': 'Дозвіл надано', 'permissionRequestError': 'Помилка під час запиту дозволу', - 'phonePermissionDetailDesc': 'Для функції дзвінків потрібен дозвіл на доступ до телефону', - 'smsPermissionDetailDesc': 'Для функції надсилання SMS потрібен дозвіл на доступ до SMS', - 'alarmPermissionDetailDesc': 'This permission is required to set exact alarms and ensure reminders trigger on time', - 'calendarWritePermissionDetailDesc': 'Для створення подій у календарі потрібен дозвіл на запис до календаря', - 'calendarFullAccessPermissionDetailDesc': 'Для керування подіями у календарі потрібен повний доступ до календаря', - 'locationPermissionDetailDesc': 'Для отримання інформації про місцезнаходження потрібен дозвіл на доступ до місцезнаходження', + 'phonePermissionDetailDesc': + 'Для функції дзвінків потрібен дозвіл на доступ до телефону', + 'smsPermissionDetailDesc': + 'Для функції надсилання SMS потрібен дозвіл на доступ до SMS', + 'alarmPermissionDetailDesc': + 'This permission is required to set exact alarms and ensure reminders trigger on time', + 'calendarWritePermissionDetailDesc': + 'Для створення подій у календарі потрібен дозвіл на запис до календаря', + 'calendarFullAccessPermissionDetailDesc': + 'Для керування подіями у календарі потрібен повний доступ до календаря', + 'locationPermissionDetailDesc': + 'Для отримання інформації про місцезнаходження потрібен дозвіл на доступ до місцезнаходження', 'contactsPermissionDesc': 'Used for accessing contact information', - 'contactsPermissionDetailDesc': 'Phone call and SMS functionality requires contacts permission to select contacts', - 'bluetoothPermissionDesc': 'Used for connecting and managing Bluetooth devices', - 'bluetoothPermissionDetailDesc': 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', + 'contactsPermissionDetailDesc': + 'Phone call and SMS functionality requires contacts permission to select contacts', + 'bluetoothPermissionDesc': + 'Used for connecting and managing Bluetooth devices', + 'bluetoothPermissionDetailDesc': + 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', 'bluetoothScanPermissionDesc': 'Used for scanning nearby Bluetooth devices', - 'bluetoothScanPermissionDetailDesc': 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', + 'bluetoothScanPermissionDetailDesc': + 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', 'bluetoothConnectPermissionDesc': 'Used for connecting to Bluetooth devices', - 'bluetoothConnectPermissionDetailDesc': 'Connecting to Bluetooth devices requires Bluetooth connect permission', + 'bluetoothConnectPermissionDetailDesc': + 'Connecting to Bluetooth devices requires Bluetooth connect permission', 'notificationPermissionDesc': 'Used for sending notification messages', - 'notificationPermissionDetailDesc': 'App needs notification permission to send you important alerts and messages', - 'appNeedsPermissionForFullFunction': 'Програмі потрібен цей дозвіл для надання повної функціональності', - 'permanentDenialText': 'Ви назавжди відмовили в доступі до {permission}, будь ласка, перейдіть до налаштувань програми, щоб увімкнути його', + 'notificationPermissionDetailDesc': + 'App needs notification permission to send you important alerts and messages', + 'appNeedsPermissionForFullFunction': + 'Програмі потрібен цей дозвіл для надання повної функціональності', + 'permanentDenialText': + 'Ви назавжди відмовили в доступі до {permission}, будь ласка, перейдіть до налаштувань програми, щоб увімкнути його', 'goToSettings': 'Перейти до налаштувань', 'bluetoothScan': 'Bluetooth Scan', 'bluetoothConnect': 'Bluetooth Connect', - 'bluetoothScanExplanation': 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', - 'bluetoothConnectExplanation': 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', - 'locationForBluetoothExplanation': 'The app needs location permission to scan Bluetooth devices.', - 'bluetoothScanPermanentDenial': 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', - 'bluetoothConnectPermanentDenial': 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', - 'locationPermanentDenial': 'Location permission has been permanently denied, please go to settings to enable it manually.', + 'bluetoothScanExplanation': + 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', + 'bluetoothConnectExplanation': + 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', + 'locationForBluetoothExplanation': + 'The app needs location permission to scan Bluetooth devices.', + 'bluetoothScanPermanentDenial': + 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', + 'bluetoothConnectPermanentDenial': + 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', + 'locationPermanentDenial': + 'Location permission has been permanently denied, please go to settings to enable it manually.', 'notificationPermission': 'Notification', 'locationPermission': 'Location', - 'notificationPermissionExplanation': 'Notification permission is required to display music playback status.', - 'locationPermissionExplanation': 'Location permission is required to get current location.', - 'notificationPermissionPermanentDenial': 'You have permanently denied notification permission, please go to settings to enable it.', - 'locationPermissionPermanentDenial': 'You have permanently denied location permission, please go to settings to enable it.', + 'notificationPermissionExplanation': + 'Notification permission is required to display music playback status.', + 'locationPermissionExplanation': + 'Location permission is required to get current location.', + 'notificationPermissionPermanentDenial': + 'You have permanently denied notification permission, please go to settings to enable it.', + 'locationPermissionPermanentDenial': + 'You have permanently denied location permission, please go to settings to enable it.', 'storagePermission': 'Storage', - 'microphonePermissionExplanation': 'We need microphone permission to record audio content.', - 'storagePermissionExplanation': 'We need storage permission so you can select and upload audio files.', + 'microphonePermissionExplanation': + 'We need microphone permission to record audio content.', + 'storagePermissionExplanation': + 'We need storage permission so you can select and upload audio files.', 'microphonePermissionPermanentDenial': '检测到您已永久拒绝录音权限。如需继续使用此功能,请前往应用设置中手动开启麦克风权限。', 'storagePermissionPermanentDenial': @@ -1123,21 +1316,24 @@ const Map ukUA = { 'permissionUtilNeed': 'Need ', 'permissionUtilPermission': ' Permission', 'permissionUtilRestricted': ' Permission Restricted', - 'permissionUtilRestrictedMessage': 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', + 'permissionUtilRestrictedMessage': + 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Навігація в процесі', - 'native.notification.navigation.keepRunning': 'Навігація, тримайте додаток запущеним', - 'native.notification.bleAgent.running': 'Голосовий помічник працює', - 'native.notification.audioRecording.recording': 'Запис аудіо, натисніть, щоб повернутися до додатку', - 'native.notification.music.waiting': 'Очікування відтворення', - 'native.notification.music.previous': 'Попередня', - 'native.notification.music.next': 'Наступна', - 'native.notification.music.play': 'Відтворити', - 'native.notification.music.pause': 'Пауза', - 'native.notification.qqMusic.playing': 'Відтворення музики', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Навігація в процесі', + 'native.notification.navigation.keepRunning': + 'Навігація, тримайте додаток запущеним', + 'native.notification.bleAgent.running': 'Голосовий помічник працює', + 'native.notification.audioRecording.recording': + 'Запис аудіо, натисніть, щоб повернутися до додатку', + 'native.notification.music.waiting': 'Очікування відтворення', + 'native.notification.music.previous': 'Попередня', + 'native.notification.music.next': 'Наступна', + 'native.notification.music.play': 'Відтворити', + 'native.notification.music.pause': 'Пауза', + 'native.notification.qqMusic.playing': 'Відтворення музики', // 版本更新 'newVersionFound': 'Знайдено нову версію', // 版本更新对话框标题 @@ -1145,8 +1341,10 @@ const Map ukUA = { 'updateNow': 'Оновити зараз', // 立即更新按钮 'checkUpdate': 'Перевірити оновлення', // 检查更新按钮 'updateFailed': 'Не вдалося оновити', // 更新失败提示 - 'cannotOpenAppStore': 'Не вдається відкрити App Store, будь ласка, перейдіть до App Store вручну, щоб оновити', // 无法打开应用商店提示 - 'updateErrorRetry': 'Сталася помилка під час оновлення, спробуйте ще раз пізніше', // 更新错误重试提示 + 'cannotOpenAppStore': + 'Не вдається відкрити App Store, будь ласка, перейдіть до App Store вручну, щоб оновити', // 无法打开应用商店提示 + 'updateErrorRetry': + 'Сталася помилка під час оновлення, спробуйте ще раз пізніше', // 更新错误重试提示 // 配对模块 "devicePairing": "Спарювання пристрою", @@ -1164,23 +1362,30 @@ const Map ukUA = { 'bluetooth': 'Bluetooth', "readyToPair": "Готово до спарювання", "preparingPairingEnvironment": "Підготовка середовища для спарювання...", - "connectDeepSoundViaSystemBluetooth": "Будь ласка, спочатку підключіться до пристрою Voitrans через системний Bluetooth", + "connectDeepSoundViaSystemBluetooth": + "Будь ласка, спочатку підключіться до пристрою Voitrans через системний Bluetooth", "deviceBindingConfirm": "Підтвердження прив'язки пристрою...", "establishingDeviceAssociation": "Встановлення асоціації пристрою...", "waitingCompletePairing": "Будь ласка, зачекайте, завершується спарювання...", - "pairingSuccessRedirecting": "Спарювання успішне! Перенаправлення на головну сторінку...", - "ensureConnectedDeepSoundDevice": "Переконайтеся, що ви підключені до пристрою Voitrans", - "deviceAlreadyBoundToOtherAccount": "Цей пристрій вже прив'язаний до іншого облікового запису", + "pairingSuccessRedirecting": + "Спарювання успішне! Перенаправлення на головну сторінку...", + "ensureConnectedDeepSoundDevice": + "Переконайтеся, що ви підключені до пристрою Voitrans", + "deviceAlreadyBoundToOtherAccount": + "Цей пристрій вже прив'язаний до іншого облікового запису", "deviceAssociationFailed": "Не вдалося асоціювати пристрій, спробуйте ще раз", - "scanTimeoutEnsureDeviceNearby": "Час сканування минув, переконайтеся, що пристрій знаходиться поруч", + "scanTimeoutEnsureDeviceNearby": + "Час сканування минув, переконайтеся, що пристрій знаходиться поруч", "networkError": "Помилка мережі", - "authorizationFailedCheckCode": "Помилка авторизації, перевірте правильність коду авторизації", + "authorizationFailedCheckCode": + "Помилка авторизації, перевірте правильність коду авторизації", "pairingFailedRetry": "Не вдалося спарити, спробуйте ще раз", 'pleaseEnableBluetooth': 'Будь ласка, увімкніть Bluetooth', 'deviceDisconnected': 'Пристрій відключено', 'readyToStartPairing': 'Готово до початку спарювання', 'checkingEnvironment': 'Перевірка середовища...', - 'ensureHeadsetOnAndPairingMode': 'Переконайтеся, що навушники увімкнені та знаходяться в режимі спарювання', + 'ensureHeadsetOnAndPairingMode': + 'Переконайтеся, що навушники увімкнені та знаходяться в режимі спарювання', 'establishingSecureConnection': 'Встановлення безпечного з\\', 'needManualBindingAuthCode': 'Потрібен код авторизації для ручної прив\\', 'pairingSuccessful': 'Спарювання успішне!', @@ -1194,17 +1399,24 @@ const Map ukUA = { 'verificationFailedRetry': 'Перевірка не вдалася, спробуйте ще раз', 'invalidDeviceAddress': 'Недійсна адреса пристрою', 'bleDeviceAssociationFailed': 'Не вдалося асоціювати пристрій BLE', - 'deviceAssociationFailedRetry': 'Не вдалося асоціювати пристрій, спробуйте ще раз', - 'bleConnectionTimeoutRetry': 'Час очікування підключення BLE минув, спробуйте ще раз', + 'deviceAssociationFailedRetry': + 'Не вдалося асоціювати пристрій, спробуйте ще раз', + 'bleConnectionTimeoutRetry': + 'Час очікування підключення BLE минув, спробуйте ще раз', 'blePairingStartupFailed': 'Не вдалося розпочати спарювання BLE', 'bleConnectionFailed': 'Не вдалося підключитися через BLE', - 'deviceAuthorizationFailedCheckCode': 'Помилка авторизації пристрою, перевірте код авторизації', + 'deviceAuthorizationFailedCheckCode': + 'Помилка авторизації пристрою, перевірте код авторизації', 'bluetoothGuideTitle': 'Manual Bluetooth Activation Required', // 需要手动开启蓝牙 'bluetoothGuideSteps': 'Please follow these steps:', // 请按照以下步骤操作: - 'bluetoothGuideStep1': 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 - 'bluetoothGuideStep2': 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 - 'bluetoothGuideStep3': 'Return to app to continue pairing process', // 返回应用继续配对流程 - 'bluetoothGuideTip': 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 + 'bluetoothGuideStep1': + 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 + 'bluetoothGuideStep2': + 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 + 'bluetoothGuideStep3': + 'Return to app to continue pairing process', // 返回应用继续配对流程 + 'bluetoothGuideTip': + 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 'iKnow': 'I Know', // 我知道了 // 配对模块 - 绑定奖励 @@ -1221,17 +1433,20 @@ const Map ukUA = { // 用户反馈模块 "feedback": "Відгук користувача", 'feedbackInfo': 'Надати відгук або пропозицію', - 'feedbackDescription': 'Будь ласка, опишіть проблему, з якою ви зіткнулися, або вашу пропозицію', + 'feedbackDescription': + 'Будь ласка, опишіть проблему, з якою ви зіткнулися, або вашу пропозицію', 'feedbackHint': 'Будь ласка, введіть ваш відгук...', 'feedbackRequired': 'Будь ласка, введіть зміст відгуку', 'contactInfo': 'Контактна інформація', 'contactHint': 'Email/Телефон, щоб ми могли з вами зв\\', 'submit': 'Надіслати', 'feedbackSubmitSuccess': 'Відгук успішно надіслано, дякуємо за ваш відгук!', - 'feedbackSubmitFailed': 'Не вдалося надіслати відгук, спробуйте ще раз пізніше', + 'feedbackSubmitFailed': + 'Не вдалося надіслати відгук, спробуйте ще раз пізніше', // OTA升级模块 - "upgradeExitConfirm": "Наразі триває оновлення, вихід перерве процес оновлення, ви впевнені, що хочете вийти?", + "upgradeExitConfirm": + "Наразі триває оновлення, вихід перерве процес оновлення, ви впевнені, що хочете вийти?", "deviceModel": "Модель пристрою", "unknownDevice": "Невідомий пристрій", "currentFirmwareVersion": "Поточна версія прошивки", @@ -1244,14 +1459,70 @@ const Map ukUA = { "retryConnection": "Повторити підключення", "ota_updateNow": "Оновити зараз", "otaVersionInfoFailed": "Failed to get version info. Please try again later.", - "otaDeviceInfoUnavailable": "Unable to get device info. Please check the connection and retry.", - "otaProductInfoUnavailable": "Unable to identify the device. Please reconnect and retry.", - "otaFirmwareVersionInvalid": "Firmware version is abnormal. Please reconnect and retry.", - "keepConnectedDontClose": "Будь ласка, тримайте пристрій підключеним, не закривайте програму", + "otaDeviceInfoUnavailable": + "Unable to get device info. Please check the connection and retry.", + "otaProductInfoUnavailable": + "Unable to identify the device. Please reconnect and retry.", + "otaFirmwareVersionInvalid": + "Firmware version is abnormal. Please reconnect and retry.", + "keepConnectedDontClose": + "Будь ласка, тримайте пристрій підключеним, не закривайте програму", "doNotDisconnect": "Будь ласка, не відключайте", "charging": "Зарядка", "updateContent": "Зміст оновлення", - "removeEarbudsEnsureBattery": "Вийміть обидва навушники та переконайтеся, що заряд батареї в обох перевищує 20%", + "removeEarbudsEnsureBattery": + "Вийміть обидва навушники та переконайтеся, що заряд батареї в обох перевищує 20%", + + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'New version @version found', + 'otaConfirmUpdateNow': 'Update now?', + 'otaUpdate': 'Update', + 'otaUpgradeSuccess': 'Upgrade Successful', + 'otaUpgradeCompleteRepair': + 'Firmware upgrade complete!\n\nDevice needs to be re-paired to work properly. Go to pairing page now?', + 'otaPairLater': 'Pair Later', + 'otaPairNow': 'Pair Now', + 'okConfirm': 'OK', + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Error checking BLE connection: @error', + 'otaBleNotConnected': 'BLE Device Not Connected', + 'otaBleNeedConnection': + 'Firmware upgrade requires BLE device connection\nPlease ensure device is properly connected and try again', + 'otaDeviceInfoUnavailableTitle': 'Device Info Unavailable', + 'otaCannotGetDeviceInfo': + 'Cannot get device info\nPlease reconnect device or try again later', + 'otaBleCheckFailed': 'BLE Connection Check Failed', + 'otaCannotGetDeviceInfoCheckConnection': + 'Cannot get device info, please check device connection', + 'otaCannotGetProductInfoWithName': + 'Cannot get product info, device name: @deviceName', + 'otaCannotGetBatteryInfo': 'Cannot get valid battery info', + 'otaLowBattery': 'Low Battery', + 'otaSingleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: battery must be above 20%\nCurrent: @ear @battery%\nPlease charge and try again', + 'otaDoubleBatteryLow': + 'Device battery too low for firmware upgrade\nRequirement: both earbuds must be above 20%\nCurrent: Left @left%, Right @right%\nPlease charge and try again', + 'otaBatteryCheckFailed': 'Battery Check Failed', + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'This update includes performance optimizations and bug fixes.', + 'otaGetLatestVersionFailed': 'Failed to get latest version info', + 'otaGetVersionInfoFailed': 'Failed to get version info', + 'otaCheckingDeviceStatus': 'Checking device status...', + 'otaDownloadFailedCheckNetwork': + 'Download failed, please check network connection', + 'otaDownloadFailed': 'Download Failed', + 'otaPreparingConnection': 'Preparing device connection...', + 'otaConnectingDevice': 'Connecting to device...', + 'otaUpgradeStarted': 'OTA upgrade started...', + 'otaUpgradeProgressWithPercent': 'Upgrade progress: @percent%', + 'otaUpgradeSuccessComplete': 'Upgrade completed successfully', + 'otaUpgradeFailedWithCode': 'Upgrade failed, error code: @code', + 'otaUpgradeFailedTitle': 'Upgrade Failed', + 'otaUpgradeFailedDesc': + 'Please check device connection or update package, error code: @code', + 'otaDeviceDisconnected': 'Device disconnected', + 'otaDeviceConnected': 'Device connected', // 音乐模块 "noMusic": "Немає музики", // 暂无音乐 diff --git a/lib/core/translations/language/vi_vn.dart b/lib/core/translations/language/vi_vn.dart index 1ff748879..4748fc7f6 100644 --- a/lib/core/translations/language/vi_vn.dart +++ b/lib/core/translations/language/vi_vn.dart @@ -1,5 +1,4 @@ const Map viVN = { - // 通用 'continue': 'Tiếp tục', 'confirm': 'Xác nhận', @@ -19,11 +18,11 @@ const Map viVN = { "unknownError": "Lỗi không xác định", "asrConnectionFailed": "Kết nối tới dịch vụ nhận dạng giọng nói thất bại. Vui lòng kiểm tra mạng hoặc thử lại sau.", - "justNow": "Just now", - "minutesAgo": "@minutes minutes ago", - "yesterday": "Yesterday", - "daysAgo": "@days days ago", - "hoursAgo": "@hours hours ago", + "justNow": "Vừa xong", + "minutesAgo": "@minutes phút trước", + "yesterday": "Hôm qua", + "daysAgo": "@days ngày trước", + "hoursAgo": "@hours giờ trước", // 启动页 "slogan": "Kết nối thế giới, vượt trên cả âm thanh", @@ -99,14 +98,16 @@ const Map viVN = { "tip": "Gợi ý", "pleaseEnterCompleteCode": "Vui lòng nhập đầy đủ mã xác minh", "loginFailed": "Đăng nhập thất bại, vui lòng thử lại", - 'pleaseAcceptPrivacyPolicy': 'Vui lòng đọc và đồng ý với Chính sách bảo mật và Thỏa thuận người dùng trước', + 'pleaseAcceptPrivacyPolicy': + 'Vui lòng đọc và đồng ý với Chính sách bảo mật và Thỏa thuận người dùng trước', "enterVerificationCode": "Nhập mã xác minh", "verificationCodeSentTo": "Mã xác minh đã được gửi đến", "resendVerificationCode": "Gửi lại mã xác minh", "login": "Đăng nhập", "usePasswordLogin": "Đăng nhập bằng mật khẩu", "loginDeclaration": "Tuyên bố của Voitrans", // Voitrans 声明 - "welcomeToThisApp": "Chào mừng bạn đến với Voitrans, vui lòng đọc kỹ", // 欢迎使用Voitrans,请充分阅读 + "welcomeToThisApp": + "Chào mừng bạn đến với Voitrans, vui lòng đọc kỹ", // 欢迎使用Voitrans,请充分阅读 "privacyPolicyText": ",点击'同意并进入'表示您已充分阅读并同意上述协议。点击'不同意'将退出应用。", // ,点击"同意并进入"表示您已充分阅读并同意上述协议。点击"不同意"将退出应用。 "disagree": "Không đồng ý", // 不同意 @@ -124,9 +125,11 @@ const Map viVN = { "connectDevice": "Kết nối thiết bị", "topAiExperiences": "Trải nghiệm AI hàng đầu", "aiAssistant": "Trợ lý toàn năng AI", - "aiAssistantInfo": "Tư vấn viên độc quyền 24/7, trả lời câu hỏi, cung cấp đề xuất", + "aiAssistantInfo": + "Tư vấn viên độc quyền 24/7, trả lời câu hỏi, cung cấp đề xuất", "interpretation": "Phiên dịch đồng thời", - "simultaneousInterpretationInfo": "Dịch thời gian thực đa ngôn ngữ, du lịch nước ngoài không lo", + "simultaneousInterpretationInfo": + "Dịch thời gian thực đa ngôn ngữ, du lịch nước ngoài không lo", "aiCompanion": "Bạn đồng hành gia đình", "aiCompanionInfo": "Thấu hiểu bạn, đồng hành ấm áp", "homeSlogan": "Kết nối thế giới, vượt trên cả âm thanh", @@ -137,7 +140,8 @@ const Map viVN = { "initializing": "Đang khởi tạo...", "bluetoothInitializationFailure": "Khởi tạo dịch vụ Bluetooth thất bại", "checkingPermissions": "Đang kiểm tra quyền...", - "lackPermissions": "Thiếu quyền Bluetooth và cần phải cấp quyền truy cập vị trí", + "lackPermissions": + "Thiếu quyền Bluetooth và cần phải cấp quyền truy cập vị trí", "searchingDevice": "Đang tìm kiếm thiết bị...", "findConnectedDevice": "Đã tìm thấy thiết bị đã kết nối", "notFound": "Không tìm thấy thiết bị Bluetooth đã kết nối", @@ -161,6 +165,29 @@ const Map viVN = { 'right': 'Phải', 'checkConnectionStatusFailed': 'Kiểm tra trạng thái kết nối thất bại', + // 蓝牙扫描模块 + 'bleInitFailedWithError': 'Khởi tạo Bluetooth thất bại: @error', + 'needBluetoothAndLocationPermission': + 'Cần quyền Bluetooth và vị trí để quét thiết bị', + 'permissionRequestFailedWithError': 'Yêu cầu quyền thất bại: @error', + 'needPermission': 'Cần cấp quyền', + 'blePermissionDialogContent': + 'Ứng dụng cần quyền Bluetooth và vị trí để quét thiết bị. Vui lòng bật trong Cài đặt.', + 'needEnableBluetooth': 'Bật Bluetooth', + 'enableBluetoothDialogContent': + 'Vui lòng bật Bluetooth để quét và kết nối thiết bị.', + 'bleScanFailedWithError': 'Quét thất bại: @error', + 'bleConnectionSuccess': 'Kết nối thành công', + 'bleConnectedToDevice': 'Đã kết nối @device', + 'bleConnectionFailedWithError': 'Kết nối thất bại: @error', + 'bleDisconnected': 'Đã ngắt kết nối', + 'bleDeviceDisconnected': 'Thiết bị đã ngắt kết nối', + 'bleDisconnectFailedWithError': 'Ngắt kết nối thất bại: @error', + 'signalStrong': 'Mạnh', + 'signalMedium': 'Trung bình', + 'signalWeak': 'Yếu', + 'signalVeryWeak': 'Rất yếu', + // 发现页 "searchAi": "Tìm kiếm chức năng AI...", "exploreSlogan": "Tai nghe thông minh, khả năng vô hạn", @@ -180,208 +207,228 @@ const Map viVN = { "healthConsultant": "Trò chuyện AI đa chức năng", "healthConsultantInfo": "Cung cấp thêm chức năng trò chuyện AI", "conferenceAssistant": "Trợ lý hội nghị kinh doanh", - "conferenceAssistantInfo": "Ghi lại biên bản họp thời gian thực, dịch đa ngôn ngữ", + "conferenceAssistantInfo": + "Ghi lại biên bản họp thời gian thực, dịch đa ngôn ngữ", "usageStats": "Thống kê sử dụng", "usageStatsInfo": "Xem thống kê sử dụng của bạn", "scene": "Tình huống", // 用量统计模块 - "aiChat": "AI Chat", - "translationStats": "Translation Statistics", - "meetingStats": "Meeting Statistics", - "today": "Today", - "thisWeek": "This Week", - "thisMonth": "This Month", - "history": "History", - "currentSessionStats": "Current Session Stats", - "translationCount": "Translation Count", - "sessionDuration": "Session Duration", - "characters": "Characters", - "recordingDuration": "Recording Duration", - "totalApiCalls": "Total API Calls", - "sessionCount": "Session Count", - "totalCharacters": "Total Characters", - "apiCallStats": "API Call Stats", - "translationApi": "Translation API", + "aiChat": "Trò chuyện AI", + "translationStats": "Thống kê dịch", + "meetingStats": "Thống kê cuộc họp", + "today": "Hôm nay", + "thisWeek": "Tuần này", + "thisMonth": "Tháng này", + "history": "Lịch sử", + "currentSessionStats": "Thống kê phiên hiện tại", + "translationCount": "Số lượt dịch", + "sessionDuration": "Thời lượng phiên", + "characters": "Ký tự", + "recordingDuration": "Thời lượng ghi âm", + "totalApiCalls": "Tổng số lượt gọi API", + "sessionCount": "Số phiên", + "totalCharacters": "Tổng số ký tự", + "apiCallStats": "Thống kê lượt gọi API", + "translationApi": "API dịch", "asr": "ASR", "tts": "TTS", - "dataVolumeStats": "Data Volume Stats", - "sourceTextCharacters": "Source Text Characters", - "ttsTextCharacters": "TTS Text Characters", - "effectiveAudioDuration": "Effective Audio Duration", - "totalSessionDuration": "Total Session Duration", - "costStats": "Cost Stats", - "estimatedCost": "Estimated Cost", - "dailyCostThreshold": "Daily Cost Threshold", - "monthlyCostThreshold": "Monthly Cost Threshold", - "usageBehaviorStats": "Usage Behavior Stats", - "mostUsedLanguagePair": "Most-used language pair", - "mostUsedMode": "Most-used mode", - "asrApiCalls": "ASR Calls", - "totalAudioDuration": "Total Audio Duration", - "audioFileSize": "Audio File Size", - "transcriptBytes": "Transcript Bytes", - "loadFailed": "Load Failed", - "statsLoadFailedTryLater": "Statistics failed to load. Please try again later.", - "cleanupComplete": "Cleanup Complete", - "cleanedOldData": "Cleaned data older than 90 days", - "exportFeature": "Export Feature", - "exportInDevelopment": "Data export is under development", + "dataVolumeStats": "Thống kê dung lượng dữ liệu", + "sourceTextCharacters": "Ký tự văn bản gốc", + "ttsTextCharacters": "Ký tự văn bản TTS", + "effectiveAudioDuration": "Thời lượng âm thanh hiệu dụng", + "totalSessionDuration": "Tổng thời lượng các phiên", + "costStats": "Thống kê chi phí", + "estimatedCost": "Chi phí ước tính", + "dailyCostThreshold": "Ngưỡng chi phí theo ngày", + "monthlyCostThreshold": "Ngưỡng chi phí theo tháng", + "usageBehaviorStats": "Thống kê hành vi sử dụng", + "mostUsedLanguagePair": "Cặp ngôn ngữ được dùng nhiều nhất", + "mostUsedMode": "Chế độ sử dụng nhiều nhất", + "asrApiCalls": "Lượt gọi ASR", + "totalAudioDuration": "Tổng thời lượng âm thanh", + "audioFileSize": "Kích thước tệp âm thanh", + "transcriptBytes": "Số byte bản ghi lời", + "loadFailed": "Tải thất bại", + "statsLoadFailedTryLater": "Không tải được thống kê. Vui lòng thử lại sau.", + "cleanupComplete": "Dọn dẹp hoàn tất", + "cleanedOldData": "Đã dọn dữ liệu cũ hơn 90 ngày", + "exportFeature": "Tính năng xuất dữ liệu", + "exportInDevelopment": "Chức năng xuất dữ liệu đang được phát triển", // 商品模块 - 通用 - 'availablePackages': 'Available Packages', - 'remainingQuota': 'Remaining Quota', - 'totalQuota': 'Total Quota', - 'remaining': 'Remaining', - 'featureDescription': 'Feature Description', - 'paymentSuccess': 'Thanh toán thành công', - 'paymentFailed': 'Thanh toán thất bại', - 'gotIt': 'Đã hiểu', - 'paymentFailedTryAgain': 'Thanh toán thất bại. Vui lòng thử lại.', - 'selectPaymentMethod': 'Chọn phương thức thanh toán', - 'wechatPay': 'WeChat Pay', - 'alipayPay': 'Alipay', - 'paypalPay': 'PayPal', - 'appleIap': 'Apple IAP', - 'googleIap': 'Google IAP', - 'wechatOrderCreateFailed': 'Không thể tạo đơn hàng WeChat', - 'alipayOrderCreateFailed': 'Không thể tạo đơn hàng Alipay', - 'appleOrderCreateFailed': 'Không thể tạo đơn hàng Apple', - 'googleOrderCreateFailed': 'Không thể tạo đơn hàng Google', - 'paypalOrderCreateFailed': 'Không thể tạo đơn hàng PayPal', - 'paymentException': 'Lỗi thanh toán', - 'paymentLaunchFailed': 'Không thể khởi chạy thanh toán', - 'paymentExceptionWithError': 'Lỗi thanh toán: @error', - 'paymentProcessingCheckLater': 'Đơn hàng của bạn đang được xử lý. Vui lòng kiểm tra lại sau.', - 'paymentResultQueryException': 'Không thể truy vấn kết quả thanh toán: @error', - 'orderConfirmedQuotaRefreshed': 'Đơn hàng đã được xác nhận. Hạn mức của bạn đã được làm mới.', - 'paymentCompletedConfirming': 'Thanh toán hoàn tất. Đang xác nhận…', - 'paymentCancelled': 'Đã hủy thanh toán', - 'paypalOpenedCompleteInBrowser': 'PayPal đã mở. Vui lòng hoàn tất thanh toán trong trình duyệt.', - 'paypalOpenFailed': 'Không thể mở trang thanh toán PayPal', - 'paymentTestTitle': 'Kiểm tra thanh toán', - 'paymentTestOrderInfo': 'Thông tin đơn hàng kiểm tra', - 'paymentTestProductId': 'Mã sản phẩm', - 'paymentTestProductDescription': 'Mô tả sản phẩm', - 'paymentTestWechatDescription': 'Kiểm tra thanh toán WeChat', - 'paymentTestAlipayDescription': 'Kiểm tra thanh toán Alipay', - 'paymentTestAmount': 'Số tiền', - 'paymentTestSelectAmount': 'Chọn số tiền kiểm tra', - 'paying': 'Đang thanh toán...', - 'wechatPayWithAmount': 'WeChat Pay ¥@amount', - 'alipayPayWithAmount': 'Alipay ¥@amount', - 'paymentStatusTitle': 'Trạng thái thanh toán', - 'errorInfoWithMessage': 'Lỗi: @message', - 'retest': 'Kiểm tra lại', - 'paymentTestInstructionsTitle': 'Hướng dẫn', - 'paymentTestInstructionsContent': '1. Chọn số tiền kiểm tra (khuyến nghị: ¥0.01)\n2. Nhấn nút thanh toán để bắt đầu\n3. Hoàn tất thanh toán trong ứng dụng thanh toán\n4. Quay lại kiểm tra kết quả', - 'startingWechatPayment': 'Đang khởi động WeChat Pay...', - 'startingAlipayPayment': 'Đang khởi động Alipay...', - 'wechatPaymentSuccess': 'Thanh toán WeChat Pay thành công!', - 'wechatPaymentFailed': 'Thanh toán WeChat Pay thất bại', - 'wechatPaymentLaunchFailed': 'Không thể khởi chạy WeChat Pay', - 'cannotLaunchWechatPayment': 'Không thể mở WeChat Pay', - 'wechatPaymentException': 'WeChat Pay gặp lỗi', - 'wechatPaymentTestCompleted': 'Kiểm tra thanh toán WeChat Pay hoàn tất', - 'alipayPaymentSuccess': 'Thanh toán Alipay thành công!', - 'alipayPaymentFailed': 'Thanh toán Alipay thất bại', - 'alipayPaymentLaunchFailed': 'Không thể khởi chạy Alipay', - 'cannotLaunchAlipayPayment': 'Không thể mở Alipay', - 'alipayPaymentException': 'Alipay gặp lỗi', - "insufficientIntegral": "Insufficient integral", - "insufficientBalanceDesc": "Insufficient balance, please go to the corresponding recharge page to recharge.", - "recharge": "Go to Recharge", - "aiMemberExpiredDesc": "AI membership expired, please go to the membership recharge page to renew.", + 'availablePackages': 'Các gói có sẵn', + 'remainingQuota': 'Hạn mức còn lại', + 'totalQuota': 'Tổng hạn mức', + 'remaining': 'Còn lại', + 'featureDescription': 'Mô tả tính năng', + 'paymentSuccess': 'Thanh toán thành công', + 'paymentFailed': 'Thanh toán thất bại', + 'gotIt': 'Đã hiểu', + 'paymentFailedTryAgain': 'Thanh toán thất bại. Vui lòng thử lại.', + 'selectPaymentMethod': 'Chọn phương thức thanh toán', + 'wechatPay': 'WeChat Pay', + 'alipayPay': 'Alipay', + 'paypalPay': 'PayPal', + 'appleIap': 'Apple IAP', + 'googleIap': 'Google IAP', + 'wechatOrderCreateFailed': 'Không thể tạo đơn hàng WeChat', + 'alipayOrderCreateFailed': 'Không thể tạo đơn hàng Alipay', + 'appleOrderCreateFailed': 'Không thể tạo đơn hàng Apple', + 'googleOrderCreateFailed': 'Không thể tạo đơn hàng Google', + 'paypalOrderCreateFailed': 'Không thể tạo đơn hàng PayPal', + 'paymentException': 'Lỗi thanh toán', + 'paymentLaunchFailed': 'Không thể khởi chạy thanh toán', + 'paymentExceptionWithError': 'Lỗi thanh toán: @error', + 'paymentProcessingCheckLater': + 'Đơn hàng của bạn đang được xử lý. Vui lòng kiểm tra lại sau.', + 'paymentResultQueryException': + 'Không thể truy vấn kết quả thanh toán: @error', + 'orderConfirmedQuotaRefreshed': + 'Đơn hàng đã được xác nhận. Hạn mức của bạn đã được làm mới.', + 'paymentCompletedConfirming': 'Thanh toán hoàn tất. Đang xác nhận…', + 'paymentCancelled': 'Đã hủy thanh toán', + 'paypalOpenedCompleteInBrowser': + 'PayPal đã mở. Vui lòng hoàn tất thanh toán trong trình duyệt.', + 'paypalOpenFailed': 'Không thể mở trang thanh toán PayPal', + 'paymentTestTitle': 'Kiểm tra thanh toán', + 'paymentTestOrderInfo': 'Thông tin đơn hàng kiểm tra', + 'paymentTestProductId': 'Mã sản phẩm', + 'paymentTestProductDescription': 'Mô tả sản phẩm', + 'paymentTestWechatDescription': 'Kiểm tra thanh toán WeChat', + 'paymentTestAlipayDescription': 'Kiểm tra thanh toán Alipay', + 'paymentTestAmount': 'Số tiền', + 'paymentTestSelectAmount': 'Chọn số tiền kiểm tra', + 'paying': 'Đang thanh toán...', + 'wechatPayWithAmount': 'WeChat Pay ¥@amount', + 'alipayPayWithAmount': 'Alipay ¥@amount', + 'paymentStatusTitle': 'Trạng thái thanh toán', + 'errorInfoWithMessage': 'Lỗi: @message', + 'retest': 'Kiểm tra lại', + 'paymentTestInstructionsTitle': 'Hướng dẫn', + 'paymentTestInstructionsContent': + '1. Chọn số tiền kiểm tra (khuyến nghị: ¥0.01)\n2. Nhấn nút thanh toán để bắt đầu\n3. Hoàn tất thanh toán trong ứng dụng thanh toán\n4. Quay lại kiểm tra kết quả', + 'startingWechatPayment': 'Đang khởi động WeChat Pay...', + 'startingAlipayPayment': 'Đang khởi động Alipay...', + 'wechatPaymentSuccess': 'Thanh toán WeChat Pay thành công!', + 'wechatPaymentFailed': 'Thanh toán WeChat Pay thất bại', + 'wechatPaymentLaunchFailed': 'Không thể khởi chạy WeChat Pay', + 'cannotLaunchWechatPayment': 'Không thể mở WeChat Pay', + 'wechatPaymentException': 'WeChat Pay gặp lỗi', + 'wechatPaymentTestCompleted': 'Kiểm tra thanh toán WeChat Pay hoàn tất', + 'alipayPaymentSuccess': 'Thanh toán Alipay thành công!', + 'alipayPaymentFailed': 'Thanh toán Alipay thất bại', + 'alipayPaymentLaunchFailed': 'Không thể khởi chạy Alipay', + 'cannotLaunchAlipayPayment': 'Không thể mở Alipay', + 'alipayPaymentException': 'Alipay gặp lỗi', + "insufficientIntegral": "Không đủ điểm", + "insufficientBalanceDesc": + "Số dư không đủ, vui lòng đến trang nạp tương ứng để nạp tiền.", + "recharge": "Đi nạp tiền", + "aiMemberExpiredDesc": + "Gói thành viên AI đã hết hạn, vui lòng đến trang gia hạn để gia hạn.", // 商品模块 - AI商品页 - 'musicAndRecommendation': 'Music & Recommendation', - 'navigationAndRoutes': 'Navigation & Routes', - 'nearbySearch': 'Nearby Search', - 'newsInformation': 'News', - 'communicationAssistant': 'Communication Assistant', - 'aiHeaderDesc1': 'Longer conversation quota, more tool calls, extended context length.', - 'aiHeaderDesc2': 'Suitable for agent Q&A, summarization, analysis, and task execution.', - 'musicSearchPlaybackControl': 'Music library search and playback control', - 'smartPlaylistAndSimilarRecommendations': 'Smart playlist and similar song recommendations', - 'routePlanningAndCongestionAvoidance': 'Route planning and congestion avoidance', - 'voiceBroadcastAndWaypoints': 'Voice broadcast and waypoint settings', - 'realTimeWeatherForecast': 'Real-time weather and forecast', - 'clothingAdviceAndTravelReminders': 'Clothing advice and travel reminders', - 'poiSearchFoodGasParking': 'POI search: dining / gas / parking', - 'ratingsHoursAndDirectRoutes': 'Ratings, business hours, and direct routing', - 'hotNewsAndTopicOverview': 'Hot news and topic overview', - 'longArticleSummariesAndKeyPoints': 'Long-article summaries and key points', - 'helpCallAndSMS': 'Help with calls and SMS', - 'templatedMessagesAndScheduleReminders': 'Template messages and schedule reminders', - 'aiDisclaimer': 'Features depend on device permissions, service availability, and network conditions.', + 'musicAndRecommendation': 'Âm nhạc & Gợi ý', + 'navigationAndRoutes': 'Điều hướng & Lộ trình', + 'nearbySearch': 'Tìm kiếm lân cận', + 'newsInformation': 'Tin tức', + 'communicationAssistant': 'Trợ lý liên lạc', + 'aiHeaderDesc1': + 'Hạn mức hội thoại dài hơn, nhiều lượt gọi công cụ hơn, ngữ cảnh dài hơn.', + 'aiHeaderDesc2': + 'Phù hợp cho hỏi đáp tác nhân, tóm tắt, phân tích và thực thi nhiệm vụ.', + 'musicSearchPlaybackControl': 'Tìm kiếm thư viện nhạc và điều khiển phát', + 'smartPlaylistAndSimilarRecommendations': + 'Danh sách phát thông minh và gợi ý bài hát tương tự', + 'routePlanningAndCongestionAvoidance': + 'Lập kế hoạch lộ trình và tránh ùn tắc', + 'voiceBroadcastAndWaypoints': 'Phát giọng nói và cài đặt điểm dừng', + 'realTimeWeatherForecast': 'Thời tiết và dự báo theo thời gian thực', + 'clothingAdviceAndTravelReminders': 'Gợi ý trang phục và nhắc nhở di chuyển', + 'poiSearchFoodGasParking': 'Tìm POI: ăn uống / xăng / đỗ xe', + 'ratingsHoursAndDirectRoutes': 'Đánh giá, giờ mở cửa và dẫn đường trực tiếp', + 'hotNewsAndTopicOverview': 'Tin nóng và tổng quan chủ đề', + 'longArticleSummariesAndKeyPoints': 'Tóm tắt bài dài và điểm chính', + 'helpCallAndSMS': 'Hỗ trợ gọi điện và SMS', + 'templatedMessagesAndScheduleReminders': 'Tin nhắn mẫu và nhắc lịch', + 'aiDisclaimer': + 'Tính năng phụ thuộc vào quyền thiết bị, khả dụng dịch vụ và điều kiện mạng.', // 商品模块 - 翻译商品页 - 'realtimeTranscription': 'Real-time Transcription', - 'sceneLexicon': 'Scenario Glossary', - 'subtitleDisplay': 'Subtitles', - 'transHeaderDesc1': 'Real-time simultaneous interpretation and text translation with low-latency voice.', - 'transHeaderDesc2': 'Suitable for travel, business, speeches, and teaching.', - 'translateZhEn': 'Chinese-English translation', - 'lowLatencyVoiceBroadcast': 'Low-latency voice broadcast', - 'multiLangTextTranslation': 'Multilingual text translation', - 'termOptimizationContextPreserve': 'Terminology optimization and context preservation', - 'lexiconTourBusinessLife': 'Travel/Business/Life lexicons', - 'personalVocabularyMemory': 'Personal vocabulary memory', - 'conversationSubtitleLargeText': 'Conversation subtitles / Large-text mode', - 'colorHighContrast': 'High color contrast', - 'transDisclaimer': 'Translation performance depends on microphone, network latency, and ambient noise.', + 'realtimeTranscription': 'Chuyển giọng nói thành văn bản thời gian thực', + 'sceneLexicon': 'Từ điển theo ngữ cảnh', + 'subtitleDisplay': 'Phụ đề', + 'transHeaderDesc1': + 'Phiên dịch đồng thời thời gian thực và dịch văn bản với giọng nói độ trễ thấp.', + 'transHeaderDesc2': + 'Phù hợp cho du lịch, công việc, thuyết trình và giảng dạy.', + 'translateZhEn': 'Dịch Trung–Anh', + 'lowLatencyVoiceBroadcast': 'Phát giọng nói độ trễ thấp', + 'multiLangTextTranslation': 'Dịch văn bản đa ngôn ngữ', + 'termOptimizationContextPreserve': 'Tối ưu thuật ngữ và giữ ngữ cảnh', + 'lexiconTourBusinessLife': 'Từ vựng Du lịch/Kinh doanh/Đời sống', + 'personalVocabularyMemory': 'Ghi nhớ từ vựng cá nhân', + 'conversationSubtitleLargeText': 'Phụ đề hội thoại / Chế độ chữ lớn', + 'colorHighContrast': 'Tương phản màu cao', + 'transDisclaimer': + 'Hiệu quả dịch phụ thuộc vào micro, độ trễ mạng và tiếng ồn môi trường.', // 商品模块 - 会议商品页 - 'meetingRecording': 'Meeting Recording', - 'transcriptionAndSummary': 'Transcription & Summary', - 'keywordSearch': 'Keyword Search', - 'collaborationSharing': 'Collaboration & Sharing', - 'meetingHeaderDesc1': 'Audio recording, transcription, keyword search, and auto summary to boost meeting efficiency.', - 'meetingHeaderDesc2': 'Suitable for business meetings, class notes, and interview minutes.', - 'meetingAutoRecording': 'Auto recording and segmentation', - 'meetingSpeakerTagging': 'Speaker labeling', - 'meetingLongAudioTranscription': 'Long audio transcription', - 'meetingKeyPointSummary': 'Key point extraction', - 'meetingTopicNameSearch': 'Search by topic/name', - 'meetingTimelineJump': 'Timeline jump', - 'meetingExportSummary': 'Export minutes', - 'meetingMultiPlatformShare': 'Share across platforms', - 'meetingDisclaimer': 'Use in quiet environments; performance depends on microphone and network.', + 'meetingRecording': 'Ghi âm cuộc họp', + 'transcriptionAndSummary': 'Chuyển biên & Tóm tắt', + 'keywordSearch': 'Tìm kiếm theo từ khóa', + 'collaborationSharing': 'Cộng tác & Chia sẻ', + 'meetingHeaderDesc1': + 'Ghi âm, chuyển biên, tìm kiếm từ khóa và tóm tắt tự động để tăng hiệu quả cuộc họp.', + 'meetingHeaderDesc2': + 'Phù hợp cho họp công việc, ghi chú lớp học và biên bản phỏng vấn.', + 'meetingAutoRecording': 'Ghi âm và phân đoạn tự động', + 'meetingSpeakerTagging': 'Gắn nhãn người nói', + 'meetingLongAudioTranscription': 'Chuyển biên audio dài', + 'meetingKeyPointSummary': 'Trích xuất điểm chính', + 'meetingTopicNameSearch': 'Tìm theo chủ đề/tên', + 'meetingTimelineJump': 'Nhảy theo mốc thời gian', + 'meetingExportSummary': 'Xuất biên bản', + 'meetingMultiPlatformShare': 'Chia sẻ đa nền tảng', + 'meetingDisclaimer': + 'Nên dùng ở nơi yên tĩnh; hiệu quả phụ thuộc vào micro và mạng.', // 商品模块 - VIP会员页 - 'benefitsOverview': 'Benefits overview', - 'higherQuota': 'Higher usage quota', - 'lowerUnitPrice': 'Lower unit price', - 'priorityService': 'Priority service', - 'exclusiveSupportChannel': 'Dedicated support channel', - 'fastResponse': 'Fast issue response', - 'eventsAndDiscounts': 'Events and discounts', - 'memberExclusiveEvents': 'Member-exclusive events', - 'longTermDiscountPlan': 'Long-term discount plan', - 'generalPrivileges': 'General privileges', - 'earlyAccessNewFeatures': 'Early access to new features', - 'crossDeviceSync': 'Cross-device sync', - 'vipDisclaimer': 'Actual benefits depend on the package details and may change with versions.', + 'benefitsOverview': 'Tổng quan quyền lợi', + 'higherQuota': 'Hạn mức sử dụng cao hơn', + 'lowerUnitPrice': 'Đơn giá thấp hơn', + 'priorityService': 'Dịch vụ ưu tiên', + 'exclusiveSupportChannel': 'Kênh hỗ trợ riêng', + 'fastResponse': 'Phản hồi nhanh', + 'eventsAndDiscounts': 'Sự kiện và ưu đãi', + 'memberExclusiveEvents': 'Sự kiện dành riêng cho hội viên', + 'longTermDiscountPlan': 'Gói ưu đãi dài hạn', + 'generalPrivileges': 'Quyền lợi chung', + 'earlyAccessNewFeatures': 'Trải nghiệm sớm tính năng mới', + 'crossDeviceSync': 'Đồng bộ đa thiết bị', + 'vipDisclaimer': + 'Quyền lợi thực tế phụ thuộc vào chi tiết gói và có thể thay đổi theo phiên bản.', // 商品模块 - 商品名称与描述 - 'ai_001_name': 'AI Basic 100', - 'ai_002_name': 'AI Basic 500', - 'ai_003_name': 'AI Basic 1000', - 'meet_001_name': 'Meeting Basic 100', - 'meet_002_name': 'Meeting Basic 500', - 'meet_003_name': 'Meeting Basic 1000', - 'trans_001_name': 'Translation Basic 100', - 'trans_002_name': 'Translation Basic 500', - 'trans_003_name': 'Translation Basic 1000', - 'ai_001_desc': 'Includes 100 uses. Access core AI features.', - 'ai_002_desc': 'Includes 500 uses. Access core AI features.', - 'ai_003_desc': 'Includes 1000 uses. Access core AI features.', - 'meet_001_desc': 'Includes 100 meeting recordings/transcriptions.', - 'meet_002_desc': 'Includes 500 meeting recordings/transcriptions.', - 'meet_003_desc': 'Includes 1000 meeting recordings/transcriptions.', - 'trans_001_desc': 'Includes 100 translations (voice/text).', - 'trans_002_desc': 'Includes 500 translations (voice/text).', - 'trans_003_desc': 'Includes 1000 translations (voice/text).', + 'ai_001_name': 'AI Cơ bản 100', + 'ai_002_name': 'AI Cơ bản 500', + 'ai_003_name': 'AI Cơ bản 1000', + 'meet_001_name': 'Cuộc họp Cơ bản 100', + 'meet_002_name': 'Cuộc họp Cơ bản 500', + 'meet_003_name': 'Cuộc họp Cơ bản 1000', + 'trans_001_name': 'Dịch Cơ bản 100', + 'trans_002_name': 'Dịch Cơ bản 500', + 'trans_003_name': 'Dịch Cơ bản 1000', + 'ai_001_desc': 'Bao gồm 100 lượt dùng. Truy cập tính năng AI cốt lõi.', + 'ai_002_desc': 'Bao gồm 500 lượt dùng. Truy cập tính năng AI cốt lõi.', + 'ai_003_desc': 'Bao gồm 1000 lượt dùng. Truy cập tính năng AI cốt lõi.', + 'meet_001_desc': 'Bao gồm 100 lượt ghi âm/chuyển biên cuộc họp.', + 'meet_002_desc': 'Bao gồm 500 lượt ghi âm/chuyển biên cuộc họp.', + 'meet_003_desc': 'Bao gồm 1000 lượt ghi âm/chuyển biên cuộc họp.', + 'trans_001_desc': 'Bao gồm 100 lượt dịch (giọng nói/văn bản).', + 'trans_002_desc': 'Bao gồm 500 lượt dịch (giọng nói/văn bản).', + 'trans_003_desc': 'Bao gồm 1000 lượt dịch (giọng nói/văn bản).', // 商品模块 - 页脚 'appNameProvider': 'App: VoiTrans · Provided by: VoiTrans', @@ -390,39 +437,41 @@ const Map viVN = { // 新手引导 'skip': 'Bỏ qua', - 'next': 'Next', - 'sayLilyHint': 'Say "Lily Lily" to the mic', - 'imHere': 'I’m here~', - 'guideWelcomeWakeAI': 'Welcome to Voitrans! First, wake your AI “Lily”.', - 'aiReplyCompleted': 'Lily has finished the reply!', - 'aiThinking': 'Lily is thinking…', - 'guideAwakenSuccess': 'Great! Lily is awake—ask it to help.', - 'confirmInput': 'Confirm Input', - 'guideClickSendPrefix': 'Tap send, ', - 'guideWeatherStart': 'Tell Lily: “What’s the weather today?”', - 'guideWeatherInput': 'What’s the weather today?', - 'guideWeatherSend': 'Lily will report the weather in real time', - 'guideWeatherEnd': 'Lily can report weather live—try other commands', - 'guideMusicStart': 'Tell Lily: “Play some rock music”', - 'guideMusicInput': 'Play some rock music', - 'guideMusicSend': 'Lily will find music for you', - 'guideMusicEnd': 'Lily found music—try other commands', - 'guideNavStart': 'Tell Lily: “Navigate to Shenzhen Airport”', - 'guideNavInput': 'Navigate to Shenzhen Airport', - 'guideNavSend': 'Lily will plan the route', - 'guideNavEnd': 'Navigation set—try other commands', - 'guideMeetingStart': 'Tell Lily: “Create a meeting reminder for 3pm tomorrow”', - 'guideMeetingInput': 'Create a meeting reminder for 3pm tomorrow', - 'guideMeetingSend': 'Lily will create a meeting reminder', - 'guideMeetingEnd': 'Reminder created—try other commands', - 'guidePhoneStart': 'Tell Lily: “Call Mom”', - 'guidePhoneInput': 'Call Mom', - 'guidePhoneSend': 'Lily will make the call', - 'guidePhoneEnd': 'Call placed—try other commands', - 'guideSmsStart': 'Tell Lily: “Send Dad a text: I’ll be home for dinner”', - 'guideSmsInput': 'Text Dad: I’ll be home for dinner', - 'guideSmsSend': 'Lily will send the message', - 'guideSmsEnd': 'Message sent—voice control is convenient', + 'next': 'Tiếp theo', + 'sayLilyHint': 'Nói "Lily Lily" vào mic', + 'imHere': 'Tôi đây~', + 'guideWelcomeWakeAI': + 'Chào mừng đến với Voitrans! Trước tiên, hãy đánh thức AI “Lily” của bạn.', + 'aiReplyCompleted': 'Lily đã trả lời xong!', + 'aiThinking': 'Lily đang suy nghĩ…', + 'guideAwakenSuccess': 'Tuyệt! Lily đã thức dậy—hãy nhờ Lily giúp.', + 'confirmInput': 'Xác nhận nhập', + 'guideClickSendPrefix': 'Nhấn gửi, ', + 'guideWeatherStart': 'Nói với Lily: “Hôm nay thời tiết thế nào?”', + 'guideWeatherInput': 'Hôm nay thời tiết thế nào?', + 'guideWeatherSend': 'Lily sẽ báo thời tiết theo thời gian thực', + 'guideWeatherEnd': 'Lily có thể báo thời tiết trực tiếp—hãy thử lệnh khác', + 'guideMusicStart': 'Nói với Lily: “Bật một chút nhạc rock”', + 'guideMusicInput': 'Bật một chút nhạc rock', + 'guideMusicSend': 'Lily sẽ tìm nhạc cho bạn', + 'guideMusicEnd': 'Lily đã tìm được nhạc—hãy thử lệnh khác', + 'guideNavStart': 'Nói với Lily: “Điều hướng đến Sân bay Thâm Quyến”', + 'guideNavInput': 'Điều hướng đến Sân bay Thâm Quyến', + 'guideNavSend': 'Lily sẽ lập lộ trình', + 'guideNavEnd': 'Đã thiết lập điều hướng—hãy thử lệnh khác', + 'guideMeetingStart': + 'Nói với Lily: “Tạo nhắc nhở cuộc họp lúc 3 giờ chiều ngày mai”', + 'guideMeetingInput': 'Tạo nhắc nhở cuộc họp lúc 3 giờ chiều ngày mai', + 'guideMeetingSend': 'Lily sẽ tạo nhắc nhở cuộc họp', + 'guideMeetingEnd': 'Đã tạo nhắc nhở—hãy thử lệnh khác', + 'guidePhoneStart': 'Nói với Lily: “Gọi cho Mẹ”', + 'guidePhoneInput': 'Gọi cho Mẹ', + 'guidePhoneSend': 'Lily sẽ thực hiện cuộc gọi', + 'guidePhoneEnd': 'Đã thực hiện cuộc gọi—hãy thử lệnh khác', + 'guideSmsStart': 'Nói với Lily: “Nhắn cho Bố: Con sẽ về nhà ăn tối”', + 'guideSmsInput': 'Nhắn cho Bố: Con sẽ về nhà ăn tối', + 'guideSmsSend': 'Lily sẽ gửi tin nhắn', + 'guideSmsEnd': 'Đã gửi tin nhắn—điều khiển giọng nói thật tiện lợi', // Meeting模块 - 首页与导航 "startMeeting": "Bắt đầu cuộc họp", @@ -436,47 +485,53 @@ const Map viVN = { 'recordingDetails': 'Chi tiết bản ghi', 'aiSummary': 'Tóm tắt AI', 'meetingTranscript': 'Bản ghi cuộc họp', - 'files': 'Files', - 'mine': 'Mine', - 'connect': 'Connect', - 'allFiles': 'All Files', - 'searchInAllFiles': 'Search in all files', - 'from': 'From', - 'sortBy': 'Sort by', - 'creationTime': 'Creation Time', - 'bluetoothConnection': 'Bluetooth Connection', - 'meetingReconnect': 'Reconnect', - 'searching': 'Searching...', - 'searchFailed': 'Search failed, please check if Bluetooth is enabled', - 'aiPenNotFound': 'AI PEN device not found', - 'connectedToAiPen': 'Connected to AI PEN device', - 'checkingNewFiles': 'Checking for new files to import', - 'startingWifi': 'Starting Wi-Fi...', - 'newFilesDetected': 'New files detected, preparing to import', - 'noNewFiles': 'No new files to import', - 'connectingWifi': 'Connecting to Wi-Fi...', - 'wifiConnected': 'Wi-Fi connected successfully', - 'downloadingFiles': 'Downloading files...', - 'downloadingFileProgress': 'Total {total} files, downloading file {current}', - 'downloadComplete': 'Download complete', - 'downloadCompleteInfo': 'Download complete, {count} files in total, returning automatically in 2 seconds', + 'files': 'Tệp', + 'mine': 'Của tôi', + 'connect': 'Kết nối', + 'allFiles': 'Tất cả tệp', + 'searchInAllFiles': 'Tìm trong tất cả tệp', + 'from': 'Từ', + 'sortBy': 'Sắp xếp theo', + 'creationTime': 'Thời gian tạo', + 'bluetoothConnection': 'Kết nối Bluetooth', + 'meetingReconnect': 'Kết nối lại', + 'searching': 'Đang tìm kiếm...', + 'searchFailed': 'Tìm kiếm thất bại, vui lòng kiểm tra Bluetooth đã bật chưa', + 'aiPenNotFound': 'Không tìm thấy thiết bị AI PEN', + 'connectedToAiPen': 'Đã kết nối với thiết bị AI PEN', + 'checkingNewFiles': 'Đang kiểm tra tệp mới để nhập', + 'startingWifi': 'Đang khởi động Wi‑Fi...', + 'newFilesDetected': 'Phát hiện tệp mới, đang chuẩn bị nhập', + 'noNewFiles': 'Không có tệp mới để nhập', + 'connectingWifi': 'Đang kết nối Wi‑Fi...', + 'wifiConnected': 'Kết nối Wi‑Fi thành công', + 'downloadingFiles': 'Đang tải xuống tệp...', + 'downloadingFileProgress': 'Tổng {total} tệp, đang tải tệp {current}', + 'downloadComplete': 'Tải xuống hoàn tất', + 'downloadCompleteInfo': + 'Tải xuống hoàn tất, tổng {count} tệp, tự động quay lại sau 2 giây', // Meeting模块 - 录音功能 - 'startRecording': 'Start Recording', - 'liveRecording': 'Live Recording', - 'audioVideoRecording': 'Audio/Video Recording', - 'callRecording': 'Call Recording', - 'importAudio': 'Import Audio', + 'startRecording': 'Bắt đầu ghi âm', + 'liveRecording': 'Ghi âm trực tiếp', + 'audioVideoRecording': 'Ghi âm âm thanh/video', + 'callRecording': 'Ghi âm cuộc gọi', + 'importAudio': 'Nhập audio', 'meetingRecordExitTitle': 'Thoát ghi âm', // 退出录音 - 'meetingRecordExitMessage': 'Vui lòng chọn thao tác sau khi thoát', // 请选择离开后的操作 + 'meetingRecordExitMessage': + 'Vui lòng chọn thao tác sau khi thoát', // 请选择离开后的操作 'meetingRecordEndAndSave': 'Kết thúc và lưu', // 结束录音并保存 'meetingRecordEndWithoutSave': 'Kết thúc không lưu', // 结束录音不保存 'meetingRecordContinueInBackground': 'Tiếp tục ghi âm trong nền', // 后台继续录音 - 'meetingRecordStopTimeout': 'Hết thời gian dừng ghi âm, vui lòng thử lại', // 结束录音超时,请重试 - 'meetingRecordStopFailed': 'Dừng ghi âm thất bại, vui lòng thử lại', // 结束录音失败,请重试 - 'meetingRecordSaveFailed': 'Lưu ghi âm thất bại, vui lòng thử lại', // 保存录音失败,请重试 + 'meetingRecordStopTimeout': + 'Hết thời gian dừng ghi âm, vui lòng thử lại', // 结束录音超时,请重试 + 'meetingRecordStopFailed': + 'Dừng ghi âm thất bại, vui lòng thử lại', // 结束录音失败,请重试 + 'meetingRecordSaveFailed': + 'Lưu ghi âm thất bại, vui lòng thử lại', // 保存录音失败,请重试 'meetingRecordRecordingNotificationTitle': 'Đang ghi âm', // 录音进行中 - 'meetingRecordRecordingNotificationBody': 'Đang ghi âm trong nền, nhấn để quay lại ứng dụng', // 正在后台录音,点击返回应用 + 'meetingRecordRecordingNotificationBody': + 'Đang ghi âm trong nền, nhấn để quay lại ứng dụng', // 正在后台录音,点击返回应用 'overlayPermissionTitle': 'Quyền cửa sổ nổi', // 悬浮窗权限 'overlayPermissionTranslationDesc': 'Để hiển thị kết quả dịch trong cuộc gọi hoặc khi dịch âm thanh/video, chúng tôi cần quyền hiển thị trên ứng dụng khác. Quyền này giúp bạn xem bản dịch theo thời gian thực khi đang dùng các ứng dụng khác.', // 为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。 @@ -484,194 +539,213 @@ const Map viVN = { 'Để hiển thị thanh nổi ghi âm (hẹn giờ/tạm dừng/tiếp tục) trong khi ghi âm, chúng tôi cần quyền hiển thị trên ứng dụng khác.', // 为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。 'overlayPermissionOpenSettingsFailed': 'Không thể tự động mở cài đặt hệ thống. Vui lòng mở Cài đặt và bật quyền hiển thị trên ứng dụng khác theo cách thủ công.', // 无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。 - 'transcribing': 'Transcribing...', - 'summarizing': 'Summarizing...', - 'analyzing': 'Analyzing...', - 'summaryComplete': 'Summary Complete', - 'generate': 'Generate', - 'overview': 'Overview', - 'transcription': 'Transcription', - 'summary': 'Summary', - 'mindMap': 'Mind Map', - 'editSpeaker': 'Edit', - 'nameSpeaker': 'Name Speaker', + 'transcribing': 'Đang chuyển biên...', + 'summarizing': 'Đang tóm tắt...', + 'analyzing': 'Đang phân tích...', + 'summaryComplete': 'Tóm tắt hoàn tất', + 'generate': 'Tạo', + 'overview': 'Tổng quan', + 'transcription': 'Bản ghi', + 'summary': 'Tóm tắt', + 'mindMap': 'Sơ đồ tư duy', + 'editSpeaker': 'Chỉnh sửa', + 'nameSpeaker': 'Đặt tên người nói', // Meeting模块 - 转写与总结 - 'reSummarize': 'Re-summarize', - 'dateAndTime': 'Date & Time', - 'location': 'Location', - 'attendees': 'Attendees', - 'inputLocation': 'Enter Location', - 'inputAttendees': 'Enter Attendees', + 'reSummarize': 'Tóm tắt lại', + 'dateAndTime': 'Ngày & giờ', + 'location': 'Địa điểm', + 'attendees': 'Người tham dự', + 'inputLocation': 'Nhập địa điểm', + 'inputAttendees': 'Nhập người tham dự', // Meeting模块 - 模版与生成 - 'selectSummaryTemplate': 'Select Summary Template', - 'useThisTemplate': 'Use This Template', - 'lastUsed': 'Last Used', - 'create': 'Tạo', - 'templateDetails': 'Chi tiết mẫu', - 'tag': 'Thẻ', - 'description': 'Mô tả', - 'template': 'Mẫu', - 'deleteTemplate': 'Xóa mẫu', - 'deleteTemplateConfirm': 'Bạn có chắc chắn muốn xóa mẫu này không?', - 'editTemplate': 'Chỉnh sửa mẫu', - 'createTemplate': 'Tạo mẫu', - 'name': 'Tên', - 'templateContentHint': 'Vui lòng nhập nội dung mẫu! Mẹo: Nhấn nút AI ở trên để tạo nhanh nội dung mẫu dựa trên tên và mô tả bạn đã nhập', - 'inputNameHint': 'Vui lòng nhập tên', - 'inputDescHint': 'Vui lòng nhập mô tả', - 'custom': 'Tùy chỉnh', - 'pleaseEnter': 'Vui lòng nhập', - 'viewAll': 'View All', - 'recordingLanguage': 'Recording Language', - 'chineseSimplified': 'Chinese Mandarin (Simplified)', - 'meetingGenerateNow': 'Generate Now', - 'keyEventsAnalyzed': 'Analyzed {count} key events.', - 'aiAnalysisDesc': 'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.', + 'selectSummaryTemplate': 'Chọn mẫu tóm tắt', + 'useThisTemplate': 'Dùng mẫu này', + 'lastUsed': 'Dùng gần đây', + 'create': 'Tạo', + 'templateDetails': 'Chi tiết mẫu', + 'tag': 'Thẻ', + 'description': 'Mô tả', + 'template': 'Mẫu', + 'deleteTemplate': 'Xóa mẫu', + 'deleteTemplateConfirm': 'Bạn có chắc chắn muốn xóa mẫu này không?', + 'editTemplate': 'Chỉnh sửa mẫu', + 'createTemplate': 'Tạo mẫu', + 'name': 'Tên', + 'templateContentHint': + 'Vui lòng nhập nội dung mẫu! Mẹo: Nhấn nút AI ở trên để tạo nhanh nội dung mẫu dựa trên tên và mô tả bạn đã nhập', + 'inputNameHint': 'Vui lòng nhập tên', + 'inputDescHint': 'Vui lòng nhập mô tả', + 'custom': 'Tùy chỉnh', + 'pleaseEnter': 'Vui lòng nhập', + 'viewAll': 'Xem tất cả', + 'recordingLanguage': 'Ngôn ngữ ghi âm', + 'chineseSimplified': 'Quan thoại (Giản thể)', + 'meetingGenerateNow': 'Tạo ngay', + 'keyEventsAnalyzed': 'Đã phân tích {count} sự kiện chính.', + 'aiAnalysisDesc': + 'Phân tích AI giúp xác định các sự kiện chính trong bản ghi, cho phép bạn chọn sự kiện quan trọng để AI tạo nội dung.', // Meeting模块 - 文件操作 - 'importing': 'Importing...', - 'batchImporting': 'Batch importing...', - 'importingLocalRecordings': 'Importing local recordings...', - 'importFailed': 'Import file failed: {filePath}, error: {error}', - 'importSuccess': 'Successfully imported {count} local recordings', - 'importError': 'Import failed: {error}', - 'pleaseSelectAudioFile': 'Please select audio file', - 'shareAudio': 'Share Meeting Audio', - 'shareComplete': 'Share complete!', - 'shareFailed': 'Share failed: {error}', - 'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}', + 'importing': 'Đang nhập...', + 'batchImporting': 'Đang nhập hàng loạt...', + 'importingLocalRecordings': 'Đang nhập bản ghi cục bộ...', + 'importFailed': 'Nhập tệp thất bại: {filePath}, lỗi: {error}', + 'importSuccess': 'Đã nhập thành công {count} bản ghi cục bộ', + 'importError': 'Nhập thất bại: {error}', + 'pleaseSelectAudioFile': 'Vui lòng chọn tệp audio', + 'shareAudio': 'Chia sẻ audio cuộc họp', + 'shareComplete': 'Chia sẻ hoàn tất', + 'shareFailed': 'Chia sẻ thất bại: {error}', + 'fileProcessingFailed': 'Xử lý tệp thất bại: {filePath}, lỗi: {error}', // Meeting模块 - 思维导图 - 'saveMindMap': 'Lưu sơ đồ tư duy', - 'shareMindMap': 'Share Mind Map', - 'shareSuccess': 'Share Success', + 'saveMindMap': 'Lưu sơ đồ tư duy', + 'shareMindMap': 'Chia sẻ sơ đồ tư duy', + 'shareSuccess': 'Chia sẻ thành công', // Meeting模块 - AI问答 - 'askAI': 'Ask AI ...', - 'askAIPrompt': 'What can I help you with today?', - 'continueAsk': 'Continue Asking', - 'todoList': 'To-Do List', - 'extractConclusion': 'Extract Conclusion', - 'generateKeyIndicators': 'Generate Key Indicators', + 'askAI': 'Hỏi AI ...', + 'askAIPrompt': 'Hôm nay tôi có thể giúp gì cho bạn?', + 'continueAsk': 'Tiếp tục hỏi', + 'todoList': 'Danh sách việc cần làm', + 'extractConclusion': 'Trích xuất kết luận', + 'generateKeyIndicators': 'Tạo chỉ số chính', // Meeting模块 - 分享与导出 - 'shareLink': 'Share Link', - 'copyTranscript': 'Copy Transcript', - 'copySummary': 'Copy Summary', - 'exportAudio': 'Export Audio', - 'exportTranscript': 'Export Transcript', - 'shareMeetingAudio': 'Share Meeting Audio', - 'exportSummary': 'Export Summary', - 'exportAs': 'Export As', - 'exportingPDF': 'Exporting PDF...', - 'export': 'Xuất', + 'shareLink': 'Chia sẻ liên kết', + 'copyTranscript': 'Sao chép bản ghi', + 'copySummary': 'Sao chép tóm tắt', + 'exportAudio': 'Xuất audio', + 'exportTranscript': 'Xuất bản ghi', + 'shareMeetingAudio': 'Chia sẻ audio cuộc họp', + 'exportSummary': 'Xuất tóm tắt', + 'exportAs': 'Xuất dưới dạng', + 'exportingPDF': 'Đang xuất PDF...', + 'export': 'Xuất', // Meeting模块 - 发言者 'applyToAllParagraphs': 'Áp dụng cho tất cả đoạn của người nói này', - 'summaryWillBeUpdatedAutomatically': 'Tóm tắt sẽ được cập nhật tự động dựa trên mẫu', - 'nameCurrentSpeaker': 'Name Current Speaker', - 'recentlyUsedNames': 'Recently Used Names', - 'applyToCurrentParagraph': 'Apply to Current Paragraph', - 'totalTime': 'Total Time', - 'summarySpeakerWillBeUpdatedAutomatically': 'Summary speakers will be updated automatically', + 'summaryWillBeUpdatedAutomatically': + 'Tóm tắt sẽ được cập nhật tự động dựa trên mẫu', + 'nameCurrentSpeaker': 'Đặt tên người nói hiện tại', + 'recentlyUsedNames': 'Tên dùng gần đây', + 'applyToCurrentParagraph': 'Áp dụng cho đoạn hiện tại', + 'totalTime': 'Tổng thời gian', + 'summarySpeakerWillBeUpdatedAutomatically': + 'Người nói trong phần tóm tắt sẽ được cập nhật tự động', // Meeting模块 - 云端同步 - 'syncToCloud': 'Sync to Cloud', + 'syncToCloud': 'Đồng bộ lên đám mây', 'syncToCloudTip': - '自动将你的录音同步到云端,你可以通过任意VOITRANS APP或VOITRANS Web(web.voitrans.com)播放、管理和分享录音。', - 'syncToVoitransApp': 'Sync VOITRANS APP', - 'transcriptionRecord': 'Transcription Record', + 'Tự động đồng bộ bản ghi của bạn lên đám mây; bạn có thể phát, quản lý và chia sẻ bản ghi qua VOITRANS APP hoặc VOITRANS Web (web.voitrans.com).', + 'syncToVoitransApp': 'Đồng bộ VOITRANS APP', + 'transcriptionRecord': 'Bản ghi chuyển biên', // Meeting模块 - 我的页面 - 'transcriptionRecords': 'Transcription Records', - 'templateCommunity': 'Template Community', - 'comingSoon': 'Coming Soon', - 'integration': 'Integration', + 'transcriptionRecords': 'Các bản ghi chuyển biên', + 'templateCommunity': 'Cộng đồng mẫu', + 'comingSoon': 'Sắp ra mắt', + 'integration': 'Tích hợp', 'voitransPrivateCloud': 'VOITRANS PRIVATE CLOUD', - 'enabled': 'Enabled', - 'disabled': 'Disabled', - 'myVoitransDevice': 'My VOITRANS Device', - 'helpAndFeedback': 'Help & Feedback', - 'aboutVoitrans': 'About VOITRANS', - 'meetingDays': 'Days', - 'meetingHours': 'Hours', - 'voitransAiMember': 'Voitrans AI Member', - 'unlockStarterMember': 'Unlock Starter Member', - 'bindDeviceToActivate': 'Bind Voitrans device to activate Starter membership', - 'unlockNow': 'Unlock Now', + 'enabled': 'Bật', + 'disabled': 'Tắt', + 'myVoitransDevice': 'Thiết bị VOITRANS của tôi', + 'helpAndFeedback': 'Trợ giúp & phản hồi', + 'aboutVoitrans': 'Về VOITRANS', + 'meetingDays': 'Ngày', + 'meetingHours': 'Giờ', + 'voitransAiMember': 'Thành viên Voitrans AI', + 'unlockStarterMember': 'Mở khóa gói Starter', + 'bindDeviceToActivate': 'Liên kết thiết bị Voitrans để kích hoạt gói Starter', + 'unlockNow': 'Mở khóa ngay', // Meeting模块 - 会员与升级 - 'comparison': 'Comparison', - 'detailedInfo': 'Detailed Information', - 'monthlyTranscriptionTime': 'Monthly Transcription Time', - 'unlimited': 'Unlimited', - 'professionalTemplates': 'Professional Templates', - 'limited': 'Limited', - 'fullTemplates': 'Full Templates', - 'professionalTerms': 'Professional Terms', - 'customTemplates': 'Custom Templates', - 'visualMindMap': 'Visual Mind Map', - 'speakerIdentification': 'Speaker Identification', - 'aiVoiceEnhancement': 'AI Voice Enhancement', - 'audioImport': 'Audio Import', - 'multipleExportFormats': 'Multiple Export Formats', - 'professionalSummaryTemplates': 'Professional Summary Templates', - 'professionalTemplateDesc': 'Professional template design to improve your work efficiency. Customized according to industry needs.', - 'customTemplateDesc': 'You can customize summary prompts according to your needs and use them to generate the required summaries.', - 'askAiDesc': 'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.', - 'visualMindMapDesc': 'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.', - 'templateCommunityDesc': 'Discover, share, and get inspiration from the template library created by users.', - 'speakerIdentificationDesc': 'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.', - 'privateCloudSyncDesc': 'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.', - 'aiVoiceEnhancementDesc': 'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.', - 'audioImportDesc': 'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.', - 'multipleExportFormatsDesc': 'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.', - 'upgradeMembership': 'Upgrade Your Membership', - 'yearlySubscription': 'Yearly Subscription', - 'monthlySubscription': 'Monthly Subscription', + 'comparison': 'So sánh', + 'detailedInfo': 'Thông tin chi tiết', + 'monthlyTranscriptionTime': 'Thời lượng chuyển biên hằng tháng', + 'unlimited': 'Không giới hạn', + 'professionalTemplates': 'Mẫu chuyên nghiệp', + 'limited': 'Giới hạn', + 'fullTemplates': 'Đầy đủ mẫu', + 'professionalTerms': 'Thuật ngữ chuyên nghiệp', + 'customTemplates': 'Mẫu tùy chỉnh', + 'visualMindMap': 'Sơ đồ tư duy trực quan', + 'speakerIdentification': 'Nhận diện người nói', + 'aiVoiceEnhancement': 'Tăng cường giọng nói bằng AI', + 'audioImport': 'Nhập audio', + 'multipleExportFormats': 'Nhiều định dạng xuất', + 'professionalSummaryTemplates': 'Mẫu tóm tắt chuyên nghiệp', + 'professionalTemplateDesc': + 'Thiết kế mẫu chuyên nghiệp giúp tăng hiệu quả công việc. Tùy chỉnh theo nhu cầu ngành.', + 'customTemplateDesc': + 'Bạn có thể tùy chỉnh gợi ý tóm tắt theo nhu cầu và dùng để tạo bản tóm tắt mong muốn.', + 'askAiDesc': + 'Trích xuất thông tin sâu hơn từ bản ghi một cách thông minh; tạo bảng dữ liệu, kết luận thảo luận chính, danh sách việc cần làm, email báo cáo và nội dung định dạng khác chỉ với một chạm.', + 'visualMindMapDesc': + 'Không chỉ tóm tắt—sắp xếp và trực quan hóa điểm chính bằng sơ đồ tư duy để hiểu toàn văn hiệu quả hơn.', + 'templateCommunityDesc': + 'Khám phá, chia sẻ và lấy cảm hứng từ thư viện mẫu do người dùng tạo.', + 'speakerIdentificationDesc': + 'Chuyển biên sẽ hỗ trợ nhận diện người nói, tái hiện nội dung cuộc họp/cuộc gọi trực quan hơn. Đồng thời bản tóm tắt cũng chính xác hơn.', + 'privateCloudSyncDesc': + 'Bản ghi và bản chuyển biên của bạn sẽ được lưu an toàn trên máy chủ đám mây chuyên dụng, mã hóa toàn bộ khi tải lên và tải xuống để đảm bảo quyền riêng tư và bảo mật.', + 'aiVoiceEnhancementDesc': + 'Tăng cường giọng nói bằng AI hỗ trợ nhiều mức khử ồn, tự động loại bỏ tiếng ồn nền, tăng độ rõ giọng nói và cải thiện chất lượng phát lại.', + 'audioImportDesc': + 'Dễ dàng nhập tệp audio từ thiết bị hoặc ứng dụng bên thứ ba, như ghi âm, Google Drive, v.v.', + 'multipleExportFormatsDesc': + 'Xuất bản ghi audio, văn bản chuyển biên và bản tóm tắt ở nhiều định dạng (TXT, PDF, JPEG) theo nhu cầu.', + 'upgradeMembership': 'Nâng cấp gói thành viên', + 'yearlySubscription': 'Gói theo năm', + 'monthlySubscription': 'Gói theo tháng', 'proMonthly': 'Pro ¥60/month', - 'proMonthlyDesc': '7-day free trial, then ¥800/year. Cancel anytime before trial ends.', - 'sevenDayTrial': '7-day Free Trial', + 'proMonthlyDesc': + 'Dùng thử miễn phí 7 ngày, sau đó ¥800/năm. Có thể hủy trước khi kết thúc dùng thử.', + 'sevenDayTrial': 'Dùng thử miễn phí 7 ngày', 'unlimitedMonthly': 'Unlimited ¥120/month', - 'unlimitedMonthlyDesc': '7-day free trial, then ¥1600/year. Cancel anytime before trial ends.', - 'trialNote': '*Free trial for 7 days, then charged annually, cancel anytime.', + 'unlimitedMonthlyDesc': + 'Dùng thử miễn phí 7 ngày, sau đó ¥1600/năm. Có thể hủy trước khi kết thúc dùng thử.', + 'trialNote': + '*Dùng thử miễn phí 7 ngày, sau đó tính phí theo năm, có thể hủy bất cứ lúc nào.', 'proPrice': 'Pro ¥120', 'proMonthlyPrice': '¥120/month', - 'subscribe': 'Subscribe', - 'unlimitedPrice': 'Unlimited ¥198', + 'subscribe': 'Đăng ký', + 'unlimitedPrice': 'Không giới hạn ¥198', 'unlimitedMonthlyPrice': '¥198/month', - 'upgradeNote': '*After upgrading subscription, the remaining days of the original subscription will be automatically calculated and refunded to your payment account', - 'buyMoreTranscriptionTime': 'Buy More Transcription Time', + 'upgradeNote': + '*Sau khi nâng cấp đăng ký, số ngày còn lại của gói hiện tại sẽ được tính tự động và hoàn tiền vào tài khoản thanh toán của bạn', + 'buyMoreTranscriptionTime': 'Mua thêm thời lượng chuyển biên', 'sixThousandMinutes': '6,000 minutes', 'threeThousandMinutes': '3,000 minutes', 'sixHundredMinutes': '600 minutes', 'oneHundredTwentyMinutes': '120 minutes', - 'validityPeriod': '*Validity Period: ', - 'validityNote': 'Activated immediately after purchase, valid for 2 years after activation.', - 'purchase': 'Purchase', + 'validityPeriod': '*Thời hạn: ', + 'validityNote': + 'Kích hoạt ngay sau khi mua, có hiệu lực 2 năm kể từ khi kích hoạt.', + 'purchase': 'Mua', // Meeting模块 - 录音语言 - 'recordLanguage': 'Recording Language', - 'cantonese': 'Cantonese', - 'sichuan': 'Sichuan Dialect', - 'shanghai': 'Shanghai Dialect', + 'recordLanguage': 'Ngôn ngữ ghi âm', + 'cantonese': 'Tiếng Quảng Đông', + 'sichuan': 'Phương ngữ Tứ Xuyên', + 'shanghai': 'Phương ngữ Thượng Hải', // Meeting模块 - 错误提示 - 'meetingUnknownLanguage': 'Unknown Language', - 'analysisFailed': 'Phân tích thất bại, vui lòng thử lại sau', - 'transcriptionFailed': 'Chuyển đổi giọng nói thất bại, vui lòng thử lại sau', - 'summaryFailed': 'Tóm tắt thất bại, vui lòng thử lại sau', - 'summaryFailedShort': 'Tóm tắt thất bại', - 'transcriptionFailedShort': 'Chuyển đổi giọng nói thất bại', + 'meetingUnknownLanguage': 'Ngôn ngữ không xác định', + 'analysisFailed': 'Phân tích thất bại, vui lòng thử lại sau', + 'transcriptionFailed': 'Chuyển đổi giọng nói thất bại, vui lòng thử lại sau', + 'summaryFailed': 'Tóm tắt thất bại, vui lòng thử lại sau', + 'summaryFailedShort': 'Tóm tắt thất bại', + 'transcriptionFailedShort': 'Chuyển đổi giọng nói thất bại', // Meeting模块 - 播放器 - 'playerNotReady': 'Trình phát âm thanh chưa sẵn sàng, vui lòng đợi', - 'playFailed': 'Phát thất bại', - 'audioFileNotFound': 'Không tìm thấy tệp âm thanh', - 'fetchingAudio': 'Đang tải âm thanh từ đám mây...', - 'playerLoadFailed': 'Trình phát âm thanh không thể tải', + 'playerNotReady': 'Trình phát âm thanh chưa sẵn sàng, vui lòng đợi', + 'playFailed': 'Phát thất bại', + 'audioFileNotFound': 'Không tìm thấy tệp âm thanh', + 'fetchingAudio': 'Đang tải âm thanh từ đám mây...', + 'playerLoadFailed': 'Trình phát âm thanh không thể tải', // 设置页 "systemSettings": "Cài đặt hệ thống", @@ -680,9 +754,10 @@ const Map viVN = { "translationRecharge": "Nạp lại dịch vụ dịch", "meetingAssistantRecharge": "Nạp lại dịch vụ hỗ trợ họp", "cloudSync": "Chuyển đổi đồng bộ hóa đám mây", - "memberService": "Member Service", - "bindRewardTitle": "Rewards", - "bindRewardSimpleDesc": "First bind device reward has been issued. Tap OK to close.", + "memberService": "Dịch vụ hội viên", + "bindRewardTitle": "Phần thưởng", + "bindRewardSimpleDesc": + "Phần thưởng liên kết thiết bị lần đầu đã được phát. Nhấn OK để đóng.", "joinDevice": "Thiết bị đã kết nối:", "accountId": "ID tài khoản:", "systemSetting": "Cài đặt hệ thống", @@ -704,9 +779,11 @@ const Map viVN = { "voiceServiceInfo": "Chọn dịch vụ nhận dạng và tổng hợp giọng nói", "selectVoiceService": "Chọn dịch vụ giọng nói", "azureVoiceService": "Dịch vụ giọng nói Azure", - "azureVoiceServiceInfo": "Dịch vụ giọng nói đám mây của Microsoft, hỗ trợ tổng hợp và nhận dạng giọng nói chất lượng cao", + "azureVoiceServiceInfo": + "Dịch vụ giọng nói đám mây của Microsoft, hỗ trợ tổng hợp và nhận dạng giọng nói chất lượng cao", "flutterVoiceService": "Dịch vụ giọng nói cục bộ Flutter", - "flutterVoiceServiceInfo": "Dịch vụ giọng nói cục bộ trên thiết bị, có thể sử dụng mà không cần kết nối mạng", + "flutterVoiceServiceInfo": + "Dịch vụ giọng nói cục bộ trên thiết bị, có thể sử dụng mà không cần kết nối mạng", 'timbreService': 'Dịch vụ âm sắc', 'timbreServiceInfo': 'Chọn dịch vụ tổng hợp giọng nói âm sắc', 'defaultTimbre': 'Âm sắc mặc định', @@ -724,23 +801,25 @@ const Map viVN = { 'checkUpdateFailed': 'Kiểm tra cập nhật thất bại', 'networkErrorRetry': 'Lỗi mạng, vui lòng thử lại sau', "realtimeVoiceChat": "Trò chuyện giọng nói thời gian thực", - "realtimeVoiceChatInfo": "Trải nghiệm chức năng tương tác giọng nói thông minh (xem trước chức năng)", + "realtimeVoiceChatInfo": + "Trải nghiệm chức năng tương tác giọng nói thông minh (xem trước chức năng)", "loading": "Đang tải...", // 设备管理模块 - "deviceTypeUnknown": "Unknown Device", - "deviceTypeClassicBluetoothHeadset": "Classic Bluetooth Headset", - "deviceTypeBleBluetoothHeadset": "BLE Bluetooth Headset", - "deviceTypeSmartVoiceRecorder": "Smart Voice Recorder", - "deviceTypeSmartEye": "Smart Glasses", + "deviceTypeUnknown": "Thiết bị không xác định", + "deviceTypeClassicBluetoothHeadset": "Tai nghe Bluetooth cổ điển", + "deviceTypeBleBluetoothHeadset": "Tai nghe Bluetooth BLE", + "deviceTypeSmartVoiceRecorder": "Máy ghi âm giọng nói thông minh", + "deviceTypeSmartEye": "Kính thông minh", "unbind": "Hủy liên kết", - "noDevicesBound": "No devices bound yet", - "pleaseBindDeviceFirst": "Please bind a device first to manage", - "noMacAddress": "No MAC Address", - "licenseCode": "License Code", - "confirmUnbind": "Confirm Unbind", - "confirmUnbindMessage": "Are you sure you want to unbind device \\", - "confirmUnbindAction": "Confirm Unbind", + "noDevicesBound": "Chưa liên kết thiết bị nào", + "pleaseBindDeviceFirst": "Vui lòng liên kết một thiết bị trước để quản lý", + "noMacAddress": "Không có địa chỉ MAC", + "licenseCode": "Mã giấy phép", + "confirmUnbind": "Xác nhận hủy liên kết", + "confirmUnbindMessage": + "Bạn có chắc chắn muốn hủy liên kết thiết bị \"{deviceName}\" không?", + "confirmUnbindAction": "Xác nhận hủy liên kết", // Agent模块 - 主界面 "Lily": "Lily", @@ -770,37 +849,43 @@ const Map viVN = { "loadMoreMessages": "Tải thêm tin nhắn...", "loadFailedClickRetry": "Tải thất bại, nhấn để thử lại", "swipeUpForMore": "Vuốt lên để xem thêm", - "callingTool": "I'm helping you, please wait!", // 正在帮您,请稍等! + "callingTool": "Tôi đang giúp bạn, vui lòng đợi!", // 正在帮您,请稍等! "voice_interrupt": "Interrupt", // 语音打断 - 'voice_interrupt_tip': 'Khi bật: AI sẽ không bị ngắt bởi giọng nói của bạn khi đang nói và chỉ có thể xử lý một lượt hội thoại. Để bắt đầu lượt mới, chỉ cần nói từ kích hoạt.', + 'voice_interrupt_tip': + 'Khi bật: AI sẽ không bị ngắt bởi giọng nói của bạn khi đang nói và chỉ có thể xử lý một lượt hội thoại. Để bắt đầu lượt mới, chỉ cần nói từ kích hoạt.', // Agent模块 - 预设提示词 - "presetMusic": "Play some music", // 来点音乐 - "presetNavigation": "Navigation to", // 导航 - "presetWeather": "Today's weather", // 今日天气 - "presetNews": "Today's news", // 今日新闻 - "presetFood": "Nearby food", // 美食 - "playSomeMusic": "Play some popular music", // 播放一些流行音乐 - "navigationTo": "Please help me navigate to", // 导航到 - "todayWeather": "How's the weather today?", // 今日天气 - "todayNews": "What's the news today?", // 今日新闻 - "nearbyFood": "What delicious food is nearby?", // 美食 + "presetMusic": "Bật nhạc", // 来点音乐 + "presetNavigation": "Điều hướng đến", // 导航 + "presetWeather": "Thời tiết hôm nay", // 今日天气 + "presetNews": "Tin tức hôm nay", // 今日新闻 + "presetFood": "Món ngon gần đây", // 美食 + "playSomeMusic": "Bật một chút nhạc thịnh hành", // 播放一些流行音乐 + "navigationTo": "Hãy giúp tôi điều hướng đến", // 导航到 + "todayWeather": "Hôm nay thời tiết thế nào?", // 今日天气 + "todayNews": "Hôm nay có tin gì?", // 今日新闻 + "nearbyFood": "Gần đây có món gì ngon?", // 美食 // Agent模块 - 欢迎消息与权限 - 'welcomeMessage': '你好!我是**Lily**,我能帮你:\n\n' - '• 回答问题和提供信息\n\n' - '• 实时语音翻译\n\n' - '• 推荐音乐和播客\n\n' - '• 语音备忘录和提醒\n\n' - '• 控制耳机功能\n\n' - '有什么我可以帮你的吗?', - 'microphonePermission': 'Microphone', - 'voiceRecognitionPermissionText': 'Chức năng nhận dạng giọng nói cần truy cập microphone.', - 'voiceTranslationPermissionText': 'Chức năng nhận dạng và dịch giọng nói cần truy cập microphone.', - 'phoneCallPermissionText': 'Chức năng gọi điện cần truy cập microphone để thực hiện cuộc gọi thoại.', - 'permissionDeniedText': 'Bạn đã từ chối vĩnh viễn quyền truy cập microphone, vui lòng vào cài đặt hệ thống để cấp quyền.', + 'welcomeMessage': 'Xin chào! Tôi là **Lily**, tôi có thể giúp bạn:\n\n' + '• Trả lời câu hỏi và cung cấp thông tin\n\n' + '• Dịch giọng nói theo thời gian thực\n\n' + '• Gợi ý nhạc và podcast\n\n' + '• Ghi nhớ bằng giọng nói và nhắc nhở\n\n' + '• Điều khiển tính năng tai nghe\n\n' + 'Tôi có thể giúp gì cho bạn?', + 'microphonePermission': 'Micrô', + 'voiceRecognitionPermissionText': + 'Chức năng nhận dạng giọng nói cần truy cập microphone.', + 'voiceTranslationPermissionText': + 'Chức năng nhận dạng và dịch giọng nói cần truy cập microphone.', + 'phoneCallPermissionText': + 'Chức năng gọi điện cần truy cập microphone để thực hiện cuộc gọi thoại.', + 'permissionDeniedText': + 'Bạn đã từ chối vĩnh viễn quyền truy cập microphone, vui lòng vào cài đặt hệ thống để cấp quyền.', 'startVoiceInput': 'Bắt đầu nhập liệu bằng giọng nói', - 'startPhoneCallMode': 'Bắt đầu chế độ gọi điện, bắt đầu nhập liệu bằng giọng nói', + 'startPhoneCallMode': + 'Bắt đầu chế độ gọi điện, bắt đầu nhập liệu bằng giọng nói', // Agent模块 - 全屏编辑器 'fullScreenEditorHint': 'Nhập tin nhắn của bạn ở đây...', // 全屏编辑器输入提示 @@ -820,9 +905,17 @@ const Map viVN = { 'privacyRelated': 'Liên quan đến quyền riêng tư', 'copyrightViolation': 'Vi phạm bản quyền, danh dự của tôi, v.v.', 'other': 'Khác', - 'reportDescriptionHint': 'Chúng tôi muốn biết lý do bạn báo cáo, bạn có thể mô tả vấn đề bạn gặp phải.', + 'reportDescriptionHint': + 'Chúng tôi muốn biết lý do bạn báo cáo, bạn có thể mô tả vấn đề bạn gặp phải.', 'generatedByAi': 'Được tạo bởi AI', + // Agent模块 - 工具调用 + 'toolCall': 'Gọi công cụ', + 'noResult': 'Không có kết quả', + 'noToolCallContentToCopy': 'Không có nội dung gọi công cụ để sao chép', + 'toolCallDetails': 'Chi tiết gọi công cụ:', + 'toolCallContentCopied': 'Đã sao chép nội dung gọi công cụ vào khay nhớ tạm', + // Agent模块 - 音乐卡片 'recommendedMusic': 'Dưới đây là một số bản nhạc được đề xuất:', 'playList': 'Danh sách phát', @@ -843,20 +936,51 @@ const Map viVN = { "bicycling": "Đi xe đạp", "tsransit": "Giao thông công cộng", + // Agent模块 - 导航选择 + 'selectNavigationApp': 'Chọn ứng dụng dẫn đường', + 'amapMap': 'Amap', + 'useAmapNavigation': 'Dẫn đường bằng Amap', + 'baiduMap': 'Baidu Maps', + 'useBaiduNavigation': 'Dẫn đường bằng Baidu Maps', + 'googleMap': 'Google Maps', + 'useGoogleNavigation': 'Dẫn đường bằng Google Maps', + 'appleMap': 'Apple Maps', + 'useAppleNavigation': 'Dẫn đường bằng Apple Maps', + 'builtInNavigation': 'Dẫn đường tích hợp', + 'useBuiltInNavigation': 'Dẫn đường bằng bản đồ tích hợp', + 'navigationStartFailed': 'Không thể bắt đầu dẫn đường', + 'cannotPlayMusicListRetryLater': + 'Không thể phát danh sách nhạc, vui lòng thử lại sau', + 'cannotPlaySong': 'Không thể phát bài hát', + 'openMapError': 'Lỗi khi mở bản đồ', + 'pleaseInstallAmapApp': 'Vui lòng cài ứng dụng Amap trước', + 'pleaseInstallBaiduMapApp': 'Vui lòng cài ứng dụng Baidu Maps trước', + 'appleMapStartFailed': 'Apple Maps không thể khởi chạy', + 'appleMapUnavailable': 'Apple Maps không khả dụng', + 'openAppleMapError': 'Lỗi khi mở Apple Maps', + // Agent模块 - 天气卡片 'weatherQuery': 'Truy vấn tình hình thời tiết:', 'highest': 'Cao nhất', 'lowest': 'Thấp nhất', 'futureForecast': 'Dự báo tương lai', - 'hotWeatherTip': 'Hôm nay trời nóng, chú ý chống nóng, uống nhiều nước để tránh say nắng', - 'coldWeatherTip': 'Hôm nay nhiệt độ thấp, ra ngoài chú ý giữ ấm, cẩn thận cảm lạnh', - 'rainyWeatherTip': 'Hôm nay có mưa, ra ngoài nhớ mang theo ô, chú ý an toàn khi đi lại', - 'snowyWeatherTip': 'Hôm nay có tuyết, đường trơn trượt chú ý an toàn, giữ ấm cơ thể', - 'foggyWeatherTip': 'Hôm nay có sương mù, tầm nhìn thấp, ra ngoài nhớ đeo khẩu trang', - 'windyWeatherTip': 'Hôm nay gió lớn, ra ngoài chú ý an toàn, buộc chặt đồ đạc', + 'hotWeatherTip': + 'Hôm nay trời nóng, chú ý chống nóng, uống nhiều nước để tránh say nắng', + 'coldWeatherTip': + 'Hôm nay nhiệt độ thấp, ra ngoài chú ý giữ ấm, cẩn thận cảm lạnh', + 'rainyWeatherTip': + 'Hôm nay có mưa, ra ngoài nhớ mang theo ô, chú ý an toàn khi đi lại', + 'snowyWeatherTip': + 'Hôm nay có tuyết, đường trơn trượt chú ý an toàn, giữ ấm cơ thể', + 'foggyWeatherTip': + 'Hôm nay có sương mù, tầm nhìn thấp, ra ngoài nhớ đeo khẩu trang', + 'windyWeatherTip': + 'Hôm nay gió lớn, ra ngoài chú ý an toàn, buộc chặt đồ đạc', 'sunnyWeatherTip': 'Hôm nay nắng đẹp, tia UV mạnh, ra ngoài nhớ chống nắng', - 'temperatureDifferenceTip': 'Hôm nay chênh lệch nhiệt độ ngày đêm lớn, chú ý thêm bớt quần áo cho phù hợp', - 'comfortableWeatherTip': 'Hôm nay thời tiết dễ chịu, là thời điểm tốt để hoạt động ngoài trời', + 'temperatureDifferenceTip': + 'Hôm nay chênh lệch nhiệt độ ngày đêm lớn, chú ý thêm bớt quần áo cho phù hợp', + 'comfortableWeatherTip': + 'Hôm nay thời tiết dễ chịu, là thời điểm tốt để hoạt động ngoài trời', "monday": "Thứ 2", "tuesday": "Thứ 3", "wednesday": "Thứ 4", @@ -887,8 +1011,8 @@ const Map viVN = { "strongWind": "Gió lớn", // 翻译模块 - 中间层 - "pictureTranslation": "Picture Translation", - "textTranslation": "Text Translation", + "pictureTranslation": "Dịch hình ảnh", + "textTranslation": "Dịch văn bản", // 翻译模块 - 主页 "translationHistory": "Lịch sử dịch", @@ -898,72 +1022,88 @@ const Map viVN = { "phoneUser": "Người dùng điện thoại", "selectSourceLanguage": "Chọn ngôn ngữ nguồn", "selectTargetLanguage": "Chọn ngôn ngữ đích", - "me": "Me", - "counterPart": "Counterpart", - "bluetoothCallStateError": "Please make sure the Bluetooth headset is connected to the phone and in a call state", - "autoDetect": "Auto Detect", // 自动检测 + "me": "Tôi", + "counterPart": "Người đối thoại", + "bluetoothCallStateError": + "Vui lòng đảm bảo tai nghe Bluetooth đã kết nối với điện thoại và đang trong cuộc gọi", + "autoDetect": "Tự động nhận diện", // 自动检测 + + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': 'Tắt cửa sổ nổi', + 'enableFloatingWindow': 'Bật cửa sổ nổi', + 'permissionTip': 'Gợi ý quyền', + 'micPermissionRequiredForRecording': 'Cần quyền micrô để ghi âm', + 'deleteTranslationRecordError': 'Lỗi khi xóa bản ghi dịch: @error', // 翻译模块 - 文本翻译 - "languageDetectionFailed": "Language detection failed", - "translationFailed": "Translation failed", - "pleaseInputText": "Please input text", - "textTooLong": "Text too long, max 5000 characters", + "languageDetectionFailed": "Nhận diện ngôn ngữ thất bại", + "translationFailed": "Dịch thất bại", + "translating": "Đang dịch", + "translate": "Dịch", + "pleaseInputText": "Vui lòng nhập văn bản", + "inputTextToTranslate": "Vui lòng nhập văn bản cần dịch", + "textTooLong": "Văn bản quá dài, tối đa 5000 ký tự", // 翻译模块 - 历史记录 "noTranslationHistory": "Chưa có lịch sử", - "historyRecords": "History Records", - "clearResults": "Clear Results", + "historyRecords": "Lịch sử", + "clearResults": "Xóa kết quả", "clearHistory": "Xóa lịch sử", - "clearHistoryConfirm": "Bạn có chắc muốn xóa toàn bộ lịch sử dịch không? Thao tác này không thể hoàn tác.", + "clearHistoryConfirm": + "Bạn có chắc muốn xóa toàn bộ lịch sử dịch không? Thao tác này không thể hoàn tác.", "unknownLanguage": "Ngôn ngữ không xác định", "deleteSessionRecord": "Xóa bản ghi phiên", - "deleteSessionConfirm": "Bạn có chắc muốn xóa tất cả các bản ghi dịch của phiên này không? Thao tác này không thể hoàn tác.", + "deleteSessionConfirm": + "Bạn có chắc muốn xóa tất cả các bản ghi dịch của phiên này không? Thao tác này không thể hoàn tác.", // 翻译模块 - 图片翻译 - "selectImageSource": "Select Image Source", - "imagePreview": "Image Preview", - "translationResult": "Translation Result", - "recognitionResult": "Recognition Result", - "translatedImagePreview": "Translated Image Preview", - "translatedImageLoadFailed": "Failed to load translated image", - "pleaseSelectImage": "Please select an image", - "imageLoadFailed": "Image load failed", - "imageQuality": "Image Quality", - "maxSize": "Max Size", - "close": "Close", - "setImageQuality": "Set Image Quality", - "currentQuality": "Current quality: @value%", - "setMaxSize": "Set Max Size", - "currentMaxSize": "Current: @pxpx", - "waitingForAction": "Waiting for action", - "pleaseSelectImageToStart": "Please select an image to start", - "chooseImage": "Choose Image", - "openingCamera": "Opening camera...", - "openingPhotoAlbum": "Opening photo album...", - "cancelled": "Cancelled", - "userCancelledSelection": "User cancelled selection", - "translatingImage": "Translating Image", - "callingImageTranslateService": "Calling image translation service...", - "savingRecord": "Saving Record", - "savingTranslationResult": "Saving translation result...", - "translationCompleted": "Translation Completed", - "allStepsCompleted": "All steps completed", - "processingFailed": "Processing Failed", - "imageProcessingOrTranslationFailed": "Image processing or translation failed. Please retry.\nError: {error}", - "imageTooLarge": "Image size exceeds 4MB limit", - "imageTooLargeHint": "Image size exceeds 4MB. Reduce quality or dimensions and retry", - "emptyTranslationResult": "Image translation API returned empty result", - "imageTranslationFailedTryLater": "Image translation failed. Network issue or rate limit. Please try later", - "imageTranslationApiException": "Image translation API exception. Check network and retry", - "permissionRequired": "Permission Required", - "cameraPermissionRequired": "Camera permission required to take photos", - "photoAlbumPermissionRequired": "Photo album permission required to pick images", - "translationDetails": "Translation Details", - "originalImage": "Original Image", - "sourceLanguage": "Source Language", - "targetLanguage": "Target Language", - "translationTime": "Translation Time", - "shareInDevelopment": "Sharing feature under development", + "selectImageSource": "Chọn nguồn ảnh", + "imagePreview": "Xem trước ảnh", + "translationResult": "Kết quả dịch", + "recognitionResult": "Kết quả nhận dạng", + "translatedImagePreview": "Xem trước ảnh đã dịch", + "translatedImageLoadFailed": "Không thể tải ảnh đã dịch", + "pleaseSelectImage": "Vui lòng chọn một ảnh", + "imageLoadFailed": "Tải ảnh thất bại", + "imageQuality": "Chất lượng ảnh", + "maxSize": "Kích thước tối đa", + "close": "Đóng", + "setImageQuality": "Đặt chất lượng ảnh", + "currentQuality": "Chất lượng hiện tại: @value%", + "setMaxSize": "Đặt kích thước tối đa", + "currentMaxSize": "Hiện tại: @pxpx", + "waitingForAction": "Đang chờ thao tác", + "pleaseSelectImageToStart": "Vui lòng chọn ảnh để bắt đầu", + "chooseImage": "Chọn ảnh", + "openingCamera": "Đang mở camera...", + "openingPhotoAlbum": "Đang mở album ảnh...", + "cancelled": "Đã hủy", + "userCancelledSelection": "Người dùng đã hủy lựa chọn", + "translatingImage": "Đang dịch ảnh", + "callingImageTranslateService": "Đang gọi dịch vụ dịch ảnh...", + "savingRecord": "Đang lưu bản ghi", + "savingTranslationResult": "Đang lưu kết quả dịch...", + "translationCompleted": "Dịch xong", + "allStepsCompleted": "Hoàn tất tất cả bước", + "processingFailed": "Xử lý thất bại", + "imageProcessingOrTranslationFailed": + "Xử lý ảnh hoặc dịch thất bại. Vui lòng thử lại.\nLỗi: {error}", + "imageTooLarge": "Kích thước ảnh vượt quá giới hạn 4MB", + "imageTooLargeHint": + "Ảnh vượt quá 4MB. Giảm chất lượng hoặc kích thước rồi thử lại", + "emptyTranslationResult": "API dịch ảnh trả về kết quả rỗng", + "imageTranslationFailedTryLater": + "Dịch ảnh thất bại. Lỗi mạng hoặc giới hạn tần suất. Vui lòng thử lại sau", + "imageTranslationApiException": "Lỗi API dịch ảnh. Kiểm tra mạng và thử lại", + "permissionRequired": "Cần cấp quyền", + "cameraPermissionRequired": "Cần quyền camera để chụp ảnh", + "photoAlbumPermissionRequired": "Cần quyền album ảnh để chọn ảnh", + "translationDetails": "Chi tiết dịch", + "originalImage": "Ảnh gốc", + "sourceLanguage": "Ngôn ngữ nguồn", + "targetLanguage": "Ngôn ngữ đích", + "translationTime": "Thời gian dịch", + "shareInDevelopment": "Chức năng chia sẻ đang được phát triển", // 翻译模块 - 录音文件 "translateAudioFiles": "Dịch tệp âm thanh", @@ -988,9 +1128,11 @@ const Map viVN = { "summaryGenerated": "Đã tạo tóm tắt", "generating": "Đang tạo...", "regenerate": "Tạo lại", - "summaryTimeoutMessage": "Yêu cầu tạo tóm tắt đã hết thời gian, có thể do sự cố mạng hoặc máy chủ bận.", + "summaryTimeoutMessage": + "Yêu cầu tạo tóm tắt đã hết thời gian, có thể do sự cố mạng hoặc máy chủ bận.", "deleteTranslationRecord": "Xóa bản ghi dịch", - "deleteTranslationConfirm": "Bạn có chắc muốn xóa bản ghi dịch này không? Thao tác này không thể hoàn tác.", + "deleteTranslationConfirm": + "Bạn có chắc muốn xóa bản ghi dịch này không? Thao tác này không thể hoàn tác.", "originalText": "Văn bản gốc", "translatedText": "Văn bản dịch", "sessionSummary": "Tóm tắt phiên", @@ -1008,21 +1150,27 @@ const Map viVN = { "notSet": "Chưa đặt", "accountSetting": "Cài đặt tài khoản", "logout": "Đăng xuất", - "logoutTips": "Bạn có chắc chắn muốn đăng xuất khỏi tài khoản hiện tại không?", + "logoutTips": + "Bạn có chắc chắn muốn đăng xuất khỏi tài khoản hiện tại không?", 'deleteAccount': 'Xóa tài khoản', - 'deleteAccountTips': 'Bạn có chắc chắn muốn xóa vĩnh viễn tài khoản của mình không? Thao tác này không thể hoàn tác', + 'deleteAccountTips': + 'Bạn có chắc chắn muốn xóa vĩnh viễn tài khoản của mình không? Thao tác này không thể hoàn tác', 'clean': 'Clear Cache', 'cleanTips': 'Are you sure you want to clear personal cache?', - 'networkConnectionFailed': 'Kết nối mạng thất bại, vui lòng kiểm tra cài đặt mạng và thử lại', - 'serverTemporarilyUnavailable': 'Máy chủ tạm thời không khả dụng, vui lòng thử lại sau', + 'networkConnectionFailed': + 'Kết nối mạng thất bại, vui lòng kiểm tra cài đặt mạng và thử lại', + 'serverTemporarilyUnavailable': + 'Máy chủ tạm thời không khả dụng, vui lòng thử lại sau', 'loginExpiredPleaseRelogin': 'Đăng nhập đã hết hạn, vui lòng đăng nhập lại', 'noPermissionForThisOperation': 'Không có quyền thực hiện thao tác này', 'requestedResourceNotFound': 'Không tìm thấy tài nguyên được yêu cầu', - 'imageProcessingFailedPleaseReselect': 'Xử lý hình ảnh thất bại, vui lòng chọn lại hình ảnh', + 'imageProcessingFailedPleaseReselect': + 'Xử lý hình ảnh thất bại, vui lòng chọn lại hình ảnh', 'operationFailedPleaseRetry': 'Thao tác thất bại, vui lòng thử lại', 'serverReturnedError': 'Máy chủ trả về lỗi', 'serverError': 'Lỗi máy chủ', - 'networkConnectionFailedCheckSettings': 'Kết nối mạng thất bại, vui lòng kiểm tra cài đặt mạng', + 'networkConnectionFailedCheckSettings': + 'Kết nối mạng thất bại, vui lòng kiểm tra cài đặt mạng', 'serverInternalErrorRetryLater': 'Lỗi nội bộ máy chủ, vui lòng thử lại sau', 'imageCompressionFailed': 'Nén hình ảnh thất bại', 'avatarUpdateFailed': 'Cập nhật ảnh đại diện thất bại', @@ -1039,23 +1187,27 @@ const Map viVN = { 'thirdPartyLogoutSuccess': 'Đăng xuất bên thứ ba thành công', // 第三方登录退出成功 'thirdPartyLogoutFailed': 'Đăng xuất bên thứ ba thất bại', // 第三方登录退出失败 'signOutProcessError': 'Đã xảy ra lỗi trong quá trình đăng xuất', // 登出过程发生错误 - 'deleteAccountProcessError': 'Đã xảy ra lỗi trong quá trình xóa tài khoản', // 删除账号过程发生错误 + 'deleteAccountProcessError': + 'Đã xảy ra lỗi trong quá trình xóa tài khoản', // 删除账号过程发生错误 'userDataClearSuccess': 'Xóa dữ liệu người dùng thành công', // 用户数据清理成功 - 'allUserDataClearSuccess': 'Tất cả dữ liệu người dùng đã được xóa thành công', // 所有用户数据清理成功 - 'accountServiceInitialized': 'AccountService đã được khởi tạo', // AccountService 已初始化 + 'allUserDataClearSuccess': + 'Tất cả dữ liệu người dùng đã được xóa thành công', // 所有用户数据清理成功 + 'accountServiceInitialized': + 'AccountService đã được khởi tạo', // AccountService 已初始化 // 权限模块 - 'meetingStoragePermission': 'Storage', - 'meetingStoragePermissionExplanation': 'We need access to storage permissions so you can select and upload audio files.', + 'meetingStoragePermission': 'Lưu trữ', + 'meetingStoragePermissionExplanation': + 'Chúng tôi cần quyền lưu trữ để bạn có thể chọn và tải lên tệp âm thanh.', 'meetingStoragePermissionPermanentDenial': - '检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。', + 'Phát hiện bạn đã từ chối vĩnh viễn quyền lưu trữ. Để tiếp tục dùng tính năng này, vui lòng vào cài đặt ứng dụng để bật quyền lưu trữ thủ công.', 'getPermissionStatusFailed': 'Lấy trạng thái quyền thất bại', 'communicationPermissions': 'Quyền giao tiếp', - 'bluetoothPermissions': 'Bluetooth Permissions', - 'notificationPermissions': 'Notification Permissions', - 'storagePermissions': 'Storage Permissions', - 'microphonePermissions': 'Microphone Permissions', - 'alarmPermissions': 'Alarm Permissions', + 'bluetoothPermissions': 'Quyền Bluetooth', + 'notificationPermissions': 'Quyền thông báo', + 'storagePermissions': 'Quyền lưu trữ', + 'microphonePermissions': 'Quyền micrô', + 'alarmPermissions': 'Quyền báo thức', 'calendarPermissions': 'Quyền lịch', 'locationPermissions': 'Quyền vị trí', 'phone': 'Điện thoại', @@ -1068,9 +1220,11 @@ const Map viVN = { 'locationInfo': 'Thông tin vị trí', 'phonePermissionDesc': 'Dùng cho chức năng gọi điện thoại', 'smsPermissionDesc': 'Dùng cho chức năng gửi SMS', - 'alarmPermissionDesc': 'Used to set exact alarms to ensure reminders trigger on time', + 'alarmPermissionDesc': + 'Dùng để đặt báo thức chính xác để đảm bảo nhắc nhở đúng giờ', 'calendarWritePermissionDesc': 'Dùng để tạo sự kiện và lời nhắc trên lịch', - 'calendarFullAccessPermissionDesc': 'Dùng để đọc và quản lý các sự kiện và lời nhắc trên lịch', + 'calendarFullAccessPermissionDesc': + 'Dùng để đọc và quản lý các sự kiện và lời nhắc trên lịch', 'locationPermissionDesc': 'Dùng để lấy thông tin vị trí hiện tại', 'appFunctionNeeds': 'Chức năng ứng dụng cần', 'authorized': 'Đã cấp quyền', @@ -1080,64 +1234,90 @@ const Map viVN = { 'unknownStatus': 'Trạng thái không xác định', 'permissionGranted': 'Quyền đã được cấp', 'permissionRequestError': 'Lỗi khi yêu cầu quyền', - 'phonePermissionDetailDesc': 'Chức năng gọi điện cần quyền truy cập điện thoại', + 'phonePermissionDetailDesc': + 'Chức năng gọi điện cần quyền truy cập điện thoại', 'smsPermissionDetailDesc': 'Chức năng gửi SMS cần quyền truy cập SMS', - 'alarmPermissionDetailDesc': 'This permission is required to set exact alarms and ensure reminders trigger on time', - 'calendarWritePermissionDetailDesc': 'Tạo sự kiện lịch cần quyền ghi vào lịch', - 'calendarFullAccessPermissionDetailDesc': 'Quản lý sự kiện lịch cần quyền truy cập lịch đầy đủ', - 'locationPermissionDetailDesc': 'Lấy thông tin vị trí cần quyền truy cập vị trí', - 'contactsPermissionDesc': 'Used for accessing contact information', - 'contactsPermissionDetailDesc': 'Phone call and SMS functionality requires contacts permission to select contacts', - 'bluetoothPermissionDesc': 'Used for connecting and managing Bluetooth devices', - 'bluetoothPermissionDetailDesc': 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', - 'bluetoothScanPermissionDesc': 'Used for scanning nearby Bluetooth devices', - 'bluetoothScanPermissionDetailDesc': 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', - 'bluetoothConnectPermissionDesc': 'Used for connecting to Bluetooth devices', - 'bluetoothConnectPermissionDetailDesc': 'Connecting to Bluetooth devices requires Bluetooth connect permission', - 'notificationPermissionDesc': 'Used for sending notification messages', - 'notificationPermissionDetailDesc': 'App needs notification permission to send you important alerts and messages', - 'appNeedsPermissionForFullFunction': 'Ứng dụng cần quyền này để cung cấp đầy đủ chức năng', - 'permanentDenialText': 'Bạn đã từ chối vĩnh viễn quyền {permission}, vui lòng vào cài đặt ứng dụng để bật', + 'alarmPermissionDetailDesc': + 'Quyền này cần thiết để đặt báo thức chính xác và đảm bảo nhắc nhở được kích hoạt đúng giờ', + 'calendarWritePermissionDetailDesc': + 'Tạo sự kiện lịch cần quyền ghi vào lịch', + 'calendarFullAccessPermissionDetailDesc': + 'Quản lý sự kiện lịch cần quyền truy cập lịch đầy đủ', + 'locationPermissionDetailDesc': + 'Lấy thông tin vị trí cần quyền truy cập vị trí', + 'contactsPermissionDesc': 'Dùng để truy cập thông tin liên hệ', + 'contactsPermissionDetailDesc': + 'Chức năng gọi điện và SMS cần quyền danh bạ để chọn liên hệ', + 'bluetoothPermissionDesc': 'Dùng để kết nối và quản lý thiết bị Bluetooth', + 'bluetoothPermissionDetailDesc': + 'Kết nối tai nghe Bluetooth và các thiết bị khác cần quyền Bluetooth', + 'bluetoothScanPermissionDesc': 'Dùng để quét thiết bị Bluetooth gần đây', + 'bluetoothScanPermissionDetailDesc': + 'Quét thiết bị Bluetooth gần đây cần quyền quét Bluetooth', + 'bluetoothConnectPermissionDesc': 'Dùng để kết nối thiết bị Bluetooth', + 'bluetoothConnectPermissionDetailDesc': + 'Kết nối thiết bị Bluetooth cần quyền kết nối Bluetooth', + 'notificationPermissionDesc': 'Dùng để gửi thông báo', + 'notificationPermissionDetailDesc': + 'Ứng dụng cần quyền thông báo để gửi cho bạn cảnh báo và tin nhắn quan trọng', + 'appNeedsPermissionForFullFunction': + 'Ứng dụng cần quyền này để cung cấp đầy đủ chức năng', + 'permanentDenialText': + 'Bạn đã từ chối vĩnh viễn quyền {permission}, vui lòng vào cài đặt ứng dụng để bật', 'goToSettings': 'Đi đến cài đặt', - 'bluetoothScan': 'Bluetooth Scan', - 'bluetoothConnect': 'Bluetooth Connect', - 'bluetoothScanExplanation': 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', - 'bluetoothConnectExplanation': 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', - 'locationForBluetoothExplanation': 'The app needs location permission to scan Bluetooth devices.', - 'bluetoothScanPermanentDenial': 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', - 'bluetoothConnectPermanentDenial': 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', - 'locationPermanentDenial': 'Location permission has been permanently denied, please go to settings to enable it manually.', - 'notificationPermission': 'Notification', - 'locationPermission': 'Location', - 'notificationPermissionExplanation': 'Notification permission is required to display music playback status.', - 'locationPermissionExplanation': 'Location permission is required to get current location.', - 'notificationPermissionPermanentDenial': 'You have permanently denied notification permission, please go to settings to enable it.', - 'locationPermissionPermanentDenial': 'You have permanently denied location permission, please go to settings to enable it.', - 'storagePermission': 'Storage', - 'microphonePermissionExplanation': 'We need microphone permission to record audio content.', - 'storagePermissionExplanation': 'We need storage permission so you can select and upload audio files.', + 'bluetoothScan': 'Quét Bluetooth', + 'bluetoothConnect': 'Kết nối Bluetooth', + 'bluetoothScanExplanation': + 'Ứng dụng cần quyền quét Bluetooth để quét thiết bị Bluetooth gần đây.', + 'bluetoothConnectExplanation': + 'Ứng dụng cần quyền kết nối Bluetooth để kết nối thiết bị Bluetooth.', + 'locationForBluetoothExplanation': + 'Ứng dụng cần quyền vị trí để quét thiết bị Bluetooth.', + 'bluetoothScanPermanentDenial': + 'Bạn đã từ chối vĩnh viễn quyền quét Bluetooth, vui lòng vào cài đặt để bật thủ công.', + 'bluetoothConnectPermanentDenial': + 'Bạn đã từ chối vĩnh viễn quyền kết nối Bluetooth, vui lòng vào cài đặt để bật thủ công.', + 'locationPermanentDenial': + 'Bạn đã từ chối vĩnh viễn quyền vị trí, vui lòng vào cài đặt để bật thủ công.', + 'notificationPermission': 'Thông báo', + 'locationPermission': 'Vị trí', + 'notificationPermissionExplanation': + 'Cần quyền thông báo để hiển thị trạng thái phát nhạc.', + 'locationPermissionExplanation': 'Cần quyền vị trí để lấy vị trí hiện tại.', + 'notificationPermissionPermanentDenial': + 'Bạn đã từ chối vĩnh viễn quyền thông báo, vui lòng vào cài đặt để bật.', + 'locationPermissionPermanentDenial': + 'Bạn đã từ chối vĩnh viễn quyền vị trí, vui lòng vào cài đặt để bật.', + 'storagePermission': 'Lưu trữ', + 'microphonePermissionExplanation': + 'Chúng tôi cần quyền micrô để ghi âm nội dung.', + 'storagePermissionExplanation': + 'Chúng tôi cần quyền lưu trữ để bạn có thể chọn và tải lên tệp âm thanh.', 'microphonePermissionPermanentDenial': - '检测到您已永久拒绝录音权限。如需继续使用此功能,请前往应用设置中手动开启麦克风权限。', + 'Phát hiện bạn đã từ chối vĩnh viễn quyền ghi âm. Để tiếp tục dùng tính năng này, vui lòng vào cài đặt ứng dụng để bật quyền micrô thủ công.', 'storagePermissionPermanentDenial': - '检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。', - 'permissionUtilNeed': 'Need ', - 'permissionUtilPermission': ' Permission', - 'permissionUtilRestricted': ' Permission Restricted', - 'permissionUtilRestrictedMessage': 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', + 'Phát hiện bạn đã từ chối vĩnh viễn quyền lưu trữ. Để tiếp tục dùng tính năng này, vui lòng vào cài đặt ứng dụng để bật quyền lưu trữ thủ công.', + 'permissionUtilNeed': 'Cần ', + 'permissionUtilPermission': ' quyền', + 'permissionUtilRestricted': ' quyền bị hạn chế', + 'permissionUtilRestrictedMessage': + 'Tính năng này không khả dụng hoặc bị hạn chế trên thiết bị hiện tại, vui lòng kiểm tra cài đặt thiết bị hoặc các hạn chế của hệ thống', 'permissionUtilConfirm': 'OK', // 原生前台服务通知(Android) - 'native.notification.appName': 'VOITRANS', - 'native.notification.navigation.title': 'Đang dẫn đường', - 'native.notification.navigation.keepRunning': 'Đang dẫn đường, giữ ứng dụng hoạt động', - 'native.notification.bleAgent.running': 'Trợ lý giọng nói đang chạy', - 'native.notification.audioRecording.recording': 'Đang ghi âm, nhấn để quay lại ứng dụng', - 'native.notification.music.waiting': 'Đang chờ phát', - 'native.notification.music.previous': 'Trước đó', - 'native.notification.music.next': 'Tiếp theo', - 'native.notification.music.play': 'Phát', - 'native.notification.music.pause': 'Tạm dừng', - 'native.notification.qqMusic.playing': 'Đang phát nhạc', + 'native.notification.appName': 'VOITRANS', + 'native.notification.navigation.title': 'Đang dẫn đường', + 'native.notification.navigation.keepRunning': + 'Đang dẫn đường, giữ ứng dụng hoạt động', + 'native.notification.bleAgent.running': 'Trợ lý giọng nói đang chạy', + 'native.notification.audioRecording.recording': + 'Đang ghi âm, nhấn để quay lại ứng dụng', + 'native.notification.music.waiting': 'Đang chờ phát', + 'native.notification.music.previous': 'Trước đó', + 'native.notification.music.next': 'Tiếp theo', + 'native.notification.music.play': 'Phát', + 'native.notification.music.pause': 'Tạm dừng', + 'native.notification.qqMusic.playing': 'Đang phát nhạc', // 版本更新 'newVersionFound': 'Đã tìm thấy phiên bản mới', // 版本更新对话框标题 @@ -1145,8 +1325,10 @@ const Map viVN = { 'updateNow': 'Cập nhật ngay', // 立即更新按钮 'checkUpdate': 'Kiểm tra cập nhật', // 检查更新按钮 'updateFailed': 'Cập nhật thất bại', // 更新失败提示 - 'cannotOpenAppStore': 'Không thể mở App Store, vui lòng vào App Store để cập nhật thủ công', // 无法打开应用商店提示 - 'updateErrorRetry': 'Đã xảy ra lỗi trong quá trình cập nhật, vui lòng thử lại sau', // 更新错误重试提示 + 'cannotOpenAppStore': + 'Không thể mở App Store, vui lòng vào App Store để cập nhật thủ công', // 无法打开应用商店提示 + 'updateErrorRetry': + 'Đã xảy ra lỗi trong quá trình cập nhật, vui lòng thử lại sau', // 更新错误重试提示 // 配对模块 "devicePairing": "Ghép nối thiết bị", @@ -1164,23 +1346,30 @@ const Map viVN = { 'bluetooth': 'Bluetooth', "readyToPair": "Sẵn sàng để ghép nối", "preparingPairingEnvironment": "Đang chuẩn bị môi trường ghép nối...", - "connectDeepSoundViaSystemBluetooth": "Vui lòng kết nối với thiết bị Voitrans qua Bluetooth hệ thống trước", + "connectDeepSoundViaSystemBluetooth": + "Vui lòng kết nối với thiết bị Voitrans qua Bluetooth hệ thống trước", "deviceBindingConfirm": "Xác nhận liên kết thiết bị...", "establishingDeviceAssociation": "Đang thiết lập liên kết thiết bị...", "waitingCompletePairing": "Vui lòng đợi, đang hoàn tất ghép nối...", - "pairingSuccessRedirecting": "Ghép nối thành công! Sắp chuyển hướng đến trang chủ...", - "ensureConnectedDeepSoundDevice": "Vui lòng đảm bảo bạn đang kết nối với thiết bị Voitrans", - "deviceAlreadyBoundToOtherAccount": "Thiết bị này đã được liên kết với tài khoản khác", + "pairingSuccessRedirecting": + "Ghép nối thành công! Sắp chuyển hướng đến trang chủ...", + "ensureConnectedDeepSoundDevice": + "Vui lòng đảm bảo bạn đang kết nối với thiết bị Voitrans", + "deviceAlreadyBoundToOtherAccount": + "Thiết bị này đã được liên kết với tài khoản khác", "deviceAssociationFailed": "Liên kết thiết bị thất bại, vui lòng thử lại", - "scanTimeoutEnsureDeviceNearby": "Quét hết thời gian, vui lòng đảm bảo thiết bị ở gần", + "scanTimeoutEnsureDeviceNearby": + "Quét hết thời gian, vui lòng đảm bảo thiết bị ở gần", "networkError": "Lỗi mạng", - "authorizationFailedCheckCode": "Ủy quyền thất bại, vui lòng kiểm tra xem mã ủy quyền có đúng không", + "authorizationFailedCheckCode": + "Ủy quyền thất bại, vui lòng kiểm tra xem mã ủy quyền có đúng không", "pairingFailedRetry": "Ghép nối thất bại, vui lòng thử lại", 'pleaseEnableBluetooth': 'Vui lòng bật Bluetooth', 'deviceDisconnected': 'Thiết bị đã ngắt kết nối', 'readyToStartPairing': 'Sẵn sàng bắt đầu ghép nối', 'checkingEnvironment': 'Đang kiểm tra môi trường...', - 'ensureHeadsetOnAndPairingMode': 'Vui lòng đảm bảo tai nghe đã bật và ở chế độ ghép nối', + 'ensureHeadsetOnAndPairingMode': + 'Vui lòng đảm bảo tai nghe đã bật và ở chế độ ghép nối', 'establishingSecureConnection': 'Đang thiết lập kết nối an toàn...', 'needManualBindingAuthCode': 'Cần mã ủy quyền liên kết thủ công...', 'pairingSuccessful': 'Ghép nối thành công!', @@ -1194,28 +1383,34 @@ const Map viVN = { 'verificationFailedRetry': 'Xác minh thất bại, vui lòng thử lại', 'invalidDeviceAddress': 'Địa chỉ thiết bị không hợp lệ', 'bleDeviceAssociationFailed': 'Liên kết thiết bị BLE thất bại', - 'deviceAssociationFailedRetry': 'Liên kết thiết bị thất bại, vui lòng thử lại', + 'deviceAssociationFailedRetry': + 'Liên kết thiết bị thất bại, vui lòng thử lại', 'bleConnectionTimeoutRetry': 'Kết nối BLE hết thời gian, vui lòng thử lại', 'blePairingStartupFailed': 'Khởi động ghép nối BLE thất bại', 'bleConnectionFailed': 'Kết nối BLE thất bại', - 'deviceAuthorizationFailedCheckCode': 'Ủy quyền thiết bị thất bại, vui lòng kiểm tra mã ủy quyền', - 'bluetoothGuideTitle': 'Manual Bluetooth Activation Required', // 需要手动开启蓝牙 - 'bluetoothGuideSteps': 'Please follow these steps:', // 请按照以下步骤操作: - 'bluetoothGuideStep1': 'Enable Bluetooth: Settings → Bluetooth → Turn On', // 开启蓝牙:设置 → 蓝牙 → 开启 - 'bluetoothGuideStep2': 'Connect Device: Find your device in "My Devices" and tap to connect', // 连接设备:在"我的设备"中找到您的设备并点击连接 - 'bluetoothGuideStep3': 'Return to app to continue pairing process', // 返回应用继续配对流程 - 'bluetoothGuideTip': 'Tip: You can also long press the Bluetooth icon in Control Center to quickly access Bluetooth settings', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 - 'iKnow': 'I Know', // 我知道了 + 'deviceAuthorizationFailedCheckCode': + 'Ủy quyền thiết bị thất bại, vui lòng kiểm tra mã ủy quyền', + 'bluetoothGuideTitle': 'Cần bật Bluetooth thủ công', // 需要手动开启蓝牙 + 'bluetoothGuideSteps': 'Vui lòng làm theo các bước sau:', // 请按照以下步骤操作: + 'bluetoothGuideStep1': + 'Bật Bluetooth: Cài đặt → Bluetooth → Bật', // 开启蓝牙:设置 → 蓝牙 → 开启 + 'bluetoothGuideStep2': + 'Kết nối thiết bị: Tìm thiết bị của bạn trong "Thiết bị của tôi" và chạm để kết nối', // 连接设备:在"我的设备"中找到您的设备并点击连接 + 'bluetoothGuideStep3': + 'Quay lại ứng dụng để tiếp tục quá trình ghép nối', // 返回应用继续配对流程 + 'bluetoothGuideTip': + 'Mẹo: Bạn cũng có thể nhấn giữ biểu tượng Bluetooth trong Trung tâm điều khiển để mở nhanh cài đặt Bluetooth', // 提示:也可以从控制中心长按蓝牙图标快速进入蓝牙设置 + 'iKnow': 'Tôi hiểu', // 我知道了 // 配对模块 - 绑定奖励 - "firstBindRewardTitle": "Welcome Reward", - "firstBindRewardDesc": "You've received binding rewards.", - "vipLevelLabel": "VIP Level:", - "expiryLabel": "Expiration:", - "notActivated": "Not activated", - "aiChatCreditsLabel": "AI Chat Credits:", - "translationCreditsLabel": "Translation Credits:", - "meetingCreditsLabel": "Meeting Credits:", + "firstBindRewardTitle": "Quà chào mừng", + "firstBindRewardDesc": "Bạn đã nhận được phần thưởng liên kết.", + "vipLevelLabel": "Cấp VIP:", + "expiryLabel": "Hết hạn:", + "notActivated": "Chưa kích hoạt", + "aiChatCreditsLabel": "Tín dụng trò chuyện AI:", + "translationCreditsLabel": "Tín dụng dịch:", + "meetingCreditsLabel": "Tín dụng cuộc họp:", "ok": "OK", // 用户反馈模块 @@ -1231,7 +1426,8 @@ const Map viVN = { 'feedbackSubmitFailed': 'Gửi phản hồi thất bại, vui lòng thử lại sau', // OTA升级模块 - "upgradeExitConfirm": "Đang nâng cấp, thoát sẽ làm gián đoạn quá trình nâng cấp, bạn có chắc chắn muốn thoát không?", + "upgradeExitConfirm": + "Đang nâng cấp, thoát sẽ làm gián đoạn quá trình nâng cấp, bạn có chắc chắn muốn thoát không?", "deviceModel": "Kiểu máy", "unknownDevice": "Thiết bị không xác định", "currentFirmwareVersion": "Phiên bản firmware hiện tại", @@ -1243,15 +1439,72 @@ const Map viVN = { "connectionFailed": "Kết nối thất bại", "retryConnection": "Thử kết nối lại", "ota_updateNow": "Cập nhật ngay", - "otaVersionInfoFailed": "Failed to get version info. Please try again later.", - "otaDeviceInfoUnavailable": "Unable to get device info. Please check the connection and retry.", - "otaProductInfoUnavailable": "Unable to identify the device. Please reconnect and retry.", - "otaFirmwareVersionInvalid": "Firmware version is abnormal. Please reconnect and retry.", - "keepConnectedDontClose": "Vui lòng giữ thiết bị kết nối, không đóng ứng dụng", + "otaVersionInfoFailed": + "Không thể lấy thông tin phiên bản. Vui lòng thử lại sau.", + "otaDeviceInfoUnavailable": + "Không thể lấy thông tin thiết bị. Vui lòng kiểm tra kết nối và thử lại.", + "otaProductInfoUnavailable": + "Không thể nhận diện thiết bị. Vui lòng kết nối lại và thử lại.", + "otaFirmwareVersionInvalid": + "Phiên bản firmware bất thường. Vui lòng kết nối lại và thử lại.", + "keepConnectedDontClose": + "Vui lòng giữ thiết bị kết nối, không đóng ứng dụng", "doNotDisconnect": "Vui lòng không ngắt kết nối", "charging": "Đang sạc", "updateContent": "Nội dung cập nhật", - "removeEarbudsEnsureBattery": "Lấy cả hai tai nghe ra và đảm bảo pin của cả hai đều trên 20%", + "removeEarbudsEnsureBattery": + "Lấy cả hai tai nghe ra và đảm bảo pin của cả hai đều trên 20%", + + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': 'Đã tìm thấy phiên bản mới @version', + 'otaConfirmUpdateNow': 'Cập nhật ngay?', + 'otaUpdate': 'Cập nhật', + 'otaUpgradeSuccess': 'Nâng cấp thành công', + 'otaUpgradeCompleteRepair': + 'Nâng cấp firmware hoàn tất!\n\nThiết bị cần ghép nối lại để hoạt động bình thường. Đi đến trang ghép nối ngay bây giờ?', + 'otaPairLater': 'Ghép nối sau', + 'otaPairNow': 'Ghép nối ngay', + 'okConfirm': 'OK', + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': 'Lỗi khi kiểm tra kết nối BLE: @error', + 'otaBleNotConnected': 'Thiết bị BLE chưa được kết nối', + 'otaBleNeedConnection': + 'Nâng cấp firmware yêu cầu kết nối thiết bị BLE\nVui lòng đảm bảo thiết bị đã kết nối đúng và thử lại', + 'otaDeviceInfoUnavailableTitle': 'Không có thông tin thiết bị', + 'otaCannotGetDeviceInfo': + 'Không thể lấy thông tin thiết bị\nVui lòng kết nối lại thiết bị hoặc thử lại sau', + 'otaBleCheckFailed': 'Kiểm tra kết nối BLE thất bại', + 'otaCannotGetDeviceInfoCheckConnection': + 'Không thể lấy thông tin thiết bị, vui lòng kiểm tra kết nối thiết bị', + 'otaCannotGetProductInfoWithName': + 'Không thể lấy thông tin sản phẩm, tên thiết bị: @deviceName', + 'otaCannotGetBatteryInfo': 'Không thể lấy thông tin pin hợp lệ', + 'otaLowBattery': 'Pin yếu', + 'otaSingleBatteryLow': + 'Pin thiết bị quá thấp để nâng cấp firmware\nYêu cầu: pin phải trên 20%\nHiện tại: @ear @battery%\nVui lòng sạc và thử lại', + 'otaDoubleBatteryLow': + 'Pin thiết bị quá thấp để nâng cấp firmware\nYêu cầu: cả hai tai nghe phải trên 20%\nHiện tại: Trái @left%, Phải @right%\nVui lòng sạc và thử lại', + 'otaBatteryCheckFailed': 'Kiểm tra pin thất bại', + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': + 'Bản cập nhật này bao gồm tối ưu hiệu năng và sửa lỗi.', + 'otaGetLatestVersionFailed': 'Không thể lấy thông tin phiên bản mới nhất', + 'otaGetVersionInfoFailed': 'Không thể lấy thông tin phiên bản', + 'otaCheckingDeviceStatus': 'Đang kiểm tra trạng thái thiết bị...', + 'otaDownloadFailedCheckNetwork': + 'Tải xuống thất bại, vui lòng kiểm tra kết nối mạng', + 'otaDownloadFailed': 'Tải xuống thất bại', + 'otaPreparingConnection': 'Đang chuẩn bị kết nối thiết bị...', + 'otaConnectingDevice': 'Đang kết nối đến thiết bị...', + 'otaUpgradeStarted': 'Bắt đầu nâng cấp OTA...', + 'otaUpgradeProgressWithPercent': 'Tiến độ nâng cấp: @percent%', + 'otaUpgradeSuccessComplete': 'Nâng cấp hoàn tất thành công', + 'otaUpgradeFailedWithCode': 'Nâng cấp thất bại, mã lỗi: @code', + 'otaUpgradeFailedTitle': 'Nâng cấp thất bại', + 'otaUpgradeFailedDesc': + 'Vui lòng kiểm tra kết nối thiết bị hoặc gói cập nhật, mã lỗi: @code', + 'otaDeviceDisconnected': 'Thiết bị đã ngắt kết nối', + 'otaDeviceConnected': 'Thiết bị đã kết nối', // 音乐模块 "noMusic": "Không có nhạc", // 暂无音乐 diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 8609088f1..c9adf241a 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -1,5 +1,4 @@ const Map zhCN = { - // 通用 'continue': '继续', 'confirm': '确认', @@ -504,10 +503,8 @@ const Map zhCN = { 'overlayPermissionTitle': '悬浮窗权限', 'overlayPermissionTranslationDesc': '为了在通话或音视频翻译时显示翻译结果,需要悬浮窗权限。这样您就可以在使用其他应用时看到实时翻译。', - 'overlayPermissionRecordingDesc': - '为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。', - 'overlayPermissionOpenSettingsFailed': - '无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。', + 'overlayPermissionRecordingDesc': '为了在录音过程中显示录音悬浮条(计时/暂停/继续),需要悬浮窗权限。', + 'overlayPermissionOpenSettingsFailed': '无法自动跳转到系统设置,请手动前往系统设置开启悬浮窗权限。', 'transcribing': '正在转写...', 'summarizing': '正在总结...', 'analyzing': '正在分析...', @@ -966,6 +963,7 @@ const Map zhCN = { // 翻译模块 - 文本翻译 "languageDetectionFailed": "语言检测失败", + "inputTextToTranslate": "请输入待翻译的文本", "translationFailed": "翻译失败", "translating": "正在翻译", "translate": "翻译", @@ -1337,8 +1335,10 @@ const Map zhCN = { 'otaCannotGetProductInfoWithName': '无法获取产品信息,设备名称: @deviceName', 'otaCannotGetBatteryInfo': '无法获取有效的电量信息', 'otaLowBattery': '电量不足', - 'otaSingleBatteryLow': '设备电量不足,无法进行固件升级\n升级要求:设备电量需大于20%\n当前电量:@ear @battery%\n请充电后再试', - 'otaDoubleBatteryLow': '设备电量不足,无法进行固件升级\n升级要求:左右耳电量均需大于20%\n当前电量:左耳 @left%,右耳 @right%\n请充电后再试', + 'otaSingleBatteryLow': + '设备电量不足,无法进行固件升级\n升级要求:设备电量需大于20%\n当前电量:@ear @battery%\n请充电后再试', + 'otaDoubleBatteryLow': + '设备电量不足,无法进行固件升级\n升级要求:左右耳电量均需大于20%\n当前电量:左耳 @left%,右耳 @right%\n请充电后再试', 'otaBatteryCheckFailed': '电量检查失败', // OTA升级模块 - 升级状态 diff --git a/lib/core/translations/language/zh_hk.dart b/lib/core/translations/language/zh_hk.dart index 7be68a20f..ae291fda9 100644 --- a/lib/core/translations/language/zh_hk.dart +++ b/lib/core/translations/language/zh_hk.dart @@ -1,5 +1,4 @@ const Map zhHK = { - // 通用 'continue': '繼續', 'confirm': '確認', @@ -160,6 +159,26 @@ const Map zhHK = { 'right': '右', 'checkConnectionStatusFailed': '檢查連接狀態失敗', + // 蓝牙扫描模块 + 'bleInitFailedWithError': '藍牙初始化失敗: @error', + 'needBluetoothAndLocationPermission': '需要藍牙和位置權限才能掃描裝置', + 'permissionRequestFailedWithError': '權限請求失敗: @error', + 'needPermission': '需要權限', + 'blePermissionDialogContent': '應用需要藍牙和位置權限才能掃描裝置。請在設定中手動開啟權限。', + 'needEnableBluetooth': '需要開啟藍牙', + 'enableBluetoothDialogContent': '請開啟藍牙以掃描和連接裝置。', + 'bleScanFailedWithError': '掃描失敗: @error', + 'bleConnectionSuccess': '連接成功', + 'bleConnectedToDevice': '已連接到 @device', + 'bleConnectionFailedWithError': '連接失敗: @error', + 'bleDisconnected': '已斷開連接', + 'bleDeviceDisconnected': '裝置已斷開連接', + 'bleDisconnectFailedWithError': '斷開連接失敗: @error', + 'signalStrong': '信號強', + 'signalMedium': '信號中等', + 'signalWeak': '信號弱', + 'signalVeryWeak': '信號很弱', + // 发现页 "searchAi": "搜尋AI功能...", "exploreSlogan": "智能耳機,無限可能", @@ -675,7 +694,7 @@ const Map zhHK = { 'playerNotReady': '音頻播放器未準備好,請稍候', 'playFailed': '播放失敗', 'audioFileNotFound': '音頻文件不存在', - 'fetchingAudio': '正在從雲端獲取音頻...', + 'fetchingAudio': '正在從雲端獲取音頻...', 'playerLoadFailed': '音頻播放器加載失敗', // 设置页 @@ -777,7 +796,7 @@ const Map zhHK = { "swipeUpForMore": "向上滑動查看更多", "callingTool": "正在幫您,請稍等!", // 正在帮您,请稍等! "voice_interrupt": "語音打斷", // 语音打断 - 'voice_interrupt_tip': '開啟後:AI播報時不會被語音打斷,只能進行單輪對話,需要打斷時請說喚醒詞開啟新一輪對話。', + 'voice_interrupt_tip': '開啟後:AI播報時不會被語音打斷,只能進行單輪對話,需要打斷時請說喚醒詞開啟新一輪對話。', // Agent模块 - 预设提示词 "presetMusic": '來點音樂', // 来点音乐 @@ -828,6 +847,13 @@ const Map zhHK = { 'reportDescriptionHint': '我們想知道你舉報的原因,你可以描述你遇到的問題。', 'generatedByAi': '由AI生成', + // Agent模块 - 工具调用 + 'toolCall': '工具調用', + 'noResult': '無結果', + 'noToolCallContentToCopy': '沒有工具調用內容可以複製', + 'toolCallDetails': '工具調用詳情:', + 'toolCallContentCopied': '工具調用內容已複製到剪貼板', + // Agent模块 - 音乐卡片 'recommendedMusic': '以下是一些推薦的音樂:', 'playList': '播放清單', @@ -848,6 +874,28 @@ const Map zhHK = { "bicycling": "騎行", "tsransit": "公共交通", + // Agent模块 - 导航选择 + 'selectNavigationApp': '選擇導航軟件', + 'amapMap': '高德地圖', + 'useAmapNavigation': '使用高德地圖導航', + 'baiduMap': '百度地圖', + 'useBaiduNavigation': '使用百度地圖導航', + 'googleMap': 'Google 地圖', + 'useGoogleNavigation': '使用 Google 地圖導航', + 'appleMap': 'Apple 地圖', + 'useAppleNavigation': '使用 Apple 地圖導航', + 'builtInNavigation': '內置導航', + 'useBuiltInNavigation': '使用內置地圖導航', + 'navigationStartFailed': '啟動導航失敗', + 'cannotPlayMusicListRetryLater': '無法播放音樂列表,請稍後重試', + 'cannotPlaySong': '無法播放歌曲', + 'openMapError': '打開地圖時發生錯誤', + 'pleaseInstallAmapApp': '請先安裝高德地圖應用', + 'pleaseInstallBaiduMapApp': '請先安裝百度地圖應用', + 'appleMapStartFailed': 'Apple 地圖啟動失敗', + 'appleMapUnavailable': 'Apple 地圖不可用', + 'openAppleMapError': '打開 Apple 地圖時發生錯誤', + // Agent模块 - 天气卡片 'weatherQuery': '查詢天氣情況:', 'highest': '最高', @@ -908,10 +956,20 @@ const Map zhHK = { "bluetoothCallStateError": '請確保藍牙耳機已連接到手機並處於通話狀態', "autoDetect": '自動檢測', // 自动检测 + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': '禁用懸浮窗', + 'enableFloatingWindow': '啟用懸浮窗', + 'permissionTip': '權限提示', + 'micPermissionRequiredForRecording': '需要麥克風權限才能使用錄音功能', + 'deleteTranslationRecordError': '刪除翻譯記錄時發生錯誤: @error', + // 翻译模块 - 文本翻译 "languageDetectionFailed": '語言檢測失敗', "translationFailed": '翻譯失敗', + "translating": "正在翻譯", + "translate": "翻譯", "pleaseInputText": '請輸入文本', + "inputTextToTranslate": "請輸入待翻譯的文本", "textTooLong": '文本過長,最多5000字符', // 翻译模块 - 历史记录 @@ -1258,6 +1316,49 @@ const Map zhHK = { "updateContent": "更新內容", "removeEarbudsEnsureBattery": "取出雙耳機,並保證電量均為20%以上的狀態", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': '發現新版本 @version', + 'otaConfirmUpdateNow': '是否立即更新?', + 'otaUpdate': '更新', + 'otaUpgradeSuccess': '升級成功', + 'otaUpgradeCompleteRepair': '固件升級已完成!\n\n裝置需要重新配對才能正常使用,現在跳轉到配對頁面嗎?', + 'otaPairLater': '稍後配對', + 'otaPairNow': '立即配對', + 'okConfirm': '確定', + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': '檢查BLE連接狀態時發生錯誤:@error', + 'otaBleNotConnected': 'BLE裝置未連接', + 'otaBleNeedConnection': '固件升級需要連接BLE裝置\n請確保裝置已正確連接後再試', + 'otaDeviceInfoUnavailableTitle': '裝置資訊不可用', + 'otaCannotGetDeviceInfo': '無法獲取裝置資訊\n請重新連接裝置或稍後再試', + 'otaBleCheckFailed': 'BLE連接檢查失敗', + 'otaCannotGetDeviceInfoCheckConnection': '無法獲取裝置資訊,請檢查裝置連接', + 'otaCannotGetProductInfoWithName': '無法獲取產品資訊,裝置名稱: @deviceName', + 'otaCannotGetBatteryInfo': '無法獲取有效的電量資訊', + 'otaLowBattery': '電量不足', + 'otaSingleBatteryLow': + '裝置電量不足,無法進行固件升級\n升級要求:裝置電量需大於20%\n當前電量:@ear @battery%\n請充電後再試', + 'otaDoubleBatteryLow': + '裝置電量不足,無法進行固件升級\n升級要求:左右耳電量均需大於20%\n當前電量:左耳 @left%,右耳 @right%\n請充電後再試', + 'otaBatteryCheckFailed': '電量檢查失敗', + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': '本次更新包含性能優化和錯誤修復。', + 'otaGetLatestVersionFailed': '獲取最新版本資訊失敗', + 'otaGetVersionInfoFailed': '獲取版本資訊失敗', + 'otaCheckingDeviceStatus': '正在檢查裝置狀態...', + 'otaDownloadFailedCheckNetwork': '下載失敗,請檢查網絡連接', + 'otaDownloadFailed': '下載失敗', + 'otaPreparingConnection': '準備裝置連接...', + 'otaConnectingDevice': '正在連接裝置...', + 'otaUpgradeStarted': 'OTA升級已開始...', + 'otaUpgradeProgressWithPercent': '升級進度: @percent%', + 'otaUpgradeSuccessComplete': '升級成功完成', + 'otaUpgradeFailedWithCode': '升級失敗,錯誤碼:@code', + 'otaUpgradeFailedTitle': '升級失敗', + 'otaUpgradeFailedDesc': '請檢查裝置連接或升級包,錯誤碼:@code', + 'otaDeviceDisconnected': '裝置連接斷開', + 'otaDeviceConnected': '裝置連接成功', + // 音乐模块 "noMusic": "暫無音樂", // 暂无音乐 "noPlayingMusic": "暫無播放音樂", // 暂无播放音乐 diff --git a/lib/core/translations/language/zh_tw.dart b/lib/core/translations/language/zh_tw.dart index 69abec864..e3edbb544 100644 --- a/lib/core/translations/language/zh_tw.dart +++ b/lib/core/translations/language/zh_tw.dart @@ -1,5 +1,4 @@ const Map zhTW = { - // 通用 'continue': '繼續', 'confirm': '確認', @@ -160,6 +159,26 @@ const Map zhTW = { 'right': '右', 'checkConnectionStatusFailed': '檢查連接狀態失敗', + // 蓝牙扫描模块 + 'bleInitFailedWithError': '藍牙初始化失敗: @error', + 'needBluetoothAndLocationPermission': '需要藍牙和位置權限才能掃描裝置', + 'permissionRequestFailedWithError': '權限請求失敗: @error', + 'needPermission': '需要權限', + 'blePermissionDialogContent': '應用程式需要藍牙和位置權限才能掃描裝置。請在設定中手動開啟權限。', + 'needEnableBluetooth': '需要開啟藍牙', + 'enableBluetoothDialogContent': '請開啟藍牙以掃描和連線裝置。', + 'bleScanFailedWithError': '掃描失敗: @error', + 'bleConnectionSuccess': '連線成功', + 'bleConnectedToDevice': '已連線到 @device', + 'bleConnectionFailedWithError': '連線失敗: @error', + 'bleDisconnected': '已中斷連線', + 'bleDeviceDisconnected': '裝置已中斷連線', + 'bleDisconnectFailedWithError': '中斷連線失敗: @error', + 'signalStrong': '訊號強', + 'signalMedium': '訊號中等', + 'signalWeak': '訊號弱', + 'signalVeryWeak': '訊號極弱', + // 发现页 "searchAi": "搜尋AI功能...", "exploreSlogan": "智能耳機,無限可能", @@ -675,7 +694,7 @@ const Map zhTW = { 'playerNotReady': '音頻播放器未準備好,請稍候', 'playFailed': '播放失敗', 'audioFileNotFound': '音頻文件不存在', - 'fetchingAudio': '正在從雲端獲取音訊...', + 'fetchingAudio': '正在從雲端獲取音訊...', 'playerLoadFailed': '音頻播放器加載失敗', // 设置页 @@ -777,7 +796,7 @@ const Map zhTW = { "swipeUpForMore": "向上滑動查看更多", "callingTool": "正在幫您,請稍等!", // 正在帮您,请稍等! "voice_interrupt": "語音打斷", // 语音打断 - 'voice_interrupt_tip': '開啟後:AI播報時不會被語音打斷,只能進行單輪對話,需要打斷時請說喚醒詞開啟新一輪對話。', + 'voice_interrupt_tip': '開啟後:AI播報時不會被語音打斷,只能進行單輪對話,需要打斷時請說喚醒詞開啟新一輪對話。', // Agent模块 - 预设提示词 "presetMusic": '來點音樂', // 来点音乐 @@ -828,6 +847,13 @@ const Map zhTW = { 'reportDescriptionHint': '我們想知道你舉報的原因,你可以描述你遇到的問題。', 'generatedByAi': '由AI生成', + // Agent模块 - 工具调用 + 'toolCall': '工具呼叫', + 'noResult': '無結果', + 'noToolCallContentToCopy': '沒有工具呼叫內容可以複製', + 'toolCallDetails': '工具呼叫詳情:', + 'toolCallContentCopied': '工具呼叫內容已複製到剪貼簿', + // Agent模块 - 音乐卡片 'recommendedMusic': '以下是一些推薦的音樂:', 'playList': '播放清單', @@ -848,6 +874,28 @@ const Map zhTW = { "bicycling": "騎行", "tsransit": "公共交通", + // Agent模块 - 导航选择 + 'selectNavigationApp': '選擇導航軟體', + 'amapMap': '高德地圖', + 'useAmapNavigation': '使用高德地圖導航', + 'baiduMap': '百度地圖', + 'useBaiduNavigation': '使用百度地圖導航', + 'googleMap': 'Google 地圖', + 'useGoogleNavigation': '使用 Google 地圖導航', + 'appleMap': 'Apple 地圖', + 'useAppleNavigation': '使用 Apple 地圖導航', + 'builtInNavigation': '內建導航', + 'useBuiltInNavigation': '使用內建地圖導航', + 'navigationStartFailed': '啟動導航失敗', + 'cannotPlayMusicListRetryLater': '無法播放音樂清單,請稍後重試', + 'cannotPlaySong': '無法播放歌曲', + 'openMapError': '開啟地圖時發生錯誤', + 'pleaseInstallAmapApp': '請先安裝高德地圖應用程式', + 'pleaseInstallBaiduMapApp': '請先安裝百度地圖應用程式', + 'appleMapStartFailed': 'Apple 地圖啟動失敗', + 'appleMapUnavailable': 'Apple 地圖無法使用', + 'openAppleMapError': '開啟 Apple 地圖時發生錯誤', + // Agent模块 - 天气卡片 'weatherQuery': '查詢天氣情況:', 'highest': '最高', @@ -908,10 +956,20 @@ const Map zhTW = { "bluetoothCallStateError": '請確保藍牙耳機已連接到手機並處於通話狀態', "autoDetect": '自動檢測', // 自动检测 + // 翻译模块 - 悬浮窗与权限 + 'disableFloatingWindow': '停用懸浮視窗', + 'enableFloatingWindow': '啟用懸浮視窗', + 'permissionTip': '權限提示', + 'micPermissionRequiredForRecording': '需要麥克風權限才能使用錄音功能', + 'deleteTranslationRecordError': '刪除翻譯記錄時發生錯誤: @error', + // 翻译模块 - 文本翻译 "languageDetectionFailed": '語言檢測失敗', "translationFailed": '翻譯失敗', + "translating": "正在翻譯", + "translate": "翻譯", "pleaseInputText": '請輸入文本', + "inputTextToTranslate": "請輸入待翻譯的文字", "textTooLong": '文本過長,最多5000字符', // 翻译模块 - 历史记录 @@ -1258,6 +1316,49 @@ const Map zhTW = { "updateContent": "更新內容", "removeEarbudsEnsureBattery": "取出雙耳機,並保證電量均為20%以上的狀態", + // OTA升级模块 - 弹窗与对话框 + 'otaNewVersionFoundWithVersion': '發現新版本 @version', + 'otaConfirmUpdateNow': '是否立即更新?', + 'otaUpdate': '更新', + 'otaUpgradeSuccess': '升級成功', + 'otaUpgradeCompleteRepair': '韌體升級已完成!\n\n裝置需要重新配對才能正常使用,現在跳轉到配對頁面嗎?', + 'otaPairLater': '稍後配對', + 'otaPairNow': '立即配對', + 'okConfirm': '確定', + // OTA升级模块 - 设备检查 + 'otaBleCheckErrorWithError': '檢查BLE連線狀態時發生錯誤:@error', + 'otaBleNotConnected': 'BLE裝置未連線', + 'otaBleNeedConnection': '韌體升級需要連接BLE裝置\n請確保裝置已正確連接後再試', + 'otaDeviceInfoUnavailableTitle': '裝置資訊無法取得', + 'otaCannotGetDeviceInfo': '無法取得裝置資訊\n請重新連線裝置或稍後再試', + 'otaBleCheckFailed': 'BLE連線檢查失敗', + 'otaCannotGetDeviceInfoCheckConnection': '無法取得裝置資訊,請檢查裝置連線', + 'otaCannotGetProductInfoWithName': '無法取得產品資訊,裝置名稱: @deviceName', + 'otaCannotGetBatteryInfo': '無法取得有效的電量資訊', + 'otaLowBattery': '電量不足', + 'otaSingleBatteryLow': + '裝置電量不足,無法進行韌體升級\n升級要求:裝置電量需大於20%\n目前電量:@ear @battery%\n請充電後再試', + 'otaDoubleBatteryLow': + '裝置電量不足,無法進行韌體升級\n升級要求:左右耳電量均需大於20%\n目前電量:左耳 @left%,右耳 @right%\n請充電後再試', + 'otaBatteryCheckFailed': '電量檢查失敗', + // OTA升级模块 - 升级状态 + 'otaDefaultUpdateDesc': '本次更新包含效能最佳化和錯誤修復。', + 'otaGetLatestVersionFailed': '取得最新版本資訊失敗', + 'otaGetVersionInfoFailed': '取得版本資訊失敗', + 'otaCheckingDeviceStatus': '正在檢查裝置狀態...', + 'otaDownloadFailedCheckNetwork': '下載失敗,請檢查網路連線', + 'otaDownloadFailed': '下載失敗', + 'otaPreparingConnection': '準備裝置連線...', + 'otaConnectingDevice': '正在連線裝置...', + 'otaUpgradeStarted': 'OTA升級已開始...', + 'otaUpgradeProgressWithPercent': '升級進度: @percent%', + 'otaUpgradeSuccessComplete': '升級成功完成', + 'otaUpgradeFailedWithCode': '升級失敗,錯誤碼:@code', + 'otaUpgradeFailedTitle': '升級失敗', + 'otaUpgradeFailedDesc': '請檢查裝置連線或升級套件,錯誤碼:@code', + 'otaDeviceDisconnected': '裝置連線中斷', + 'otaDeviceConnected': '裝置連線成功', + // 音乐模块 "noMusic": "暫無音樂", // 暂无音乐 "noPlayingMusic": "暫無播放音樂", // 暂无播放音乐 diff --git a/tools/i18n_allowlist.json b/tools/i18n_allowlist.json new file mode 100644 index 000000000..c937a7f84 --- /dev/null +++ b/tools/i18n_allowlist.json @@ -0,0 +1,24 @@ +[ + "Lily", + "paypalPay", + "wechatPay", + "alipayPay", + "appleIap", + "googleIap", + "wechatPayWithAmount", + "alipayPayWithAmount", + "amapMap", + "baiduMap", + "googleMap", + "appleMap", + "native.notification.appName", + "copyrightVoitrans", + "voitransPrivateCloud", + "aiChatCreditsLabel", + "translationCreditsLabel", + "meetingCreditsLabel", + "vipLevelLabel", + "error", + "errorInfoWithMessage" +] + diff --git a/tools/i18n_audit.py b/tools/i18n_audit.py new file mode 100644 index 000000000..0a7b84817 --- /dev/null +++ b/tools/i18n_audit.py @@ -0,0 +1,201 @@ +import argparse +import glob +import json +import os +from collections import Counter + + +def _unesc(s: str) -> str: + if "\\" in s: + return s.encode("utf-8").decode("unicode_escape") + return s + + +def _skip_ws_and_comments(text: str, i: int) -> int: + n = len(text) + while i < n: + ch = text[i] + if ch.isspace(): + i += 1 + continue + if text.startswith("//", i): + j = text.find("\n", i + 2) + i = n if j == -1 else j + 1 + continue + if text.startswith("/*", i): + j = text.find("*/", i + 2) + i = n if j == -1 else j + 2 + continue + break + return i + + +def _parse_string_literal(text: str, i: int) -> tuple[str, int]: + quote = text[i] + i += 1 + n = len(text) + buf: list[str] = [] + while i < n: + ch = text[i] + if ch == "\\" and i + 1 < n: + buf.append(ch) + buf.append(text[i + 1]) + i += 2 + continue + if ch == quote: + i += 1 + break + buf.append(ch) + i += 1 + raw = "".join(buf) + return _unesc(raw), i + + +def _parse_dart_map(file_path: str) -> dict[str, str]: + with open(file_path, "r", encoding="utf-8") as f: + text = f.read() + start = text.find("{") + end = text.rfind("}") + if start == -1 or end == -1 or end <= start: + return {} + text = text[start + 1 : end] + out: dict[str, str] = {} + i = 0 + n = len(text) + while i < n: + i = _skip_ws_and_comments(text, i) + if i >= n: + break + if text[i] not in ("'", '"'): + i += 1 + continue + key, i = _parse_string_literal(text, i) + i = _skip_ws_and_comments(text, i) + if i >= n or text[i] != ":": + continue + i += 1 + i = _skip_ws_and_comments(text, i) + if i >= n or text[i] not in ("'", '"'): + continue + parts: list[str] = [] + while i < n and text[i] in ("'", '"'): + part, i = _parse_string_literal(text, i) + parts.append(part) + i = _skip_ws_and_comments(text, i) + out[key] = "".join(parts) + return out + + +def _ascii_letter_ratio(s: str) -> float: + if not s: + return 0.0 + letters = sum(1 for ch in s if ("a" <= ch.lower() <= "z")) + return letters / max(1, len(s)) + + +def _looks_english_sentence(s: str) -> bool: + if len(s.strip()) < 4: + return False + ratio = _ascii_letter_ratio(s) + if ratio < 0.35: + return False + s_low = s.lower() + common = [ + "please", + "failed", + "success", + "error", + "connect", + "connection", + "device", + "network", + "download", + "upload", + "translate", + "translation", + "record", + "permission", + "enable", + "disable", + "check", + "try again", + ] + return any(w in s_low for w in common) + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument( + "--dir", + default=os.path.join("lib", "core", "translations", "language"), + help="Directory containing language dart files", + ) + parser.add_argument( + "--baseline", + default="en_us.dart", + help="Baseline dart file to compare values against", + ) + parser.add_argument( + "--allowlist", + default="", + help="Path to JSON array of keys allowed to keep identical baseline values", + ) + parser.add_argument( + "--mode", + choices=["exact", "englishy"], + default="englishy", + help="exact: value equals baseline; englishy: value equals baseline and looks English", + ) + args = parser.parse_args() + + lang_dir = args.dir + dart_files = sorted(glob.glob(os.path.join(lang_dir, "*.dart"))) + if not dart_files: + raise SystemExit(f"No dart files found in {lang_dir}") + + allowlist: set[str] = set() + if args.allowlist: + with open(args.allowlist, "r", encoding="utf-8") as f: + allowlist = set(json.load(f)) + + parsed = {os.path.basename(p): _parse_dart_map(p) for p in dart_files} + if args.baseline not in parsed: + raise SystemExit(f"baseline not found: {args.baseline}") + + baseline = parsed[args.baseline] + + result: dict[str, dict] = {"baseline": args.baseline, "mode": args.mode, "files": {}} + global_counter: Counter[str] = Counter() + + for fn, kv in parsed.items(): + if fn == args.baseline: + continue + issues: list[dict] = [] + for k, v in kv.items(): + if k in allowlist: + continue + bv = baseline.get(k) + if bv is None: + continue + if v != bv: + continue + if args.mode == "englishy" and not _looks_english_sentence(v): + continue + issues.append({"key": k, "value": v}) + global_counter[k] += 1 + result["files"][fn] = {"count": len(issues), "items": issues} + + result["summary"] = { + "file_count": len(dart_files), + "non_baseline_file_count": len(dart_files) - 1, + "files_with_issues": sum(1 for f in result["files"].values() if f["count"] > 0), + "total_issues": sum(f["count"] for f in result["files"].values()), + "most_common_keys": [{"key": k, "count": c} for k, c in global_counter.most_common(50)], + } + + print(json.dumps(result, ensure_ascii=False, indent=2)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())