From 26dbce0277395a19fc48d8fd2e2e8f24966f0df2 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Wed, 5 Aug 2026 13:05:15 +0200 Subject: [PATCH] fix(profiles): name the Plex user and account in one translated chip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A Plex account connection labels itself with the account owner's name. Under a profile tile that reads as being signed in as the owner: the Plex Home tile showed the owner beneath the Home user's own name, and a local profile that borrowed a Home user out of someone else's account showed only the lender. Both halves of the relation now go through a single translated string, so a locale orders them itself instead of inheriting the English "user via account" — az, hu, ja, kk, ko, tr, uz, zh and zh-Hant put the account first. When the Home cache cannot resolve the connection's uuid the chip names the account alone rather than falling back to a bare name. ProfilesView carries the Home user cache that resolution needs, and chip labels ellipsize now that an account label can be an email. --- lib/i18n/az.i18n.json | 3 +- lib/i18n/bg.i18n.json | 3 +- lib/i18n/da.i18n.json | 3 +- lib/i18n/de.i18n.json | 3 +- lib/i18n/en.i18n.json | 3 +- lib/i18n/es.i18n.json | 3 +- lib/i18n/fr.i18n.json | 3 +- lib/i18n/hu.i18n.json | 3 +- lib/i18n/it.i18n.json | 3 +- lib/i18n/ja.i18n.json | 3 +- lib/i18n/kk.i18n.json | 3 +- lib/i18n/ko.i18n.json | 3 +- lib/i18n/nb.i18n.json | 3 +- lib/i18n/nl.i18n.json | 3 +- lib/i18n/pl.i18n.json | 3 +- lib/i18n/pt.i18n.json | 3 +- lib/i18n/ru.i18n.json | 3 +- lib/i18n/strings.g.dart | 2 +- lib/i18n/strings_az.g.dart | 8 +- lib/i18n/strings_bg.g.dart | 8 +- lib/i18n/strings_da.g.dart | 8 +- lib/i18n/strings_de.g.dart | 8 +- lib/i18n/strings_en.g.dart | 16 +- lib/i18n/strings_es.g.dart | 8 +- lib/i18n/strings_fr.g.dart | 8 +- lib/i18n/strings_hu.g.dart | 8 +- lib/i18n/strings_it.g.dart | 8 +- lib/i18n/strings_ja.g.dart | 8 +- lib/i18n/strings_kk.g.dart | 8 +- lib/i18n/strings_ko.g.dart | 8 +- lib/i18n/strings_nb.g.dart | 8 +- lib/i18n/strings_nl.g.dart | 8 +- lib/i18n/strings_pl.g.dart | 8 +- lib/i18n/strings_pt.g.dart | 8 +- lib/i18n/strings_ru.g.dart | 8 +- lib/i18n/strings_sv.g.dart | 8 +- lib/i18n/strings_tr.g.dart | 8 +- lib/i18n/strings_uz.g.dart | 8 +- lib/i18n/strings_zh.g.dart | 8 +- lib/i18n/strings_zh_Hant.g.dart | 8 +- lib/i18n/sv.i18n.json | 3 +- lib/i18n/tr.i18n.json | 3 +- lib/i18n/uz.i18n.json | 3 +- lib/i18n/zh-Hant.i18n.json | 3 +- lib/i18n/zh.i18n.json | 3 +- lib/profiles/profiles_view.dart | 9 + .../profile/profile_switch_screen.dart | 60 ++++- .../profile/profile_switch_screen_test.dart | 255 ++++++++++++++---- 48 files changed, 437 insertions(+), 139 deletions(-) diff --git a/lib/i18n/az.i18n.json b/lib/i18n/az.i18n.json index ff88d999..f0fa8286 100644 --- a/lib/i18n/az.i18n.json +++ b/lib/i18n/az.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Bu profil silinsin?", "deleteThisProfileMessage": "${displayName} silinəcək. Qoşulmalar təsirlənmir.", "active": "Aktiv", - "viaPlexAccount": "", "manage": "İdarə et", "delete": "Sil", "signOut": "Çıxış et", @@ -795,6 +794,8 @@ "noConnectionsHint": "Qoşulma yoxdur — bu profili istifadə etmək üçün birini əlavə edin.", "noConnections": "Qoşulma yoxdur", "plexHomeAccount": "Plex Ev hesabı", + "plexAccountChip": "Plex hesabı: ${account}", + "plexAccountUserChip": "${account} hesabı vasitəsilə ${user}", "connectionDefault": "Defolt", "connectionAs": "${displayName} olaraq", "makeDefault": "Defolt et", diff --git a/lib/i18n/bg.i18n.json b/lib/i18n/bg.i18n.json index 1342be46..df5f0fc3 100644 --- a/lib/i18n/bg.i18n.json +++ b/lib/i18n/bg.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Да се изтрие ли този профил?", "deleteThisProfileMessage": "Премахване на ${displayName}. Връзките не се засягат.", "active": "Активен", - "viaPlexAccount": "", "manage": "Управление", "delete": "Изтрий", "signOut": "Изход", @@ -795,6 +794,8 @@ "noConnectionsHint": "Няма връзки — добавете такава, за да използвате този профил.", "noConnections": "Няма връзки", "plexHomeAccount": "Plex Home акаунт", + "plexAccountChip": "Plex акаунт: ${account}", + "plexAccountUserChip": "${user} през ${account}", "connectionDefault": "По подразбиране", "connectionAs": "като ${displayName}", "makeDefault": "Направи по подразбиране", diff --git a/lib/i18n/da.i18n.json b/lib/i18n/da.i18n.json index a11db77c..87692e10 100644 --- a/lib/i18n/da.i18n.json +++ b/lib/i18n/da.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Slet denne profil?", "deleteThisProfileMessage": "Fjern ${displayName}. Forbindelser påvirkes ikke.", "active": "Aktiv", - "viaPlexAccount": "", "manage": "Administrer", "delete": "Slet", "signOut": "Log ud", @@ -795,6 +794,8 @@ "noConnectionsHint": "Ingen forbindelser — tilføj en for at bruge denne profil.", "noConnections": "Ingen forbindelser", "plexHomeAccount": "Plex Home-konto", + "plexAccountChip": "Plex-konto: ${account}", + "plexAccountUserChip": "${user} via ${account}", "connectionDefault": "Standard", "connectionAs": "som ${displayName}", "makeDefault": "Gør til standard", diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index 94011c9f..b19668b4 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Dieses Profil löschen?", "deleteThisProfileMessage": "${displayName} entfernen. Verbindungen bleiben unberührt.", "active": "Aktiv", - "viaPlexAccount": "", "manage": "Verwalten", "delete": "Löschen", "signOut": "Abmelden", @@ -795,6 +794,8 @@ "noConnectionsHint": "Keine Verbindungen — füge eine hinzu, um dieses Profil zu nutzen.", "noConnections": "Keine Verbindungen", "plexHomeAccount": "Plex Home-Konto", + "plexAccountChip": "Plex-Konto: ${account}", + "plexAccountUserChip": "${user} über ${account}", "connectionDefault": "Standard", "connectionAs": "als ${displayName}", "makeDefault": "Als Standard festlegen", diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index 1f869235..037cea9d 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Delete this profile?", "deleteThisProfileMessage": "Remove ${displayName}. Connections aren't affected.", "active": "Active", - "viaPlexAccount": "via ${name}", "manage": "Manage", "delete": "Delete", "signOut": "Sign out", @@ -795,6 +794,8 @@ "noConnectionsHint": "No connections — add one to use this profile.", "noConnections": "No connections", "plexHomeAccount": "Plex Home account", + "plexAccountChip": "Plex account: ${account}", + "plexAccountUserChip": "${user} via ${account}", "connectionDefault": "Default", "connectionAs": "as ${displayName}", "makeDefault": "Make default", diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index ae5e5a3b..174d0cbe 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "¿Eliminar este perfil?", "deleteThisProfileMessage": "Eliminar ${displayName}. Las conexiones no se verán afectadas.", "active": "Activo", - "viaPlexAccount": "", "manage": "Administrar", "delete": "Eliminar", "signOut": "Cerrar sesión", @@ -795,6 +794,8 @@ "noConnectionsHint": "Sin conexiones — añade una para usar este perfil.", "noConnections": "Sin conexiones", "plexHomeAccount": "Cuenta Plex Home", + "plexAccountChip": "Cuenta Plex: ${account}", + "plexAccountUserChip": "${user} a través de ${account}", "connectionDefault": "Predeterminada", "connectionAs": "como ${displayName}", "makeDefault": "Establecer como predeterminada", diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index e098cd6b..d3237534 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Supprimer ce profil ?", "deleteThisProfileMessage": "Supprimer ${displayName}. Les connexions ne sont pas affectées.", "active": "Actif", - "viaPlexAccount": "", "manage": "Gérer", "delete": "Supprimer", "signOut": "Se déconnecter", @@ -795,6 +794,8 @@ "noConnectionsHint": "Aucune connexion — ajoutez-en une pour utiliser ce profil.", "noConnections": "Aucune connexion", "plexHomeAccount": "Compte Plex Home", + "plexAccountChip": "Compte Plex : ${account}", + "plexAccountUserChip": "${user} via ${account}", "connectionDefault": "Par défaut", "connectionAs": "en tant que ${displayName}", "makeDefault": "Définir par défaut", diff --git a/lib/i18n/hu.i18n.json b/lib/i18n/hu.i18n.json index 958579f2..79a44bbd 100644 --- a/lib/i18n/hu.i18n.json +++ b/lib/i18n/hu.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Törlöd ezt a profilt?", "deleteThisProfileMessage": "${displayName} eltávolítása. A kapcsolatokat nem érinti.", "active": "Aktív", - "viaPlexAccount": "", "manage": "Kezelés", "delete": "Törlés", "signOut": "Kijelentkezés", @@ -795,6 +794,8 @@ "noConnectionsHint": "Nincsenek kapcsolatok — adj hozzá egyet a profil használatához.", "noConnections": "Nincsenek kapcsolatok", "plexHomeAccount": "Plex Home-fiók", + "plexAccountChip": "Plex-fiók: ${account}", + "plexAccountUserChip": "${account} fiókján keresztül: ${user}", "connectionDefault": "Alapértelmezett", "connectionAs": "mint ${displayName}", "makeDefault": "Beállítás alapértelmezettként", diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index 452a65c0..3dd77e46 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Eliminare questo profilo?", "deleteThisProfileMessage": "Rimuovi ${displayName}. Le connessioni resteranno invariate.", "active": "Attivo", - "viaPlexAccount": "", "manage": "Gestisci", "delete": "Elimina", "signOut": "Esci", @@ -795,6 +794,8 @@ "noConnectionsHint": "Nessuna connessione — aggiungine una per usare questo profilo.", "noConnections": "Nessuna connessione", "plexHomeAccount": "Account Plex Home", + "plexAccountChip": "Account Plex: ${account}", + "plexAccountUserChip": "${user} tramite ${account}", "connectionDefault": "Predefinita", "connectionAs": "come ${displayName}", "makeDefault": "Imposta come predefinita", diff --git a/lib/i18n/ja.i18n.json b/lib/i18n/ja.i18n.json index f5f8fb57..22b2046b 100644 --- a/lib/i18n/ja.i18n.json +++ b/lib/i18n/ja.i18n.json @@ -762,7 +762,6 @@ "deleteThisProfileTitle": "このプロフィールを削除しますか?", "deleteThisProfileMessage": "${displayName}を削除します。接続には影響しません。", "active": "アクティブ", - "viaPlexAccount": "", "manage": "管理", "delete": "削除", "signOut": "サインアウト", @@ -794,6 +793,8 @@ "noConnectionsHint": "接続がありません — このプロフィールを使うには接続を追加してください。", "noConnections": "接続がありません", "plexHomeAccount": "Plex Homeアカウント", + "plexAccountChip": "Plexアカウント: ${account}", + "plexAccountUserChip": "${account}経由の${user}", "connectionDefault": "デフォルト", "connectionAs": "${displayName}として", "makeDefault": "デフォルトに設定", diff --git a/lib/i18n/kk.i18n.json b/lib/i18n/kk.i18n.json index d8e59f99..0af77916 100644 --- a/lib/i18n/kk.i18n.json +++ b/lib/i18n/kk.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Осы профиль өшірілсін бе?", "deleteThisProfileMessage": "${displayName} өшіріледі. Қосылымдарға әсер етпейді.", "active": "Белсенді", - "viaPlexAccount": "", "manage": "Басқару", "delete": "Өшіру", "signOut": "Шығу", @@ -795,6 +794,8 @@ "noConnectionsHint": "Қосылымдар жоқ — бұл профильді пайдалану үшін қосылым қосыңыз.", "noConnections": "Қосылымдар жоқ", "plexHomeAccount": "Plex Home тіркелгісі", + "plexAccountChip": "Plex тіркелгісі: ${account}", + "plexAccountUserChip": "${account} арқылы ${user}", "connectionDefault": "Әдепкі", "connectionAs": "${displayName} ретінде", "makeDefault": "Әдепкі ету", diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index dcb15dca..152e5364 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -762,7 +762,6 @@ "deleteThisProfileTitle": "이 프로필을 삭제하시겠습니까?", "deleteThisProfileMessage": "${displayName}을(를) 제거합니다. 연결에는 영향이 없습니다.", "active": "활성", - "viaPlexAccount": "", "manage": "관리", "delete": "삭제", "signOut": "로그아웃", @@ -794,6 +793,8 @@ "noConnectionsHint": "연결이 없습니다 — 이 프로필을 사용하려면 하나 추가하세요.", "noConnections": "연결 없음", "plexHomeAccount": "Plex Home 계정", + "plexAccountChip": "Plex 계정: ${account}", + "plexAccountUserChip": "${account} 계정의 ${user}", "connectionDefault": "기본값", "connectionAs": "${displayName}(으)로", "makeDefault": "기본값으로 설정", diff --git a/lib/i18n/nb.i18n.json b/lib/i18n/nb.i18n.json index 573d1815..5d3c5a37 100644 --- a/lib/i18n/nb.i18n.json +++ b/lib/i18n/nb.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Slett denne profilen?", "deleteThisProfileMessage": "Fjern ${displayName}. Tilkoblinger påvirkes ikke.", "active": "Aktiv", - "viaPlexAccount": "", "manage": "Administrer", "delete": "Slett", "signOut": "Logg ut", @@ -795,6 +794,8 @@ "noConnectionsHint": "Ingen tilkoblinger — legg til én for å bruke denne profilen.", "noConnections": "Ingen tilkoblinger", "plexHomeAccount": "Plex Home-konto", + "plexAccountChip": "Plex-konto: ${account}", + "plexAccountUserChip": "${user} via ${account}", "connectionDefault": "Standard", "connectionAs": "som ${displayName}", "makeDefault": "Gjør til standard", diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index 2f16e05f..75388869 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Dit profiel verwijderen?", "deleteThisProfileMessage": "Verwijder ${displayName}. Verbindingen blijven ongewijzigd.", "active": "Actief", - "viaPlexAccount": "", "manage": "Beheren", "delete": "Verwijderen", "signOut": "Afmelden", @@ -795,6 +794,8 @@ "noConnectionsHint": "Geen verbindingen — voeg er één toe om dit profiel te gebruiken.", "noConnections": "Geen verbindingen", "plexHomeAccount": "Plex Home-account", + "plexAccountChip": "Plex-account: ${account}", + "plexAccountUserChip": "${user} via ${account}", "connectionDefault": "Standaard", "connectionAs": "als ${displayName}", "makeDefault": "Als standaard instellen", diff --git a/lib/i18n/pl.i18n.json b/lib/i18n/pl.i18n.json index 5d7f7da7..6f0e60c9 100644 --- a/lib/i18n/pl.i18n.json +++ b/lib/i18n/pl.i18n.json @@ -765,7 +765,6 @@ "deleteThisProfileTitle": "Usunąć ten profil?", "deleteThisProfileMessage": "Usuń ${displayName}. Połączenia nie zostaną zmienione.", "active": "Aktywny", - "viaPlexAccount": "", "manage": "Zarządzaj", "delete": "Usuń", "signOut": "Wyloguj się", @@ -797,6 +796,8 @@ "noConnectionsHint": "Brak połączeń — dodaj jedno, aby używać tego profilu.", "noConnections": "Brak połączeń", "plexHomeAccount": "Konto Plex Home", + "plexAccountChip": "Konto Plex: ${account}", + "plexAccountUserChip": "${user} przez ${account}", "connectionDefault": "Domyślne", "connectionAs": "jako ${displayName}", "makeDefault": "Ustaw jako domyślne", diff --git a/lib/i18n/pt.i18n.json b/lib/i18n/pt.i18n.json index 1f4dc34b..a4939aba 100644 --- a/lib/i18n/pt.i18n.json +++ b/lib/i18n/pt.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Excluir este perfil?", "deleteThisProfileMessage": "Remover ${displayName}. As conexões não serão afetadas.", "active": "Ativo", - "viaPlexAccount": "", "manage": "Gerenciar", "delete": "Excluir", "signOut": "Sair", @@ -795,6 +794,8 @@ "noConnectionsHint": "Sem conexões — adicione uma para usar este perfil.", "noConnections": "Sem conexões", "plexHomeAccount": "Conta Plex Home", + "plexAccountChip": "Conta Plex: ${account}", + "plexAccountUserChip": "${user} via ${account}", "connectionDefault": "Padrão", "connectionAs": "como ${displayName}", "makeDefault": "Definir como padrão", diff --git a/lib/i18n/ru.i18n.json b/lib/i18n/ru.i18n.json index 4533fb53..f5a8642b 100644 --- a/lib/i18n/ru.i18n.json +++ b/lib/i18n/ru.i18n.json @@ -765,7 +765,6 @@ "deleteThisProfileTitle": "Удалить этот профиль?", "deleteThisProfileMessage": "Удалить ${displayName}. Подключения не изменятся.", "active": "Активный", - "viaPlexAccount": "", "manage": "Управление", "delete": "Удалить", "signOut": "Выйти", @@ -797,6 +796,8 @@ "noConnectionsHint": "Нет соединений — добавьте одно, чтобы использовать этот профиль.", "noConnections": "Нет соединений", "plexHomeAccount": "Аккаунт Plex Home", + "plexAccountChip": "Аккаунт Plex: ${account}", + "plexAccountUserChip": "${user} через ${account}", "connectionDefault": "По умолчанию", "connectionAs": "как ${displayName}", "makeDefault": "Сделать по умолчанию", diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index 82305407..2060ef18 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,7 +4,7 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 22 -/// Strings: 32738 (1488 per locale) +/// Strings: 32781 (1490 per locale) // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/lib/i18n/strings_az.g.dart b/lib/i18n/strings_az.g.dart index f6f2801a..d79d24de 100644 --- a/lib/i18n/strings_az.g.dart +++ b/lib/i18n/strings_az.g.dart @@ -881,6 +881,8 @@ class _Translations$profiles$az extends Translations$profiles$en { @override String get noConnectionsHint => 'Qoşulma yoxdur — bu profili istifadə etmək üçün birini əlavə edin.'; @override String get noConnections => 'Qoşulma yoxdur'; @override String get plexHomeAccount => 'Plex Ev hesabı'; + @override String plexAccountChip({required Object account}) => 'Plex hesabı: ${account}'; + @override String plexAccountUserChip({required Object account, required Object user}) => '${account} hesabı vasitəsilə ${user}'; @override String get connectionDefault => 'Defolt'; @override String connectionAs({required Object displayName}) => '${displayName} olaraq'; @override String get makeDefault => 'Defolt et'; @@ -2842,6 +2844,8 @@ extension on TranslationsAz { 'profiles.noConnectionsHint' => 'Qoşulma yoxdur — bu profili istifadə etmək üçün birini əlavə edin.', 'profiles.noConnections' => 'Qoşulma yoxdur', 'profiles.plexHomeAccount' => 'Plex Ev hesabı', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex hesabı: ${account}', + 'profiles.plexAccountUserChip' => ({required Object account, required Object user}) => '${account} hesabı vasitəsilə ${user}', 'profiles.connectionDefault' => 'Defolt', 'profiles.connectionAs' => ({required Object displayName}) => '${displayName} olaraq', 'profiles.makeDefault' => 'Defolt et', @@ -3224,10 +3228,10 @@ extension on TranslationsAz { 'watchTogether.pasteFromClipboard' => 'Buferdən yapışdır', 'watchTogether.pleaseEnterCode' => 'Lütfən seans kodunu daxil edin', 'watchTogether.codeMustBe5Chars' => 'Seans kodu 5 simvol olmalıdır', - 'watchTogether.joinInstructions' => 'Qoşulmaq üçün təşkilatçının seans kodunu daxil edin.', - 'watchTogether.failedToCreate' => 'Seans yaradıla bilmədi', _ => null, } ?? switch (path) { + 'watchTogether.joinInstructions' => 'Qoşulmaq üçün təşkilatçının seans kodunu daxil edin.', + 'watchTogether.failedToCreate' => 'Seans yaradıla bilmədi', 'watchTogether.failedToJoin' => 'Seansa qoşuluna bilmədi', 'watchTogether.sessionCodeCopied' => 'Seans kodu buferə kopyalandı', 'watchTogether.relayUnreachable' => 'Rele serverinə çatmaq olmur. İnternet provayderinin bloklaması Birlikdə İzləməyə mane ola bilər.', diff --git a/lib/i18n/strings_bg.g.dart b/lib/i18n/strings_bg.g.dart index 5acf4aef..3fc8e330 100644 --- a/lib/i18n/strings_bg.g.dart +++ b/lib/i18n/strings_bg.g.dart @@ -877,6 +877,8 @@ class _Translations$profiles$bg extends Translations$profiles$en { @override String get noConnectionsHint => 'Няма връзки — добавете такава, за да използвате този профил.'; @override String get noConnections => 'Няма връзки'; @override String get plexHomeAccount => 'Plex Home акаунт'; + @override String plexAccountChip({required Object account}) => 'Plex акаунт: ${account}'; + @override String plexAccountUserChip({required Object user, required Object account}) => '${user} през ${account}'; @override String get connectionDefault => 'По подразбиране'; @override String connectionAs({required Object displayName}) => 'като ${displayName}'; @override String get makeDefault => 'Направи по подразбиране'; @@ -2827,6 +2829,8 @@ extension on TranslationsBg { 'profiles.noConnectionsHint' => 'Няма връзки — добавете такава, за да използвате този профил.', 'profiles.noConnections' => 'Няма връзки', 'profiles.plexHomeAccount' => 'Plex Home акаунт', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex акаунт: ${account}', + 'profiles.plexAccountUserChip' => ({required Object user, required Object account}) => '${user} през ${account}', 'profiles.connectionDefault' => 'По подразбиране', 'profiles.connectionAs' => ({required Object displayName}) => 'като ${displayName}', 'profiles.makeDefault' => 'Направи по подразбиране', @@ -3213,10 +3217,10 @@ extension on TranslationsBg { 'watchTogether.failedToJoin' => 'Неуспешно присъединяване към сесия', 'watchTogether.sessionCodeCopied' => 'Кодът на сесията е копиран в клипборда', 'watchTogether.relayUnreachable' => 'Релейният сървър е недостъпен. Възможно е интернет доставчикът да блокира гледането заедно.', - 'watchTogether.reconnectingToHost' => 'Повторно свързване с организатора...', - 'watchTogether.currentPlayback' => 'Текущо възпроизвеждане', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'Повторно свързване с организатора...', + 'watchTogether.currentPlayback' => 'Текущо възпроизвеждане', 'watchTogether.joinCurrentPlayback' => 'Присъедини се към текущото възпроизвеждане', 'watchTogether.joinCurrentPlaybackDescription' => 'Върнете се към това, което организаторът гледа в момента', 'watchTogether.failedToOpenCurrentPlayback' => 'Неуспешно отваряне на текущото възпроизвеждане', diff --git a/lib/i18n/strings_da.g.dart b/lib/i18n/strings_da.g.dart index ce7fc418..602fd7ac 100644 --- a/lib/i18n/strings_da.g.dart +++ b/lib/i18n/strings_da.g.dart @@ -877,6 +877,8 @@ class _Translations$profiles$da extends Translations$profiles$en { @override String get noConnectionsHint => 'Ingen forbindelser — tilføj en for at bruge denne profil.'; @override String get noConnections => 'Ingen forbindelser'; @override String get plexHomeAccount => 'Plex Home-konto'; + @override String plexAccountChip({required Object account}) => 'Plex-konto: ${account}'; + @override String plexAccountUserChip({required Object user, required Object account}) => '${user} via ${account}'; @override String get connectionDefault => 'Standard'; @override String connectionAs({required Object displayName}) => 'som ${displayName}'; @override String get makeDefault => 'Gør til standard'; @@ -2827,6 +2829,8 @@ extension on TranslationsDa { 'profiles.noConnectionsHint' => 'Ingen forbindelser — tilføj en for at bruge denne profil.', 'profiles.noConnections' => 'Ingen forbindelser', 'profiles.plexHomeAccount' => 'Plex Home-konto', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex-konto: ${account}', + 'profiles.plexAccountUserChip' => ({required Object user, required Object account}) => '${user} via ${account}', 'profiles.connectionDefault' => 'Standard', 'profiles.connectionAs' => ({required Object displayName}) => 'som ${displayName}', 'profiles.makeDefault' => 'Gør til standard', @@ -3213,10 +3217,10 @@ extension on TranslationsDa { 'watchTogether.failedToJoin' => 'Kunne ikke deltage i session', 'watchTogether.sessionCodeCopied' => 'Sessionskode kopieret til udklipsholder', 'watchTogether.relayUnreachable' => 'Relayserveren kan ikke nås. Blokering hos internetudbyderen kan forhindre Se sammen.', - 'watchTogether.reconnectingToHost' => 'Genopretter forbindelse til vært...', - 'watchTogether.currentPlayback' => 'Nuværende afspilning', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'Genopretter forbindelse til vært...', + 'watchTogether.currentPlayback' => 'Nuværende afspilning', 'watchTogether.joinCurrentPlayback' => 'Deltag i nuværende afspilning', 'watchTogether.joinCurrentPlaybackDescription' => 'Hop tilbage til det værten ser nu', 'watchTogether.failedToOpenCurrentPlayback' => 'Kunne ikke åbne nuværende afspilning', diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index 99acab24..f48b9225 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -877,6 +877,8 @@ class _Translations$profiles$de extends Translations$profiles$en { @override String get noConnectionsHint => 'Keine Verbindungen — füge eine hinzu, um dieses Profil zu nutzen.'; @override String get noConnections => 'Keine Verbindungen'; @override String get plexHomeAccount => 'Plex Home-Konto'; + @override String plexAccountChip({required Object account}) => 'Plex-Konto: ${account}'; + @override String plexAccountUserChip({required Object user, required Object account}) => '${user} über ${account}'; @override String get connectionDefault => 'Standard'; @override String connectionAs({required Object displayName}) => 'als ${displayName}'; @override String get makeDefault => 'Als Standard festlegen'; @@ -2827,6 +2829,8 @@ extension on TranslationsDe { 'profiles.noConnectionsHint' => 'Keine Verbindungen — füge eine hinzu, um dieses Profil zu nutzen.', 'profiles.noConnections' => 'Keine Verbindungen', 'profiles.plexHomeAccount' => 'Plex Home-Konto', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex-Konto: ${account}', + 'profiles.plexAccountUserChip' => ({required Object user, required Object account}) => '${user} über ${account}', 'profiles.connectionDefault' => 'Standard', 'profiles.connectionAs' => ({required Object displayName}) => 'als ${displayName}', 'profiles.makeDefault' => 'Als Standard festlegen', @@ -3213,10 +3217,10 @@ extension on TranslationsDe { 'watchTogether.failedToJoin' => 'Beitritt zur Sitzung fehlgeschlagen', 'watchTogether.sessionCodeCopied' => 'Sitzungscode in Zwischenablage kopiert', 'watchTogether.relayUnreachable' => 'Relay-Server nicht erreichbar. Eine Sperre durch den Internetanbieter kann gemeinsames Schauen verhindern.', - 'watchTogether.reconnectingToHost' => 'Verbindung zum Host wird wiederhergestellt …', - 'watchTogether.currentPlayback' => 'Aktuelle Wiedergabe', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'Verbindung zum Host wird wiederhergestellt …', + 'watchTogether.currentPlayback' => 'Aktuelle Wiedergabe', 'watchTogether.joinCurrentPlayback' => 'Aktueller Wiedergabe beitreten', 'watchTogether.joinCurrentPlaybackDescription' => 'Zu dem Inhalt wechseln, den der Host gerade ansieht', 'watchTogether.failedToOpenCurrentPlayback' => 'Aktuelle Wiedergabe konnte nicht geöffnet werden', diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index 09ece13f..cc44fcb0 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -2296,9 +2296,6 @@ class Translations$profiles$en { /// en: 'Active' String get active => 'Active'; - /// en: 'via ${name}' - String viaPlexAccount({required Object name}) => 'via ${name}'; - /// en: 'Manage' String get manage => 'Manage'; @@ -2392,6 +2389,12 @@ class Translations$profiles$en { /// en: 'Plex Home account' String get plexHomeAccount => 'Plex Home account'; + /// en: 'Plex account: ${account}' + String plexAccountChip({required Object account}) => 'Plex account: ${account}'; + + /// en: '${user} via ${account}' + String plexAccountUserChip({required Object user, required Object account}) => '${user} via ${account}'; + /// en: 'Default' String get connectionDefault => 'Default'; @@ -6757,7 +6760,6 @@ extension on Translations { 'profiles.deleteThisProfileTitle' => 'Delete this profile?', 'profiles.deleteThisProfileMessage' => ({required Object displayName}) => 'Remove ${displayName}. Connections aren\'t affected.', 'profiles.active' => 'Active', - 'profiles.viaPlexAccount' => ({required Object name}) => 'via ${name}', 'profiles.manage' => 'Manage', 'profiles.delete' => 'Delete', 'profiles.signOut' => 'Sign out', @@ -6789,6 +6791,8 @@ extension on Translations { 'profiles.noConnectionsHint' => 'No connections — add one to use this profile.', 'profiles.noConnections' => 'No connections', 'profiles.plexHomeAccount' => 'Plex Home account', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex account: ${account}', + 'profiles.plexAccountUserChip' => ({required Object user, required Object account}) => '${user} via ${account}', 'profiles.connectionDefault' => 'Default', 'profiles.connectionAs' => ({required Object displayName}) => 'as ${displayName}', 'profiles.makeDefault' => 'Make default', @@ -7065,9 +7069,9 @@ extension on Translations { 'explore.stats.completed' => ({required Object n}) => '${n} completed', 'explore.stats.onHold' => ({required Object n}) => '${n} on hold', 'explore.stats.dropped' => ({required Object n}) => '${n} dropped', - 'explore.season.winter' => 'Winter', _ => null, } ?? switch (path) { + 'explore.season.winter' => 'Winter', 'explore.season.spring' => 'Spring', 'explore.season.summer' => 'Summer', 'explore.season.fall' => 'Fall', @@ -7579,9 +7583,9 @@ extension on Translations { 'externalPlayer.playerCommand' => 'Command', 'externalPlayer.playerPackage' => 'Package Name', 'externalPlayer.playerUrlScheme' => 'URL Scheme', - 'externalPlayer.off' => 'Off', _ => null, } ?? switch (path) { + 'externalPlayer.off' => 'Off', 'externalPlayer.launchFailed' => 'Failed to open external player', 'externalPlayer.appNotInstalled' => ({required Object name}) => '${name} is not installed', 'externalPlayer.playInExternalPlayer' => 'Play in External Player', diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index 2971ee74..ac918556 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -877,6 +877,8 @@ class _Translations$profiles$es extends Translations$profiles$en { @override String get noConnectionsHint => 'Sin conexiones — añade una para usar este perfil.'; @override String get noConnections => 'Sin conexiones'; @override String get plexHomeAccount => 'Cuenta Plex Home'; + @override String plexAccountChip({required Object account}) => 'Cuenta Plex: ${account}'; + @override String plexAccountUserChip({required Object user, required Object account}) => '${user} a través de ${account}'; @override String get connectionDefault => 'Predeterminada'; @override String connectionAs({required Object displayName}) => 'como ${displayName}'; @override String get makeDefault => 'Establecer como predeterminada'; @@ -2827,6 +2829,8 @@ extension on TranslationsEs { 'profiles.noConnectionsHint' => 'Sin conexiones — añade una para usar este perfil.', 'profiles.noConnections' => 'Sin conexiones', 'profiles.plexHomeAccount' => 'Cuenta Plex Home', + 'profiles.plexAccountChip' => ({required Object account}) => 'Cuenta Plex: ${account}', + 'profiles.plexAccountUserChip' => ({required Object user, required Object account}) => '${user} a través de ${account}', 'profiles.connectionDefault' => 'Predeterminada', 'profiles.connectionAs' => ({required Object displayName}) => 'como ${displayName}', 'profiles.makeDefault' => 'Establecer como predeterminada', @@ -3213,10 +3217,10 @@ extension on TranslationsEs { 'watchTogether.failedToJoin' => 'Error al unirse a la sesión', 'watchTogether.sessionCodeCopied' => 'Código de sesión copiado al portapapeles', 'watchTogether.relayUnreachable' => 'No se puede acceder al servidor de retransmisión. Es posible que tu proveedor de internet esté bloqueando Ver juntos.', - 'watchTogether.reconnectingToHost' => 'Reconectando con el anfitrión...', - 'watchTogether.currentPlayback' => 'Reproducción actual', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'Reconectando con el anfitrión...', + 'watchTogether.currentPlayback' => 'Reproducción actual', 'watchTogether.joinCurrentPlayback' => 'Unirse a la reproducción actual', 'watchTogether.joinCurrentPlaybackDescription' => 'Vuelve a lo que el anfitrión está viendo ahora mismo', 'watchTogether.failedToOpenCurrentPlayback' => 'No se pudo abrir la reproducción actual', diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index f6be83e3..33c08e09 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -877,6 +877,8 @@ class _Translations$profiles$fr extends Translations$profiles$en { @override String get noConnectionsHint => 'Aucune connexion — ajoutez-en une pour utiliser ce profil.'; @override String get noConnections => 'Aucune connexion'; @override String get plexHomeAccount => 'Compte Plex Home'; + @override String plexAccountChip({required Object account}) => 'Compte Plex : ${account}'; + @override String plexAccountUserChip({required Object user, required Object account}) => '${user} via ${account}'; @override String get connectionDefault => 'Par défaut'; @override String connectionAs({required Object displayName}) => 'en tant que ${displayName}'; @override String get makeDefault => 'Définir par défaut'; @@ -2827,6 +2829,8 @@ extension on TranslationsFr { 'profiles.noConnectionsHint' => 'Aucune connexion — ajoutez-en une pour utiliser ce profil.', 'profiles.noConnections' => 'Aucune connexion', 'profiles.plexHomeAccount' => 'Compte Plex Home', + 'profiles.plexAccountChip' => ({required Object account}) => 'Compte Plex : ${account}', + 'profiles.plexAccountUserChip' => ({required Object user, required Object account}) => '${user} via ${account}', 'profiles.connectionDefault' => 'Par défaut', 'profiles.connectionAs' => ({required Object displayName}) => 'en tant que ${displayName}', 'profiles.makeDefault' => 'Définir par défaut', @@ -3213,10 +3217,10 @@ extension on TranslationsFr { 'watchTogether.failedToJoin' => 'Échec de la connexion à la session', 'watchTogether.sessionCodeCopied' => 'Code de session copié dans le presse-papiers', 'watchTogether.relayUnreachable' => 'Serveur relais inaccessible. Un blocage par le fournisseur d’accès peut empêcher le fonctionnement de Regarder ensemble.', - 'watchTogether.reconnectingToHost' => 'Reconnexion à l\'hôte...', - 'watchTogether.currentPlayback' => 'Lecture en cours', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'Reconnexion à l\'hôte...', + 'watchTogether.currentPlayback' => 'Lecture en cours', 'watchTogether.joinCurrentPlayback' => 'Rejoindre la lecture en cours', 'watchTogether.joinCurrentPlaybackDescription' => 'Reprendre le contenu que l’hôte regarde actuellement', 'watchTogether.failedToOpenCurrentPlayback' => 'Impossible d\'ouvrir la lecture en cours', diff --git a/lib/i18n/strings_hu.g.dart b/lib/i18n/strings_hu.g.dart index dedf1eb9..5169c7db 100644 --- a/lib/i18n/strings_hu.g.dart +++ b/lib/i18n/strings_hu.g.dart @@ -877,6 +877,8 @@ class _Translations$profiles$hu extends Translations$profiles$en { @override String get noConnectionsHint => 'Nincsenek kapcsolatok — adj hozzá egyet a profil használatához.'; @override String get noConnections => 'Nincsenek kapcsolatok'; @override String get plexHomeAccount => 'Plex Home-fiók'; + @override String plexAccountChip({required Object account}) => 'Plex-fiók: ${account}'; + @override String plexAccountUserChip({required Object account, required Object user}) => '${account} fiókján keresztül: ${user}'; @override String get connectionDefault => 'Alapértelmezett'; @override String connectionAs({required Object displayName}) => 'mint ${displayName}'; @override String get makeDefault => 'Beállítás alapértelmezettként'; @@ -2827,6 +2829,8 @@ extension on TranslationsHu { 'profiles.noConnectionsHint' => 'Nincsenek kapcsolatok — adj hozzá egyet a profil használatához.', 'profiles.noConnections' => 'Nincsenek kapcsolatok', 'profiles.plexHomeAccount' => 'Plex Home-fiók', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex-fiók: ${account}', + 'profiles.plexAccountUserChip' => ({required Object account, required Object user}) => '${account} fiókján keresztül: ${user}', 'profiles.connectionDefault' => 'Alapértelmezett', 'profiles.connectionAs' => ({required Object displayName}) => 'mint ${displayName}', 'profiles.makeDefault' => 'Beállítás alapértelmezettként', @@ -3213,10 +3217,10 @@ extension on TranslationsHu { 'watchTogether.failedToJoin' => 'Nem sikerült csatlakozni a munkamenethez', 'watchTogether.sessionCodeCopied' => 'A munkamenetkód a vágólapra másolva', 'watchTogether.relayUnreachable' => 'A relészerver nem érhető el. Az internetszolgáltató blokkolása megakadályozhatja a közös nézést.', - 'watchTogether.reconnectingToHost' => 'Újracsatlakozás a házigazdához...', - 'watchTogether.currentPlayback' => 'Jelenlegi lejátszás', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'Újracsatlakozás a házigazdához...', + 'watchTogether.currentPlayback' => 'Jelenlegi lejátszás', 'watchTogether.joinCurrentPlayback' => 'Csatlakozás a jelenlegi lejátszáshoz', 'watchTogether.joinCurrentPlaybackDescription' => 'Visszatérés ahhoz, amit a házigazda éppen néz', 'watchTogether.failedToOpenCurrentPlayback' => 'Nem sikerült megnyitni a jelenlegi lejátszást', diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index 9b28f29b..8bc8af9a 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -877,6 +877,8 @@ class _Translations$profiles$it extends Translations$profiles$en { @override String get noConnectionsHint => 'Nessuna connessione — aggiungine una per usare questo profilo.'; @override String get noConnections => 'Nessuna connessione'; @override String get plexHomeAccount => 'Account Plex Home'; + @override String plexAccountChip({required Object account}) => 'Account Plex: ${account}'; + @override String plexAccountUserChip({required Object user, required Object account}) => '${user} tramite ${account}'; @override String get connectionDefault => 'Predefinita'; @override String connectionAs({required Object displayName}) => 'come ${displayName}'; @override String get makeDefault => 'Imposta come predefinita'; @@ -2827,6 +2829,8 @@ extension on TranslationsIt { 'profiles.noConnectionsHint' => 'Nessuna connessione — aggiungine una per usare questo profilo.', 'profiles.noConnections' => 'Nessuna connessione', 'profiles.plexHomeAccount' => 'Account Plex Home', + 'profiles.plexAccountChip' => ({required Object account}) => 'Account Plex: ${account}', + 'profiles.plexAccountUserChip' => ({required Object user, required Object account}) => '${user} tramite ${account}', 'profiles.connectionDefault' => 'Predefinita', 'profiles.connectionAs' => ({required Object displayName}) => 'come ${displayName}', 'profiles.makeDefault' => 'Imposta come predefinita', @@ -3213,10 +3217,10 @@ extension on TranslationsIt { 'watchTogether.failedToJoin' => 'Impossibile unirsi alla sessione', 'watchTogether.sessionCodeCopied' => 'Codice della sessione copiato negli appunti', 'watchTogether.relayUnreachable' => 'Il server relay non è raggiungibile. Eventuali blocchi dell\'ISP potrebbero impedire l\'uso di Guarda insieme.', - 'watchTogether.reconnectingToHost' => 'Riconnessione all\'host...', - 'watchTogether.currentPlayback' => 'Riproduzione corrente', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'Riconnessione all\'host...', + 'watchTogether.currentPlayback' => 'Riproduzione corrente', 'watchTogether.joinCurrentPlayback' => 'Unisciti alla riproduzione corrente', 'watchTogether.joinCurrentPlaybackDescription' => 'Torna a ciò che l\'host sta guardando in questo momento', 'watchTogether.failedToOpenCurrentPlayback' => 'Impossibile aprire la riproduzione corrente', diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart index 9edf58d2..11e4d785 100644 --- a/lib/i18n/strings_ja.g.dart +++ b/lib/i18n/strings_ja.g.dart @@ -876,6 +876,8 @@ class _Translations$profiles$ja extends Translations$profiles$en { @override String get noConnectionsHint => '接続がありません — このプロフィールを使うには接続を追加してください。'; @override String get noConnections => '接続がありません'; @override String get plexHomeAccount => 'Plex Homeアカウント'; + @override String plexAccountChip({required Object account}) => 'Plexアカウント: ${account}'; + @override String plexAccountUserChip({required Object account, required Object user}) => '${account}経由の${user}'; @override String get connectionDefault => 'デフォルト'; @override String connectionAs({required Object displayName}) => '${displayName}として'; @override String get makeDefault => 'デフォルトに設定'; @@ -2824,6 +2826,8 @@ extension on TranslationsJa { 'profiles.noConnectionsHint' => '接続がありません — このプロフィールを使うには接続を追加してください。', 'profiles.noConnections' => '接続がありません', 'profiles.plexHomeAccount' => 'Plex Homeアカウント', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plexアカウント: ${account}', + 'profiles.plexAccountUserChip' => ({required Object account, required Object user}) => '${account}経由の${user}', 'profiles.connectionDefault' => 'デフォルト', 'profiles.connectionAs' => ({required Object displayName}) => '${displayName}として', 'profiles.makeDefault' => 'デフォルトに設定', @@ -3210,10 +3214,10 @@ extension on TranslationsJa { 'watchTogether.failedToJoin' => 'セッションへの参加に失敗しました', 'watchTogether.sessionCodeCopied' => 'セッションコードをクリップボードにコピーしました', 'watchTogether.relayUnreachable' => 'リレーサーバーに接続できません。ISPによるブロックのため「一緒に見る」を利用できない可能性があります。', - 'watchTogether.reconnectingToHost' => 'ホストに再接続中…', - 'watchTogether.currentPlayback' => '現在の再生', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'ホストに再接続中…', + 'watchTogether.currentPlayback' => '現在の再生', 'watchTogether.joinCurrentPlayback' => '現在の再生に参加', 'watchTogether.joinCurrentPlaybackDescription' => 'ホストが現在視聴中のコンテンツに戻る', 'watchTogether.failedToOpenCurrentPlayback' => '現在の再生を開けませんでした', diff --git a/lib/i18n/strings_kk.g.dart b/lib/i18n/strings_kk.g.dart index 72460908..0dff39f7 100644 --- a/lib/i18n/strings_kk.g.dart +++ b/lib/i18n/strings_kk.g.dart @@ -881,6 +881,8 @@ class _Translations$profiles$kk extends Translations$profiles$en { @override String get noConnectionsHint => 'Қосылымдар жоқ — бұл профильді пайдалану үшін қосылым қосыңыз.'; @override String get noConnections => 'Қосылымдар жоқ'; @override String get plexHomeAccount => 'Plex Home тіркелгісі'; + @override String plexAccountChip({required Object account}) => 'Plex тіркелгісі: ${account}'; + @override String plexAccountUserChip({required Object account, required Object user}) => '${account} арқылы ${user}'; @override String get connectionDefault => 'Әдепкі'; @override String connectionAs({required Object displayName}) => '${displayName} ретінде'; @override String get makeDefault => 'Әдепкі ету'; @@ -2842,6 +2844,8 @@ extension on TranslationsKk { 'profiles.noConnectionsHint' => 'Қосылымдар жоқ — бұл профильді пайдалану үшін қосылым қосыңыз.', 'profiles.noConnections' => 'Қосылымдар жоқ', 'profiles.plexHomeAccount' => 'Plex Home тіркелгісі', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex тіркелгісі: ${account}', + 'profiles.plexAccountUserChip' => ({required Object account, required Object user}) => '${account} арқылы ${user}', 'profiles.connectionDefault' => 'Әдепкі', 'profiles.connectionAs' => ({required Object displayName}) => '${displayName} ретінде', 'profiles.makeDefault' => 'Әдепкі ету', @@ -3224,10 +3228,10 @@ extension on TranslationsKk { 'watchTogether.pasteFromClipboard' => 'Алмасу буферінен қою', 'watchTogether.pleaseEnterCode' => 'Сеанс кодын енгізіңіз', 'watchTogether.codeMustBe5Chars' => 'Сеанс коды 5 таңбадан тұруы керек', - 'watchTogether.joinInstructions' => 'Ұйымдастырушының сеанс кодын енгізіңіз.', - 'watchTogether.failedToCreate' => 'Сеансты жасау мүмкін болмады', _ => null, } ?? switch (path) { + 'watchTogether.joinInstructions' => 'Ұйымдастырушының сеанс кодын енгізіңіз.', + 'watchTogether.failedToCreate' => 'Сеансты жасау мүмкін болмады', 'watchTogether.failedToJoin' => 'Сеансқа қосылу мүмкін болмады', 'watchTogether.sessionCodeCopied' => 'Сеанс коды көшірілді', 'watchTogether.relayUnreachable' => 'Реле сервері қолжетімсіз.', diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index 2b7666b5..3a83e81e 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -876,6 +876,8 @@ class _Translations$profiles$ko extends Translations$profiles$en { @override String get noConnectionsHint => '연결이 없습니다 — 이 프로필을 사용하려면 하나 추가하세요.'; @override String get noConnections => '연결 없음'; @override String get plexHomeAccount => 'Plex Home 계정'; + @override String plexAccountChip({required Object account}) => 'Plex 계정: ${account}'; + @override String plexAccountUserChip({required Object account, required Object user}) => '${account} 계정의 ${user}'; @override String get connectionDefault => '기본값'; @override String connectionAs({required Object displayName}) => '${displayName}(으)로'; @override String get makeDefault => '기본값으로 설정'; @@ -2824,6 +2826,8 @@ extension on TranslationsKo { 'profiles.noConnectionsHint' => '연결이 없습니다 — 이 프로필을 사용하려면 하나 추가하세요.', 'profiles.noConnections' => '연결 없음', 'profiles.plexHomeAccount' => 'Plex Home 계정', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex 계정: ${account}', + 'profiles.plexAccountUserChip' => ({required Object account, required Object user}) => '${account} 계정의 ${user}', 'profiles.connectionDefault' => '기본값', 'profiles.connectionAs' => ({required Object displayName}) => '${displayName}(으)로', 'profiles.makeDefault' => '기본값으로 설정', @@ -3210,10 +3214,10 @@ extension on TranslationsKo { 'watchTogether.failedToJoin' => '세션 참여 실패', 'watchTogether.sessionCodeCopied' => '세션 코드가 클립보드에 복사되었습니다', 'watchTogether.relayUnreachable' => '릴레이 서버에 연결할 수 없습니다. ISP 차단으로 함께 보기를 사용하지 못할 수 있습니다.', - 'watchTogether.reconnectingToHost' => '호스트에 재연결 중...', - 'watchTogether.currentPlayback' => '현재 재생', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => '호스트에 재연결 중...', + 'watchTogether.currentPlayback' => '현재 재생', 'watchTogether.joinCurrentPlayback' => '현재 재생 참여', 'watchTogether.joinCurrentPlaybackDescription' => '호스트가 현재 시청 중인 콘텐츠로 이동합니다', 'watchTogether.failedToOpenCurrentPlayback' => '현재 재생을 열 수 없습니다', diff --git a/lib/i18n/strings_nb.g.dart b/lib/i18n/strings_nb.g.dart index 20847307..60213b49 100644 --- a/lib/i18n/strings_nb.g.dart +++ b/lib/i18n/strings_nb.g.dart @@ -877,6 +877,8 @@ class _Translations$profiles$nb extends Translations$profiles$en { @override String get noConnectionsHint => 'Ingen tilkoblinger — legg til én for å bruke denne profilen.'; @override String get noConnections => 'Ingen tilkoblinger'; @override String get plexHomeAccount => 'Plex Home-konto'; + @override String plexAccountChip({required Object account}) => 'Plex-konto: ${account}'; + @override String plexAccountUserChip({required Object user, required Object account}) => '${user} via ${account}'; @override String get connectionDefault => 'Standard'; @override String connectionAs({required Object displayName}) => 'som ${displayName}'; @override String get makeDefault => 'Gjør til standard'; @@ -2827,6 +2829,8 @@ extension on TranslationsNb { 'profiles.noConnectionsHint' => 'Ingen tilkoblinger — legg til én for å bruke denne profilen.', 'profiles.noConnections' => 'Ingen tilkoblinger', 'profiles.plexHomeAccount' => 'Plex Home-konto', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex-konto: ${account}', + 'profiles.plexAccountUserChip' => ({required Object user, required Object account}) => '${user} via ${account}', 'profiles.connectionDefault' => 'Standard', 'profiles.connectionAs' => ({required Object displayName}) => 'som ${displayName}', 'profiles.makeDefault' => 'Gjør til standard', @@ -3213,10 +3217,10 @@ extension on TranslationsNb { 'watchTogether.failedToJoin' => 'Kunne ikke bli med i økt', 'watchTogether.sessionCodeCopied' => 'Øktkode kopiert til utklippstavle', 'watchTogether.relayUnreachable' => 'Reléserveren kan ikke nås. Blokkering hos internettleverandøren kan hindre Se sammen.', - 'watchTogether.reconnectingToHost' => 'Kobler til verten på nytt...', - 'watchTogether.currentPlayback' => 'Gjeldende avspilling', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'Kobler til verten på nytt...', + 'watchTogether.currentPlayback' => 'Gjeldende avspilling', 'watchTogether.joinCurrentPlayback' => 'Bli med i gjeldende avspilling', 'watchTogether.joinCurrentPlaybackDescription' => 'Hopp tilbake til det verten ser på nå', 'watchTogether.failedToOpenCurrentPlayback' => 'Kunne ikke åpne gjeldende avspilling', diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index 4df32332..8960b7fa 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -877,6 +877,8 @@ class _Translations$profiles$nl extends Translations$profiles$en { @override String get noConnectionsHint => 'Geen verbindingen — voeg er één toe om dit profiel te gebruiken.'; @override String get noConnections => 'Geen verbindingen'; @override String get plexHomeAccount => 'Plex Home-account'; + @override String plexAccountChip({required Object account}) => 'Plex-account: ${account}'; + @override String plexAccountUserChip({required Object user, required Object account}) => '${user} via ${account}'; @override String get connectionDefault => 'Standaard'; @override String connectionAs({required Object displayName}) => 'als ${displayName}'; @override String get makeDefault => 'Als standaard instellen'; @@ -2827,6 +2829,8 @@ extension on TranslationsNl { 'profiles.noConnectionsHint' => 'Geen verbindingen — voeg er één toe om dit profiel te gebruiken.', 'profiles.noConnections' => 'Geen verbindingen', 'profiles.plexHomeAccount' => 'Plex Home-account', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex-account: ${account}', + 'profiles.plexAccountUserChip' => ({required Object user, required Object account}) => '${user} via ${account}', 'profiles.connectionDefault' => 'Standaard', 'profiles.connectionAs' => ({required Object displayName}) => 'als ${displayName}', 'profiles.makeDefault' => 'Als standaard instellen', @@ -3213,10 +3217,10 @@ extension on TranslationsNl { 'watchTogether.failedToJoin' => 'Deelnemen aan sessie mislukt', 'watchTogether.sessionCodeCopied' => 'Sessiecode naar het klembord gekopieerd', 'watchTogether.relayUnreachable' => 'De relayserver is onbereikbaar. Een blokkering door je internetprovider kan Samen kijken verhinderen.', - 'watchTogether.reconnectingToHost' => 'Opnieuw verbinden met host...', - 'watchTogether.currentPlayback' => 'Wat nu wordt afgespeeld', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'Opnieuw verbinden met host...', + 'watchTogether.currentPlayback' => 'Wat nu wordt afgespeeld', 'watchTogether.joinCurrentPlayback' => 'Deelnemen aan huidige weergave', 'watchTogether.joinCurrentPlaybackDescription' => 'Ga terug naar wat de host nu kijkt', 'watchTogether.failedToOpenCurrentPlayback' => 'Wat nu wordt afgespeeld kon niet worden geopend', diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart index 4c65cc2d..2102060a 100644 --- a/lib/i18n/strings_pl.g.dart +++ b/lib/i18n/strings_pl.g.dart @@ -879,6 +879,8 @@ class _Translations$profiles$pl extends Translations$profiles$en { @override String get noConnectionsHint => 'Brak połączeń — dodaj jedno, aby używać tego profilu.'; @override String get noConnections => 'Brak połączeń'; @override String get plexHomeAccount => 'Konto Plex Home'; + @override String plexAccountChip({required Object account}) => 'Konto Plex: ${account}'; + @override String plexAccountUserChip({required Object user, required Object account}) => '${user} przez ${account}'; @override String get connectionDefault => 'Domyślne'; @override String connectionAs({required Object displayName}) => 'jako ${displayName}'; @override String get makeDefault => 'Ustaw jako domyślne'; @@ -2833,6 +2835,8 @@ extension on TranslationsPl { 'profiles.noConnectionsHint' => 'Brak połączeń — dodaj jedno, aby używać tego profilu.', 'profiles.noConnections' => 'Brak połączeń', 'profiles.plexHomeAccount' => 'Konto Plex Home', + 'profiles.plexAccountChip' => ({required Object account}) => 'Konto Plex: ${account}', + 'profiles.plexAccountUserChip' => ({required Object user, required Object account}) => '${user} przez ${account}', 'profiles.connectionDefault' => 'Domyślne', 'profiles.connectionAs' => ({required Object displayName}) => 'jako ${displayName}', 'profiles.makeDefault' => 'Ustaw jako domyślne', @@ -3219,10 +3223,10 @@ extension on TranslationsPl { 'watchTogether.failedToJoin' => 'Nie udało się dołączyć do sesji', 'watchTogether.sessionCodeCopied' => 'Kod sesji skopiowany do schowka', 'watchTogether.relayUnreachable' => 'Serwer pośredniczący jest nieosiągalny. Blokada operatora internetowego może uniemożliwiać korzystanie z funkcji „Oglądaj razem”.', - 'watchTogether.reconnectingToHost' => 'Ponowne łączenie z gospodarzem...', - 'watchTogether.currentPlayback' => 'Bieżące odtwarzanie', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'Ponowne łączenie z gospodarzem...', + 'watchTogether.currentPlayback' => 'Bieżące odtwarzanie', 'watchTogether.joinCurrentPlayback' => 'Dołącz do bieżącego odtwarzania', 'watchTogether.joinCurrentPlaybackDescription' => 'Wróć do treści oglądanej obecnie przez gospodarza', 'watchTogether.failedToOpenCurrentPlayback' => 'Nie udało się otworzyć bieżącego odtwarzania', diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart index 99042fc5..9bcdcd42 100644 --- a/lib/i18n/strings_pt.g.dart +++ b/lib/i18n/strings_pt.g.dart @@ -877,6 +877,8 @@ class _Translations$profiles$pt extends Translations$profiles$en { @override String get noConnectionsHint => 'Sem conexões — adicione uma para usar este perfil.'; @override String get noConnections => 'Sem conexões'; @override String get plexHomeAccount => 'Conta Plex Home'; + @override String plexAccountChip({required Object account}) => 'Conta Plex: ${account}'; + @override String plexAccountUserChip({required Object user, required Object account}) => '${user} via ${account}'; @override String get connectionDefault => 'Padrão'; @override String connectionAs({required Object displayName}) => 'como ${displayName}'; @override String get makeDefault => 'Definir como padrão'; @@ -2827,6 +2829,8 @@ extension on TranslationsPt { 'profiles.noConnectionsHint' => 'Sem conexões — adicione uma para usar este perfil.', 'profiles.noConnections' => 'Sem conexões', 'profiles.plexHomeAccount' => 'Conta Plex Home', + 'profiles.plexAccountChip' => ({required Object account}) => 'Conta Plex: ${account}', + 'profiles.plexAccountUserChip' => ({required Object user, required Object account}) => '${user} via ${account}', 'profiles.connectionDefault' => 'Padrão', 'profiles.connectionAs' => ({required Object displayName}) => 'como ${displayName}', 'profiles.makeDefault' => 'Definir como padrão', @@ -3213,10 +3217,10 @@ extension on TranslationsPt { 'watchTogether.failedToJoin' => 'Falha ao entrar na sessão', 'watchTogether.sessionCodeCopied' => 'Código da sessão copiado para a área de transferência', 'watchTogether.relayUnreachable' => 'Servidor de retransmissão inacessível. O bloqueio pelo provedor de internet pode impedir o uso do Assistir Juntos.', - 'watchTogether.reconnectingToHost' => 'Reconectando ao anfitrião...', - 'watchTogether.currentPlayback' => 'Reprodução atual', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'Reconectando ao anfitrião...', + 'watchTogether.currentPlayback' => 'Reprodução atual', 'watchTogether.joinCurrentPlayback' => 'Entrar na reprodução atual', 'watchTogether.joinCurrentPlaybackDescription' => 'Voltar ao conteúdo que o anfitrião está assistindo agora', 'watchTogether.failedToOpenCurrentPlayback' => 'Falha ao abrir a reprodução atual', diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart index e7207693..1ec083a7 100644 --- a/lib/i18n/strings_ru.g.dart +++ b/lib/i18n/strings_ru.g.dart @@ -879,6 +879,8 @@ class _Translations$profiles$ru extends Translations$profiles$en { @override String get noConnectionsHint => 'Нет соединений — добавьте одно, чтобы использовать этот профиль.'; @override String get noConnections => 'Нет соединений'; @override String get plexHomeAccount => 'Аккаунт Plex Home'; + @override String plexAccountChip({required Object account}) => 'Аккаунт Plex: ${account}'; + @override String plexAccountUserChip({required Object user, required Object account}) => '${user} через ${account}'; @override String get connectionDefault => 'По умолчанию'; @override String connectionAs({required Object displayName}) => 'как ${displayName}'; @override String get makeDefault => 'Сделать по умолчанию'; @@ -2833,6 +2835,8 @@ extension on TranslationsRu { 'profiles.noConnectionsHint' => 'Нет соединений — добавьте одно, чтобы использовать этот профиль.', 'profiles.noConnections' => 'Нет соединений', 'profiles.plexHomeAccount' => 'Аккаунт Plex Home', + 'profiles.plexAccountChip' => ({required Object account}) => 'Аккаунт Plex: ${account}', + 'profiles.plexAccountUserChip' => ({required Object user, required Object account}) => '${user} через ${account}', 'profiles.connectionDefault' => 'По умолчанию', 'profiles.connectionAs' => ({required Object displayName}) => 'как ${displayName}', 'profiles.makeDefault' => 'Сделать по умолчанию', @@ -3219,10 +3223,10 @@ extension on TranslationsRu { 'watchTogether.failedToJoin' => 'Не удалось присоединиться к сессии', 'watchTogether.sessionCodeCopied' => 'Код сессии скопирован в буфер обмена', 'watchTogether.relayUnreachable' => 'Сервер ретрансляции недоступен. Блокировка интернет-провайдером может помешать совместному просмотру.', - 'watchTogether.reconnectingToHost' => 'Повторное подключение к организатору...', - 'watchTogether.currentPlayback' => 'Текущее воспроизведение', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'Повторное подключение к организатору...', + 'watchTogether.currentPlayback' => 'Текущее воспроизведение', 'watchTogether.joinCurrentPlayback' => 'Присоединиться к текущему воспроизведению', 'watchTogether.joinCurrentPlaybackDescription' => 'Вернуться к материалу, который сейчас смотрит организатор', 'watchTogether.failedToOpenCurrentPlayback' => 'Не удалось открыть текущее воспроизведение', diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index 934c11a5..f68060e5 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -877,6 +877,8 @@ class _Translations$profiles$sv extends Translations$profiles$en { @override String get noConnectionsHint => 'Inga anslutningar — lägg till en för att använda den här profilen.'; @override String get noConnections => 'Inga anslutningar'; @override String get plexHomeAccount => 'Plex Home-konto'; + @override String plexAccountChip({required Object account}) => 'Plex-konto: ${account}'; + @override String plexAccountUserChip({required Object user, required Object account}) => '${user} via ${account}'; @override String get connectionDefault => 'Standard'; @override String connectionAs({required Object displayName}) => 'som ${displayName}'; @override String get makeDefault => 'Gör till standard'; @@ -2827,6 +2829,8 @@ extension on TranslationsSv { 'profiles.noConnectionsHint' => 'Inga anslutningar — lägg till en för att använda den här profilen.', 'profiles.noConnections' => 'Inga anslutningar', 'profiles.plexHomeAccount' => 'Plex Home-konto', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex-konto: ${account}', + 'profiles.plexAccountUserChip' => ({required Object user, required Object account}) => '${user} via ${account}', 'profiles.connectionDefault' => 'Standard', 'profiles.connectionAs' => ({required Object displayName}) => 'som ${displayName}', 'profiles.makeDefault' => 'Gör till standard', @@ -3213,10 +3217,10 @@ extension on TranslationsSv { 'watchTogether.failedToJoin' => 'Det gick inte att gå med i sessionen', 'watchTogether.sessionCodeCopied' => 'Sessionskoden har kopierats till urklipp', 'watchTogether.relayUnreachable' => 'Reläservern kan inte nås. Din internetleverantör kan blockera Titta tillsammans.', - 'watchTogether.reconnectingToHost' => 'Återansluter till värden...', - 'watchTogether.currentPlayback' => 'Aktuell uppspelning', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => 'Återansluter till värden...', + 'watchTogether.currentPlayback' => 'Aktuell uppspelning', 'watchTogether.joinCurrentPlayback' => 'Gå med i aktuell uppspelning', 'watchTogether.joinCurrentPlaybackDescription' => 'Hoppa tillbaka till det värden tittar på just nu', 'watchTogether.failedToOpenCurrentPlayback' => 'Kunde inte öppna aktuell uppspelning', diff --git a/lib/i18n/strings_tr.g.dart b/lib/i18n/strings_tr.g.dart index 260f10f9..3ed56be2 100644 --- a/lib/i18n/strings_tr.g.dart +++ b/lib/i18n/strings_tr.g.dart @@ -881,6 +881,8 @@ class _Translations$profiles$tr extends Translations$profiles$en { @override String get noConnectionsHint => 'Bağlantı yok — bu profili kullanmak için bir tane ekleyin.'; @override String get noConnections => 'Bağlantı yok'; @override String get plexHomeAccount => 'Plex Ev hesabı'; + @override String plexAccountChip({required Object account}) => 'Plex hesabı: ${account}'; + @override String plexAccountUserChip({required Object account, required Object user}) => '${account} hesabı üzerinden ${user}'; @override String get connectionDefault => 'Varsayılan'; @override String connectionAs({required Object displayName}) => '${displayName} olarak'; @override String get makeDefault => 'Varsayılan yap'; @@ -2842,6 +2844,8 @@ extension on TranslationsTr { 'profiles.noConnectionsHint' => 'Bağlantı yok — bu profili kullanmak için bir tane ekleyin.', 'profiles.noConnections' => 'Bağlantı yok', 'profiles.plexHomeAccount' => 'Plex Ev hesabı', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex hesabı: ${account}', + 'profiles.plexAccountUserChip' => ({required Object account, required Object user}) => '${account} hesabı üzerinden ${user}', 'profiles.connectionDefault' => 'Varsayılan', 'profiles.connectionAs' => ({required Object displayName}) => '${displayName} olarak', 'profiles.makeDefault' => 'Varsayılan yap', @@ -3224,10 +3228,10 @@ extension on TranslationsTr { 'watchTogether.pasteFromClipboard' => 'Panodan yapıştır', 'watchTogether.pleaseEnterCode' => 'Lütfen bir oturum kodu girin', 'watchTogether.codeMustBe5Chars' => 'Oturum kodu 5 karakter olmalıdır', - 'watchTogether.joinInstructions' => 'Katılmak için kurucunun oturum kodunu girin.', - 'watchTogether.failedToCreate' => 'Oturum oluşturulamadı', _ => null, } ?? switch (path) { + 'watchTogether.joinInstructions' => 'Katılmak için kurucunun oturum kodunu girin.', + 'watchTogether.failedToCreate' => 'Oturum oluşturulamadı', 'watchTogether.failedToJoin' => 'Oturuma katılınamadı', 'watchTogether.sessionCodeCopied' => 'Oturum kodu panoya kopyalandı', 'watchTogether.relayUnreachable' => 'Aktarıcı sunucusuna ulaşılamıyor. İSS engellemesi Birlikte İzle\'yi önleyebilir.', diff --git a/lib/i18n/strings_uz.g.dart b/lib/i18n/strings_uz.g.dart index 6cc42650..f656eabf 100644 --- a/lib/i18n/strings_uz.g.dart +++ b/lib/i18n/strings_uz.g.dart @@ -881,6 +881,8 @@ class _Translations$profiles$uz extends Translations$profiles$en { @override String get noConnectionsHint => 'Ulanishlar yoʻq — ushbu profildan foydalanish uchun ulanish qoʻshing.'; @override String get noConnections => 'Ulanishlar yoʻq'; @override String get plexHomeAccount => 'Plex Home hisobi'; + @override String plexAccountChip({required Object account}) => 'Plex hisobi: ${account}'; + @override String plexAccountUserChip({required Object account, required Object user}) => '${account} hisobi orqali ${user}'; @override String get connectionDefault => 'Standart'; @override String connectionAs({required Object displayName}) => '${displayName} sifatida'; @override String get makeDefault => 'Standart qilish'; @@ -2842,6 +2844,8 @@ extension on TranslationsUz { 'profiles.noConnectionsHint' => 'Ulanishlar yoʻq — ushbu profildan foydalanish uchun ulanish qoʻshing.', 'profiles.noConnections' => 'Ulanishlar yoʻq', 'profiles.plexHomeAccount' => 'Plex Home hisobi', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex hisobi: ${account}', + 'profiles.plexAccountUserChip' => ({required Object account, required Object user}) => '${account} hisobi orqali ${user}', 'profiles.connectionDefault' => 'Standart', 'profiles.connectionAs' => ({required Object displayName}) => '${displayName} sifatida', 'profiles.makeDefault' => 'Standart qilish', @@ -3224,10 +3228,10 @@ extension on TranslationsUz { 'watchTogether.pasteFromClipboard' => 'Xotiradan joylash', 'watchTogether.pleaseEnterCode' => 'Seans kodini kiriting', 'watchTogether.codeMustBe5Chars' => 'Seans kodi 5 ta belgidan iborat boʻlishi kerak', - 'watchTogether.joinInstructions' => 'Tashkilotchining seans kodini kiriting.', - 'watchTogether.failedToCreate' => 'Seansni yaratib boʻlmadi', _ => null, } ?? switch (path) { + 'watchTogether.joinInstructions' => 'Tashkilotchining seans kodini kiriting.', + 'watchTogether.failedToCreate' => 'Seansni yaratib boʻlmadi', 'watchTogether.failedToJoin' => 'Seansga qoʻshilib boʻlmadi', 'watchTogether.sessionCodeCopied' => 'Seans kodi nusxalandi', 'watchTogether.relayUnreachable' => 'Rele serveriga ulanib boʻlmadi.', diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index 907da77b..db244eb8 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -876,6 +876,8 @@ class Translations$profiles$zh extends Translations$profiles$en { @override String get noConnectionsHint => '没有连接 — 请添加连接以使用此用户资料。'; @override String get noConnections => '没有连接'; @override String get plexHomeAccount => 'Plex Home 账户'; + @override String plexAccountChip({required Object account}) => 'Plex 账户:${account}'; + @override String plexAccountUserChip({required Object account, required Object user}) => '${account} 账户下的 ${user}'; @override String get connectionDefault => '默认'; @override String connectionAs({required Object displayName}) => '以 ${displayName} 身份'; @override String get makeDefault => '设为默认'; @@ -2824,6 +2826,8 @@ extension on TranslationsZh { 'profiles.noConnectionsHint' => '没有连接 — 请添加连接以使用此用户资料。', 'profiles.noConnections' => '没有连接', 'profiles.plexHomeAccount' => 'Plex Home 账户', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex 账户:${account}', + 'profiles.plexAccountUserChip' => ({required Object account, required Object user}) => '${account} 账户下的 ${user}', 'profiles.connectionDefault' => '默认', 'profiles.connectionAs' => ({required Object displayName}) => '以 ${displayName} 身份', 'profiles.makeDefault' => '设为默认', @@ -3210,10 +3214,10 @@ extension on TranslationsZh { 'watchTogether.failedToJoin' => '加入会话失败', 'watchTogether.sessionCodeCopied' => '会话代码已复制到剪贴板', 'watchTogether.relayUnreachable' => '无法访问中继服务器。网络运营商的屏蔽可能导致“一起看”不可用。', - 'watchTogether.reconnectingToHost' => '正在重新连接到主持人…', - 'watchTogether.currentPlayback' => '当前播放', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => '正在重新连接到主持人…', + 'watchTogether.currentPlayback' => '当前播放', 'watchTogether.joinCurrentPlayback' => '加入当前播放', 'watchTogether.joinCurrentPlaybackDescription' => '加入主持人当前正在观看的内容', 'watchTogether.failedToOpenCurrentPlayback' => '无法打开当前播放', diff --git a/lib/i18n/strings_zh_Hant.g.dart b/lib/i18n/strings_zh_Hant.g.dart index 9c695774..5a1f4875 100644 --- a/lib/i18n/strings_zh_Hant.g.dart +++ b/lib/i18n/strings_zh_Hant.g.dart @@ -877,6 +877,8 @@ class _Translations$profiles$zh_Hant extends Translations$profiles$zh { @override String get noConnectionsHint => '無連線 — 請新增一個連線以啟用此設定檔。'; @override String get noConnections => '無連線資訊'; @override String get plexHomeAccount => 'Plex Home 帳戶'; + @override String plexAccountChip({required Object account}) => 'Plex 帳戶:${account}'; + @override String plexAccountUserChip({required Object account, required Object user}) => '${account} 帳戶下的 ${user}'; @override String get connectionDefault => '預設'; @override String connectionAs({required Object displayName}) => '以 ${displayName} 身分'; @override String get makeDefault => '設為預設值'; @@ -2825,6 +2827,8 @@ extension on TranslationsZhHant { 'profiles.noConnectionsHint' => '無連線 — 請新增一個連線以啟用此設定檔。', 'profiles.noConnections' => '無連線資訊', 'profiles.plexHomeAccount' => 'Plex Home 帳戶', + 'profiles.plexAccountChip' => ({required Object account}) => 'Plex 帳戶:${account}', + 'profiles.plexAccountUserChip' => ({required Object account, required Object user}) => '${account} 帳戶下的 ${user}', 'profiles.connectionDefault' => '預設', 'profiles.connectionAs' => ({required Object displayName}) => '以 ${displayName} 身分', 'profiles.makeDefault' => '設為預設值', @@ -3211,10 +3215,10 @@ extension on TranslationsZhHant { 'watchTogether.failedToJoin' => '加入工作階段失敗', 'watchTogether.sessionCodeCopied' => '工作階段代碼已複製到剪貼簿', 'watchTogether.relayUnreachable' => '無法連線至中繼伺服器。ISP 封鎖可能會導致「一起看」無法使用。', - 'watchTogether.reconnectingToHost' => '正在重新連線至主持人…', - 'watchTogether.currentPlayback' => '目前播放內容', _ => null, } ?? switch (path) { + 'watchTogether.reconnectingToHost' => '正在重新連線至主持人…', + 'watchTogether.currentPlayback' => '目前播放內容', 'watchTogether.joinCurrentPlayback' => '加入目前播放點', 'watchTogether.joinCurrentPlaybackDescription' => '同步至主持人目前的觀看進度', 'watchTogether.failedToOpenCurrentPlayback' => '無法開啟目前播放點', diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index 8ddb3df2..bc3a1ae4 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Ta bort denna profil?", "deleteThisProfileMessage": "Ta bort ${displayName}. Anslutningar påverkas inte.", "active": "Aktiv", - "viaPlexAccount": "", "manage": "Hantera", "delete": "Ta bort", "signOut": "Logga ut", @@ -795,6 +794,8 @@ "noConnectionsHint": "Inga anslutningar — lägg till en för att använda den här profilen.", "noConnections": "Inga anslutningar", "plexHomeAccount": "Plex Home-konto", + "plexAccountChip": "Plex-konto: ${account}", + "plexAccountUserChip": "${user} via ${account}", "connectionDefault": "Standard", "connectionAs": "som ${displayName}", "makeDefault": "Gör till standard", diff --git a/lib/i18n/tr.i18n.json b/lib/i18n/tr.i18n.json index 8e01931b..9b8f9657 100644 --- a/lib/i18n/tr.i18n.json +++ b/lib/i18n/tr.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Bu profil silinsin mi?", "deleteThisProfileMessage": "${displayName} kişisi kaldırılacak. Bağlantılar etkilenmez.", "active": "Aktif", - "viaPlexAccount": "", "manage": "Yönet", "delete": "Sil", "signOut": "Çıkış Yap", @@ -795,6 +794,8 @@ "noConnectionsHint": "Bağlantı yok — bu profili kullanmak için bir tane ekleyin.", "noConnections": "Bağlantı yok", "plexHomeAccount": "Plex Ev hesabı", + "plexAccountChip": "Plex hesabı: ${account}", + "plexAccountUserChip": "${account} hesabı üzerinden ${user}", "connectionDefault": "Varsayılan", "connectionAs": "${displayName} olarak", "makeDefault": "Varsayılan yap", diff --git a/lib/i18n/uz.i18n.json b/lib/i18n/uz.i18n.json index 0b4e9e68..97ee9966 100644 --- a/lib/i18n/uz.i18n.json +++ b/lib/i18n/uz.i18n.json @@ -763,7 +763,6 @@ "deleteThisProfileTitle": "Ushbu profil oʻchirilsinmi?", "deleteThisProfileMessage": "${displayName} oʻchiriladi. Ulanishlarga taʼsir qilmaydi.", "active": "Faol", - "viaPlexAccount": "", "manage": "Boshqarish", "delete": "Oʻchirish", "signOut": "Chiqish", @@ -795,6 +794,8 @@ "noConnectionsHint": "Ulanishlar yoʻq — ushbu profildan foydalanish uchun ulanish qoʻshing.", "noConnections": "Ulanishlar yoʻq", "plexHomeAccount": "Plex Home hisobi", + "plexAccountChip": "Plex hisobi: ${account}", + "plexAccountUserChip": "${account} hisobi orqali ${user}", "connectionDefault": "Standart", "connectionAs": "${displayName} sifatida", "makeDefault": "Standart qilish", diff --git a/lib/i18n/zh-Hant.i18n.json b/lib/i18n/zh-Hant.i18n.json index 215da132..5cd52d6a 100644 --- a/lib/i18n/zh-Hant.i18n.json +++ b/lib/i18n/zh-Hant.i18n.json @@ -762,7 +762,6 @@ "deleteThisProfileTitle": "刪除此使用者設定檔?", "deleteThisProfileMessage": "將移除 ${displayName}。連線資訊將不受影響。", "active": "使用中", - "viaPlexAccount": "", "manage": "管理", "delete": "刪除", "signOut": "登出", @@ -794,6 +793,8 @@ "noConnectionsHint": "無連線 — 請新增一個連線以啟用此設定檔。", "noConnections": "無連線資訊", "plexHomeAccount": "Plex Home 帳戶", + "plexAccountChip": "Plex 帳戶:${account}", + "plexAccountUserChip": "${account} 帳戶下的 ${user}", "connectionDefault": "預設", "connectionAs": "以 ${displayName} 身分", "makeDefault": "設為預設值", diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index 41d5f6fd..1e9ec05b 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -762,7 +762,6 @@ "deleteThisProfileTitle": "删除此用户资料?", "deleteThisProfileMessage": "移除 ${displayName}。连接不会受影响。", "active": "当前使用", - "viaPlexAccount": "", "manage": "管理", "delete": "删除", "signOut": "退出登录", @@ -794,6 +793,8 @@ "noConnectionsHint": "没有连接 — 请添加连接以使用此用户资料。", "noConnections": "没有连接", "plexHomeAccount": "Plex Home 账户", + "plexAccountChip": "Plex 账户:${account}", + "plexAccountUserChip": "${account} 账户下的 ${user}", "connectionDefault": "默认", "connectionAs": "以 ${displayName} 身份", "makeDefault": "设为默认", diff --git a/lib/profiles/profiles_view.dart b/lib/profiles/profiles_view.dart index 40bb7ff6..d80ae59a 100644 --- a/lib/profiles/profiles_view.dart +++ b/lib/profiles/profiles_view.dart @@ -29,11 +29,18 @@ class ProfilesView { /// Picture URL per profile id; null means render initials. See [resolveProfileAvatarUrls]. final Map avatarUrlByProfile; + /// Live Plex Home users per account connection id. Chip/label UI needs it + /// to turn a [ProfileConnection.userIdentifier] uuid into the Home user's + /// name; without it a borrowed Plex connection can only name the account + /// owner, which reads as the wrong identity. + final Map> plexHomeByConnectionId; + const ProfilesView({ required this.profiles, required this.connectionsByProfile, required this.connectionsById, required this.avatarUrlByProfile, + required this.plexHomeByConnectionId, }); static const empty = ProfilesView( @@ -41,6 +48,7 @@ class ProfilesView { connectionsByProfile: {}, connectionsById: {}, avatarUrlByProfile: {}, + plexHomeByConnectionId: {}, ); } @@ -108,6 +116,7 @@ ProfilesView _build({ connectionsById: connectionsById, plexHomeByConnectionId: homes, ), + plexHomeByConnectionId: homes, ); } diff --git a/lib/screens/profile/profile_switch_screen.dart b/lib/screens/profile/profile_switch_screen.dart index e5c70edd..b28bf1c4 100644 --- a/lib/screens/profile/profile_switch_screen.dart +++ b/lib/screens/profile/profile_switch_screen.dart @@ -327,21 +327,14 @@ class _ProfileSwitchScreenState extends State with MountedS List<_ChipData> _chipsFor(Profile profile, ProfilesView view) { final chips = <_ChipData>[]; // Plex Home profiles implicitly own their parent Plex connection (no - // join-table row), so prepend it before any borrowed connections. + // join-table row), so prepend it before any borrowed connections. The + // profile *is* the Home user there, so its own name identifies the user + // half of the label. if (profile.isPlexHome) { final parentId = profile.parentConnectionId; if (parentId != null) { final conn = view.connectionsById[parentId]; - if (conn != null) { - chips.add( - _ChipData( - backend: conn.backend, - label: conn is PlexAccountConnection - ? t.profiles.viaPlexAccount(name: conn.accountLabel) - : conn.displayLabel, - ), - ); - } + if (conn != null) chips.add(_chipFor(conn, user: profile.displayName)); } } final pcs = visibleProfileConnections( @@ -350,11 +343,47 @@ class _ProfileSwitchScreenState extends State with MountedS ); for (final pc in pcs) { final conn = view.connectionsById[pc.connectionId]; - if (conn != null) chips.add(_ChipData(backend: conn.backend, label: conn.displayLabel)); + if (conn != null) chips.add(_chipFor(conn, user: _plexHomeUserName(view, conn, pc.userIdentifier))); } return chips; } + /// A Plex account connection labels itself with the account owner's name, + /// which under a profile tile reads as the profile being signed in as that + /// person — wrong for a Plex Home user, and wrong again for a local profile + /// that borrowed a Home user out of someone else's account. + /// + /// Both halves of that relation go through a single translated string so a + /// locale can order them itself; several put the account first (`ja`, `ko`, + /// `tr`, `zh`). [user] is null only when the Home cache cannot resolve the + /// connection's uuid yet, which falls back to naming the account alone. + _ChipData _chipFor(Connection conn, {required String? user}) { + return _ChipData( + backend: conn.backend, + label: switch (conn) { + PlexAccountConnection(:final accountLabel) when user != null => t.profiles.plexAccountUserChip( + user: user, + account: accountLabel, + ), + PlexAccountConnection(:final accountLabel) => t.profiles.plexAccountChip(account: accountLabel), + _ => conn.displayLabel, + }, + ); + } + + /// Home user behind a borrowed Plex connection, or null when the live cache + /// has no match for [userIdentifier] (not loaded yet, or the row predates + /// the account's current Home membership). + String? _plexHomeUserName(ProfilesView view, Connection conn, String userIdentifier) { + if (conn is! PlexAccountConnection || userIdentifier.isEmpty) return null; + final users = view.plexHomeByConnectionId[conn.id]; + if (users == null) return null; + for (final user in users) { + if (user.uuid == userIdentifier) return user.displayName; + } + return null; + } + Future _addLocalProfile() async { await Navigator.of(context).push(MaterialPageRoute(builder: (_) => const AddLocalProfileScreen())); } @@ -566,7 +595,12 @@ class _ConnectionChips extends StatelessWidget { children: [ BackendBadge(backend: c.backend, size: 12), const SizedBox(width: 4), - Text(c.label, style: theme.textTheme.labelSmall), + // Account labels are often an email address, and a chip in a + // Wrap gets unbounded main-axis space — without this the row + // overflows the tile instead of ellipsizing. + Flexible( + child: Text(c.label, style: theme.textTheme.labelSmall, overflow: .ellipsis), + ), ], ), ), diff --git a/test/screens/profile/profile_switch_screen_test.dart b/test/screens/profile/profile_switch_screen_test.dart index ec9942fe..3fe7aa81 100644 --- a/test/screens/profile/profile_switch_screen_test.dart +++ b/test/screens/profile/profile_switch_screen_test.dart @@ -10,6 +10,7 @@ import 'package:plezy/database/app_database.dart'; import 'package:plezy/focus/focusable_wrapper.dart'; import 'package:plezy/focus/input_mode_tracker.dart'; import 'package:plezy/i18n/strings.g.dart'; +import 'package:plezy/models/plex/plex_home_user.dart'; import 'package:plezy/profiles/active_profile_provider.dart'; import 'package:plezy/profiles/plex_home_service.dart'; import 'package:plezy/profiles/profile.dart'; @@ -369,70 +370,211 @@ void main() { await tester.pump(); }); - testWidgets('labels a Plex Home parent connection as an account, not as the profile', (tester) async { - final db = AppDatabase.forTesting(NativeDatabase.memory()); - final profile = Profile.plexHome( - id: 'home-alice', - displayName: 'Alice', - parentConnectionId: 'plex-account', - plexHomeUserUuid: 'alice-uuid', - createdAt: DateTime(2026, 1, 1), - ); - final profiles = _FakeProfileRegistry(db, [profile]); - final connections = _FakeConnectionRegistry(db, [ - PlexAccountConnection( - id: 'plex-account', - accountToken: 'token', - clientIdentifier: 'client', - accountLabel: 'Bob', - createdAt: DateTime(2026, 1, 1), - ), - ]); - final profileConnections = _FakeProfileConnectionRegistry(db); - final storage = await StorageService.getInstance(); - final plexHome = PlexHomeService( - connections: connections, - profileConnections: profileConnections, - storage: storage, - plexHomeUserFetcher: (_) async => const [], - ); - final activeProfile = ActiveProfileProvider( - registry: profiles, - plexHome: plexHome, - connections: connections, - profileConnections: profileConnections, - storage: storage, - ); - addTearDown(() async { - activeProfile.dispose(); - await plexHome.dispose(); - await db.close(); - }); - - await tester.pumpWidget( - TranslationProvider( - child: MultiProvider( - providers: [ - Provider.value(value: storage), - Provider.value(value: profiles), - Provider.value(value: profileConnections), - Provider.value(value: connections), - Provider.value(value: plexHome), - ChangeNotifierProvider.value(value: activeProfile), - ], - child: MaterialApp(theme: monoTheme(dark: true), home: const ProfileSwitchScreen()), + testWidgets('names the Plex Home user and the account together, not the account alone', (tester) async { + await _pumpPicker( + tester, + profiles: [ + Profile.plexHome( + id: 'home-alice', + displayName: 'Alice', + parentConnectionId: 'plex-account', + plexHomeUserUuid: 'alice-uuid', + createdAt: DateTime(2026, 1, 1), ), - ), + ], + connections: [_plexAccount('Bob')], ); - await tester.pumpAndSettle(); expect(find.text('Alice'), findsOneWidget); - expect(find.text(t.profiles.viaPlexAccount(name: 'Bob')), findsOneWidget); + expect( + _relationChip(tester, tile: _tileFor('Alice'), first: 'Alice', second: 'Bob'), + t.profiles.plexAccountUserChip(user: 'Alice', account: 'Bob'), + ); + expect(find.text('Bob'), findsNothing, reason: 'the owner name alone reads as being signed in as the owner'); + + await tester.pumpWidget(const SizedBox.shrink()); + await tester.pump(); + }); + + testWidgets('names the borrowed Home user and the account it came from', (tester) async { + await _pumpPicker( + tester, + profiles: [Profile.local(id: 'local-alice', displayName: 'Alice', createdAt: DateTime(2026, 1, 1))], + connections: [_plexAccount('Bob')], + profileConnections: const [ + ProfileConnection( + profileId: 'local-alice', + connectionId: 'plex-account', + userToken: 'borrowed-token', + userIdentifier: 'charlie-uuid', + ), + ], + homeUsers: [_homeUser('charlie-uuid', 'Charlie')], + ); + + expect( + _relationChip(tester, tile: _tileFor('Alice'), first: 'Charlie', second: 'Bob'), + t.profiles.plexAccountUserChip(user: 'Charlie', account: 'Bob'), + ); + + await tester.pumpWidget(const SizedBox.shrink()); + await tester.pump(); + }); + + testWidgets('falls back to naming the account when the Home user cannot be resolved', (tester) async { + await _pumpPicker( + tester, + profiles: [Profile.local(id: 'local-alice', displayName: 'Alice', createdAt: DateTime(2026, 1, 1))], + connections: [_plexAccount('Bob')], + profileConnections: const [ + ProfileConnection( + profileId: 'local-alice', + connectionId: 'plex-account', + userToken: 'borrowed-token', + userIdentifier: 'departed-uuid', + ), + ], + ); + + expect(find.text(t.profiles.plexAccountChip(account: 'Bob')), findsOneWidget); expect(find.text('Bob'), findsNothing); await tester.pumpWidget(const SizedBox.shrink()); await tester.pump(); }); + + testWidgets('lets a locale put the account before the user', (tester) async { + // ja renders the relation as `${account}経由の${user}`. Splitting the two + // halves across widgets — or across two translated fragments — would pin + // them to English order; this is the assertion that keeps them in one + // translated string. + // `runAsync`: a deferred locale library loads on the real event loop, + // which the widget tester's fake async would otherwise never pump. + await tester.runAsync(() => LocaleSettings.setLocale(AppLocale.ja)); + addTearDown(() => LocaleSettings.setLocaleSync(AppLocale.en)); + await _pumpPicker( + tester, + profiles: [ + Profile.plexHome( + id: 'home-alice', + displayName: 'Alice', + parentConnectionId: 'plex-account', + plexHomeUserUuid: 'alice-uuid', + createdAt: DateTime(2026, 1, 1), + ), + ], + connections: [_plexAccount('Bob')], + ); + + final label = _relationChip(tester, tile: _tileFor('Alice'), first: 'Alice', second: 'Bob'); + expect(label, t.profiles.plexAccountUserChip(user: 'Alice', account: 'Bob')); + expect(label.indexOf('Bob'), lessThan(label.indexOf('Alice'))); + + await tester.pumpWidget(const SizedBox.shrink()); + await tester.pump(); + }); +} + +/// Boots the picker over a fixed profile/connection set. [homeUsers] seeds the +/// live Plex Home cache, which is what turns a borrowed connection's +/// `userIdentifier` uuid into a name. +Future _pumpPicker( + WidgetTester tester, { + required List profiles, + required List connections, + List profileConnections = const [], + List homeUsers = const [], +}) async { + final db = AppDatabase.forTesting(NativeDatabase.memory()); + final profileRegistry = _FakeProfileRegistry(db, profiles); + final connectionRegistry = _FakeConnectionRegistry(db, connections); + final profileConnectionRegistry = _FakeProfileConnectionRegistry(db, profileConnections); + final storage = await StorageService.getInstance(); + final plexHome = PlexHomeService( + connections: connectionRegistry, + profileConnections: profileConnectionRegistry, + storage: storage, + plexHomeUserFetcher: (_) async => homeUsers, + ); + final activeProfile = ActiveProfileProvider( + registry: profileRegistry, + plexHome: plexHome, + connections: connectionRegistry, + profileConnections: profileConnectionRegistry, + storage: storage, + ); + addTearDown(() async { + activeProfile.dispose(); + await plexHome.dispose(); + await db.close(); + }); + if (homeUsers.isNotEmpty) { + for (final connection in connections.whereType()) { + expect(await plexHome.refresh(connection), isTrue); + } + } + + await tester.pumpWidget( + TranslationProvider( + child: MultiProvider( + providers: [ + Provider.value(value: storage), + Provider.value(value: profileRegistry), + Provider.value(value: profileConnectionRegistry), + Provider.value(value: connectionRegistry), + Provider.value(value: plexHome), + ChangeNotifierProvider.value(value: activeProfile), + ], + child: MaterialApp(theme: monoTheme(dark: true), home: const ProfileSwitchScreen()), + ), + ), + ); + await tester.pumpAndSettle(); +} + +PlexAccountConnection _plexAccount(String accountLabel) { + return PlexAccountConnection( + id: 'plex-account', + accountToken: 'token', + clientIdentifier: 'client', + accountLabel: accountLabel, + createdAt: DateTime(2026, 1, 1), + ); +} + +PlexHomeUser _homeUser(String uuid, String title) { + return PlexHomeUser( + id: 1, + uuid: uuid, + title: title, + thumb: '', + hasPassword: false, + restricted: false, + updatedAt: null, + admin: false, + guest: false, + protected: false, + ); +} + +Finder _tileFor(String displayName) { + return find.ancestor(of: find.text(displayName), matching: find.byType(FocusableWrapper)); +} + +/// The single chip label inside [tile] that names both [first] and [second]. +/// +/// Asserting that exactly one text node carries both halves is the point: two +/// nodes, or one node plus a neighbouring label, would mean the relation is +/// assembled in Dart and no locale could reorder it. +String _relationChip(WidgetTester tester, {required Finder tile, required String first, required String second}) { + final labels = tester + .widgetList(find.descendant(of: tile, matching: find.byType(Text))) + .map((text) => text.data) + .whereType() + .where((label) => label.contains(first) && label.contains(second)) + .toList(); + expect(labels, hasLength(1), reason: 'both halves must render as one translated string'); + return labels.single; } /// Tile labels in painted order. Only the two names the reorder tests seed are @@ -509,6 +651,9 @@ class _FakeConnectionRegistry extends ConnectionRegistry { @override Future> list() async => _connections; + + @override + Future get(String id) async => _connections.where((conn) => conn.id == id).firstOrNull; } class _FakeProfileConnectionRegistry extends ProfileConnectionRegistry {