diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index c4616e5f6..8073596a0 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -558,6 +558,9 @@ "diagnosticsRecWeakWifiTitle": "إشارة WiFi ضعيفة", "disable": "تعطيل", "disableInstantPrivacyDesc": "ستتمكن جميع الأجهزة من الاتصال بشبكتك بحرية.", + "privateMacWarningTitle": "تستخدم بعض الأجهزة عنوان Wi-Fi خاصًا", + "privateMacWarningDesc": "تستخدم الأجهزة المذكورة أدناه عنوان Wi-Fi خاصًا (عشوائيًا). ونظرًا لأن هذا العنوان يتغير بمرور الوقت، فقد يتم حظرها بعد تبديله — حتى الجهاز الذي تستخدمه الآن. للبقاء متصلاً، أوقف تشغيل «عنوان Wi-Fi خاص» لهذه الأجهزة قبل تمكين الخصوصية الفورية.", + "privateMacLabel": "خاص", "disableInstantPrivacyTitle": "تعطيل الخصوصية الفورية؟", "discards": "حالات التجاهل", "distribution": "التوزيع", diff --git a/lib/l10n/app_da.arb b/lib/l10n/app_da.arb index c045bf7f2..11d96b062 100644 --- a/lib/l10n/app_da.arb +++ b/lib/l10n/app_da.arb @@ -557,6 +557,9 @@ "diagnosticsRecWeakWifiTitle": "Svagt WiFi-signal", "disable": "Deaktiver", "disableInstantPrivacyDesc": "Alle enheder vil kunne oprette forbindelse frit til dit netværk.", + "privateMacWarningTitle": "Nogle enheder bruger en privat Wi-Fi-adresse", + "privateMacWarningDesc": "Enhederne nedenfor bruger en privat (tilfældig) Wi-Fi-adresse. Da denne adresse ændrer sig over tid, kan de blive blokeret, når den skifter — også den, du bruger lige nu. For at forblive forbundet skal du slå \"Privat Wi-Fi-adresse\" fra for disse enheder, før du aktiverer Instant Privacy.", + "privateMacLabel": "Privat", "disableInstantPrivacyTitle": "Deaktiver Instant Privacy?", "discards": "Forkastninger", "distribution": "Fordeling", diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index a44827e0c..70bcf4c26 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -557,6 +557,9 @@ "diagnosticsRecWeakWifiTitle": "Schwaches WiFi-Signal", "disable": "Deaktivieren", "disableInstantPrivacyDesc": "Alle Geräte können sich frei mit Ihrem Netzwerk verbinden.", + "privateMacWarningTitle": "Einige Geräte verwenden eine private WLAN-Adresse", + "privateMacWarningDesc": "Die unten aufgeführten Geräte verwenden eine private (zufällige) WLAN-Adresse. Da sich diese Adresse im Laufe der Zeit ändert, können die Geräte nach einem Wechsel blockiert werden – auch das Gerät, das Sie gerade verwenden. Um verbunden zu bleiben, deaktivieren Sie für diese Geräte die Option „Private WLAN-Adresse“, bevor Sie Instant Privacy aktivieren.", + "privateMacLabel": "Privat", "disableInstantPrivacyTitle": "Instant Privacy deaktivieren?", "discards": "Verworfene Pakete", "distribution": "Verteilung", diff --git a/lib/l10n/app_el.arb b/lib/l10n/app_el.arb index 68152b4cd..11341e7ec 100644 --- a/lib/l10n/app_el.arb +++ b/lib/l10n/app_el.arb @@ -555,6 +555,9 @@ "diagnosticsRecWeakWifiTitle": "Αδύναμο σήμα WiFi", "disable": "Απενεργοποίηση", "disableInstantPrivacyDesc": "Όλες οι συσκευές θα μπορούν να συνδέονται ελεύθερα στο δίκτυό σας.", + "privateMacWarningTitle": "Ορισμένες συσκευές χρησιμοποιούν ιδιωτική διεύθυνση Wi-Fi", + "privateMacWarningDesc": "Οι παρακάτω συσκευές χρησιμοποιούν ιδιωτική (τυχαία) διεύθυνση Wi-Fi. Επειδή αυτή η διεύθυνση αλλάζει με την πάροδο του χρόνου, ενδέχεται να αποκλειστούν μετά την εναλλαγή της — ακόμη και αυτή που χρησιμοποιείτε τώρα. Για να παραμείνετε συνδεδεμένοι, απενεργοποιήστε την «Ιδιωτική διεύθυνση Wi-Fi» για αυτές τις συσκευές πριν ενεργοποιήσετε το Instant Privacy.", + "privateMacLabel": "Ιδιωτική", "disableInstantPrivacyTitle": "Απενεργοποίηση Instant Privacy;", "discards": "Απορρίψεις", "distribution": "Κατανομή", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index bc798ed22..ff62182f6 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1397,6 +1397,9 @@ } } }, + "privateMacWarningTitle": "Some devices use a private Wi-Fi address", + "privateMacWarningDesc": "The device(s) below use a private (randomized) Wi-Fi address. Because this address changes over time, they may be blocked after it rotates — even the one you're using now. To stay connected, turn off \"Private Wi-Fi Address\" for these devices before enabling Instant Privacy.", + "privateMacLabel": "Private", "disableInstantPrivacyTitle": "Disable Instant Privacy?", "disableInstantPrivacyDesc": "All devices will be able to connect freely to your network.", "addDeviceManually": "Add device manually", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 5f38da38a..2adaeb6ee 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -557,6 +557,9 @@ "diagnosticsRecWeakWifiTitle": "Señal WiFi débil", "disable": "Desactivar", "disableInstantPrivacyDesc": "Todos los dispositivos podrán conectarse libremente a su red.", + "privateMacWarningTitle": "Algunos dispositivos usan una dirección Wi-Fi privada", + "privateMacWarningDesc": "Los dispositivos que aparecen a continuación usan una dirección Wi-Fi privada (aleatoria). Como esta dirección cambia con el tiempo, pueden quedar bloqueados cuando rote —incluso el que estás usando ahora—. Para no perder la conexión, desactiva la \"Dirección Wi-Fi privada\" en estos dispositivos antes de activar Instant-Privacidad.", + "privateMacLabel": "Privada", "disableInstantPrivacyTitle": "¿Desactivar Instant-Privacidad?", "discards": "Descartes", "distribution": "Distribución", diff --git a/lib/l10n/app_es_ar.arb b/lib/l10n/app_es_ar.arb index 7fc66cd49..067dd32d3 100644 --- a/lib/l10n/app_es_ar.arb +++ b/lib/l10n/app_es_ar.arb @@ -557,6 +557,9 @@ "diagnosticsRecWeakWifiTitle": "Señal WiFi débil", "disable": "Desactivar", "disableInstantPrivacyDesc": "Todos los dispositivos podrán conectarse libremente a su red.", + "privateMacWarningTitle": "Algunos dispositivos usan una dirección Wi-Fi privada", + "privateMacWarningDesc": "Los dispositivos que se muestran abajo usan una dirección Wi-Fi privada (aleatoria). Como esta dirección cambia con el tiempo, pueden quedar bloqueados cuando rote —incluso el que estás usando ahora—. Para no perder la conexión, desactivá la \"Dirección Wi-Fi privada\" en estos dispositivos antes de activar la Privacidad instantánea.", + "privateMacLabel": "Privada", "disableInstantPrivacyTitle": "¿Desactivar la Privacidad instantánea?", "discards": "Descartes", "distribution": "Distribución", diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 6a316390a..4b664fcdd 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -555,6 +555,9 @@ "diagnosticsRecWeakWifiTitle": "Heikko WiFi-signaali", "disable": "Poista käytöstä", "disableInstantPrivacyDesc": "Kaikki laitteet voivat yhdistää vapaasti verkkoosi.", + "privateMacWarningTitle": "Jotkin laitteet käyttävät yksityistä Wi-Fi-osoitetta", + "privateMacWarningDesc": "Alla luetellut laitteet käyttävät yksityistä (satunnaistettua) Wi-Fi-osoitetta. Koska tämä osoite muuttuu ajan myötä, ne voidaan estää osoitteen vaihduttua — myös laite, jota käytät juuri nyt. Pysyäksesi yhteydessä poista näiden laitteiden \"Yksityinen Wi-Fi-osoite\" käytöstä ennen kuin otat Instant Privacyn käyttöön.", + "privateMacLabel": "Yksityinen", "disableInstantPrivacyTitle": "Poistetaanko Instant Privacy käytöstä?", "discards": "Hylätyt", "distribution": "Jakauma", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index bb4b38d89..52563ddfd 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -557,6 +557,9 @@ "diagnosticsRecWeakWifiTitle": "Signal WiFi faible", "disable": "Désactiver", "disableInstantPrivacyDesc": "Tous les périphériques pourront se connecter librement à votre réseau.", + "privateMacWarningTitle": "Certains appareils utilisent une adresse Wi-Fi privée", + "privateMacWarningDesc": "Les appareils ci-dessous utilisent une adresse Wi-Fi privée (aléatoire). Comme cette adresse change au fil du temps, ils risquent d’être bloqués après sa rotation — y compris celui que vous utilisez actuellement. Pour rester connecté, désactivez l’option « Adresse Wi-Fi privée » sur ces appareils avant d’activer Instant Privacy.", + "privateMacLabel": "Privé", "disableInstantPrivacyTitle": "Désactiver Instant Privacy ?", "discards": "Rejets", "distribution": "Répartition", diff --git a/lib/l10n/app_fr_ca.arb b/lib/l10n/app_fr_ca.arb index 03f4afea5..53f1f9b98 100644 --- a/lib/l10n/app_fr_ca.arb +++ b/lib/l10n/app_fr_ca.arb @@ -557,6 +557,9 @@ "diagnosticsRecWeakWifiTitle": "Signal WiFi faible", "disable": "Désactiver", "disableInstantPrivacyDesc": "Tous les appareils pourront se connecter librement à votre réseau.", + "privateMacWarningTitle": "Certains appareils utilisent une adresse Wi-Fi privée", + "privateMacWarningDesc": "Les appareils ci-dessous utilisent une adresse Wi-Fi privée (aléatoire). Comme cette adresse change au fil du temps, ils risquent d’être bloqués après sa rotation — y compris celui que vous utilisez en ce moment. Pour rester connecté, désactivez l’option « Adresse Wi-Fi privée » sur ces appareils avant d’activer Instant-Confidentialité.", + "privateMacLabel": "Privé", "disableInstantPrivacyTitle": "Désactiver Instant-Confidentialité?", "discards": "Rejets", "distribution": "Répartition", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 1ad97080a..5a09a9d55 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -555,6 +555,9 @@ "diagnosticsRecWeakWifiTitle": "Sinyal WiFi Lemah", "disable": "Nonaktifkan", "disableInstantPrivacyDesc": "Semua perangkat akan dapat tersambung secara bebas ke jaringan Anda.", + "privateMacWarningTitle": "Beberapa perangkat menggunakan alamat Wi-Fi pribadi", + "privateMacWarningDesc": "Perangkat di bawah ini menggunakan alamat Wi-Fi pribadi (acak). Karena alamat ini berubah seiring waktu, perangkat tersebut mungkin diblokir setelah alamatnya berganti — bahkan perangkat yang sedang Anda gunakan sekarang. Agar tetap terhubung, nonaktifkan \"Alamat Wi-Fi Pribadi\" untuk perangkat ini sebelum mengaktifkan Privasi Instan.", + "privateMacLabel": "Pribadi", "disableInstantPrivacyTitle": "Nonaktifkan Privasi Instan?", "discards": "Pembuangan", "distribution": "Distribusi", diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index d95e26794..dca8eb47e 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -557,6 +557,9 @@ "diagnosticsRecWeakWifiTitle": "Segnale WiFi debole", "disable": "Disattiva", "disableInstantPrivacyDesc": "Tutti i dispositivi potranno connettersi liberamente alla tua rete.", + "privateMacWarningTitle": "Alcuni dispositivi usano un indirizzo Wi-Fi privato", + "privateMacWarningDesc": "I dispositivi elencati di seguito usano un indirizzo Wi-Fi privato (casuale). Poiché questo indirizzo cambia nel tempo, potrebbero essere bloccati dopo la sua rotazione — compreso quello che stai usando ora. Per restare connesso, disattiva l’\"Indirizzo Wi-Fi privato\" per questi dispositivi prima di attivare Instant Privacy.", + "privateMacLabel": "Privato", "disableInstantPrivacyTitle": "Disattivare Instant Privacy?", "discards": "Scarti", "distribution": "Distribuzione", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 48952628d..d45c01034 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -558,6 +558,9 @@ "diagnosticsRecWeakWifiTitle": "WiFi 信号が弱い", "disable": "無効にする", "disableInstantPrivacyDesc": "すべてのデバイスがネットワークに自由に接続できるようになります。", + "privateMacWarningTitle": "一部のデバイスはプライベート Wi-Fi アドレスを使用しています", + "privateMacWarningDesc": "以下のデバイスはプライベート(ランダム化された)Wi-Fi アドレスを使用しています。このアドレスは時間の経過とともに変化するため、切り替わった後にブロックされる可能性があります。現在使用しているデバイスも例外ではありません。接続を維持するには、Instant Privacy を有効にする前に、これらのデバイスの「プライベート Wi-Fi アドレス」をオフにしてください。", + "privateMacLabel": "プライベート", "disableInstantPrivacyTitle": "Instant Privacy を無効にしますか?", "discards": "破棄", "distribution": "分布", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index e7b369ac0..bc3afc327 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -555,6 +555,9 @@ "diagnosticsRecWeakWifiTitle": "약한 WiFi 신호", "disable": "비활성화", "disableInstantPrivacyDesc": "모든 장치가 네트워크에 자유롭게 연결할 수 있게 됩니다.", + "privateMacWarningTitle": "일부 기기가 비공개 Wi-Fi 주소를 사용합니다", + "privateMacWarningDesc": "아래 기기는 비공개(무작위) Wi-Fi 주소를 사용합니다. 이 주소는 시간이 지나면 변경되므로 주소가 바뀐 후에는 차단될 수 있으며, 지금 사용 중인 기기도 예외가 아닙니다. 계속 연결하려면 Instant Privacy를 활성화하기 전에 이 기기들의 “비공개 Wi-Fi 주소”를 꺼 주세요.", + "privateMacLabel": "비공개", "disableInstantPrivacyTitle": "Instant Privacy를 비활성화하시겠습니까?", "discards": "폐기", "distribution": "분포", diff --git a/lib/l10n/app_nb.arb b/lib/l10n/app_nb.arb index 9e5930ae3..898eb933d 100644 --- a/lib/l10n/app_nb.arb +++ b/lib/l10n/app_nb.arb @@ -557,6 +557,9 @@ "diagnosticsRecWeakWifiTitle": "Svakt WiFi-signal", "disable": "Deaktiver", "disableInstantPrivacyDesc": "Alle enheter vil kunne koble til nettverket ditt fritt.", + "privateMacWarningTitle": "Noen enheter bruker en privat Wi-Fi-adresse", + "privateMacWarningDesc": "Enhetene nedenfor bruker en privat (tilfeldig) Wi-Fi-adresse. Siden denne adressen endrer seg over tid, kan de bli blokkert etter at den roterer — også den du bruker akkurat nå. For å forbli tilkoblet må du slå av \"Privat Wi-Fi-adresse\" for disse enhetene før du aktiverer Instant Privacy.", + "privateMacLabel": "Privat", "disableInstantPrivacyTitle": "Deaktivere Instant Privacy?", "discards": "Forkastninger", "distribution": "Fordeling", diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 4af9d2be0..fb0846d67 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -557,6 +557,9 @@ "diagnosticsRecWeakWifiTitle": "Zwak WiFi-signaal", "disable": "Uitschakelen", "disableInstantPrivacyDesc": "Alle apparaten kunnen vrij verbinding maken met uw netwerk.", + "privateMacWarningTitle": "Sommige apparaten gebruiken een privé-wifi-adres", + "privateMacWarningDesc": "De onderstaande apparaten gebruiken een privé (willekeurig) wifi-adres. Omdat dit adres na verloop van tijd verandert, kunnen ze na een wisseling worden geblokkeerd — ook het apparaat dat u nu gebruikt. Schakel voor deze apparaten \"Privé-wifi-adres\" uit voordat u Instant Privacy inschakelt om verbonden te blijven.", + "privateMacLabel": "Privé", "disableInstantPrivacyTitle": "Instant Privacy uitschakelen?", "discards": "Verworpen", "distribution": "Verdeling", diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index fffafcce6..46f5a0dff 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -555,6 +555,9 @@ "diagnosticsRecWeakWifiTitle": "Słaby sygnał WiFi", "disable": "Wyłącz", "disableInstantPrivacyDesc": "Wszystkie urządzenia będą mogły swobodnie łączyć się z Twoją siecią.", + "privateMacWarningTitle": "Niektóre urządzenia używają prywatnego adresu Wi-Fi", + "privateMacWarningDesc": "Wymienione poniżej urządzenia używają prywatnego (losowego) adresu Wi-Fi. Ponieważ ten adres zmienia się z czasem, po jego zmianie mogą zostać zablokowane — nawet to, którego używasz teraz. Aby zachować połączenie, wyłącz opcję „Prywatny adres Wi-Fi” dla tych urządzeń przed włączeniem Instant Privacy.", + "privateMacLabel": "Prywatny", "disableInstantPrivacyTitle": "Wyłączyć Instant Privacy?", "discards": "Odrzucenia", "distribution": "Rozkład", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index d95771258..2192508ce 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -557,6 +557,9 @@ "diagnosticsRecWeakWifiTitle": "Sinal de WiFi fraco", "disable": "Desabilitar", "disableInstantPrivacyDesc": "Todos os dispositivos poderão se conectar livremente à sua rede.", + "privateMacWarningTitle": "Alguns dispositivos usam um endereço Wi-Fi privado", + "privateMacWarningDesc": "Os dispositivos listados abaixo usam um endereço Wi-Fi privado (aleatório). Como esse endereço muda com o tempo, eles podem ser bloqueados após a rotação — inclusive o que você está usando agora. Para continuar conectado, desative o \"Endereço Wi-Fi privado\" nesses dispositivos antes de ativar o Instant Privacy.", + "privateMacLabel": "Privado", "disableInstantPrivacyTitle": "Desativar o Instant Privacy?", "discards": "Descartes", "distribution": "Distribuição", diff --git a/lib/l10n/app_pt_pt.arb b/lib/l10n/app_pt_pt.arb index 937751d02..ce13a94b6 100644 --- a/lib/l10n/app_pt_pt.arb +++ b/lib/l10n/app_pt_pt.arb @@ -557,6 +557,9 @@ "diagnosticsRecWeakWifiTitle": "Sinal WiFi fraco", "disable": "Desativar", "disableInstantPrivacyDesc": "Todos os dispositivos poderão ligar-se livremente à sua rede.", + "privateMacWarningTitle": "Alguns dispositivos utilizam um endereço Wi-Fi privado", + "privateMacWarningDesc": "Os dispositivos indicados abaixo utilizam um endereço Wi-Fi privado (aleatório). Uma vez que este endereço muda ao longo do tempo, podem ser bloqueados após a rotação — incluindo aquele que está a utilizar agora. Para se manter ligado, desative o \"Endereço Wi-Fi privado\" nestes dispositivos antes de ativar a Privacidade Instantânea.", + "privateMacLabel": "Privado", "disableInstantPrivacyTitle": "Desativar Privacidade Instantânea?", "discards": "Descartes", "distribution": "Distribuição", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 66f263ee2..338f54929 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -555,6 +555,9 @@ "diagnosticsRecWeakWifiTitle": "Слабый сигнал WiFi", "disable": "Отключить", "disableInstantPrivacyDesc": "Все устройства смогут свободно подключаться к вашей сети.", + "privateMacWarningTitle": "Некоторые устройства используют частный адрес Wi-Fi", + "privateMacWarningDesc": "Устройства, перечисленные ниже, используют частный (случайный) адрес Wi-Fi. Поскольку этот адрес со временем меняется, после его смены они могут быть заблокированы — даже то, которым вы пользуетесь сейчас. Чтобы не потерять подключение, отключите «Частный адрес Wi-Fi» для этих устройств перед включением Instant Privacy.", + "privateMacLabel": "Частный", "disableInstantPrivacyTitle": "Отключить Instant Privacy?", "discards": "Отброшено", "distribution": "Распределение", diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index c87d3d0ee..4f7488fae 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -557,6 +557,9 @@ "diagnosticsRecWeakWifiTitle": "Svag WiFi-signal", "disable": "Inaktivera", "disableInstantPrivacyDesc": "Alla enheter kommer att kunna ansluta fritt till ditt nätverk.", + "privateMacWarningTitle": "Vissa enheter använder en privat Wi-Fi-adress", + "privateMacWarningDesc": "Enheterna nedan använder en privat (slumpmässig) Wi-Fi-adress. Eftersom den här adressen ändras med tiden kan de blockeras efter att den roterar — även den du använder just nu. Stäng av \"Privat Wi-Fi-adress\" för dessa enheter innan du aktiverar Instant Privacy för att förbli ansluten.", + "privateMacLabel": "Privat", "disableInstantPrivacyTitle": "Inaktivera Instant Privacy?", "discards": "Kasserade", "distribution": "Fördelning", diff --git a/lib/l10n/app_th.arb b/lib/l10n/app_th.arb index baf7684e5..3f9063360 100644 --- a/lib/l10n/app_th.arb +++ b/lib/l10n/app_th.arb @@ -555,6 +555,9 @@ "diagnosticsRecWeakWifiTitle": "สัญญาณ WiFi อ่อน", "disable": "ปิดใช้งาน", "disableInstantPrivacyDesc": "อุปกรณ์ทั้งหมดจะสามารถเชื่อมต่อกับเครือข่ายของคุณได้อย่างอิสระ", + "privateMacWarningTitle": "อุปกรณ์บางเครื่องใช้ที่อยู่ Wi-Fi ส่วนตัว", + "privateMacWarningDesc": "อุปกรณ์ด้านล่างนี้ใช้ที่อยู่ Wi-Fi ส่วนตัว (แบบสุ่ม) เนื่องจากที่อยู่นี้เปลี่ยนแปลงไปตามเวลา อุปกรณ์เหล่านี้อาจถูกบล็อกหลังจากที่อยู่เปลี่ยน — แม้แต่เครื่องที่คุณกำลังใช้อยู่ตอนนี้ เพื่อให้เชื่อมต่ออยู่เสมอ โปรดปิด \"ที่อยู่ Wi-Fi ส่วนตัว\" สำหรับอุปกรณ์เหล่านี้ก่อนเปิดใช้งาน Instant Privacy", + "privateMacLabel": "ส่วนตัว", "disableInstantPrivacyTitle": "ปิดใช้งาน Instant Privacy หรือไม่", "discards": "การละทิ้ง", "distribution": "การกระจาย", diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 7c70318fd..278c7c38a 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -555,6 +555,9 @@ "diagnosticsRecWeakWifiTitle": "Zayıf WiFi Sinyali", "disable": "Devre Dışı Bırak", "disableInstantPrivacyDesc": "Tüm cihazlar ağınıza serbestçe bağlanabilecek.", + "privateMacWarningTitle": "Bazı cihazlar özel bir Wi-Fi adresi kullanıyor", + "privateMacWarningDesc": "Aşağıdaki cihazlar özel (rastgele) bir Wi-Fi adresi kullanıyor. Bu adres zamanla değiştiğinden, adres değiştikten sonra engellenebilirler — şu anda kullandığınız cihaz da dahil. Bağlı kalmak için Anında Gizlilik’i etkinleştirmeden önce bu cihazlarda \"Özel Wi-Fi Adresi\" ayarını kapatın.", + "privateMacLabel": "Özel", "disableInstantPrivacyTitle": "Anında Gizlilik Devre Dışı Bırakılsın mı?", "discards": "Atılanlar", "distribution": "Dağılım", diff --git a/lib/l10n/app_vi.arb b/lib/l10n/app_vi.arb index 836b51331..7f4d4d858 100644 --- a/lib/l10n/app_vi.arb +++ b/lib/l10n/app_vi.arb @@ -555,6 +555,9 @@ "diagnosticsRecWeakWifiTitle": "Tín hiệu WiFi yếu", "disable": "Tắt", "disableInstantPrivacyDesc": "Mọi thiết bị sẽ có thể kết nối tự do với mạng của bạn.", + "privateMacWarningTitle": "Một số thiết bị sử dụng địa chỉ Wi-Fi riêng tư", + "privateMacWarningDesc": "Các thiết bị bên dưới sử dụng địa chỉ Wi-Fi riêng tư (ngẫu nhiên). Vì địa chỉ này thay đổi theo thời gian, chúng có thể bị chặn sau khi địa chỉ thay đổi — kể cả thiết bị bạn đang dùng ngay bây giờ. Để duy trì kết nối, hãy tắt \"Địa chỉ Wi-Fi riêng\" cho các thiết bị này trước khi bật Quyền riêng tư tức thì.", + "privateMacLabel": "Riêng tư", "disableInstantPrivacyTitle": "Tắt Quyền riêng tư tức thì?", "discards": "Loại bỏ", "distribution": "Phân bố", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index f8a5029e5..c42930d18 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -558,6 +558,9 @@ "diagnosticsRecWeakWifiTitle": "WiFi 信号弱", "disable": "禁用", "disableInstantPrivacyDesc": "所有设备都将能够自由连接到您的网络。", + "privateMacWarningTitle": "部分设备使用私有 Wi-Fi 地址", + "privateMacWarningDesc": "以下设备使用私有(随机)Wi-Fi 地址。由于该地址会随时间变化,轮换后这些设备可能会被屏蔽——即使是您现在正在使用的设备。为保持连接,请在启用即时隐私前,关闭这些设备的“私有 Wi-Fi 地址”。", + "privateMacLabel": "私有", "disableInstantPrivacyTitle": "禁用即时隐私?", "discards": "丢弃", "distribution": "分布", diff --git a/lib/l10n/app_zh_TW.arb b/lib/l10n/app_zh_TW.arb index f9f53f040..189d844a0 100644 --- a/lib/l10n/app_zh_TW.arb +++ b/lib/l10n/app_zh_TW.arb @@ -558,6 +558,9 @@ "diagnosticsRecWeakWifiTitle": "WiFi 訊號微弱", "disable": "停用", "disableInstantPrivacyDesc": "所有裝置都將能自由連線至您的網路。", + "privateMacWarningTitle": "部分裝置使用私密 Wi-Fi 位址", + "privateMacWarningDesc": "以下裝置使用私密(隨機)Wi-Fi 位址。由於該位址會隨時間變更,輪替後這些裝置可能會被封鎖——即使是您目前正在使用的裝置。為維持連線,請在啟用即時隱私前,關閉這些裝置的「私密 Wi-Fi 位址」。", + "privateMacLabel": "私密", "disableInstantPrivacyTitle": "停用即時隱私?", "discards": "捨棄", "distribution": "分布", diff --git a/lib/page/instant_privacy/models/instant_privacy_device_ui_model.dart b/lib/page/instant_privacy/models/instant_privacy_device_ui_model.dart index 513e2579a..67e3cba7a 100644 --- a/lib/page/instant_privacy/models/instant_privacy_device_ui_model.dart +++ b/lib/page/instant_privacy/models/instant_privacy_device_ui_model.dart @@ -12,11 +12,19 @@ class InstantPrivacyDeviceUIModel extends Equatable { /// Display name: hostname if available, otherwise falls back to [mac]. final String displayName; + /// Whether [mac] is a locally-administered (private/randomized) address. + /// + /// Devices using a private WiFi address rotate their MAC, so whitelisting + /// the current value risks locking the device out after it rotates. The UI + /// surfaces a warning for these before enabling the feature. + final bool isPrivateMac; + const InstantPrivacyDeviceUIModel({ required this.mac, required this.displayName, + this.isPrivateMac = false, }); @override - List get props => [mac, displayName]; + List get props => [mac, displayName, isPrivateMac]; } diff --git a/lib/page/instant_privacy/services/instant_privacy_service.dart b/lib/page/instant_privacy/services/instant_privacy_service.dart index 9a998f068..81ad6c18f 100644 --- a/lib/page/instant_privacy/services/instant_privacy_service.dart +++ b/lib/page/instant_privacy/services/instant_privacy_service.dart @@ -4,6 +4,7 @@ import 'package:privacy_gui/core/errors/service_error.dart'; import 'package:privacy_gui/core/usp/errors/usp_error.dart'; import 'package:privacy_gui/core/usp/providers/usp_client_provider.dart'; import 'package:privacy_gui/core/usp/services/usp_client.dart'; +import 'package:privacy_gui/core/utils/oui_lookup.dart'; import 'package:privacy_gui/generated/connected_devices.g.dart'; import 'package:privacy_gui/generated/mac_filter_access_points.g.dart'; import 'package:privacy_gui/page/instant_privacy/models/instant_privacy_device_ui_model.dart'; @@ -64,6 +65,7 @@ class UspInstantPrivacyService { return InstantPrivacyDeviceUIModel( mac: mac, displayName: d.hostName.isNotEmpty ? d.hostName : mac, + isPrivateMac: OuiLookup.isRandomizedMac(mac), ); }).toList(); } @@ -190,7 +192,11 @@ class UspInstantPrivacyService { // Allowed list shows all whitelisted MACs with hostname if known, else MAC final allowed = allowedDevices(macAps).map((d) { final name = hostnameByMac[d.mac] ?? d.mac; - return InstantPrivacyDeviceUIModel(mac: d.mac, displayName: name); + return InstantPrivacyDeviceUIModel( + mac: d.mac, + displayName: name, + isPrivateMac: OuiLookup.isRandomizedMac(d.mac), + ); }).toList(); return InstantPrivacyFetchResult( diff --git a/lib/page/instant_privacy/views/instant_privacy_view.dart b/lib/page/instant_privacy/views/instant_privacy_view.dart index b882b9742..29659701a 100644 --- a/lib/page/instant_privacy/views/instant_privacy_view.dart +++ b/lib/page/instant_privacy/views/instant_privacy_view.dart @@ -53,12 +53,20 @@ class InstantPrivacyView extends ConsumerWidget { WidgetRef ref, UspInstantPrivacyState state, ) { + final hasPrivateMacInList = state.isEnabled + ? state.allowedDevices.any((d) => d.isPrivateMac) + : state.connectedDevices.any((d) => d.isPrivateMac); + return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ AppText.bodyMedium( loc(context).instantPrivacyPageDesc, ), + if (hasPrivateMacInList) ...[ + AppGap.md(), + _buildPrivateMacWarningBanner(context), + ], AppGap.lg(), _buildToggleCard(context, ref, state), AppGap.md(), @@ -190,14 +198,23 @@ class InstantPrivacyView extends ConsumerWidget { Widget _buildDeviceLayoutBlock( BuildContext context, InstantPrivacyDeviceUIModel device) { + final colorScheme = Theme.of(context).colorScheme; return LayoutBlock( padding: const EdgeInsets.all(AppSpacing.md), child: Row( children: [ + if (device.isPrivateMac) ...[ + AppBadge( + label: loc(context).privateMacLabel, + color: colorScheme.error, + textColor: colorScheme.onError, + ), + AppGap.sm(), + ], AppIcon.font( Icons.devices, size: 20, - color: Theme.of(context).colorScheme.onSurfaceVariant, + color: colorScheme.onSurfaceVariant, ), AppGap.sm(), Expanded( @@ -207,7 +224,7 @@ class InstantPrivacyView extends ConsumerWidget { AppText.bodyMedium(device.displayName), AppText.bodySmall( device.mac, - color: Theme.of(context).colorScheme.onSurfaceVariant, + color: colorScheme.onSurfaceVariant, ), ], ), @@ -217,24 +234,86 @@ class InstantPrivacyView extends ConsumerWidget { ); } + // --------------------------------------------------------------------------- + // Private (randomized) MAC warning + // --------------------------------------------------------------------------- + + /// Banner shown on page when any device uses a private MAC. + Widget _buildPrivateMacWarningBanner(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + return Container( + padding: const EdgeInsets.all(AppSpacing.md), + decoration: BoxDecoration( + color: colorScheme.errorContainer, + borderRadius: BorderRadius.circular(AppSpacing.sm), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppIcon.font( + Icons.warning_amber_rounded, + size: 20, + color: colorScheme.onErrorContainer, + ), + AppGap.sm(), + Expanded( + child: AppText.bodySmall( + loc(context).privateMacWarningDesc, + color: colorScheme.onErrorContainer, + ), + ), + ], + ), + ); + } + + /// Inline warning shown in enable dialog (title only). + Widget _buildPrivateMacDialogWarning(BuildContext context) { + final colorScheme = Theme.of(context).colorScheme; + return Padding( + padding: const EdgeInsets.only(top: AppSpacing.md), + child: Row( + children: [ + AppIcon.font( + Icons.warning_amber_rounded, + size: 20, + color: colorScheme.error, + ), + AppGap.sm(), + Expanded( + child: AppText.labelMedium( + loc(context).privateMacWarningTitle, + color: colorScheme.error, + ), + ), + ], + ), + ); + } + // --------------------------------------------------------------------------- // Confirmation dialogs // --------------------------------------------------------------------------- Future _onEnable(BuildContext context, WidgetRef ref) async { + final connected = + ref.read(uspInstantPrivacyProvider).valueOrNull?.connectedDevices ?? + const []; + final privateMacDevices = connected.where((d) => d.isPrivateMac).toList(); final confirmed = await showAppDialog( context: context, builder: (ctx) => AppDialog( titleText: loc(context).enableInstantPrivacyTitle, - content: AppText.bodyMedium( - loc(context).enableInstantPrivacyDesc( - ref - .read(uspInstantPrivacyProvider) - .valueOrNull - ?.connectedDevices - .length ?? - 0, - ), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppText.bodyMedium( + loc(context).enableInstantPrivacyDesc(connected.length), + ), + if (privateMacDevices.isNotEmpty) + _buildPrivateMacDialogWarning(context), + ], ), actions: [ AppButton.text( diff --git a/test/page/instant_privacy/services/usp_instant_privacy_service_test.dart b/test/page/instant_privacy/services/usp_instant_privacy_service_test.dart index 4adc6fb6c..3e3bba84a 100644 --- a/test/page/instant_privacy/services/usp_instant_privacy_service_test.dart +++ b/test/page/instant_privacy/services/usp_instant_privacy_service_test.dart @@ -162,6 +162,28 @@ void main() { final result = service.activeDevices(ConnectedDevices(items: [])); expect(result, isEmpty); }); + + test('flags locally-administered (private) MAC as isPrivateMac', () { + // Second hex digit 2/6/A/E → U/L bit set → private/randomized MAC. + final data = ConnectedDevices(items: [ + _device(macAddress: '2E:52:AD:77:D0:F8'), + ]); + + final result = service.activeDevices(data); + + expect(result[0].isPrivateMac, isTrue); + }); + + test('does not flag a universally-administered (real) MAC', () { + // 74 → U/L bit clear → real hardware MAC. + final data = ConnectedDevices(items: [ + _device(macAddress: '74:12:13:21:56:3B'), + ]); + + final result = service.activeDevices(data); + + expect(result[0].isPrivateMac, isFalse); + }); }); // --------------------------------------------------------------------------- @@ -407,6 +429,24 @@ void main() { // FF:FF:FF:FF:FF:FF is not in connected devices → MAC address as display name expect(result.allowedDevices[0].displayName, 'FF:FF:FF:FF:FF:FF'); }); + + test('allowed devices have isPrivateMac flag set correctly', () async { + stubFetchAll(mockUsp, apResponse: { + 'Device.WiFi.AccessPoint.1.SSIDReference': 'Device.WiFi.SSID.1', + 'Device.WiFi.AccessPoint.1.MACAddressControlEnabled': true, + // 2E:... is locally-administered (private), 74:... is universal (real) + 'Device.WiFi.AccessPoint.1.AllowedMACAddress': + '2E:52:AD:77:D0:F8,74:12:13:21:56:3B', + }); + + final result = await service.fetchAll(); + + expect(result.allowedDevices, hasLength(2)); + expect(result.allowedDevices[0].mac, '2E:52:AD:77:D0:F8'); + expect(result.allowedDevices[0].isPrivateMac, isTrue); + expect(result.allowedDevices[1].mac, '74:12:13:21:56:3B'); + expect(result.allowedDevices[1].isPrivateMac, isFalse); + }); }); group('UspInstantPrivacyService — enable', () {