add toggle for autmatically translated messages for notification and chat or manual translation on message action. Due to heavy battery usage.

chore/offband-rebrand
ericz 2 months ago
parent bc5f299350
commit 9ada4ea601

@ -1072,18 +1072,30 @@ class MeshCoreConnector extends ChangeNotifier {
} }
} }
Future<TranslationResult?> _translateIncomingContactMessage( Future<TranslationResult?> translateContactMessage(
String contactKeyHex, String contactKeyHex,
Message message, Message message, {
) async { bool manualTranslation = false,
}) async {
try { try {
if (message.translatedText?.trim().isNotEmpty == true ||
(!manualTranslation &&
message.translationStatus != MessageTranslationStatus.none)) {
return null;
}
final service = _translationService; final service = _translationService;
if (service == null || if (service == null ||
!service.shouldTranslateIncoming( !(manualTranslation
text: message.text, ? service.canTranslateIncoming(
isCli: message.isCli, text: message.text,
isOutgoing: message.isOutgoing, isCli: message.isCli,
)) { isOutgoing: message.isOutgoing,
)
: service.shouldAutoTranslateIncoming(
text: message.text,
isCli: message.isCli,
isOutgoing: message.isOutgoing,
))) {
return null; return null;
} }
final targetLanguageCode = service.resolvedIncomingLanguageCode( final targetLanguageCode = service.resolvedIncomingLanguageCode(
@ -1116,18 +1128,30 @@ class MeshCoreConnector extends ChangeNotifier {
} }
} }
Future<TranslationResult?> _translateIncomingChannelMessage( Future<TranslationResult?> translateChannelMessage(
int channelIndex, int channelIndex,
ChannelMessage message, ChannelMessage message, {
) async { bool manualTranslation = false,
}) async {
try { try {
if (message.translatedText?.trim().isNotEmpty == true ||
(!manualTranslation &&
message.translationStatus != MessageTranslationStatus.none)) {
return null;
}
final service = _translationService; final service = _translationService;
if (service == null || if (service == null ||
!service.shouldTranslateIncoming( !(manualTranslation
text: message.text, ? service.canTranslateIncoming(
isCli: false, text: message.text,
isOutgoing: message.isOutgoing, isCli: false,
)) { isOutgoing: message.isOutgoing,
)
: service.shouldAutoTranslateIncoming(
text: message.text,
isCli: false,
isOutgoing: message.isOutgoing,
))) {
return null; return null;
} }
final targetLanguageCode = service.resolvedIncomingLanguageCode( final targetLanguageCode = service.resolvedIncomingLanguageCode(
@ -4421,7 +4445,7 @@ class MeshCoreConnector extends ChangeNotifier {
final msg = message; // capture for closure final msg = message; // capture for closure
final c = contact; // capture contact reference final c = contact; // capture contact reference
unawaited(() async { unawaited(() async {
final translationResult = await _translateIncomingContactMessage( final translationResult = await translateContactMessage(
msg.senderKeyHex, msg.senderKeyHex,
msg, msg,
); );
@ -4784,7 +4808,7 @@ class MeshCoreConnector extends ChangeNotifier {
if (isNew && !message.isOutgoing) { if (isNew && !message.isOutgoing) {
final msg = message; // capture for closure final msg = message; // capture for closure
unawaited(() async { unawaited(() async {
final translationResult = await _translateIncomingChannelMessage( final translationResult = await translateChannelMessage(
msg.channelIndex!, msg.channelIndex!,
msg, msg,
); );
@ -4867,7 +4891,7 @@ class MeshCoreConnector extends ChangeNotifier {
if (isNew) { if (isNew) {
// Run translation + notification asynchronously to avoid blocking // Run translation + notification asynchronously to avoid blocking
unawaited(() async { unawaited(() async {
final translationResult = await _translateIncomingChannelMessage( final translationResult = await translateChannelMessage(
channel.index, channel.index,
message, message,
); );

@ -2099,6 +2099,9 @@
"translation_composerTitle": "Преведете преди да изпратите", "translation_composerTitle": "Преведете преди да изпратите",
"translation_enableSubtitle": "Превеждайте входящите съобщения и позволявайте предварително превеждане преди изпращане.", "translation_enableSubtitle": "Превеждайте входящите съобщения и позволявайте предварително превеждане преди изпращане.",
"translation_composerSubtitle": "Контролира началния статус на иконата за превод, създадена от композитора.", "translation_composerSubtitle": "Контролира началния статус на иконата за превод, създадена от композитора.",
"translation_autoIncomingTitle": "Автоматичен превод на съобщения",
"translation_autoIncomingSubtitle": "Превежда автоматично съобщенията за известия, както и за чатове или канали.",
"translation_translateMessage": "Преведи съобщението",
"translation_targetLanguage": "Целеви език", "translation_targetLanguage": "Целеви език",
"translation_useAppLanguage": "Използвайте езика на приложението", "translation_useAppLanguage": "Използвайте езика на приложението",
"translation_downloadedModelLabel": "Изтегнат модел", "translation_downloadedModelLabel": "Изтегнат модел",

@ -2127,6 +2127,9 @@
"translation_enableSubtitle": "Nachrichten empfangen und übersetzen sowie die Möglichkeit bieten, Nachrichten vor dem Versenden zu übersetzen.", "translation_enableSubtitle": "Nachrichten empfangen und übersetzen sowie die Möglichkeit bieten, Nachrichten vor dem Versenden zu übersetzen.",
"translation_enableTitle": "Aktivieren Sie die Übersetzung", "translation_enableTitle": "Aktivieren Sie die Übersetzung",
"translation_composerSubtitle": "Steuert den Standardzustand des Icons für die Übersetzung des Komponisten.", "translation_composerSubtitle": "Steuert den Standardzustand des Icons für die Übersetzung des Komponisten.",
"translation_autoIncomingTitle": "Nachrichten automatisch übersetzen",
"translation_autoIncomingSubtitle": "Übersetzt Nachrichten für Benachrichtigungen sowie für Chats oder Kanäle automatisch.",
"translation_translateMessage": "Nachricht übersetzen",
"translation_targetLanguage": "Zielsprache", "translation_targetLanguage": "Zielsprache",
"translation_useAppLanguage": "Verwenden Sie die App-Sprache", "translation_useAppLanguage": "Verwenden Sie die App-Sprache",
"translation_downloadedModelLabel": "Heruntergeladenes Modell", "translation_downloadedModelLabel": "Heruntergeladenes Modell",

@ -2288,6 +2288,9 @@
"translation_enableSubtitle": "Translate incoming messages and allow pre-send translation.", "translation_enableSubtitle": "Translate incoming messages and allow pre-send translation.",
"translation_composerTitle": "Translate before sending", "translation_composerTitle": "Translate before sending",
"translation_composerSubtitle": "Controls the default state of the composer translation icon.", "translation_composerSubtitle": "Controls the default state of the composer translation icon.",
"translation_autoIncomingTitle": "Auto-translate incoming messages",
"translation_autoIncomingSubtitle": "Translates Messages for notification and for chat or channel automatically.",
"translation_translateMessage": "Translate message",
"translation_targetLanguage": "Target language", "translation_targetLanguage": "Target language",
"translation_useAppLanguage": "Use app language", "translation_useAppLanguage": "Use app language",
"translation_downloadedModelLabel": "Downloaded model", "translation_downloadedModelLabel": "Downloaded model",

@ -2128,6 +2128,9 @@
"translation_enableTitle": "Habilitar la traducción", "translation_enableTitle": "Habilitar la traducción",
"translation_composerTitle": "Traducir antes de enviar", "translation_composerTitle": "Traducir antes de enviar",
"translation_composerSubtitle": "Controla el estado predeterminado del icono de traducción del compositor.", "translation_composerSubtitle": "Controla el estado predeterminado del icono de traducción del compositor.",
"translation_autoIncomingTitle": "Traducir mensajes automáticamente",
"translation_autoIncomingSubtitle": "Traduce mensajes para notificaciones y para chats o canales automáticamente.",
"translation_translateMessage": "Traducir mensaje",
"translation_targetLanguage": "Idioma de destino", "translation_targetLanguage": "Idioma de destino",
"translation_useAppLanguage": "Utilizar el idioma de la aplicación", "translation_useAppLanguage": "Utilizar el idioma de la aplicación",
"translation_downloadedModelLabel": "Modelo descargado", "translation_downloadedModelLabel": "Modelo descargado",

@ -2099,6 +2099,9 @@
"translation_title": "Traduction", "translation_title": "Traduction",
"translation_enableSubtitle": "Traduire les messages entrants et permettre la traduction avant l'envoi.", "translation_enableSubtitle": "Traduire les messages entrants et permettre la traduction avant l'envoi.",
"translation_composerSubtitle": "Contrôle l'état par défaut de l'icône de traduction du composant.", "translation_composerSubtitle": "Contrôle l'état par défaut de l'icône de traduction du composant.",
"translation_autoIncomingTitle": "Traduire automatiquement les messages",
"translation_autoIncomingSubtitle": "Traduit automatiquement les messages pour les notifications et pour les discussions ou les canaux.",
"translation_translateMessage": "Traduire le message",
"translation_targetLanguage": "Langue cible", "translation_targetLanguage": "Langue cible",
"translation_useAppLanguage": "Utiliser la langue de l'application", "translation_useAppLanguage": "Utiliser la langue de l'application",
"translation_downloadedModelLabel": "Modèle téléchargé", "translation_downloadedModelLabel": "Modèle téléchargé",

@ -2137,6 +2137,9 @@
"translation_enableSubtitle": "Fordítsa az érkező üzeneteket, és lehetővé tegye a küldés előtti fordítást.", "translation_enableSubtitle": "Fordítsa az érkező üzeneteket, és lehetővé tegye a küldés előtti fordítást.",
"translation_composerTitle": "Fordítsa el, mielőtt elküldi", "translation_composerTitle": "Fordítsa el, mielőtt elküldi",
"translation_composerSubtitle": "Ellenőrzi a zeneszerző fordítási ikon alapértékét.", "translation_composerSubtitle": "Ellenőrzi a zeneszerző fordítási ikon alapértékét.",
"translation_autoIncomingTitle": "Üzenetek automatikus fordítása",
"translation_autoIncomingSubtitle": "Automatikusan lefordítja az üzeneteket az értesítésekhez, valamint a csevegésekhez vagy csatornákhoz.",
"translation_translateMessage": "Üzenet fordítása",
"translation_targetLanguage": "Célnyelv", "translation_targetLanguage": "Célnyelv",
"translation_useAppLanguage": "Használja az alkalmazás nyelvének beállítását.", "translation_useAppLanguage": "Használja az alkalmazás nyelvének beállítását.",
"translation_downloadedModelLabel": "Letöltött modell", "translation_downloadedModelLabel": "Letöltött modell",

@ -2100,6 +2100,9 @@
"translation_enableTitle": "Abilitare la traduzione", "translation_enableTitle": "Abilitare la traduzione",
"translation_title": "Traduzione", "translation_title": "Traduzione",
"translation_composerSubtitle": "Controlla lo stato predefinito dell'icona di traduzione del compositore.", "translation_composerSubtitle": "Controlla lo stato predefinito dell'icona di traduzione del compositore.",
"translation_autoIncomingTitle": "Traduci automaticamente i messaggi",
"translation_autoIncomingSubtitle": "Traduce automaticamente i messaggi per le notifiche e per le chat o i canali.",
"translation_translateMessage": "Traduci messaggio",
"translation_targetLanguage": "Lingua di destinazione", "translation_targetLanguage": "Lingua di destinazione",
"translation_useAppLanguage": "Utilizza la lingua dell'app", "translation_useAppLanguage": "Utilizza la lingua dell'app",
"translation_downloadedModelLabel": "Modello scaricato", "translation_downloadedModelLabel": "Modello scaricato",

@ -2137,6 +2137,9 @@
"translation_composerTitle": "送信する前に翻訳する", "translation_composerTitle": "送信する前に翻訳する",
"translation_enableTitle": "翻訳機能を有効にする", "translation_enableTitle": "翻訳機能を有効にする",
"translation_composerSubtitle": "作曲家翻訳アイコンのデフォルト状態を制御する。", "translation_composerSubtitle": "作曲家翻訳アイコンのデフォルト状態を制御する。",
"translation_autoIncomingTitle": "メッセージを自動翻訳",
"translation_autoIncomingSubtitle": "通知やチャット、チャンネルのメッセージを自動的に翻訳します。",
"translation_translateMessage": "メッセージを翻訳",
"translation_targetLanguage": "翻訳対象言語", "translation_targetLanguage": "翻訳対象言語",
"translation_useAppLanguage": "アプリの言語設定", "translation_useAppLanguage": "アプリの言語設定",
"translation_downloadedModelLabel": "ダウンロードしたモデル", "translation_downloadedModelLabel": "ダウンロードしたモデル",

@ -2137,6 +2137,9 @@
"translation_enableTitle": "번역 기능 활성화", "translation_enableTitle": "번역 기능 활성화",
"translation_composerTitle": "보내기 전에 번역", "translation_composerTitle": "보내기 전에 번역",
"translation_composerSubtitle": "컴포저 번역 아이콘의 기본 상태를 제어합니다.", "translation_composerSubtitle": "컴포저 번역 아이콘의 기본 상태를 제어합니다.",
"translation_autoIncomingTitle": "메시지 자동 번역",
"translation_autoIncomingSubtitle": "알림과 채팅 또는 채널의 메시지를 자동으로 번역합니다.",
"translation_translateMessage": "메시지 번역",
"translation_targetLanguage": "목표 언어", "translation_targetLanguage": "목표 언어",
"translation_useAppLanguage": "앱 언어 사용", "translation_useAppLanguage": "앱 언어 사용",
"translation_downloadedModelLabel": "다운로드한 모델", "translation_downloadedModelLabel": "다운로드한 모델",

@ -7114,6 +7114,24 @@ abstract class AppLocalizations {
/// **'Controls the default state of the composer translation icon.'** /// **'Controls the default state of the composer translation icon.'**
String get translation_composerSubtitle; String get translation_composerSubtitle;
/// No description provided for @translation_autoIncomingTitle.
///
/// In en, this message translates to:
/// **'Auto-translate incoming messages'**
String get translation_autoIncomingTitle;
/// No description provided for @translation_autoIncomingSubtitle.
///
/// In en, this message translates to:
/// **'Translates Messages for notification and for chat or channel automatically.'**
String get translation_autoIncomingSubtitle;
/// No description provided for @translation_translateMessage.
///
/// In en, this message translates to:
/// **'Translate message'**
String get translation_translateMessage;
/// No description provided for @translation_targetLanguage. /// No description provided for @translation_targetLanguage.
/// ///
/// In en, this message translates to: /// In en, this message translates to:

@ -4161,6 +4161,16 @@ class AppLocalizationsBg extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Контролира началния статус на иконата за превод, създадена от композитора.'; 'Контролира началния статус на иконата за превод, създадена от композитора.';
@override
String get translation_autoIncomingTitle => 'Автоматичен превод на съобщения';
@override
String get translation_autoIncomingSubtitle =>
'Превежда автоматично съобщенията за известия, както и за чатове или канали.';
@override
String get translation_translateMessage => 'Преведи съобщението';
@override @override
String get translation_targetLanguage => 'Целеви език'; String get translation_targetLanguage => 'Целеви език';

@ -4176,6 +4176,17 @@ class AppLocalizationsDe extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Steuert den Standardzustand des Icons für die Übersetzung des Komponisten.'; 'Steuert den Standardzustand des Icons für die Übersetzung des Komponisten.';
@override
String get translation_autoIncomingTitle =>
'Nachrichten automatisch übersetzen';
@override
String get translation_autoIncomingSubtitle =>
'Übersetzt Nachrichten für Benachrichtigungen sowie für Chats oder Kanäle automatisch.';
@override
String get translation_translateMessage => 'Nachricht übersetzen';
@override @override
String get translation_targetLanguage => 'Zielsprache'; String get translation_targetLanguage => 'Zielsprache';

@ -4085,6 +4085,17 @@ class AppLocalizationsEn extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Controls the default state of the composer translation icon.'; 'Controls the default state of the composer translation icon.';
@override
String get translation_autoIncomingTitle =>
'Auto-translate incoming messages';
@override
String get translation_autoIncomingSubtitle =>
'Translates Messages for notification and for chat or channel automatically.';
@override
String get translation_translateMessage => 'Translate message';
@override @override
String get translation_targetLanguage => 'Target language'; String get translation_targetLanguage => 'Target language';

@ -4163,6 +4163,17 @@ class AppLocalizationsEs extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Controla el estado predeterminado del icono de traducción del compositor.'; 'Controla el estado predeterminado del icono de traducción del compositor.';
@override
String get translation_autoIncomingTitle =>
'Traducir mensajes automáticamente';
@override
String get translation_autoIncomingSubtitle =>
'Traduce mensajes para notificaciones y para chats o canales automáticamente.';
@override
String get translation_translateMessage => 'Traducir mensaje';
@override @override
String get translation_targetLanguage => 'Idioma de destino'; String get translation_targetLanguage => 'Idioma de destino';

@ -4193,6 +4193,17 @@ class AppLocalizationsFr extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Contrôle l\'état par défaut de l\'icône de traduction du composant.'; 'Contrôle l\'état par défaut de l\'icône de traduction du composant.';
@override
String get translation_autoIncomingTitle =>
'Traduire automatiquement les messages';
@override
String get translation_autoIncomingSubtitle =>
'Traduit automatiquement les messages pour les notifications et pour les discussions ou les canaux.';
@override
String get translation_translateMessage => 'Traduire le message';
@override @override
String get translation_targetLanguage => 'Langue cible'; String get translation_targetLanguage => 'Langue cible';

@ -4181,6 +4181,16 @@ class AppLocalizationsHu extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Ellenőrzi a zeneszerző fordítási ikon alapértékét.'; 'Ellenőrzi a zeneszerző fordítási ikon alapértékét.';
@override
String get translation_autoIncomingTitle => 'Üzenetek automatikus fordítása';
@override
String get translation_autoIncomingSubtitle =>
'Automatikusan lefordítja az üzeneteket az értesítésekhez, valamint a csevegésekhez vagy csatornákhoz.';
@override
String get translation_translateMessage => 'Üzenet fordítása';
@override @override
String get translation_targetLanguage => 'Célnyelv'; String get translation_targetLanguage => 'Célnyelv';

@ -4169,6 +4169,17 @@ class AppLocalizationsIt extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Controlla lo stato predefinito dell\'icona di traduzione del compositore.'; 'Controlla lo stato predefinito dell\'icona di traduzione del compositore.';
@override
String get translation_autoIncomingTitle =>
'Traduci automaticamente i messaggi';
@override
String get translation_autoIncomingSubtitle =>
'Traduce automaticamente i messaggi per le notifiche e per le chat o i canali.';
@override
String get translation_translateMessage => 'Traduci messaggio';
@override @override
String get translation_targetLanguage => 'Lingua di destinazione'; String get translation_targetLanguage => 'Lingua di destinazione';

@ -3941,6 +3941,16 @@ class AppLocalizationsJa extends AppLocalizations {
@override @override
String get translation_composerSubtitle => '作曲家翻訳アイコンのデフォルト状態を制御する。'; String get translation_composerSubtitle => '作曲家翻訳アイコンのデフォルト状態を制御する。';
@override
String get translation_autoIncomingTitle => 'メッセージを自動翻訳';
@override
String get translation_autoIncomingSubtitle =>
'通知やチャット、チャンネルのメッセージを自動的に翻訳します。';
@override
String get translation_translateMessage => 'メッセージを翻訳';
@override @override
String get translation_targetLanguage => '翻訳対象言語'; String get translation_targetLanguage => '翻訳対象言語';

@ -3942,6 +3942,16 @@ class AppLocalizationsKo extends AppLocalizations {
@override @override
String get translation_composerSubtitle => '컴포저 번역 아이콘의 기본 상태를 제어합니다.'; String get translation_composerSubtitle => '컴포저 번역 아이콘의 기본 상태를 제어합니다.';
@override
String get translation_autoIncomingTitle => '메시지 자동 번역';
@override
String get translation_autoIncomingSubtitle =>
'알림과 채팅 또는 채널의 메시지를 자동으로 번역합니다.';
@override
String get translation_translateMessage => '메시지 번역';
@override @override
String get translation_targetLanguage => '목표 언어'; String get translation_targetLanguage => '목표 언어';

@ -4146,6 +4146,16 @@ class AppLocalizationsNl extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Stelt de standaardstatus van het pictogram voor de vertaling van de componist in.'; 'Stelt de standaardstatus van het pictogram voor de vertaling van de componist in.';
@override
String get translation_autoIncomingTitle => 'Berichten automatisch vertalen';
@override
String get translation_autoIncomingSubtitle =>
'Vertaalt berichten automatisch voor meldingen en voor chats of kanalen.';
@override
String get translation_translateMessage => 'Bericht vertalen';
@override @override
String get translation_targetLanguage => 'Doeltaal'; String get translation_targetLanguage => 'Doeltaal';

@ -4184,6 +4184,17 @@ class AppLocalizationsPl extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Kontroluje domyślny stan ikony tłumaczenia w edytorze.'; 'Kontroluje domyślny stan ikony tłumaczenia w edytorze.';
@override
String get translation_autoIncomingTitle =>
'Automatycznie tłumacz wiadomości';
@override
String get translation_autoIncomingSubtitle =>
'Automatycznie tłumaczy wiadomości do powiadomień oraz do czatów lub kanałów.';
@override
String get translation_translateMessage => 'Przetłumacz wiadomość';
@override @override
String get translation_targetLanguage => 'Język docelowy'; String get translation_targetLanguage => 'Język docelowy';

@ -4159,6 +4159,17 @@ class AppLocalizationsPt extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Controla o estado padrão do ícone de tradução do compositor.'; 'Controla o estado padrão do ícone de tradução do compositor.';
@override
String get translation_autoIncomingTitle =>
'Traduzir mensagens automaticamente';
@override
String get translation_autoIncomingSubtitle =>
'Traduz automaticamente mensagens para notificações e para chats ou canais.';
@override
String get translation_translateMessage => 'Traduzir mensagem';
@override @override
String get translation_targetLanguage => 'Língua-alvo'; String get translation_targetLanguage => 'Língua-alvo';

@ -4177,6 +4177,17 @@ class AppLocalizationsRu extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Управляет исходным состоянием значка перевода, предоставляемого редактором.'; 'Управляет исходным состоянием значка перевода, предоставляемого редактором.';
@override
String get translation_autoIncomingTitle =>
'Автоматически переводить сообщения';
@override
String get translation_autoIncomingSubtitle =>
'Автоматически переводит сообщения для уведомлений, а также для чатов и каналов.';
@override
String get translation_translateMessage => 'Перевести сообщение';
@override @override
String get translation_targetLanguage => 'Целевой язык'; String get translation_targetLanguage => 'Целевой язык';

@ -4141,6 +4141,16 @@ class AppLocalizationsSk extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Riadi výchoce stav ikony pre preklad, ktorú používa program.'; 'Riadi výchoce stav ikony pre preklad, ktorú používa program.';
@override
String get translation_autoIncomingTitle => 'Automaticky prekladať správy';
@override
String get translation_autoIncomingSubtitle =>
'Automaticky prekladá správy pre upozornenia aj pre čet alebo kanál.';
@override
String get translation_translateMessage => 'Preložiť správu';
@override @override
String get translation_targetLanguage => 'Cieľový jazyk'; String get translation_targetLanguage => 'Cieľový jazyk';

@ -4139,6 +4139,16 @@ class AppLocalizationsSl extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Ureja privzeto stanje ikone za prevod, ki jo uporablja avtor.'; 'Ureja privzeto stanje ikone za prevod, ki jo uporablja avtor.';
@override
String get translation_autoIncomingTitle => 'Samodejno prevajaj sporočila';
@override
String get translation_autoIncomingSubtitle =>
'Samodejno prevaja sporočila za obvestila ter za klepete ali kanale.';
@override
String get translation_translateMessage => 'Prevedi sporočilo';
@override @override
String get translation_targetLanguage => 'Ciljna jezika'; String get translation_targetLanguage => 'Ciljna jezika';

@ -4113,6 +4113,17 @@ class AppLocalizationsSv extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Styr standardtillståndet för kompositorns översättningsikon.'; 'Styr standardtillståndet för kompositorns översättningsikon.';
@override
String get translation_autoIncomingTitle =>
'Översätt meddelanden automatiskt';
@override
String get translation_autoIncomingSubtitle =>
'Översätter meddelanden automatiskt för aviseringar och för chattar eller kanaler.';
@override
String get translation_translateMessage => 'Översätt meddelande';
@override @override
String get translation_targetLanguage => 'Målmedvetet språk'; String get translation_targetLanguage => 'Målmedvetet språk';

@ -4176,6 +4176,17 @@ class AppLocalizationsUk extends AppLocalizations {
String get translation_composerSubtitle => String get translation_composerSubtitle =>
'Контролює стан ікон перекладу, який використовується за замовчуванням.'; 'Контролює стан ікон перекладу, який використовується за замовчуванням.';
@override
String get translation_autoIncomingTitle =>
'Автоматично перекладати повідомлення';
@override
String get translation_autoIncomingSubtitle =>
'Автоматично перекладає повідомлення для сповіщень, а також для чатів і каналів.';
@override
String get translation_translateMessage => 'Перекласти повідомлення';
@override @override
String get translation_targetLanguage => 'Цільова мова'; String get translation_targetLanguage => 'Цільова мова';

@ -3816,6 +3816,15 @@ class AppLocalizationsZh extends AppLocalizations {
@override @override
String get translation_composerSubtitle => '控制作曲家翻译图标的默认状态。'; String get translation_composerSubtitle => '控制作曲家翻译图标的默认状态。';
@override
String get translation_autoIncomingTitle => '自动翻译消息';
@override
String get translation_autoIncomingSubtitle => '自动为通知以及聊天或频道翻译消息。';
@override
String get translation_translateMessage => '翻译消息';
@override @override
String get translation_targetLanguage => '目标语言'; String get translation_targetLanguage => '目标语言';

@ -2101,6 +2101,9 @@
"translation_composerTitle": "Vertaal voor verzending", "translation_composerTitle": "Vertaal voor verzending",
"translation_composerSubtitle": "Stelt de standaardstatus van het pictogram voor de vertaling van de componist in.", "translation_composerSubtitle": "Stelt de standaardstatus van het pictogram voor de vertaling van de componist in.",
"translation_useAppLanguage": "Gebruik de taal van de app", "translation_useAppLanguage": "Gebruik de taal van de app",
"translation_autoIncomingTitle": "Berichten automatisch vertalen",
"translation_autoIncomingSubtitle": "Vertaalt berichten automatisch voor meldingen en voor chats of kanalen.",
"translation_translateMessage": "Bericht vertalen",
"translation_targetLanguage": "Doeltaal", "translation_targetLanguage": "Doeltaal",
"translation_downloadedModelLabel": "Gedownloade model", "translation_downloadedModelLabel": "Gedownloade model",
"translation_presetModelLabel": "Voorgeprogrammeerd Hugging Face-model", "translation_presetModelLabel": "Voorgeprogrammeerd Hugging Face-model",

@ -2137,6 +2137,9 @@
"translation_enableTitle": "Włącz tłumaczenie", "translation_enableTitle": "Włącz tłumaczenie",
"translation_enableSubtitle": "Tłumaczenie otrzymywanych wiadomości oraz umożliwienie tłumaczenia przed wysłaniem.", "translation_enableSubtitle": "Tłumaczenie otrzymywanych wiadomości oraz umożliwienie tłumaczenia przed wysłaniem.",
"translation_composerSubtitle": "Kontroluje domyślny stan ikony tłumaczenia w edytorze.", "translation_composerSubtitle": "Kontroluje domyślny stan ikony tłumaczenia w edytorze.",
"translation_autoIncomingTitle": "Automatycznie tłumacz wiadomości",
"translation_autoIncomingSubtitle": "Automatycznie tłumaczy wiadomości do powiadomień oraz do czatów lub kanałów.",
"translation_translateMessage": "Przetłumacz wiadomość",
"translation_targetLanguage": "Język docelowy", "translation_targetLanguage": "Język docelowy",
"translation_useAppLanguage": "Użyj języka aplikacji", "translation_useAppLanguage": "Użyj języka aplikacji",
"translation_downloadedModelLabel": "Pobudowany model", "translation_downloadedModelLabel": "Pobudowany model",

@ -2100,6 +2100,9 @@
"translation_enableTitle": "Ativar a tradução", "translation_enableTitle": "Ativar a tradução",
"translation_title": "Tradução", "translation_title": "Tradução",
"translation_composerSubtitle": "Controla o estado padrão do ícone de tradução do compositor.", "translation_composerSubtitle": "Controla o estado padrão do ícone de tradução do compositor.",
"translation_autoIncomingTitle": "Traduzir mensagens automaticamente",
"translation_autoIncomingSubtitle": "Traduz automaticamente mensagens para notificações e para chats ou canais.",
"translation_translateMessage": "Traduzir mensagem",
"translation_targetLanguage": "Língua-alvo", "translation_targetLanguage": "Língua-alvo",
"translation_useAppLanguage": "Utilize o idioma da aplicação", "translation_useAppLanguage": "Utilize o idioma da aplicação",
"translation_downloadedModelLabel": "Modelo baixado", "translation_downloadedModelLabel": "Modelo baixado",

@ -1268,6 +1268,9 @@
"translation_title": "Перевод", "translation_title": "Перевод",
"translation_enableTitle": "Включить перевод", "translation_enableTitle": "Включить перевод",
"translation_composerSubtitle": "Управляет исходным состоянием значка перевода, предоставляемого редактором.", "translation_composerSubtitle": "Управляет исходным состоянием значка перевода, предоставляемого редактором.",
"translation_autoIncomingTitle": "Автоматически переводить сообщения",
"translation_autoIncomingSubtitle": "Автоматически переводит сообщения для уведомлений, а также для чатов и каналов.",
"translation_translateMessage": "Перевести сообщение",
"translation_targetLanguage": "Целевой язык", "translation_targetLanguage": "Целевой язык",
"translation_useAppLanguage": "Используйте язык приложения", "translation_useAppLanguage": "Используйте язык приложения",
"translation_downloadedModelLabel": "Загруженная модель", "translation_downloadedModelLabel": "Загруженная модель",

@ -2100,6 +2100,9 @@
"translation_composerTitle": "Preložte pred odeslaním", "translation_composerTitle": "Preložte pred odeslaním",
"translation_title": "Preklad", "translation_title": "Preklad",
"translation_composerSubtitle": "Riadi výchoce stav ikony pre preklad, ktorú používa program.", "translation_composerSubtitle": "Riadi výchoce stav ikony pre preklad, ktorú používa program.",
"translation_autoIncomingTitle": "Automaticky prekladať správy",
"translation_autoIncomingSubtitle": "Automaticky prekladá správy pre upozornenia aj pre čet alebo kanál.",
"translation_translateMessage": "Preložiť správu",
"translation_targetLanguage": "Cieľový jazyk", "translation_targetLanguage": "Cieľový jazyk",
"translation_useAppLanguage": "Použite jazyk aplikácie", "translation_useAppLanguage": "Použite jazyk aplikácie",
"translation_downloadedModelLabel": "Stiahnutý model", "translation_downloadedModelLabel": "Stiahnutý model",

@ -2099,6 +2099,9 @@
"translation_enableSubtitle": "Prevedite vstopne sporočila in omogočite predhodno prevajanje.", "translation_enableSubtitle": "Prevedite vstopne sporočila in omogočite predhodno prevajanje.",
"translation_enableTitle": "Omogočite prevod", "translation_enableTitle": "Omogočite prevod",
"translation_composerSubtitle": "Ureja privzeto stanje ikone za prevod, ki jo uporablja avtor.", "translation_composerSubtitle": "Ureja privzeto stanje ikone za prevod, ki jo uporablja avtor.",
"translation_autoIncomingTitle": "Samodejno prevajaj sporočila",
"translation_autoIncomingSubtitle": "Samodejno prevaja sporočila za obvestila ter za klepete ali kanale.",
"translation_translateMessage": "Prevedi sporočilo",
"translation_targetLanguage": "Ciljna jezika", "translation_targetLanguage": "Ciljna jezika",
"translation_useAppLanguage": "Uporabite jezik aplikacije", "translation_useAppLanguage": "Uporabite jezik aplikacije",
"translation_downloadedModelLabel": "Naložen model", "translation_downloadedModelLabel": "Naložen model",

@ -2100,6 +2100,9 @@
"translation_title": "Översättning", "translation_title": "Översättning",
"translation_composerTitle": "Översätt innan du skickar", "translation_composerTitle": "Översätt innan du skickar",
"translation_composerSubtitle": "Styr standardtillståndet för kompositorns översättningsikon.", "translation_composerSubtitle": "Styr standardtillståndet för kompositorns översättningsikon.",
"translation_autoIncomingTitle": "Översätt meddelanden automatiskt",
"translation_autoIncomingSubtitle": "Översätter meddelanden automatiskt för aviseringar och för chattar eller kanaler.",
"translation_translateMessage": "Översätt meddelande",
"translation_targetLanguage": "Målmedvetet språk", "translation_targetLanguage": "Målmedvetet språk",
"translation_useAppLanguage": "Använd appens språk", "translation_useAppLanguage": "Använd appens språk",
"translation_downloadedModelLabel": "Nedladdad modell", "translation_downloadedModelLabel": "Nedladdad modell",

@ -2109,6 +2109,9 @@
"translation_enableTitle": "Увімкнути переклад", "translation_enableTitle": "Увімкнути переклад",
"translation_enableSubtitle": "Перекладати отримані повідомлення та дозволяти попередній переклад перед відправкою.", "translation_enableSubtitle": "Перекладати отримані повідомлення та дозволяти попередній переклад перед відправкою.",
"translation_composerSubtitle": "Контролює стан ікон перекладу, який використовується за замовчуванням.", "translation_composerSubtitle": "Контролює стан ікон перекладу, який використовується за замовчуванням.",
"translation_autoIncomingTitle": "Автоматично перекладати повідомлення",
"translation_autoIncomingSubtitle": "Автоматично перекладає повідомлення для сповіщень, а також для чатів і каналів.",
"translation_translateMessage": "Перекласти повідомлення",
"translation_targetLanguage": "Цільова мова", "translation_targetLanguage": "Цільова мова",
"translation_useAppLanguage": "Використовувати мову застосунку", "translation_useAppLanguage": "Використовувати мову застосунку",
"translation_downloadedModelLabel": "Завантажений шаблон", "translation_downloadedModelLabel": "Завантажений шаблон",

@ -2105,6 +2105,9 @@
"translation_composerTitle": "在发送之前进行翻译", "translation_composerTitle": "在发送之前进行翻译",
"translation_enableTitle": "启用翻译功能", "translation_enableTitle": "启用翻译功能",
"translation_composerSubtitle": "控制作曲家翻译图标的默认状态。", "translation_composerSubtitle": "控制作曲家翻译图标的默认状态。",
"translation_autoIncomingTitle": "自动翻译消息",
"translation_autoIncomingSubtitle": "自动为通知以及聊天或频道翻译消息。",
"translation_translateMessage": "翻译消息",
"translation_targetLanguage": "目标语言", "translation_targetLanguage": "目标语言",
"translation_useAppLanguage": "使用应用程序语言", "translation_useAppLanguage": "使用应用程序语言",
"translation_downloadedModelLabel": "下载的模型", "translation_downloadedModelLabel": "下载的模型",

@ -113,6 +113,7 @@ class AppSettings {
final int tcpServerPort; final int tcpServerPort;
final bool jumpToOldestUnread; final bool jumpToOldestUnread;
final bool translationEnabled; final bool translationEnabled;
final bool autoTranslateIncomingMessages;
final String? translationTargetLanguageCode; final String? translationTargetLanguageCode;
final bool composerTranslationEnabled; final bool composerTranslationEnabled;
final String? translationModelSourceUrl; final String? translationModelSourceUrl;
@ -166,6 +167,7 @@ class AppSettings {
this.tcpServerPort = 0, this.tcpServerPort = 0,
this.jumpToOldestUnread = false, this.jumpToOldestUnread = false,
this.translationEnabled = false, this.translationEnabled = false,
this.autoTranslateIncomingMessages = true,
this.translationTargetLanguageCode, this.translationTargetLanguageCode,
this.composerTranslationEnabled = false, this.composerTranslationEnabled = false,
this.translationModelSourceUrl, this.translationModelSourceUrl,
@ -226,6 +228,7 @@ class AppSettings {
'tcp_server_port': tcpServerPort, 'tcp_server_port': tcpServerPort,
'jump_to_oldest_unread': jumpToOldestUnread, 'jump_to_oldest_unread': jumpToOldestUnread,
'translation_enabled': translationEnabled, 'translation_enabled': translationEnabled,
'auto_translate_incoming_messages': autoTranslateIncomingMessages,
'translation_target_language_code': translationTargetLanguageCode, 'translation_target_language_code': translationTargetLanguageCode,
'composer_translation_enabled': composerTranslationEnabled, 'composer_translation_enabled': composerTranslationEnabled,
'translation_model_source_url': translationModelSourceUrl, 'translation_model_source_url': translationModelSourceUrl,
@ -307,6 +310,8 @@ class AppSettings {
tcpServerPort: json['tcp_server_port'] as int? ?? 0, tcpServerPort: json['tcp_server_port'] as int? ?? 0,
jumpToOldestUnread: json['jump_to_oldest_unread'] as bool? ?? false, jumpToOldestUnread: json['jump_to_oldest_unread'] as bool? ?? false,
translationEnabled: json['translation_enabled'] as bool? ?? false, translationEnabled: json['translation_enabled'] as bool? ?? false,
autoTranslateIncomingMessages:
json['auto_translate_incoming_messages'] as bool? ?? true,
translationTargetLanguageCode: translationTargetLanguageCode:
json['translation_target_language_code'] as String?, json['translation_target_language_code'] as String?,
composerTranslationEnabled: composerTranslationEnabled:
@ -396,6 +401,7 @@ class AppSettings {
int? tcpServerPort, int? tcpServerPort,
bool? jumpToOldestUnread, bool? jumpToOldestUnread,
bool? translationEnabled, bool? translationEnabled,
bool? autoTranslateIncomingMessages,
Object? translationTargetLanguageCode = _unset, Object? translationTargetLanguageCode = _unset,
bool? composerTranslationEnabled, bool? composerTranslationEnabled,
Object? translationModelSourceUrl = _unset, Object? translationModelSourceUrl = _unset,
@ -453,6 +459,8 @@ class AppSettings {
tcpServerPort: tcpServerPort ?? this.tcpServerPort, tcpServerPort: tcpServerPort ?? this.tcpServerPort,
jumpToOldestUnread: jumpToOldestUnread ?? this.jumpToOldestUnread, jumpToOldestUnread: jumpToOldestUnread ?? this.jumpToOldestUnread,
translationEnabled: translationEnabled ?? this.translationEnabled, translationEnabled: translationEnabled ?? this.translationEnabled,
autoTranslateIncomingMessages:
autoTranslateIncomingMessages ?? this.autoTranslateIncomingMessages,
translationTargetLanguageCode: translationTargetLanguageCode == _unset translationTargetLanguageCode: translationTargetLanguageCode == _unset
? this.translationTargetLanguageCode ? this.translationTargetLanguageCode
: translationTargetLanguageCode as String?, : translationTargetLanguageCode as String?,

@ -559,6 +559,7 @@ class AppSettingsScreen extends StatelessWidget {
TranslationService translationService, TranslationService translationService,
) { ) {
final settings = settingsService.settings; final settings = settingsService.settings;
final translationEnabled = settings.translationEnabled;
return Card( return Card(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -579,11 +580,41 @@ class AppSettingsScreen extends StatelessWidget {
), ),
const Divider(height: 1), const Divider(height: 1),
SwitchListTile( SwitchListTile(
secondary: const Icon(Icons.outgoing_mail), secondary: Icon(
title: Text(context.l10n.translation_composerTitle), Icons.auto_awesome_outlined,
subtitle: Text(context.l10n.translation_composerSubtitle), color: translationEnabled ? null : Colors.grey,
),
title: Text(
context.l10n.translation_autoIncomingTitle,
style: TextStyle(color: translationEnabled ? null : Colors.grey),
),
subtitle: Text(
context.l10n.translation_autoIncomingSubtitle,
style: TextStyle(color: translationEnabled ? null : Colors.grey),
),
value: settings.autoTranslateIncomingMessages,
onChanged: translationEnabled
? settingsService.setAutoTranslateIncomingMessages
: null,
),
const Divider(height: 1),
SwitchListTile(
secondary: Icon(
Icons.outgoing_mail,
color: translationEnabled ? null : Colors.grey,
),
title: Text(
context.l10n.translation_composerTitle,
style: TextStyle(color: translationEnabled ? null : Colors.grey),
),
subtitle: Text(
context.l10n.translation_composerSubtitle,
style: TextStyle(color: translationEnabled ? null : Colors.grey),
),
value: settings.composerTranslationEnabled, value: settings.composerTranslationEnabled,
onChanged: settingsService.setComposerTranslationEnabled, onChanged: translationEnabled
? settingsService.setComposerTranslationEnabled
: null,
), ),
const Divider(height: 1), const Divider(height: 1),
ListTile( ListTile(

@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:math' as math; import 'dart:math' as math;
@ -1320,6 +1321,18 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
} }
void _showMessageActions(ChannelMessage message) { void _showMessageActions(ChannelMessage message) {
final settings = context.read<AppSettingsService>().settings;
final translationService = context.read<TranslationService>();
final canTranslateMessage =
settings.translationEnabled &&
!settings.autoTranslateIncomingMessages &&
translationService.canTranslateIncoming(
text: message.text,
isCli: false,
isOutgoing: message.isOutgoing,
) &&
(message.translatedText?.trim().isEmpty ?? true);
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
builder: (sheetContext) => SafeArea( builder: (sheetContext) => SafeArea(
@ -1361,6 +1374,21 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
_copyMessageText(message.text); _copyMessageText(message.text);
}, },
), ),
if (canTranslateMessage)
ListTile(
leading: const Icon(Icons.translate),
title: Text(context.l10n.translation_translateMessage),
onTap: () {
Navigator.pop(sheetContext);
unawaited(
context.read<MeshCoreConnector>().translateChannelMessage(
widget.channel.index,
message,
manualTranslation: true,
),
);
},
),
if (!message.isOutgoing) if (!message.isOutgoing)
ListTile( ListTile(
leading: const Icon(Icons.mark_chat_unread_outlined), leading: const Icon(Icons.mark_chat_unread_outlined),

@ -1577,6 +1577,18 @@ class _ChatScreenState extends State<ChatScreen> {
} }
void _showMessageActions(Message message, Contact contact) { void _showMessageActions(Message message, Contact contact) {
final settings = context.read<AppSettingsService>().settings;
final translationService = context.read<TranslationService>();
final canTranslateMessage =
settings.translationEnabled &&
!settings.autoTranslateIncomingMessages &&
translationService.canTranslateIncoming(
text: message.text,
isCli: message.isCli,
isOutgoing: message.isOutgoing,
) &&
(message.translatedText?.trim().isEmpty ?? true);
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
builder: (sheetContext) => SafeArea( builder: (sheetContext) => SafeArea(
@ -1610,6 +1622,21 @@ class _ChatScreenState extends State<ChatScreen> {
_copyMessageText(message.text); _copyMessageText(message.text);
}, },
), ),
if (canTranslateMessage)
ListTile(
leading: const Icon(Icons.translate),
title: Text(context.l10n.translation_translateMessage),
onTap: () {
Navigator.pop(sheetContext);
unawaited(
context.read<MeshCoreConnector>().translateContactMessage(
widget.contact.publicKeyHex,
message,
manualTranslation: true,
),
);
},
),
if (!message.isOutgoing) if (!message.isOutgoing)
ListTile( ListTile(
leading: const Icon(Icons.mark_chat_unread_outlined), leading: const Icon(Icons.mark_chat_unread_outlined),

@ -235,6 +235,12 @@ class AppSettingsService extends ChangeNotifier {
await updateSettings(_settings.copyWith(translationEnabled: value)); await updateSettings(_settings.copyWith(translationEnabled: value));
} }
Future<void> setAutoTranslateIncomingMessages(bool value) async {
await updateSettings(
_settings.copyWith(autoTranslateIncomingMessages: value),
);
}
Future<void> setTranslationTargetLanguageCode(String? value) async { Future<void> setTranslationTargetLanguageCode(String? value) async {
await updateSettings( await updateSettings(
_settings.copyWith(translationTargetLanguageCode: value), _settings.copyWith(translationTargetLanguageCode: value),

@ -89,7 +89,22 @@ class TranslationService extends ChangeNotifier {
'en'; 'en';
} }
bool shouldTranslateIncoming({ bool shouldAutoTranslateIncoming({
required String text,
required bool isCli,
required bool isOutgoing,
}) {
if (!_settings.autoTranslateIncomingMessages) {
return false;
}
return canTranslateIncoming(
text: text,
isCli: isCli,
isOutgoing: isOutgoing,
);
}
bool canTranslateIncoming({
required String text, required String text,
required bool isCli, required bool isCli,
required bool isOutgoing, required bool isOutgoing,

Loading…
Cancel
Save

Powered by TurnKey Linux.