From c249cb75efa89efbf86ec012b7cfa50c695b3e31 Mon Sep 17 00:00:00 2001 From: Taksh Date: Fri, 31 Jul 2026 11:44:54 +0300 Subject: [PATCH 1/5] feat: extract MessageClipboard for plaintext and quote formatting Centralize pasteboard writes and composer quote blocks so message actions stay testable without SwiftUI. --- bitchat/Services/MessageClipboard.swift | 57 +++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 bitchat/Services/MessageClipboard.swift diff --git a/bitchat/Services/MessageClipboard.swift b/bitchat/Services/MessageClipboard.swift new file mode 100644 index 00000000..6582e32c --- /dev/null +++ b/bitchat/Services/MessageClipboard.swift @@ -0,0 +1,57 @@ +// +// MessageClipboard.swift +// bitchat +// +// This is free and unencumbered software released into the public domain. +// For more information, see +// + +import Foundation +#if os(iOS) +import UIKit +#elseif os(macOS) +import AppKit +#endif + +/// Clipboard helpers for message actions. Kept out of the view so unit tests +/// can assert quote formatting without standing up SwiftUI. +enum MessageClipboard { + /// Plain message body for the pasteboard. + static func copyPlaintext(_ content: String) { + #if os(iOS) + UIPasteboard.general.string = content + #elseif os(macOS) + let pasteboard = NSPasteboard.general + pasteboard.clearContents() + pasteboard.setString(content, forType: .string) + #endif + } + + /// Builds a composer-ready quote block (`> line` per line, trailing blank). + static func quoteForComposer(_ content: String, sender: String?) -> String { + let body = content.trimmingCharacters(in: .whitespacesAndNewlines) + guard !body.isEmpty else { return "" } + let header: String + if let sender, !sender.isEmpty, sender != "system" { + header = "> @\(sender):\n" + } else { + header = "" + } + let quoted = body + .split(separator: "\n", omittingEmptySubsequences: false) + .map { "> \($0)" } + .joined(separator: "\n") + return header + quoted + "\n\n" + } + + /// Appends a quote to an existing composer draft without wiping it. + static func appendQuote(to draft: String, content: String, sender: String?) -> String { + let quote = quoteForComposer(content, sender: sender) + guard !quote.isEmpty else { return draft } + if draft.isEmpty { return quote } + if draft.hasSuffix("\n") || draft.hasSuffix(" ") { + return draft + quote + } + return draft + "\n" + quote + } +} From 3152eeb13983ed93f4c94a6186fccf11206df103 Mon Sep 17 00:00:00 2001 From: Taksh Date: Fri, 31 Jul 2026 11:44:54 +0300 Subject: [PATCH 2/5] feat: add quote-in-composer beside copy on message context menu Keeps an existing draft and inserts a sender-attributed quote block so replies can reference nearby chat without retyping. --- bitchat/Views/MessageListView.swift | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/bitchat/Views/MessageListView.swift b/bitchat/Views/MessageListView.swift index 6e1c6b95..3226335c 100644 --- a/bitchat/Views/MessageListView.swift +++ b/bitchat/Views/MessageListView.swift @@ -143,13 +143,23 @@ struct MessageListView: View { } } Button("content.message.copy") { - #if os(iOS) - UIPasteboard.general.string = message.content - #else - let pb = NSPasteboard.general - pb.clearContents() - pb.setString(message.content, forType: .string) - #endif + MessageClipboard.copyPlaintext(message.content) + } + if !message.content.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty, + message.sender != "system" { + Button { + messageText = MessageClipboard.appendQuote( + to: messageText, + content: message.content, + sender: message.sender + ) + } label: { + Text(String( + localized: "content.message.quote", + defaultValue: "quote in composer", + comment: "Context menu action that inserts a quoted copy of the message into the composer draft" + )) + } } if isResendableFailedMessage(message) { Button("content.actions.resend") { From 6103e3f4e5a959b9e25609edacd2dbf25acaba96 Mon Sep 17 00:00:00 2001 From: Taksh Date: Fri, 31 Jul 2026 11:44:54 +0300 Subject: [PATCH 3/5] test: cover message quote formatting and draft append behavior Pinned multiline quotes, system-sender omission, and non-destructive append. --- .../Services/MessageClipboardTests.swift | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 bitchatTests/Services/MessageClipboardTests.swift diff --git a/bitchatTests/Services/MessageClipboardTests.swift b/bitchatTests/Services/MessageClipboardTests.swift new file mode 100644 index 00000000..da589bd9 --- /dev/null +++ b/bitchatTests/Services/MessageClipboardTests.swift @@ -0,0 +1,37 @@ +import Foundation +import Testing +@testable import bitchat + +struct MessageClipboardTests { + @Test func quoteWrapsEachLineAndAddsSender() { + let quoted = MessageClipboard.quoteForComposer("hello\nworld", sender: "alice") + #expect(quoted == "> @alice:\n> hello\n> world\n\n") + } + + @Test func quoteSkipsSystemSenderHeader() { + let quoted = MessageClipboard.quoteForComposer("joined", sender: "system") + #expect(quoted == "> joined\n\n") + } + + @Test func emptyContentYieldsEmptyQuote() { + #expect(MessageClipboard.quoteForComposer(" ", sender: "alice").isEmpty) + } + + @Test func appendQuotePreservesExistingDraft() { + let result = MessageClipboard.appendQuote( + to: "already typing", + content: "prior message", + sender: "bob" + ) + #expect(result == "already typing\n> @bob:\n> prior message\n\n") + } + + @Test func appendQuoteOntoEmptyDraft() { + let result = MessageClipboard.appendQuote( + to: "", + content: "solo", + sender: "carol" + ) + #expect(result == "> @carol:\n> solo\n\n") + } +} From 333746b08a01e7f52ca57242772092a4827552af Mon Sep 17 00:00:00 2001 From: Taksh Date: Fri, 31 Jul 2026 17:50:36 +0300 Subject: [PATCH 4/5] Address Jack review on quote-in-composer (#1570). Add content.message.quote to the 30-locale catalog; use a plain sender header (no @) so quotes do not re-ping; drop the shared draft when the composer target changes; and only skip the newline insert after a real trailing newline (not a trailing space). --- bitchat/Localizable.xcstrings | 1174 ++++++++++++++--- bitchat/Services/MessageClipboard.swift | 9 +- bitchat/Views/ContentView.swift | 5 + .../Services/MessageClipboardTests.swift | 15 +- 4 files changed, 1003 insertions(+), 200 deletions(-) diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index f869ab85..98da015a 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -2051,36 +2051,186 @@ "comment" : "System message shown in the affected chat when an explicit media delete or /clear was refused and bubbles/files were kept", "extractionState" : "manual", "localizations" : { - "ar" : { "stringUnit" : { "state" : "needs_review", "value" : "تعذّر حذف بعض الوسائط. جرّب حذف الوسائط الأقدم أولاً." } }, - "bn" : { "stringUnit" : { "state" : "needs_review", "value" : "কিছু মিডিয়া মুছে ফেলা যায়নি। আগে পুরোনো মিডিয়া মুছে ফেলার চেষ্টা করুন।" } }, - "de" : { "stringUnit" : { "state" : "needs_review", "value" : "einige medien konnten nicht gelöscht werden. versuche zuerst, ältere medien zu löschen." } }, - "en" : { "stringUnit" : { "state" : "translated", "value" : "some media could not be deleted. try deleting older media first." } }, - "es" : { "stringUnit" : { "state" : "needs_review", "value" : "no se pudieron eliminar algunos archivos multimedia. prueba a eliminar primero los más antiguos." } }, - "fa" : { "stringUnit" : { "state" : "needs_review", "value" : "برخی رسانه‌ها حذف نشدند. ابتدا رسانه‌های قدیمی‌تر را حذف کنید." } }, - "fil" : { "stringUnit" : { "state" : "needs_review", "value" : "hindi ma-delete ang ilang media. subukang i-delete muna ang mas lumang media." } }, - "fr" : { "stringUnit" : { "state" : "needs_review", "value" : "impossible de supprimer certains médias. essaie d'abord de supprimer les médias plus anciens." } }, - "he" : { "stringUnit" : { "state" : "needs_review", "value" : "לא ניתן למחוק חלק מהמדיה. נסה קודם למחוק מדיה ישנה יותר." } }, - "hi" : { "stringUnit" : { "state" : "needs_review", "value" : "कुछ मीडिया हटाई नहीं जा सकी। पहले पुरानी मीडिया हटाने का प्रयास करें।" } }, - "id" : { "stringUnit" : { "state" : "needs_review", "value" : "sebagian media tidak dapat dihapus. coba hapus media yang lebih lama dulu." } }, - "it" : { "stringUnit" : { "state" : "needs_review", "value" : "impossibile eliminare alcuni contenuti multimediali. prova prima a eliminare quelli più vecchi." } }, - "ja" : { "stringUnit" : { "state" : "needs_review", "value" : "一部のメディアを削除できませんでした。先に古いメディアを削除してみてください。" } }, - "ko" : { "stringUnit" : { "state" : "needs_review", "value" : "일부 미디어를 삭제하지 못했습니다. 먼저 오래된 미디어를 삭제해 보세요." } }, - "ms" : { "stringUnit" : { "state" : "needs_review", "value" : "sesetengah media tidak dapat dipadamkan. cuba padamkan media yang lebih lama dahulu." } }, - "ne" : { "stringUnit" : { "state" : "needs_review", "value" : "केही मिडिया मेटाउन सकिएन। पहिले पुराना मिडिया मेटाउने प्रयास गर।" } }, - "nl" : { "stringUnit" : { "state" : "needs_review", "value" : "sommige media konden niet worden verwijderd. probeer eerst oudere media te verwijderen." } }, - "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "nie udało się usunąć części multimediów. spróbuj najpierw usunąć starsze multimedia." } }, - "pt" : { "stringUnit" : { "state" : "needs_review", "value" : "não foi possível eliminar alguns ficheiros multimédia. tenta eliminar primeiro os mais antigos." } }, - "pt-BR" : { "stringUnit" : { "state" : "needs_review", "value" : "não foi possível excluir algumas mídias. tente excluir primeiro as mídias mais antigas." } }, - "ru" : { "stringUnit" : { "state" : "needs_review", "value" : "не удалось удалить часть медиафайлов. попробуй сначала удалить более старые." } }, - "sv" : { "stringUnit" : { "state" : "needs_review", "value" : "vissa medier kunde inte raderas. prova att radera äldre medier först." } }, - "ta" : { "stringUnit" : { "state" : "needs_review", "value" : "சில ஊடகங்களை நீக்க முடியவில்லை. முதலில் பழைய ஊடகங்களை நீக்க முயற்சிக்கவும்." } }, - "th" : { "stringUnit" : { "state" : "needs_review", "value" : "ไม่สามารถลบสื่อบางรายการได้ ลองลบสื่อที่เก่ากว่าก่อน" } }, - "tr" : { "stringUnit" : { "state" : "needs_review", "value" : "bazı medya silinemedi. önce daha eski medyayı silmeyi dene." } }, - "uk" : { "stringUnit" : { "state" : "needs_review", "value" : "не вдалося видалити частину медіафайлів. спробуй спочатку видалити старіші." } }, - "ur" : { "stringUnit" : { "state" : "needs_review", "value" : "کچھ میڈیا حذف نہیں ہو سکا۔ پہلے پرانا میڈیا حذف کرنے کی کوشش کریں۔" } }, - "vi" : { "stringUnit" : { "state" : "needs_review", "value" : "không thể xóa một số phương tiện. hãy thử xóa phương tiện cũ hơn trước." } }, - "zh-Hans" : { "stringUnit" : { "state" : "needs_review", "value" : "部分媒体无法删除。请先尝试删除较早的媒体。" } }, - "zh-Hant" : { "stringUnit" : { "state" : "needs_review", "value" : "部分媒體無法刪除。請先嘗試刪除較舊的媒體。" } } + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "تعذّر حذف بعض الوسائط. جرّب حذف الوسائط الأقدم أولاً." + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "কিছু মিডিয়া মুছে ফেলা যায়নি। আগে পুরোনো মিডিয়া মুছে ফেলার চেষ্টা করুন।" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "einige medien konnten nicht gelöscht werden. versuche zuerst, ältere medien zu löschen." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "some media could not be deleted. try deleting older media first." + } + }, + "es" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "no se pudieron eliminar algunos archivos multimedia. prueba a eliminar primero los más antiguos." + } + }, + "fa" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "برخی رسانه‌ها حذف نشدند. ابتدا رسانه‌های قدیمی‌تر را حذف کنید." + } + }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "hindi ma-delete ang ilang media. subukang i-delete muna ang mas lumang media." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossible de supprimer certains médias. essaie d'abord de supprimer les médias plus anciens." + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לא ניתן למחוק חלק מהמדיה. נסה קודם למחוק מדיה ישנה יותר." + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "कुछ मीडिया हटाई नहीं जा सकी। पहले पुरानी मीडिया हटाने का प्रयास करें।" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sebagian media tidak dapat dihapus. coba hapus media yang lebih lama dulu." + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "impossibile eliminare alcuni contenuti multimediali. prova prima a eliminare quelli più vecchi." + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "一部のメディアを削除できませんでした。先に古いメディアを削除してみてください。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "일부 미디어를 삭제하지 못했습니다. 먼저 오래된 미디어를 삭제해 보세요." + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sesetengah media tidak dapat dipadamkan. cuba padamkan media yang lebih lama dahulu." + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "केही मिडिया मेटाउन सकिएन। पहिले पुराना मिडिया मेटाउने प्रयास गर।" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "sommige media konden niet worden verwijderd. probeer eerst oudere media te verwijderen." + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "nie udało się usunąć części multimediów. spróbuj najpierw usunąć starsze multimedia." + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não foi possível eliminar alguns ficheiros multimédia. tenta eliminar primeiro os mais antigos." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "não foi possível excluir algumas mídias. tente excluir primeiro as mídias mais antigas." + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не удалось удалить часть медиафайлов. попробуй сначала удалить более старые." + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "vissa medier kunde inte raderas. prova att radera äldre medier först." + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "சில ஊடகங்களை நீக்க முடியவில்லை. முதலில் பழைய ஊடகங்களை நீக்க முயற்சிக்கவும்." + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ไม่สามารถลบสื่อบางรายการได้ ลองลบสื่อที่เก่ากว่าก่อน" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "bazı medya silinemedi. önce daha eski medyayı silmeyi dene." + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "не вдалося видалити частину медіафайлів. спробуй спочатку видалити старіші." + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "کچھ میڈیا حذف نہیں ہو سکا۔ پہلے پرانا میڈیا حذف کرنے کی کوشش کریں۔" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "không thể xóa một số phương tiện. hãy thử xóa phương tiện cũ hơn trước." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "部分媒体无法删除。请先尝试删除较早的媒体。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "部分媒體無法刪除。請先嘗試刪除較舊的媒體。" + } + } } }, "notification.action.wave" : { @@ -41254,6 +41404,191 @@ } } }, + "content.message.quote" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "اقتباس في المسودة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "কম্পোজারে উদ্ধৃতি" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "in entwurf zitieren" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "quote in composer" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "citar en el compositor" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "نقل‌قول در پیش‌نویس" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "quote sa composer" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "citer dans le compositeur" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ציטוט בטיוטה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "कंपोज़र में उद्धृत करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "kutip di composer" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "cita nel compositore" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "入力欄に引用" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "작성창에 인용" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "petik dalam composer" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "कम्पोजरमा उद्धरण" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "citeren in opsteller" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "cytuj w polu wpisu" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "citar no compositor" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "citar no compositor" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "цитировать в поле ввода" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "citera i skrivfältet" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "எழுதும் இடத்தில் மேற்கோள்" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "อ้างในช่องพิมพ์" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "yazma alanına alıntıla" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "цитувати у полі вводу" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "کمپوزر میں اقتباس" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "trích dẫn vào ô soạn" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "引用到输入框" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "引用到輸入框" + } + } + } + }, "content.message.show_less" : { "extractionState" : "manual", "localizations" : { @@ -76984,7 +77319,6 @@ } } }, - "verification.scan.paste_prompt" : { "extractionState" : "manual", "localizations" : { @@ -79213,108 +79547,558 @@ "comment" : "Explains that shared content replaces the named destination's composer and is not sent automatically", "extractionState" : "manual", "localizations" : { - "ar" : { "stringUnit" : { "state" : "needs_review", "value" : "هل تريد استبدال مسودة %@ بهذا المحتوى؟ لن يتم إرسال أي شيء تلقائيًا." } }, - "bn" : { "stringUnit" : { "state" : "needs_review", "value" : "%@-এর খসড়াটি এই কনটেন্ট দিয়ে বদলাবেন? কিছুই স্বয়ংক্রিয়ভাবে পাঠানো হবে না।" } }, - "de" : { "stringUnit" : { "state" : "needs_review", "value" : "Entwurf für %@ durch diesen Inhalt ersetzen? Es wird nichts automatisch gesendet." } }, - "en" : { "stringUnit" : { "state" : "translated", "value" : "Replace the draft for %@ with this content? Nothing will be sent automatically." } }, - "es" : { "stringUnit" : { "state" : "needs_review", "value" : "¿Reemplazar el borrador de %@ con este contenido? No se enviará nada automáticamente." } }, - "fa" : { "stringUnit" : { "state" : "needs_review", "value" : "پیش‌نویس %@ با این محتوا جایگزین شود؟ چیزی به‌طور خودکار ارسال نمی‌شود." } }, - "fil" : { "stringUnit" : { "state" : "needs_review", "value" : "Palitan ng content na ito ang draft para sa %@? Walang awtomatikong ipapadala." } }, - "fr" : { "stringUnit" : { "state" : "needs_review", "value" : "Remplacer le brouillon pour %@ par ce contenu ? Rien ne sera envoyé automatiquement." } }, - "he" : { "stringUnit" : { "state" : "needs_review", "value" : "להחליף את הטיוטה עבור %@ בתוכן הזה? שום דבר לא יישלח אוטומטית." } }, - "hi" : { "stringUnit" : { "state" : "needs_review", "value" : "%@ का ड्राफ़्ट इस सामग्री से बदलें? कुछ भी अपने आप नहीं भेजा जाएगा।" } }, - "id" : { "stringUnit" : { "state" : "needs_review", "value" : "Ganti draf untuk %@ dengan konten ini? Tidak ada yang akan dikirim otomatis." } }, - "it" : { "stringUnit" : { "state" : "needs_review", "value" : "Sostituire la bozza per %@ con questo contenuto? Nulla verrà inviato automaticamente." } }, - "ja" : { "stringUnit" : { "state" : "needs_review", "value" : "%@ の下書きをこの内容で置き換えますか?自動的には送信されません。" } }, - "ko" : { "stringUnit" : { "state" : "needs_review", "value" : "%@의 초안을 이 콘텐츠로 바꾸시겠습니까? 자동으로 전송되지 않습니다." } }, - "ms" : { "stringUnit" : { "state" : "needs_review", "value" : "Gantikan draf untuk %@ dengan kandungan ini? Tiada apa-apa akan dihantar secara automatik." } }, - "ne" : { "stringUnit" : { "state" : "needs_review", "value" : "%@ को मस्यौदा यो सामग्रीले बदल्ने? केही पनि स्वचालित रूपमा पठाइने छैन।" } }, - "nl" : { "stringUnit" : { "state" : "needs_review", "value" : "Concept voor %@ vervangen door deze inhoud? Er wordt niets automatisch verzonden." } }, - "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Zastąpić szkic dla %@ tą treścią? Nic nie zostanie wysłane automatycznie." } }, - "pt" : { "stringUnit" : { "state" : "needs_review", "value" : "Substituir o rascunho para %@ por este conteúdo? Nada será enviado automaticamente." } }, - "pt-BR" : { "stringUnit" : { "state" : "needs_review", "value" : "Substituir o rascunho de %@ por este conteúdo? Nada será enviado automaticamente." } }, - "ru" : { "stringUnit" : { "state" : "needs_review", "value" : "Заменить черновик для %@ этим содержимым? Ничего не будет отправлено автоматически." } }, - "sv" : { "stringUnit" : { "state" : "needs_review", "value" : "Ersätta utkastet för %@ med detta innehåll? Inget skickas automatiskt." } }, - "ta" : { "stringUnit" : { "state" : "needs_review", "value" : "%@ க்கான வரைவைக் இந்த உள்ளடக்கத்தால் மாற்றவா? எதுவும் தானாக அனுப்பப்படாது." } }, - "th" : { "stringUnit" : { "state" : "needs_review", "value" : "แทนที่ฉบับร่างสำหรับ %@ ด้วยเนื้อหานี้หรือไม่? จะไม่มีการส่งอัตโนมัติ" } }, - "tr" : { "stringUnit" : { "state" : "needs_review", "value" : "%@ taslağı bu içerikle değiştirilsin mi? Hiçbir şey otomatik olarak gönderilmez." } }, - "uk" : { "stringUnit" : { "state" : "needs_review", "value" : "Замінити чернетку для %@ цим вмістом? Нічого не буде надіслано автоматично." } }, - "ur" : { "stringUnit" : { "state" : "needs_review", "value" : "%@ کا مسودہ اس مواد سے بدلیں؟ کچھ بھی خودکار طور پر نہیں بھیجا جائے گا۔" } }, - "vi" : { "stringUnit" : { "state" : "needs_review", "value" : "Thay bản nháp cho %@ bằng nội dung này? Không có gì được tự động gửi." } }, - "zh-Hans" : { "stringUnit" : { "state" : "needs_review", "value" : "要用此内容替换 %@ 的草稿吗?内容不会自动发送。" } }, - "zh-Hant" : { "stringUnit" : { "state" : "needs_review", "value" : "要用此內容取代 %@ 的草稿嗎?內容不會自動傳送。" } } + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "هل تريد استبدال مسودة %@ بهذا المحتوى؟ لن يتم إرسال أي شيء تلقائيًا." + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@-এর খসড়াটি এই কনটেন্ট দিয়ে বদলাবেন? কিছুই স্বয়ংক্রিয়ভাবে পাঠানো হবে না।" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Entwurf für %@ durch diesen Inhalt ersetzen? Es wird nichts automatisch gesendet." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Replace the draft for %@ with this content? Nothing will be sent automatically." + } + }, + "es" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "¿Reemplazar el borrador de %@ con este contenido? No se enviará nada automáticamente." + } + }, + "fa" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "پیش‌نویس %@ با این محتوا جایگزین شود؟ چیزی به‌طور خودکار ارسال نمی‌شود." + } + }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Palitan ng content na ito ang draft para sa %@? Walang awtomatikong ipapadala." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Remplacer le brouillon pour %@ par ce contenu ? Rien ne sera envoyé automatiquement." + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "להחליף את הטיוטה עבור %@ בתוכן הזה? שום דבר לא יישלח אוטומטית." + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ का ड्राफ़्ट इस सामग्री से बदलें? कुछ भी अपने आप नहीं भेजा जाएगा।" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ganti draf untuk %@ dengan konten ini? Tidak ada yang akan dikirim otomatis." + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Sostituire la bozza per %@ con questo contenuto? Nulla verrà inviato automaticamente." + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ の下書きをこの内容で置き換えますか?自動的には送信されません。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@의 초안을 이 콘텐츠로 바꾸시겠습니까? 자동으로 전송되지 않습니다." + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Gantikan draf untuk %@ dengan kandungan ini? Tiada apa-apa akan dihantar secara automatik." + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ को मस्यौदा यो सामग्रीले बदल्ने? केही पनि स्वचालित रूपमा पठाइने छैन।" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Concept voor %@ vervangen door deze inhoud? Er wordt niets automatisch verzonden." + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Zastąpić szkic dla %@ tą treścią? Nic nie zostanie wysłane automatycznie." + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Substituir o rascunho para %@ por este conteúdo? Nada será enviado automaticamente." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Substituir o rascunho de %@ por este conteúdo? Nada será enviado automaticamente." + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Заменить черновик для %@ этим содержимым? Ничего не будет отправлено автоматически." + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ersätta utkastet för %@ med detta innehåll? Inget skickas automatiskt." + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ க்கான வரைவைக் இந்த உள்ளடக்கத்தால் மாற்றவா? எதுவும் தானாக அனுப்பப்படாது." + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "แทนที่ฉบับร่างสำหรับ %@ ด้วยเนื้อหานี้หรือไม่? จะไม่มีการส่งอัตโนมัติ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ taslağı bu içerikle değiştirilsin mi? Hiçbir şey otomatik olarak gönderilmez." + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Замінити чернетку для %@ цим вмістом? Нічого не буде надіслано автоматично." + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "%@ کا مسودہ اس مواد سے بدلیں؟ کچھ بھی خودکار طور پر نہیں بھیجا جائے گا۔" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Thay bản nháp cho %@ bằng nội dung này? Không có gì được tự động gửi." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "要用此内容替换 %@ 的草稿吗?内容不会自动发送。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "要用此內容取代 %@ 的草稿嗎?內容不會自動傳送。" + } + } } }, "share_import.review.title" : { "comment" : "Title for reviewing content received from the share extension", "extractionState" : "manual", "localizations" : { - "ar" : { "stringUnit" : { "state" : "needs_review", "value" : "مراجعة المحتوى المشترك" } }, - "bn" : { "stringUnit" : { "state" : "needs_review", "value" : "শেয়ার করা কনটেন্ট পর্যালোচনা করুন" } }, - "de" : { "stringUnit" : { "state" : "needs_review", "value" : "Geteilte Inhalte prüfen" } }, - "en" : { "stringUnit" : { "state" : "translated", "value" : "Review shared content" } }, - "es" : { "stringUnit" : { "state" : "needs_review", "value" : "Revisar contenido compartido" } }, - "fa" : { "stringUnit" : { "state" : "needs_review", "value" : "بازبینی محتوای هم‌رسانی‌شده" } }, - "fil" : { "stringUnit" : { "state" : "needs_review", "value" : "Suriin ang ibinahaging content" } }, - "fr" : { "stringUnit" : { "state" : "needs_review", "value" : "Vérifier le contenu partagé" } }, - "he" : { "stringUnit" : { "state" : "needs_review", "value" : "בדיקת תוכן משותף" } }, - "hi" : { "stringUnit" : { "state" : "needs_review", "value" : "शेयर की गई सामग्री की समीक्षा करें" } }, - "id" : { "stringUnit" : { "state" : "needs_review", "value" : "Tinjau konten yang dibagikan" } }, - "it" : { "stringUnit" : { "state" : "needs_review", "value" : "Controlla il contenuto condiviso" } }, - "ja" : { "stringUnit" : { "state" : "needs_review", "value" : "共有コンテンツを確認" } }, - "ko" : { "stringUnit" : { "state" : "needs_review", "value" : "공유 콘텐츠 검토" } }, - "ms" : { "stringUnit" : { "state" : "needs_review", "value" : "Semak kandungan yang dikongsi" } }, - "ne" : { "stringUnit" : { "state" : "needs_review", "value" : "साझा सामग्री समीक्षा गर्नुहोस्" } }, - "nl" : { "stringUnit" : { "state" : "needs_review", "value" : "Gedeelde inhoud bekijken" } }, - "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Sprawdź udostępnioną treść" } }, - "pt" : { "stringUnit" : { "state" : "needs_review", "value" : "Rever conteúdo partilhado" } }, - "pt-BR" : { "stringUnit" : { "state" : "needs_review", "value" : "Revisar conteúdo compartilhado" } }, - "ru" : { "stringUnit" : { "state" : "needs_review", "value" : "Проверить общий контент" } }, - "sv" : { "stringUnit" : { "state" : "needs_review", "value" : "Granska delat innehåll" } }, - "ta" : { "stringUnit" : { "state" : "needs_review", "value" : "பகிரப்பட்ட உள்ளடக்கத்தை மதிப்பாய்வு செய்" } }, - "th" : { "stringUnit" : { "state" : "needs_review", "value" : "ตรวจสอบเนื้อหาที่แชร์" } }, - "tr" : { "stringUnit" : { "state" : "needs_review", "value" : "Paylaşılan içeriği gözden geçir" } }, - "uk" : { "stringUnit" : { "state" : "needs_review", "value" : "Переглянути спільний вміст" } }, - "ur" : { "stringUnit" : { "state" : "needs_review", "value" : "شیئر کردہ مواد کا جائزہ لیں" } }, - "vi" : { "stringUnit" : { "state" : "needs_review", "value" : "Xem lại nội dung được chia sẻ" } }, - "zh-Hans" : { "stringUnit" : { "state" : "needs_review", "value" : "查看共享内容" } }, - "zh-Hant" : { "stringUnit" : { "state" : "needs_review", "value" : "查看分享內容" } } + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "مراجعة المحتوى المشترك" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "শেয়ার করা কনটেন্ট পর্যালোচনা করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Geteilte Inhalte prüfen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Review shared content" + } + }, + "es" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Revisar contenido compartido" + } + }, + "fa" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "بازبینی محتوای هم‌رسانی‌شده" + } + }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Suriin ang ibinahaging content" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Vérifier le contenu partagé" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "בדיקת תוכן משותף" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "शेयर की गई सामग्री की समीक्षा करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Tinjau konten yang dibagikan" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Controlla il contenuto condiviso" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "共有コンテンツを確認" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "공유 콘텐츠 검토" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Semak kandungan yang dikongsi" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "साझा सामग्री समीक्षा गर्नुहोस्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Gedeelde inhoud bekijken" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Sprawdź udostępnioną treść" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Rever conteúdo partilhado" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Revisar conteúdo compartilhado" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Проверить общий контент" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Granska delat innehåll" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "பகிரப்பட்ட உள்ளடக்கத்தை மதிப்பாய்வு செய்" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ตรวจสอบเนื้อหาที่แชร์" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Paylaşılan içeriği gözden geçir" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Переглянути спільний вміст" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "شیئر کردہ مواد کا جائزہ لیں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Xem lại nội dung được chia sẻ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "查看共享内容" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "查看分享內容" + } + } } }, "share_import.review.use_in_composer" : { "comment" : "Action that places reviewed shared content in the composer without sending it", "extractionState" : "manual", "localizations" : { - "ar" : { "stringUnit" : { "state" : "needs_review", "value" : "استخدام في مسودة الرسالة" } }, - "bn" : { "stringUnit" : { "state" : "needs_review", "value" : "বার্তার খসড়ায় ব্যবহার করুন" } }, - "de" : { "stringUnit" : { "state" : "needs_review", "value" : "Im Nachrichtenentwurf verwenden" } }, - "en" : { "stringUnit" : { "state" : "translated", "value" : "Use in composer" } }, - "es" : { "stringUnit" : { "state" : "needs_review", "value" : "Usar en el borrador" } }, - "fa" : { "stringUnit" : { "state" : "needs_review", "value" : "استفاده در پیش‌نویس پیام" } }, - "fil" : { "stringUnit" : { "state" : "needs_review", "value" : "Gamitin sa draft" } }, - "fr" : { "stringUnit" : { "state" : "needs_review", "value" : "Utiliser dans le brouillon" } }, - "he" : { "stringUnit" : { "state" : "needs_review", "value" : "שימוש בטיוטה" } }, - "hi" : { "stringUnit" : { "state" : "needs_review", "value" : "संदेश के ड्राफ़्ट में उपयोग करें" } }, - "id" : { "stringUnit" : { "state" : "needs_review", "value" : "Gunakan di draf" } }, - "it" : { "stringUnit" : { "state" : "needs_review", "value" : "Usa nella bozza" } }, - "ja" : { "stringUnit" : { "state" : "needs_review", "value" : "下書きで使用" } }, - "ko" : { "stringUnit" : { "state" : "needs_review", "value" : "초안에 사용" } }, - "ms" : { "stringUnit" : { "state" : "needs_review", "value" : "Gunakan dalam draf" } }, - "ne" : { "stringUnit" : { "state" : "needs_review", "value" : "सन्देशको मस्यौदामा प्रयोग गर्नुहोस्" } }, - "nl" : { "stringUnit" : { "state" : "needs_review", "value" : "In concept gebruiken" } }, - "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Użyj w szkicu" } }, - "pt" : { "stringUnit" : { "state" : "needs_review", "value" : "Usar no rascunho" } }, - "pt-BR" : { "stringUnit" : { "state" : "needs_review", "value" : "Usar no rascunho" } }, - "ru" : { "stringUnit" : { "state" : "needs_review", "value" : "Использовать в черновике" } }, - "sv" : { "stringUnit" : { "state" : "needs_review", "value" : "Använd i utkast" } }, - "ta" : { "stringUnit" : { "state" : "needs_review", "value" : "செய்தி வரைவில் பயன்படுத்து" } }, - "th" : { "stringUnit" : { "state" : "needs_review", "value" : "ใช้ในฉบับร่าง" } }, - "tr" : { "stringUnit" : { "state" : "needs_review", "value" : "Taslakta kullan" } }, - "uk" : { "stringUnit" : { "state" : "needs_review", "value" : "Використати в чернетці" } }, - "ur" : { "stringUnit" : { "state" : "needs_review", "value" : "پیغام کے مسودے میں استعمال کریں" } }, - "vi" : { "stringUnit" : { "state" : "needs_review", "value" : "Dùng trong bản nháp" } }, - "zh-Hans" : { "stringUnit" : { "state" : "needs_review", "value" : "用于草稿" } }, - "zh-Hant" : { "stringUnit" : { "state" : "needs_review", "value" : "用於草稿" } } + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "استخدام في مسودة الرسالة" + } + }, + "bn" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "বার্তার খসড়ায় ব্যবহার করুন" + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Im Nachrichtenentwurf verwenden" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Use in composer" + } + }, + "es" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Usar en el borrador" + } + }, + "fa" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "استفاده در پیش‌نویس پیام" + } + }, + "fil" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Gamitin sa draft" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Utiliser dans le brouillon" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "שימוש בטיוטה" + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "संदेश के ड्राफ़्ट में उपयोग करें" + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Gunakan di draf" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Usa nella bozza" + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "下書きで使用" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "초안에 사용" + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Gunakan dalam draf" + } + }, + "ne" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "सन्देशको मस्यौदामा प्रयोग गर्नुहोस्" + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "In concept gebruiken" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Użyj w szkicu" + } + }, + "pt" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Usar no rascunho" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Usar no rascunho" + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Использовать в черновике" + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Använd i utkast" + } + }, + "ta" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "செய்தி வரைவில் பயன்படுத்து" + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ใช้ในฉบับร่าง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Taslakta kullan" + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Використати в чернетці" + } + }, + "ur" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "پیغام کے مسودے میں استعمال کریں" + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Dùng trong bản nháp" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "用于草稿" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "用於草稿" + } + } } }, "location_channels.quick_join.title" : { @@ -79324,13 +80108,13 @@ "ar" : { "stringUnit" : { "state" : "translated", - "value" : "\u0627\u0646\u0636\u0645\u0627\u0645 \u0633\u0631\u064a\u0639" + "value" : "انضمام سريع" } }, "bn" : { "stringUnit" : { "state" : "translated", - "value" : "\u09a6\u09cd\u09b0\u09c1\u09a4 \u09af\u09cb\u0997" + "value" : "দ্রুত যোগ" } }, "de" : { @@ -79348,13 +80132,13 @@ "es" : { "stringUnit" : { "state" : "translated", - "value" : "acceso r\u00e1pido" + "value" : "acceso rápido" } }, "fa" : { "stringUnit" : { "state" : "translated", - "value" : "\u067e\u06cc\u0648\u0633\u062a\u0646 \u0633\u0631\u06cc\u0639" + "value" : "پیوستن سریع" } }, "fil" : { @@ -79366,19 +80150,19 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "acc\u00e8s rapide" + "value" : "accès rapide" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "\u05d4\u05e6\u05d8\u05e8\u05e4\u05d5\u05ea \u05de\u05d4\u05d9\u05e8\u05d4" + "value" : "הצטרפות מהירה" } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "\u091d\u091f\u092a\u091f \u091c\u0941\u0921\u093c\u0947\u0902" + "value" : "झटपट जुड़ें" } }, "id" : { @@ -79396,13 +80180,13 @@ "ja" : { "stringUnit" : { "state" : "translated", - "value" : "\u30af\u30a4\u30c3\u30af\u53c2\u52a0" + "value" : "クイック参加" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "\ube60\ub978 \ucc38\uc5ec" + "value" : "빠른 참여" } }, "ms" : { @@ -79414,7 +80198,7 @@ "ne" : { "stringUnit" : { "state" : "translated", - "value" : "\u091b\u093f\u091f\u094b \u0938\u093e\u092e\u0947\u0932" + "value" : "छिटो सामेल" } }, "nl" : { @@ -79426,25 +80210,25 @@ "pl" : { "stringUnit" : { "state" : "translated", - "value" : "szybkie do\u0142\u0105czenie" + "value" : "szybkie dołączenie" } }, "pt" : { "stringUnit" : { "state" : "translated", - "value" : "entrada r\u00e1pida" + "value" : "entrada rápida" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "entrada r\u00e1pida" + "value" : "entrada rápida" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "\u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0432\u0445\u043e\u0434" + "value" : "быстрый вход" } }, "sv" : { @@ -79456,31 +80240,31 @@ "ta" : { "stringUnit" : { "state" : "translated", - "value" : "\u0bb5\u0bbf\u0bb0\u0bc8\u0bb5\u0bc1 \u0b9a\u0bc7\u0bb0\u0bcd\u0b95\u0bcd\u0b95\u0bc8" + "value" : "விரைவு சேர்க்கை" } }, "th" : { "stringUnit" : { "state" : "translated", - "value" : "\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21\u0e14\u0e48\u0e27\u0e19" + "value" : "เข้าร่วมด่วน" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "h\u0131zl\u0131 kat\u0131l\u0131m" + "value" : "hızlı katılım" } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "\u0448\u0432\u0438\u0434\u043a\u0438\u0439 \u0432\u0445\u0456\u0434" + "value" : "швидкий вхід" } }, "ur" : { "stringUnit" : { "state" : "translated", - "value" : "\u0641\u0648\u0631\u06cc \u0634\u0645\u0648\u0644\u06cc\u062a" + "value" : "فوری شمولیت" } }, "vi" : { @@ -79492,13 +80276,13 @@ "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "\u5feb\u901f\u52a0\u5165" + "value" : "快速加入" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "\u5feb\u901f\u52a0\u5165" + "value" : "快速加入" } } } @@ -79510,181 +80294,181 @@ "ar" : { "stringUnit" : { "state" : "translated", - "value" : "\u0642\u0646\u0627\u0629 \u0627\u0644\u0645\u0646\u0637\u0642\u0629 \u0627\u0644\u062a\u064a \u064a\u062a\u062c\u0645\u0639 \u0641\u064a\u0647\u0627 \u0639\u0627\u062f\u0629\u064b \u0627\u0644\u0646\u0627\u0633 \u0645\u0646 %@ \u2014 \u0627\u0644\u062e\u0644\u064a\u0629 \u0627\u0644\u0648\u0627\u0633\u0639\u0629 \u062d\u0648\u0644 \u0623\u0643\u0628\u0631 \u0645\u0631\u0643\u0632 \u0633\u0643\u0627\u0646\u064a\u060c \u0648\u0644\u064a\u0633\u062a \u0645\u0648\u0642\u0639\u0643. \u0625\u0646\u0647\u0627 \u0639\u0627\u0645\u0629 \u0648\u0645\u0639\u0631\u0648\u0641\u0629 \u0644\u0644\u062c\u0645\u064a\u0639\u060c \u0641\u0627\u0641\u062a\u0631\u0636 \u0623\u0646\u0647\u0627 \u0645\u0631\u0627\u0642\u0628\u0629: \u0627\u0644\u0627\u0646\u0636\u0645\u0627\u0645 \u0627\u0644\u0633\u0631\u064a\u0639 \u064a\u0648\u0641\u0651\u0631 \u0639\u0644\u064a\u0643 \u0643\u062a\u0627\u0628\u0629 \u0627\u0644\u062c\u064a\u0648\u0647\u0627\u0634 \u0641\u0642\u0637\u061b \u0644\u0627 \u064a\u062e\u0641\u064a\u0643 \u0648\u0644\u0627 \u064a\u062a\u062c\u0627\u0648\u0632 \u0627\u0644\u062d\u062c\u0628." + "value" : "قناة المنطقة التي يتجمع فيها عادةً الناس من %@ — الخلية الواسعة حول أكبر مركز سكاني، وليست موقعك. إنها عامة ومعروفة للجميع، فافترض أنها مراقبة: الانضمام السريع يوفّر عليك كتابة الجيوهاش فقط؛ لا يخفيك ولا يتجاوز الحجب." } }, "bn" : { "stringUnit" : { "state" : "translated", - "value" : "\u09af\u09c7 \u0985\u099e\u09cd\u099a\u09b2-\u099a\u09cd\u09af\u09be\u09a8\u09c7\u09b2\u09c7 %@-\u098f\u09b0 \u09ae\u09be\u09a8\u09c1\u09b7 \u09b8\u09be\u09a7\u09be\u09b0\u09a3\u09a4 \u099c\u09a1\u09bc\u09cb \u09b9\u09af\u09bc \u2014 \u09b8\u09ac\u099a\u09c7\u09af\u09bc\u09c7 \u09ac\u09a1\u09bc \u099c\u09a8\u0995\u09c7\u09a8\u09cd\u09a6\u09cd\u09b0\u09c7\u09b0 \u099a\u09be\u09b0\u09aa\u09be\u09b6\u09c7\u09b0 \u09ac\u09bf\u09b8\u09cd\u09a4\u09c3\u09a4 \u09b8\u09c7\u09b2, \u0986\u09aa\u09a8\u09be\u09b0 \u0985\u09ac\u09b8\u09cd\u09a5\u09be\u09a8 \u09a8\u09af\u09bc\u0964 \u098f\u099f\u09bf \u09aa\u09cd\u09b0\u0995\u09be\u09b6\u09cd\u09af \u0993 \u09b8\u09c1\u09aa\u09b0\u09bf\u099a\u09bf\u09a4, \u09a4\u09be\u0987 \u09a7\u09b0\u09c7 \u09a8\u09bf\u09a8 \u098f\u099f\u09bf \u09a8\u099c\u09b0\u09a6\u09be\u09b0\u09bf\u09a4\u09c7 \u0986\u099b\u09c7: \u09a6\u09cd\u09b0\u09c1\u09a4 \u09af\u09cb\u0997 \u09b6\u09c1\u09a7\u09c1 \u099c\u09bf\u0993\u09b9\u09cd\u09af\u09be\u09b6 \u099f\u09be\u0987\u09aa \u0995\u09b0\u09be \u09ac\u09be\u0981\u099a\u09be\u09af\u09bc; \u098f\u099f\u09bf \u0986\u09aa\u09a8\u09be\u0995\u09c7 \u09b2\u09c1\u0995\u09be\u09af\u09bc \u09a8\u09be, \u09ac\u09cd\u09b2\u0995\u0993 \u098f\u09a1\u09bc\u09be\u09af\u09bc \u09a8\u09be\u0964" + "value" : "যে অঞ্চল-চ্যানেলে %@-এর মানুষ সাধারণত জড়ো হয় — সবচেয়ে বড় জনকেন্দ্রের চারপাশের বিস্তৃত সেল, আপনার অবস্থান নয়। এটি প্রকাশ্য ও সুপরিচিত, তাই ধরে নিন এটি নজরদারিতে আছে: দ্রুত যোগ শুধু জিওহ্যাশ টাইপ করা বাঁচায়; এটি আপনাকে লুকায় না, ব্লকও এড়ায় না।" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "der regionskanal, in dem sich leute aus %@ meist sammeln \u2014 die weite zelle um das gr\u00f6\u00dfte bev\u00f6lkerungszentrum, nicht dein standort. er ist \u00f6ffentlich und allgemein bekannt, geh also davon aus, dass er beobachtet wird: schnellbeitritt spart nur das eintippen des geohash; er versteckt dich nicht und umgeht keine sperren." + "value" : "der regionskanal, in dem sich leute aus %@ meist sammeln — die weite zelle um das größte bevölkerungszentrum, nicht dein standort. er ist öffentlich und allgemein bekannt, geh also davon aus, dass er beobachtet wird: schnellbeitritt spart nur das eintippen des geohash; er versteckt dich nicht und umgeht keine sperren." } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "the region channel where people from %@ tend to gather \u2014 the wide cell around the main population center, not your location. it's public and well-known, so assume it's watched: quick join saves typing a geohash; it doesn't hide you or bypass blocks." + "value" : "the region channel where people from %@ tend to gather — the wide cell around the main population center, not your location. it's public and well-known, so assume it's watched: quick join saves typing a geohash; it doesn't hide you or bypass blocks." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "el canal de regi\u00f3n donde suele reunirse la gente de %@ \u2014 la celda amplia alrededor del mayor centro de poblaci\u00f3n, no tu ubicaci\u00f3n. es p\u00fablico y conocido, as\u00ed que asume que est\u00e1 vigilado: el acceso r\u00e1pido solo te ahorra escribir el geohash; no te oculta ni evita bloqueos." + "value" : "el canal de región donde suele reunirse la gente de %@ — la celda amplia alrededor del mayor centro de población, no tu ubicación. es público y conocido, así que asume que está vigilado: el acceso rápido solo te ahorra escribir el geohash; no te oculta ni evita bloqueos." } }, "fa" : { "stringUnit" : { "state" : "translated", - "value" : "\u06a9\u0627\u0646\u0627\u0644 \u0645\u0646\u0637\u0642\u0647\u200c\u0627\u06cc \u06a9\u0647 \u0645\u0631\u062f\u0645 %@ \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u062f\u0631 \u0622\u0646 \u062c\u0645\u0639 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f \u2014 \u0633\u0644\u0648\u0644 \u067e\u0647\u0646\u0627\u0648\u0631 \u062f\u0648\u0631 \u0628\u0632\u0631\u06af\u200c\u062a\u0631\u06cc\u0646 \u0645\u0631\u06a9\u0632 \u062c\u0645\u0639\u06cc\u062a\u060c \u0646\u0647 \u0645\u0648\u0642\u0639\u06cc\u062a \u0634\u0645\u0627. \u0639\u0645\u0648\u0645\u06cc \u0648 \u0634\u0646\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u067e\u0633 \u0641\u0631\u0636 \u06a9\u0646\u06cc\u062f \u0632\u06cc\u0631 \u0646\u0638\u0631 \u0627\u0633\u062a: \u067e\u06cc\u0648\u0633\u062a\u0646 \u0633\u0631\u06cc\u0639 \u0641\u0642\u0637 \u062a\u0627\u06cc\u067e \u0698\u0626\u0648\u0647\u0634 \u0631\u0627 \u06a9\u0645 \u0645\u06cc\u200c\u06a9\u0646\u062f\u061b \u0634\u0645\u0627 \u0631\u0627 \u067e\u0646\u0647\u0627\u0646 \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0641\u06cc\u0644\u062a\u0631\u0647\u0627 \u0631\u0627 \u062f\u0648\u0631 \u0646\u0645\u06cc\u200c\u0632\u0646\u062f." + "value" : "کانال منطقه‌ای که مردم %@ معمولاً در آن جمع می‌شوند — سلول پهناور دور بزرگ‌ترین مرکز جمعیت، نه موقعیت شما. عمومی و شناخته‌شده است، پس فرض کنید زیر نظر است: پیوستن سریع فقط تایپ ژئوهش را کم می‌کند؛ شما را پنهان نمی‌کند و فیلترها را دور نمی‌زند." } }, "fil" : { "stringUnit" : { "state" : "translated", - "value" : "ang region channel kung saan karaniwang nagtitipon ang mga tao mula sa %@ \u2014 ang malawak na cell sa paligid ng pinakamalaking sentro ng populasyon, hindi ang iyong lokasyon. pampubliko ito at kilala, kaya ipagpalagay na binabantayan: ang mabilis na pagsali ay nagtitipid lang ng pag-type ng geohash; hindi ka nito itinatago at hindi nito nilalampasan ang mga block." + "value" : "ang region channel kung saan karaniwang nagtitipon ang mga tao mula sa %@ — ang malawak na cell sa paligid ng pinakamalaking sentro ng populasyon, hindi ang iyong lokasyon. pampubliko ito at kilala, kaya ipagpalagay na binabantayan: ang mabilis na pagsali ay nagtitipid lang ng pag-type ng geohash; hindi ka nito itinatago at hindi nito nilalampasan ang mga block." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "le canal de r\u00e9gion o\u00f9 les gens de %@ se retrouvent le plus souvent \u2014 la large cellule autour du principal centre de population, pas votre position. il est public et bien connu : partez du principe qu'il est surveill\u00e9. l'acc\u00e8s rapide \u00e9vite seulement de taper le geohash ; il ne vous cache pas et ne contourne aucun blocage." + "value" : "le canal de région où les gens de %@ se retrouvent le plus souvent — la large cellule autour du principal centre de population, pas votre position. il est public et bien connu : partez du principe qu'il est surveillé. l'accès rapide évite seulement de taper le geohash ; il ne vous cache pas et ne contourne aucun blocage." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "\u05e2\u05e8\u05d5\u05e5 \u05d4\u05d0\u05d6\u05d5\u05e8 \u05e9\u05d1\u05d5 \u05d0\u05e0\u05e9\u05d9\u05dd \u05de%@ \u05d1\u05d3\u05e8\u05da \u05db\u05dc\u05dc \u05de\u05ea\u05e7\u05d1\u05e6\u05d9\u05dd \u2014 \u05d4\u05ea\u05d0 \u05d4\u05e8\u05d7\u05d1 \u05e1\u05d1\u05d9\u05d1 \u05de\u05e8\u05db\u05d6 \u05d4\u05d0\u05d5\u05db\u05dc\u05d5\u05e1\u05d9\u05d9\u05d4 \u05d4\u05d2\u05d3\u05d5\u05dc \u05d1\u05d9\u05d5\u05ea\u05e8, \u05dc\u05d0 \u05d4\u05de\u05d9\u05e7\u05d5\u05dd \u05e9\u05dc\u05da. \u05d4\u05d5\u05d0 \u05e6\u05d9\u05d1\u05d5\u05e8\u05d9 \u05d5\u05de\u05d5\u05db\u05e8, \u05d0\u05d6 \u05d9\u05e9 \u05dc\u05d4\u05e0\u05d9\u05d7 \u05e9\u05d4\u05d5\u05d0 \u05de\u05e0\u05d5\u05d8\u05e8: \u05d4\u05e6\u05d8\u05e8\u05e4\u05d5\u05ea \u05de\u05d4\u05d9\u05e8\u05d4 \u05e8\u05e7 \u05d7\u05d5\u05e1\u05db\u05ea \u05d4\u05e7\u05dc\u05d3\u05ea geohash; \u05d4\u05d9\u05d0 \u05dc\u05d0 \u05de\u05e1\u05ea\u05d9\u05e8\u05d4 \u05d0\u05d5\u05ea\u05da \u05d5\u05dc\u05d0 \u05e2\u05d5\u05e7\u05e4\u05ea \u05d7\u05e1\u05d9\u05de\u05d5\u05ea." + "value" : "ערוץ האזור שבו אנשים מ%@ בדרך כלל מתקבצים — התא הרחב סביב מרכז האוכלוסייה הגדול ביותר, לא המיקום שלך. הוא ציבורי ומוכר, אז יש להניח שהוא מנוטר: הצטרפות מהירה רק חוסכת הקלדת geohash; היא לא מסתירה אותך ולא עוקפת חסימות." } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "\u0935\u0939 \u0915\u094d\u0937\u0947\u0924\u094d\u0930 \u091a\u0948\u0928\u0932 \u091c\u0939\u093e\u0901 %@ \u0915\u0947 \u0932\u094b\u0917 \u0906\u092e\u0924\u094c\u0930 \u092a\u0930 \u091c\u0941\u091f\u0924\u0947 \u0939\u0948\u0902 \u2014 \u0938\u092c\u0938\u0947 \u092c\u0921\u093c\u0947 \u0906\u092c\u093e\u0926\u0940 \u0915\u0947\u0902\u0926\u094d\u0930 \u0915\u0947 \u091a\u093e\u0930\u094b\u0902 \u0913\u0930 \u0915\u0940 \u091a\u094c\u0921\u093c\u0940 \u0938\u0947\u0932, \u0906\u092a\u0915\u0940 \u0932\u094b\u0915\u0947\u0936\u0928 \u0928\u0939\u0940\u0902\u0964 \u092f\u0939 \u0938\u093e\u0930\u094d\u0935\u091c\u0928\u093f\u0915 \u0914\u0930 \u091c\u093e\u0928\u093e-\u092a\u0939\u091a\u093e\u0928\u093e \u0939\u0948, \u0907\u0938\u0932\u093f\u090f \u092e\u093e\u0928 \u0932\u0947\u0902 \u0915\u093f \u0907\u0938 \u092a\u0930 \u0928\u091c\u093c\u0930 \u0939\u0948: \u091d\u091f\u092a\u091f \u091c\u0941\u0921\u093c\u0928\u093e \u0938\u093f\u0930\u094d\u092b\u093c geohash \u091f\u093e\u0907\u092a \u0915\u0930\u0928\u0947 \u0938\u0947 \u092c\u091a\u093e\u0924\u093e \u0939\u0948; \u092f\u0939 \u0906\u092a\u0915\u094b \u091b\u093f\u092a\u093e\u0924\u093e \u0928\u0939\u0940\u0902 \u0914\u0930 \u0928 \u0939\u0940 \u092c\u094d\u0932\u0949\u0915 \u0939\u091f\u093e\u0924\u093e \u0939\u0948\u0964" + "value" : "वह क्षेत्र चैनल जहाँ %@ के लोग आमतौर पर जुटते हैं — सबसे बड़े आबादी केंद्र के चारों ओर की चौड़ी सेल, आपकी लोकेशन नहीं। यह सार्वजनिक और जाना-पहचाना है, इसलिए मान लें कि इस पर नज़र है: झटपट जुड़ना सिर्फ़ geohash टाइप करने से बचाता है; यह आपको छिपाता नहीं और न ही ब्लॉक हटाता है।" } }, "id" : { "stringUnit" : { "state" : "translated", - "value" : "channel wilayah tempat orang-orang dari %@ biasanya berkumpul \u2014 sel luas di sekitar pusat populasi terbesar, bukan lokasimu. channel ini publik dan dikenal luas, jadi anggap saja dipantau: gabung cepat hanya menghemat pengetikan geohash; tidak menyembunyikanmu dan tidak menembus blokir." + "value" : "channel wilayah tempat orang-orang dari %@ biasanya berkumpul — sel luas di sekitar pusat populasi terbesar, bukan lokasimu. channel ini publik dan dikenal luas, jadi anggap saja dipantau: gabung cepat hanya menghemat pengetikan geohash; tidak menyembunyikanmu dan tidak menembus blokir." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "il canale di regione dove di solito si ritrovano le persone di %@ \u2014 la cella ampia attorno al principale centro abitato, non la tua posizione. \u00e8 pubblico e ben noto, quindi dai per scontato che sia sorvegliato: l'accesso rapido ti evita solo di digitare il geohash; non ti nasconde e non aggira i blocchi." + "value" : "il canale di regione dove di solito si ritrovano le persone di %@ — la cella ampia attorno al principale centro abitato, non la tua posizione. è pubblico e ben noto, quindi dai per scontato che sia sorvegliato: l'accesso rapido ti evita solo di digitare il geohash; non ti nasconde e non aggira i blocchi." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%@\u306e\u4eba\u3005\u304c\u96c6\u307e\u308a\u3084\u3059\u3044\u5730\u57df\u30c1\u30e3\u30f3\u30cd\u30eb \u2014 \u6700\u5927\u306e\u4eba\u53e3\u96c6\u4e2d\u5730\u3092\u56f2\u3080\u5e83\u3044\u30bb\u30eb\u3067\u3001\u3042\u306a\u305f\u306e\u4f4d\u7f6e\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u516c\u958b\u3055\u308c\u3066\u3044\u3066\u8ab0\u3082\u304c\u77e5\u308b\u5834\u6240\u306a\u306e\u3067\u3001\u76e3\u8996\u3055\u308c\u3066\u3044\u308b\u524d\u63d0\u3067\u3002\u30af\u30a4\u30c3\u30af\u53c2\u52a0\u306f\u30b8\u30aa\u30cf\u30c3\u30b7\u30e5\u5165\u529b\u3092\u7701\u304f\u3060\u3051\u3067\u3001\u3042\u306a\u305f\u3092\u96a0\u3057\u305f\u308a\u30d6\u30ed\u30c3\u30af\u3092\u56de\u907f\u3057\u305f\u308a\u306f\u3057\u307e\u305b\u3093\u3002" + "value" : "%@の人々が集まりやすい地域チャンネル — 最大の人口集中地を囲む広いセルで、あなたの位置ではありません。公開されていて誰もが知る場所なので、監視されている前提で。クイック参加はジオハッシュ入力を省くだけで、あなたを隠したりブロックを回避したりはしません。" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "%@ \uc0ac\ub78c\ub4e4\uc774 \uc8fc\ub85c \ubaa8\uc774\ub294 \uc9c0\uc5ed \ucc44\ub110 \u2014 \ucd5c\ub300 \uc778\uad6c \ubc00\uc9d1\uc9c0 \uc8fc\ubcc0\uc758 \ub113\uc740 \uc140\uc774\uba70, \ub2f9\uc2e0\uc758 \uc704\uce58\uac00 \uc544\ub2d9\ub2c8\ub2e4. \uacf5\uac1c\ub418\uc5b4 \uc788\uace0 \ub110\ub9ac \uc54c\ub824\uc838 \uc788\uc73c\ub2c8 \uac10\uc2dc\ub41c\ub2e4\uace0 \uac00\uc815\ud558\uc138\uc694: \ube60\ub978 \ucc38\uc5ec\ub294 \uc9c0\uc624\ud574\uc2dc \uc785\ub825\ub9cc \uc904\uc5ec\uc904 \ubfd0, \ub2f9\uc2e0\uc744 \uc228\uae30\uac70\ub098 \ucc28\ub2e8\uc744 \uc6b0\ud68c\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4." + "value" : "%@ 사람들이 주로 모이는 지역 채널 — 최대 인구 밀집지 주변의 넓은 셀이며, 당신의 위치가 아닙니다. 공개되어 있고 널리 알려져 있으니 감시된다고 가정하세요: 빠른 참여는 지오해시 입력만 줄여줄 뿐, 당신을 숨기거나 차단을 우회하지 않습니다." } }, "ms" : { "stringUnit" : { "state" : "translated", - "value" : "saluran wilayah tempat orang dari %@ biasanya berkumpul \u2014 sel luas di sekitar pusat penduduk terbesar, bukan lokasi anda. ia terbuka dan dikenali ramai, jadi anggap ia dipantau: sertai pantas cuma menjimatkan menaip geohash; ia tidak menyembunyikan anda dan tidak memintas sekatan." + "value" : "saluran wilayah tempat orang dari %@ biasanya berkumpul — sel luas di sekitar pusat penduduk terbesar, bukan lokasi anda. ia terbuka dan dikenali ramai, jadi anggap ia dipantau: sertai pantas cuma menjimatkan menaip geohash; ia tidak menyembunyikan anda dan tidak memintas sekatan." } }, "ne" : { "stringUnit" : { "state" : "translated", - "value" : "%@ \u0915\u093e \u092e\u093e\u0928\u093f\u0938\u0939\u0930\u0942 \u092a\u094d\u0930\u093e\u092f\u0903 \u092d\u0947\u0932\u093e \u0939\u0941\u0928\u0947 \u0915\u094d\u0937\u0947\u0924\u094d\u0930 \u091a\u094d\u092f\u093e\u0928\u0932 \u2014 \u0938\u092c\u0948\u092d\u0928\u094d\u0926\u093e \u0920\u0942\u0932\u094b \u091c\u0928\u0938\u0902\u0916\u094d\u092f\u093e \u0915\u0947\u0928\u094d\u0926\u094d\u0930 \u0935\u0930\u093f\u092a\u0930\u093f\u0915\u094b \u092b\u0930\u093e\u0915\u093f\u0932\u094b \u0938\u0947\u0932, \u0924\u092a\u093e\u0908\u0902\u0915\u094b \u0938\u094d\u0925\u093e\u0928 \u0939\u094b\u0907\u0928\u0964 \u092f\u094b \u0938\u093e\u0930\u094d\u0935\u091c\u0928\u093f\u0915 \u0930 \u0938\u092c\u0948\u0932\u093e\u0908 \u0925\u093e\u0939\u093e \u092d\u090f\u0915\u094b \u0939\u0941\u0928\u093e\u0932\u0947 \u0928\u093f\u0917\u0930\u093e\u0928\u0940\u092e\u093e \u091b \u092d\u0928\u0940 \u092e\u093e\u0928\u094d\u0928\u0941\u0939\u094b\u0938\u094d: \u091b\u093f\u091f\u094b \u0938\u093e\u092e\u0947\u0932\u0932\u0947 geohash \u091f\u093e\u0907\u092a \u0917\u0930\u094d\u0928\u092c\u093e\u091f \u092e\u093e\u0924\u094d\u0930 \u091c\u094b\u0917\u093e\u0909\u0901\u091b; \u092f\u0938\u0932\u0947 \u0924\u092a\u093e\u0908\u0902\u0932\u093e\u0908 \u0932\u0941\u0915\u093e\u0909\u0901\u0926\u0948\u0928 \u0930 \u092c\u094d\u0932\u0915 \u091b\u0932\u094d\u0926\u0948\u0928\u0964" + "value" : "%@ का मानिसहरू प्रायः भेला हुने क्षेत्र च्यानल — सबैभन्दा ठूलो जनसंख्या केन्द्र वरिपरिको फराकिलो सेल, तपाईंको स्थान होइन। यो सार्वजनिक र सबैलाई थाहा भएको हुनाले निगरानीमा छ भनी मान्नुहोस्: छिटो सामेलले geohash टाइप गर्नबाट मात्र जोगाउँछ; यसले तपाईंलाई लुकाउँदैन र ब्लक छल्दैन।" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "het regiokanaal waar mensen uit %@ meestal samenkomen \u2014 de brede cel rond het grootste bevolkingscentrum, niet jouw locatie. het is openbaar en algemeen bekend, ga er dus van uit dat er wordt meegekeken: snel deelnemen bespaart alleen het intypen van de geohash; het verbergt je niet en omzeilt geen blokkades." + "value" : "het regiokanaal waar mensen uit %@ meestal samenkomen — de brede cel rond het grootste bevolkingscentrum, niet jouw locatie. het is openbaar en algemeen bekend, ga er dus van uit dat er wordt meegekeken: snel deelnemen bespaart alleen het intypen van de geohash; het verbergt je niet en omzeilt geen blokkades." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "kana\u0142 regionu, w kt\u00f3rym zwykle zbieraj\u0105 si\u0119 ludzie z %@ \u2014 szeroka kom\u00f3rka wok\u00f3\u0142 najwi\u0119kszego skupiska ludno\u015bci, nie twoja lokalizacja. jest publiczny i powszechnie znany, wi\u0119c za\u0142\u00f3\u017c, \u017ce jest obserwowany: szybkie do\u0142\u0105czenie oszcz\u0119dza tylko wpisywania geohasha; nie ukrywa ci\u0119 i nie omija blokad." + "value" : "kanał regionu, w którym zwykle zbierają się ludzie z %@ — szeroka komórka wokół największego skupiska ludności, nie twoja lokalizacja. jest publiczny i powszechnie znany, więc załóż, że jest obserwowany: szybkie dołączenie oszczędza tylko wpisywania geohasha; nie ukrywa cię i nie omija blokad." } }, "pt" : { "stringUnit" : { "state" : "translated", - "value" : "o canal de regi\u00e3o onde as pessoas de %@ costumam reunir-se \u2014 a c\u00e9lula ampla em torno do maior centro populacional, n\u00e3o a sua localiza\u00e7\u00e3o. \u00e9 p\u00fablico e conhecido, por isso presuma que est\u00e1 vigiado: a entrada r\u00e1pida apenas evita escrever o geohash; n\u00e3o o esconde nem contorna bloqueios." + "value" : "o canal de região onde as pessoas de %@ costumam reunir-se — a célula ampla em torno do maior centro populacional, não a sua localização. é público e conhecido, por isso presuma que está vigiado: a entrada rápida apenas evita escrever o geohash; não o esconde nem contorna bloqueios." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "o canal de regi\u00e3o onde as pessoas de %@ costumam se reunir \u2014 a c\u00e9lula ampla em torno do maior centro populacional, n\u00e3o a sua localiza\u00e7\u00e3o. \u00e9 p\u00fablico e conhecido, ent\u00e3o presuma que est\u00e1 vigiado: a entrada r\u00e1pida s\u00f3 poupa digitar o geohash; n\u00e3o esconde voc\u00ea nem contorna bloqueios." + "value" : "o canal de região onde as pessoas de %@ costumam se reunir — a célula ampla em torno do maior centro populacional, não a sua localização. é público e conhecido, então presuma que está vigiado: a entrada rápida só poupa digitar o geohash; não esconde você nem contorna bloqueios." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "\u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b, \u0433\u0434\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043b\u044e\u0434\u0438 \u0438\u0437 %@ \u2014 \u0448\u0438\u0440\u043e\u043a\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f, \u0430 \u043d\u0435 \u0432\u0430\u0448\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u043e\u043d \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438 \u0432\u0441\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0447\u0438\u0442\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u0437\u0430 \u043d\u0438\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u044e\u0442: \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0432\u0445\u043e\u0434 \u043b\u0438\u0448\u044c \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442 \u0432\u0432\u043e\u0434\u0430 \u0433\u0435\u043e\u0445\u044d\u0448\u0430; \u043e\u043d \u043d\u0435 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0430\u0441 \u0438 \u043d\u0435 \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438." + "value" : "региональный канал, где обычно собираются люди из %@ — широкая ячейка вокруг крупнейшего центра населения, а не ваше местоположение. он публичный и всем известный, поэтому считайте, что за ним наблюдают: быстрый вход лишь избавляет от ввода геохэша; он не скрывает вас и не обходит блокировки." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "regionkanalen d\u00e4r folk fr\u00e5n %@ oftast samlas \u2014 den vida cellen kring det st\u00f6rsta befolkningscentrumet, inte din plats. den \u00e4r offentlig och v\u00e4lk\u00e4nd, s\u00e5 utg\u00e5 fr\u00e5n att den bevakas: snabbanslutning sparar bara geohash-skrivandet; den d\u00f6ljer dig inte och kringg\u00e5r inga blockeringar." + "value" : "regionkanalen där folk från %@ oftast samlas — den vida cellen kring det största befolkningscentrumet, inte din plats. den är offentlig och välkänd, så utgå från att den bevakas: snabbanslutning sparar bara geohash-skrivandet; den döljer dig inte och kringgår inga blockeringar." } }, "ta" : { "stringUnit" : { "state" : "translated", - "value" : "%@ \u0bae\u0b95\u0bcd\u0b95\u0bb3\u0bcd \u0baa\u0bca\u0ba4\u0bc1\u0bb5\u0bbe\u0b95\u0b95\u0bcd \u0b95\u0bc2\u0b9f\u0bc1\u0bae\u0bcd \u0bae\u0ba3\u0bcd\u0b9f\u0bb2 \u0b9a\u0bc7\u0ba9\u0bb2\u0bcd \u2014 \u0bae\u0bbf\u0b95\u0baa\u0bcd\u0baa\u0bc6\u0bb0\u0bbf\u0baf \u0bae\u0b95\u0bcd\u0b95\u0bb3\u0bcd\u0ba4\u0bca\u0b95\u0bc8 \u0bae\u0bc8\u0baf\u0ba4\u0bcd\u0ba4\u0bc8\u0b9a\u0bcd \u0b9a\u0bc1\u0bb1\u0bcd\u0bb1\u0bbf\u0baf\u0bc1\u0bb3\u0bcd\u0bb3 \u0b85\u0b95\u0ba9\u0bcd\u0bb1 \u0b9a\u0bc6\u0bb2\u0bcd, \u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b87\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0b9f\u0bae\u0bcd \u0b85\u0bb2\u0bcd\u0bb2. \u0b87\u0ba4\u0bc1 \u0baa\u0bca\u0ba4\u0bc1\u0bb5\u0bbe\u0ba9\u0ba4\u0bc1, \u0ba8\u0ba9\u0bcd\u0b95\u0bc1 \u0b85\u0bb1\u0bbf\u0baf\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1; \u0b8e\u0ba9\u0bb5\u0bc7 \u0b95\u0ba3\u0bcd\u0b95\u0bbe\u0ba3\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1 \u0b8e\u0ba9\u0bcd\u0bb1\u0bc7 \u0b95\u0bb0\u0bc1\u0ba4\u0bc1\u0b99\u0bcd\u0b95\u0bb3\u0bcd: \u0bb5\u0bbf\u0bb0\u0bc8\u0bb5\u0bc1 \u0b9a\u0bc7\u0bb0\u0bcd\u0b95\u0bcd\u0b95\u0bc8 geohash \u0ba4\u0b9f\u0bcd\u0b9f\u0b9a\u0bcd\u0b9a\u0bc8 \u0bae\u0b9f\u0bcd\u0b9f\u0bc1\u0bae\u0bc7 \u0ba4\u0bb5\u0bbf\u0bb0\u0bcd\u0b95\u0bcd\u0b95\u0bbf\u0bb1\u0ba4\u0bc1; \u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bc8 \u0bae\u0bb1\u0bc8\u0b95\u0bcd\u0b95\u0bbe\u0ba4\u0bc1, \u0ba4\u0b9f\u0bc8\u0b95\u0bb3\u0bc8\u0baf\u0bc1\u0bae\u0bcd \u0ba4\u0bbe\u0ba3\u0bcd\u0b9f\u0bbe\u0ba4\u0bc1." + "value" : "%@ மக்கள் பொதுவாகக் கூடும் மண்டல சேனல் — மிகப்பெரிய மக்கள்தொகை மையத்தைச் சுற்றியுள்ள அகன்ற செல், உங்கள் இருப்பிடம் அல்ல. இது பொதுவானது, நன்கு அறியப்பட்டது; எனவே கண்காணிக்கப்படுகிறது என்றே கருதுங்கள்: விரைவு சேர்க்கை geohash தட்டச்சை மட்டுமே தவிர்க்கிறது; உங்களை மறைக்காது, தடைகளையும் தாண்டாது." } }, "th" : { "stringUnit" : { "state" : "translated", - "value" : "\u0e41\u0e0a\u0e19\u0e41\u0e19\u0e25\u0e20\u0e39\u0e21\u0e34\u0e20\u0e32\u0e04\u0e17\u0e35\u0e48\u0e1c\u0e39\u0e49\u0e04\u0e19\u0e08\u0e32\u0e01 %@ \u0e21\u0e31\u0e01\u0e21\u0e32\u0e23\u0e27\u0e21\u0e01\u0e31\u0e19 \u2014 \u0e40\u0e0b\u0e25\u0e25\u0e4c\u0e01\u0e27\u0e49\u0e32\u0e07\u0e23\u0e2d\u0e1a\u0e28\u0e39\u0e19\u0e22\u0e4c\u0e01\u0e25\u0e32\u0e07\u0e1b\u0e23\u0e30\u0e0a\u0e32\u0e01\u0e23\u0e17\u0e35\u0e48\u0e43\u0e2b\u0e0d\u0e48\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14 \u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e15\u0e33\u0e41\u0e2b\u0e19\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 \u0e21\u0e31\u0e19\u0e40\u0e1b\u0e34\u0e14\u0e2a\u0e32\u0e18\u0e32\u0e23\u0e13\u0e30\u0e41\u0e25\u0e30\u0e40\u0e1b\u0e47\u0e19\u0e17\u0e35\u0e48\u0e23\u0e39\u0e49\u0e08\u0e31\u0e01 \u0e43\u0e2b\u0e49\u0e16\u0e37\u0e2d\u0e27\u0e48\u0e32\u0e16\u0e39\u0e01\u0e08\u0e31\u0e1a\u0e15\u0e32\u0e21\u0e2d\u0e07: \u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21\u0e14\u0e48\u0e27\u0e19\u0e41\u0e04\u0e48\u0e0a\u0e48\u0e27\u0e22\u0e43\u0e2b\u0e49\u0e44\u0e21\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e1e\u0e34\u0e21\u0e1e\u0e4c geohash \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e0b\u0e48\u0e2d\u0e19\u0e15\u0e31\u0e27\u0e04\u0e38\u0e13\u0e41\u0e25\u0e30\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e02\u0e49\u0e32\u0e21\u0e01\u0e32\u0e23\u0e1a\u0e25\u0e47\u0e2d\u0e01" + "value" : "แชนแนลภูมิภาคที่ผู้คนจาก %@ มักมารวมกัน — เซลล์กว้างรอบศูนย์กลางประชากรที่ใหญ่ที่สุด ไม่ใช่ตำแหน่งของคุณ มันเปิดสาธารณะและเป็นที่รู้จัก ให้ถือว่าถูกจับตามอง: เข้าร่วมด่วนแค่ช่วยให้ไม่ต้องพิมพ์ geohash ไม่ได้ซ่อนตัวคุณและไม่ได้ข้ามการบล็อก" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ insanlar\u0131n\u0131n genellikle topland\u0131\u011f\u0131 b\u00f6lge kanal\u0131 \u2014 en b\u00fcy\u00fck n\u00fcfus merkezinin \u00e7evresindeki geni\u015f h\u00fccre, sizin konumunuz de\u011fil. herkese a\u00e7\u0131k ve iyi bilinir, bu y\u00fczden izlendi\u011fini varsay\u0131n: h\u0131zl\u0131 kat\u0131l\u0131m yaln\u0131zca geohash yazmaktan kurtar\u0131r; sizi gizlemez ve engelleri a\u015fmaz." + "value" : "%@ insanlarının genellikle toplandığı bölge kanalı — en büyük nüfus merkezinin çevresindeki geniş hücre, sizin konumunuz değil. herkese açık ve iyi bilinir, bu yüzden izlendiğini varsayın: hızlı katılım yalnızca geohash yazmaktan kurtarır; sizi gizlemez ve engelleri aşmaz." } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "\u0440\u0435\u0433\u0456\u043e\u043d\u0430\u043b\u044c\u043d\u0438\u0439 \u043a\u0430\u043d\u0430\u043b, \u0434\u0435 \u0437\u0430\u0437\u0432\u0438\u0447\u0430\u0439 \u0437\u0431\u0438\u0440\u0430\u044e\u0442\u044c\u0441\u044f \u043b\u044e\u0434\u0438 \u0437 %@ \u2014 \u0448\u0438\u0440\u043e\u043a\u0430 \u043a\u043e\u043c\u0456\u0440\u043a\u0430 \u043d\u0430\u0432\u043a\u043e\u043b\u043e \u043d\u0430\u0439\u0431\u0456\u043b\u044c\u0448\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0443 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u044f, \u0430 \u043d\u0435 \u0442\u0432\u043e\u0454 \u043c\u0456\u0441\u0446\u0435\u0437\u043d\u0430\u0445\u043e\u0434\u0436\u0435\u043d\u043d\u044f. \u0432\u0456\u043d \u043f\u0443\u0431\u043b\u0456\u0447\u043d\u0438\u0439 \u0456 \u0432\u0441\u0456\u043c \u0432\u0456\u0434\u043e\u043c\u0438\u0439, \u0442\u043e\u0436 \u0432\u0432\u0430\u0436\u0430\u0439, \u0449\u043e \u0437\u0430 \u043d\u0438\u043c \u0441\u0442\u0435\u0436\u0430\u0442\u044c: \u0448\u0432\u0438\u0434\u043a\u0438\u0439 \u0432\u0445\u0456\u0434 \u043b\u0438\u0448\u0435 \u043f\u043e\u0437\u0431\u0430\u0432\u043b\u044f\u0454 \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044f \u0433\u0435\u043e\u0445\u0435\u0448\u0443; \u0432\u0456\u043d \u043d\u0435 \u0445\u043e\u0432\u0430\u0454 \u0442\u0435\u0431\u0435 \u0439 \u043d\u0435 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0431\u043b\u043e\u043a\u0443\u0432\u0430\u043d\u043d\u044f." + "value" : "регіональний канал, де зазвичай збираються люди з %@ — широка комірка навколо найбільшого центру населення, а не твоє місцезнаходження. він публічний і всім відомий, тож вважай, що за ним стежать: швидкий вхід лише позбавляє введення геохешу; він не ховає тебе й не обходить блокування." } }, "ur" : { "stringUnit" : { "state" : "translated", - "value" : "\u0648\u06c1 \u0639\u0644\u0627\u0642\u0627\u0626\u06cc \u0686\u06cc\u0646\u0644 \u062c\u06c1\u0627\u06ba %@ \u06a9\u06d2 \u0644\u0648\u06af \u0639\u0645\u0648\u0645\u0627\u064b \u062c\u0645\u0639 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u2014 \u0633\u0628 \u0633\u06d2 \u0628\u0691\u06d2 \u0622\u0628\u0627\u062f\u06cc \u06a9\u06d2 \u0645\u0631\u06a9\u0632 \u06a9\u06d2 \u06af\u0631\u062f \u0648\u0633\u06cc\u0639 \u0633\u06cc\u0644\u060c \u0622\u067e \u06a9\u0627 \u0645\u0642\u0627\u0645 \u0646\u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0639\u0648\u0627\u0645\u06cc \u0627\u0648\u0631 \u0645\u0639\u0631\u0648\u0641 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0627\u0633 \u067e\u0631 \u0646\u0638\u0631 \u06c1\u06d2: \u0641\u0648\u0631\u06cc \u0634\u0645\u0648\u0644\u06cc\u062a \u0635\u0631\u0641 geohash \u0679\u0627\u0626\u067e \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0628\u0686\u0627\u062a\u06cc \u06c1\u06d2\u061b \u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0686\u06be\u067e\u0627\u062a\u06cc \u0646\u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0646\u06c1 \u0628\u0646\u062f\u0634\u06cc\u06ba \u0639\u0628\u0648\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4" + "value" : "وہ علاقائی چینل جہاں %@ کے لوگ عموماً جمع ہوتے ہیں — سب سے بڑے آبادی کے مرکز کے گرد وسیع سیل، آپ کا مقام نہیں۔ یہ عوامی اور معروف ہے، اس لیے فرض کریں کہ اس پر نظر ہے: فوری شمولیت صرف geohash ٹائپ کرنے سے بچاتی ہے؛ یہ آپ کو چھپاتی نہیں اور نہ بندشیں عبور کرتی ہے۔" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "k\u00eanh khu v\u1ef1c n\u01a1i m\u1ecdi ng\u01b0\u1eddi t\u1eeb %@ th\u01b0\u1eddng t\u1ee5 h\u1ecdp \u2014 \u00f4 r\u1ed9ng quanh trung t\u00e2m d\u00e2n c\u01b0 l\u1edbn nh\u1ea5t, kh\u00f4ng ph\u1ea3i v\u1ecb tr\u00ed c\u1ee7a b\u1ea1n. k\u00eanh n\u00e0y c\u00f4ng khai v\u00e0 ai c\u0169ng bi\u1ebft, n\u00ean h\u00e3y m\u1eb7c \u0111\u1ecbnh l\u00e0 n\u00f3 b\u1ecb theo d\u00f5i: tham gia nhanh ch\u1ec9 gi\u00fap kh\u1ecfi g\u00f5 geohash; n\u00f3 kh\u00f4ng che gi\u1ea5u b\u1ea1n v\u00e0 kh\u00f4ng v\u01b0\u1ee3t ch\u1eb7n." + "value" : "kênh khu vực nơi mọi người từ %@ thường tụ họp — ô rộng quanh trung tâm dân cư lớn nhất, không phải vị trí của bạn. kênh này công khai và ai cũng biết, nên hãy mặc định là nó bị theo dõi: tham gia nhanh chỉ giúp khỏi gõ geohash; nó không che giấu bạn và không vượt chặn." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%@\u7684\u4eba\u4eec\u901a\u5e38\u805a\u96c6\u7684\u533a\u57df\u9891\u9053\u2014\u2014\u56f4\u7ed5\u6700\u5927\u4eba\u53e3\u4e2d\u5fc3\u7684\u5bbd\u9614\u5355\u5143\u683c\uff0c\u800c\u4e0d\u662f\u4f60\u7684\u4f4d\u7f6e\u3002\u5b83\u516c\u5f00\u4e14\u4f17\u6240\u5468\u77e5\uff0c\u8bf7\u9ed8\u8ba4\u5b83\u88ab\u76d1\u89c6\uff1a\u5feb\u901f\u52a0\u5165\u53ea\u662f\u7701\u53bb\u8f93\u5165 geohash\uff1b\u5b83\u4e0d\u4f1a\u9690\u85cf\u4f60\uff0c\u4e5f\u4e0d\u4f1a\u7ed5\u8fc7\u5c01\u9501\u3002" + "value" : "%@的人们通常聚集的区域频道——围绕最大人口中心的宽阔单元格,而不是你的位置。它公开且众所周知,请默认它被监视:快速加入只是省去输入 geohash;它不会隐藏你,也不会绕过封锁。" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "%@\u7684\u4eba\u5011\u901a\u5e38\u805a\u96c6\u7684\u5340\u57df\u983b\u9053\u2014\u2014\u570d\u7e5e\u6700\u5927\u4eba\u53e3\u4e2d\u5fc3\u7684\u5bec\u95ca\u55ae\u5143\u683c\uff0c\u800c\u4e0d\u662f\u4f60\u7684\u4f4d\u7f6e\u3002\u5b83\u516c\u958b\u4e14\u773e\u6240\u5468\u77e5\uff0c\u8acb\u9810\u8a2d\u5b83\u53d7\u5230\u76e3\u8996\uff1a\u5feb\u901f\u52a0\u5165\u53ea\u662f\u7701\u53bb\u8f38\u5165 geohash\uff1b\u5b83\u4e0d\u6703\u96b1\u85cf\u4f60\uff0c\u4e5f\u4e0d\u6703\u7e5e\u904e\u5c01\u9396\u3002" + "value" : "%@的人們通常聚集的區域頻道——圍繞最大人口中心的寬闊單元格,而不是你的位置。它公開且眾所周知,請預設它受到監視:快速加入只是省去輸入 geohash;它不會隱藏你,也不會繞過封鎖。" } } } @@ -79696,13 +80480,13 @@ "ar" : { "stringUnit" : { "state" : "translated", - "value" : "\u0627\u0644\u0627\u0646\u0636\u0645\u0627\u0645 \u0625\u0644\u0649 \u0642\u0646\u0627\u0629 \u0645\u0646\u0637\u0642\u0629 %@" + "value" : "الانضمام إلى قناة منطقة %@" } }, "bn" : { "stringUnit" : { "state" : "translated", - "value" : "%@-\u098f\u09b0 \u0985\u099e\u09cd\u099a\u09b2-\u099a\u09cd\u09af\u09be\u09a8\u09c7\u09b2\u09c7 \u09af\u09cb\u0997 \u09a6\u09bf\u09a8" + "value" : "%@-এর অঞ্চল-চ্যানেলে যোগ দিন" } }, "de" : { @@ -79720,13 +80504,13 @@ "es" : { "stringUnit" : { "state" : "translated", - "value" : "unirse al canal de regi\u00f3n de %@" + "value" : "unirse al canal de región de %@" } }, "fa" : { "stringUnit" : { "state" : "translated", - "value" : "\u067e\u06cc\u0648\u0633\u062a\u0646 \u0628\u0647 \u06a9\u0627\u0646\u0627\u0644 \u0645\u0646\u0637\u0642\u0647\u200c\u0627\u06cc %@" + "value" : "پیوستن به کانال منطقه‌ای %@" } }, "fil" : { @@ -79738,19 +80522,19 @@ "fr" : { "stringUnit" : { "state" : "translated", - "value" : "rejoindre le canal de r\u00e9gion de %@" + "value" : "rejoindre le canal de région de %@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "\u05d4\u05e6\u05d8\u05e8\u05e4\u05d5\u05ea \u05dc\u05e2\u05e8\u05d5\u05e5 \u05d4\u05d0\u05d6\u05d5\u05e8 \u05e9\u05dc %@" + "value" : "הצטרפות לערוץ האזור של %@" } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "%@ \u0915\u0947 \u0915\u094d\u0937\u0947\u0924\u094d\u0930 \u091a\u0948\u0928\u0932 \u0938\u0947 \u091c\u0941\u0921\u093c\u0947\u0902" + "value" : "%@ के क्षेत्र चैनल से जुड़ें" } }, "id" : { @@ -79768,13 +80552,13 @@ "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%@\u306e\u5730\u57df\u30c1\u30e3\u30f3\u30cd\u30eb\u306b\u53c2\u52a0" + "value" : "%@の地域チャンネルに参加" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "%@ \uc9c0\uc5ed \ucc44\ub110 \ucc38\uc5ec" + "value" : "%@ 지역 채널 참여" } }, "ms" : { @@ -79786,7 +80570,7 @@ "ne" : { "stringUnit" : { "state" : "translated", - "value" : "%@ \u0915\u094b \u0915\u094d\u0937\u0947\u0924\u094d\u0930 \u091a\u094d\u092f\u093e\u0928\u0932\u092e\u093e \u0938\u093e\u092e\u0947\u0932 \u0939\u0941\u0928\u0941\u0939\u094b\u0938\u094d" + "value" : "%@ को क्षेत्र च्यानलमा सामेल हुनुहोस्" } }, "nl" : { @@ -79798,79 +80582,79 @@ "pl" : { "stringUnit" : { "state" : "translated", - "value" : "do\u0142\u0105cz do kana\u0142u regionu %@" + "value" : "dołącz do kanału regionu %@" } }, "pt" : { "stringUnit" : { "state" : "translated", - "value" : "entrar no canal de regi\u00e3o de %@" + "value" : "entrar no canal de região de %@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "entrar no canal de regi\u00e3o de %@" + "value" : "entrar no canal de região de %@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "\u0432\u043e\u0439\u0442\u0438 \u0432 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b %@" + "value" : "войти в региональный канал %@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "g\u00e5 med i regionkanalen f\u00f6r %@" + "value" : "gå med i regionkanalen för %@" } }, "ta" : { "stringUnit" : { "state" : "translated", - "value" : "%@ \u0bae\u0ba3\u0bcd\u0b9f\u0bb2 \u0b9a\u0bc7\u0ba9\u0bb2\u0bbf\u0bb2\u0bcd \u0b9a\u0bc7\u0bb0\u0bcd" + "value" : "%@ மண்டல சேனலில் சேர்" } }, "th" : { "stringUnit" : { "state" : "translated", - "value" : "\u0e40\u0e02\u0e49\u0e32\u0e23\u0e48\u0e27\u0e21\u0e41\u0e0a\u0e19\u0e41\u0e19\u0e25\u0e20\u0e39\u0e21\u0e34\u0e20\u0e32\u0e04\u0e02\u0e2d\u0e07 %@" + "value" : "เข้าร่วมแชนแนลภูมิภาคของ %@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ b\u00f6lge kanal\u0131na kat\u0131l" + "value" : "%@ bölge kanalına katıl" } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "\u0443\u0432\u0456\u0439\u0442\u0438 \u0434\u043e \u0440\u0435\u0433\u0456\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0443 %@" + "value" : "увійти до регіонального каналу %@" } }, "ur" : { "stringUnit" : { "state" : "translated", - "value" : "%@ \u06a9\u06d2 \u0639\u0644\u0627\u0642\u0627\u0626\u06cc \u0686\u06cc\u0646\u0644 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u0648\u06ba" + "value" : "%@ کے علاقائی چینل میں شامل ہوں" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "tham gia k\u00eanh khu v\u1ef1c c\u1ee7a %@" + "value" : "tham gia kênh khu vực của %@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "\u52a0\u5165%@\u7684\u533a\u57df\u9891\u9053" + "value" : "加入%@的区域频道" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "\u52a0\u5165%@\u7684\u5340\u57df\u983b\u9053" + "value" : "加入%@的區域頻道" } } } diff --git a/bitchat/Services/MessageClipboard.swift b/bitchat/Services/MessageClipboard.swift index 6582e32c..fc8963b8 100644 --- a/bitchat/Services/MessageClipboard.swift +++ b/bitchat/Services/MessageClipboard.swift @@ -28,12 +28,15 @@ enum MessageClipboard { } /// Builds a composer-ready quote block (`> line` per line, trailing blank). + /// Sender header is plain text (`> alice:`), not `@alice`, so quoting does + /// not re-fire mention notifications for the quoted person or for names + /// inside the quoted body (those stay behind `> ` and are not live tokens). static func quoteForComposer(_ content: String, sender: String?) -> String { let body = content.trimmingCharacters(in: .whitespacesAndNewlines) guard !body.isEmpty else { return "" } let header: String if let sender, !sender.isEmpty, sender != "system" { - header = "> @\(sender):\n" + header = "> \(sender):\n" } else { header = "" } @@ -45,11 +48,13 @@ enum MessageClipboard { } /// Appends a quote to an existing composer draft without wiping it. + /// Only a trailing newline skips inserting another separator — a trailing + /// space must still get a newline so the quote marker starts its own line. static func appendQuote(to draft: String, content: String, sender: String?) -> String { let quote = quoteForComposer(content, sender: sender) guard !quote.isEmpty else { return draft } if draft.isEmpty { return quote } - if draft.hasSuffix("\n") || draft.hasSuffix(" ") { + if draft.hasSuffix("\n") { return draft + quote } return draft + "\n" + quote diff --git a/bitchat/Views/ContentView.swift b/bitchat/Views/ContentView.swift index 1fe95c75..2cb4ed74 100644 --- a/bitchat/Views/ContentView.swift +++ b/bitchat/Views/ContentView.swift @@ -254,12 +254,17 @@ struct ContentView: View { .frame(minWidth: 600, minHeight: 400) #endif .onChange(of: selectedPrivatePeerID) { newValue in + // Shared composer draft must not travel across conversation + // targets (quoting a DM then opening public would otherwise + // one-tap-broadcast private content). + messageText = "" if newValue != nil { showSidebar = true } sharedContentImportModel.updateDestination(sharedContentDestination) } .onChange(of: locationChannelsModel.selectedChannel) { _ in + messageText = "" sharedContentImportModel.updateDestination(sharedContentDestination) } .sheet( diff --git a/bitchatTests/Services/MessageClipboardTests.swift b/bitchatTests/Services/MessageClipboardTests.swift index da589bd9..3619e04d 100644 --- a/bitchatTests/Services/MessageClipboardTests.swift +++ b/bitchatTests/Services/MessageClipboardTests.swift @@ -5,7 +5,7 @@ import Testing struct MessageClipboardTests { @Test func quoteWrapsEachLineAndAddsSender() { let quoted = MessageClipboard.quoteForComposer("hello\nworld", sender: "alice") - #expect(quoted == "> @alice:\n> hello\n> world\n\n") + #expect(quoted == "> alice:\n> hello\n> world\n\n") } @Test func quoteSkipsSystemSenderHeader() { @@ -23,7 +23,7 @@ struct MessageClipboardTests { content: "prior message", sender: "bob" ) - #expect(result == "already typing\n> @bob:\n> prior message\n\n") + #expect(result == "already typing\n> bob:\n> prior message\n\n") } @Test func appendQuoteOntoEmptyDraft() { @@ -32,6 +32,15 @@ struct MessageClipboardTests { content: "solo", sender: "carol" ) - #expect(result == "> @carol:\n> solo\n\n") + #expect(result == "> carol:\n> solo\n\n") + } + + @Test func appendQuoteAfterTrailingSpaceStartsNewLine() { + let result = MessageClipboard.appendQuote( + to: "draft with space ", + content: "quoted", + sender: "dana" + ) + #expect(result == "draft with space \n> dana:\n> quoted\n\n") } }