diff --git a/bitchat/Localizable.xcstrings b/bitchat/Localizable.xcstrings index f869ab85..b775ded6 100644 --- a/bitchat/Localizable.xcstrings +++ b/bitchat/Localizable.xcstrings @@ -18040,6 +18040,9917 @@ } } }, + "command.error.invalid" : { + "comment" : "Returned when the command string has no leading token", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid command" + } + } + } + }, + + "command.error.groups.mesh_only" : { + "comment" : "Returned when /group is used outside mesh context", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "groups are only for mesh peers in #mesh" + } + } + } + }, + + "command.error.favorites.mesh_only" : { + "comment" : "Returned when /fav or /unfav is used outside mesh context", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "favorites are only for mesh peers in #mesh" + } + } + } + }, + + "command.error.ping.mesh_only" : { + "comment" : "Returned when /ping is used outside mesh context", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "ping only works for mesh peers in #mesh" + } + } + } + }, + + "command.error.trace.mesh_only" : { + "comment" : "Returned when /trace is used outside mesh context", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "trace only works for mesh peers in #mesh" + } + } + } + }, + + "command.error.unknown" : { + "comment" : "Returned for an unrecognized slash command; %@ is the command token", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "unknown command: %@ — type /help for commands" + } + } + } + }, + + "command.help.text" : { + "comment" : "Full /help command reference printed as a system message", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "commands:\n/msg @name [message] — start a private chat\n/who — list who's here\n/clear — clear this chat\n/hug @name — send a hug\n/slap @name — slap with a large trout\n/block @name · /unblock @name\n/fav @name · /unfav @name — favorites (mesh only)\n/group create — start an encrypted group\n/group invite @name · /group remove @name — manage members (creator)\n/group leave · /group list — leave or list your groups\n/ping @name — measure round-trip time (mesh only)\n/trace @name — estimated mesh path (mesh only)\n/pay — send a cashu ecash token in this chat\n/drop — pin a note to this place for 24h (needs location)\n/help — this list\n" + } + } + } + }, + + "command.error.drop.notes_off" : { + "comment" : "Returned by /drop when location notes are disabled", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "location notes are off — enable them in the info screen" + } + } + } + }, + + "command.usage.drop" : { + "comment" : "Usage hint when /drop has no message argument", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /drop " + } + } + } + }, + + "command.error.drop.needs_location" : { + "comment" : "Returned by /drop when location permission is not authorized", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "leaving a note needs location — enable it in the info screen" + } + } + } + }, + + "command.error.drop.finding_place" : { + "comment" : "Returned by /drop when building-level geohash is not yet available", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "still finding this place — try again in a moment" + } + } + } + }, + + "command.error.drop.no_relays" : { + "comment" : "Returned by /drop when posting to geo relays fails", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "no geo relays reachable — note not left" + } + } + } + }, + + "command.success.drop.left" : { + "comment" : "Success confirmation after leaving a location note via /drop", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "📍 note left here — it fades in 24h" + } + } + } + }, + + "command.usage.msg" : { + "comment" : "Usage hint when /msg has no nickname argument", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /msg @nickname [message]" + } + } + } + }, + + "command.error.msg.not_found" : { + "comment" : "Returned by /msg when the nickname cannot be resolved; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' not found" + } + } + } + }, + + "command.success.msg.started" : { + "comment" : "Success after starting a private chat via /msg; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "started private chat with %@" + } + } + } + }, + + "command.success.who.nobody" : { + "comment" : "Returned by /who in geohash when context provider is missing", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "nobody around" + } + } + } + }, + + "command.success.who.empty" : { + "comment" : "Returned by /who when no other peers are online", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "no one else is online right now" + } + } + } + }, + + "command.success.who.online" : { + "comment" : "Returned by /who listing online names; %@ is the comma-separated name list", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "online: %@" + } + } + } + }, + + "command.usage.named" : { + "comment" : "Usage for commands that take a nickname; %@ is the command name without slash", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /%@ " + } + } + } + }, + + "command.error.emote.not_found" : { + "comment" : "Returned by /hug or /slap when target is not found; first %@ is command, second %@ is nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found" + } + } + } + }, + + "command.list.none" : { + "comment" : "Placeholder when a /block listing has no entries", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "none" + } + } + } + }, + + "command.success.block.list" : { + "comment" : "Returned by /block with no args; first %@ is mesh list, second %@ is geohash list", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked peers: %@ | geohash blocks: %@" + } + } + } + }, + + "command.success.block.already" : { + "comment" : "Returned when blocking someone already blocked; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already blocked" + } + } + } + }, + + "command.success.block.mesh" : { + "comment" : "Success after blocking a mesh peer; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@. you will no longer receive messages from them" + } + } + } + }, + + "command.success.block.geohash" : { + "comment" : "Success after blocking a geohash participant; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "blocked %@ in geohash chats" + } + } + } + }, + + "command.error.block.not_found" : { + "comment" : "Returned when /block target cannot be resolved; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot block %@: not found or unable to verify identity" + } + } + } + }, + + "command.usage.unblock" : { + "comment" : "Usage hint when /unblock has no nickname argument", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /unblock " + } + } + } + }, + + "command.success.unblock.not_blocked" : { + "comment" : "Returned when unblocking someone who is not blocked; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not blocked" + } + } + } + }, + + "command.success.unblock.mesh" : { + "comment" : "Success after unblocking a mesh peer; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@" + } + } + } + }, + + "command.success.unblock.geohash" : { + "comment" : "Success after unblocking a geohash participant; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "unblocked %@ in geohash chats" + } + } + } + }, + + "command.error.unblock.not_found" : { + "comment" : "Returned when /unblock target cannot be resolved; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot unblock %@: not found" + } + } + } + }, + + "command.usage.group" : { + "comment" : "Usage for /group when subcommand is missing or unknown", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /group create · invite @name · remove @name · leave · list" + } + } + } + }, + + "command.error.mesh.not_found" : { + "comment" : "Returned by /ping or /trace when peer is not found on mesh; first %@ is command, second %@ is nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "cannot %@ %@: not found on mesh" + } + } + } + }, + + "command.success.ping.pinging" : { + "comment" : "Immediate success after sending a mesh ping; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "pinging %@…" + } + } + } + }, + + "command.success.ping.no_reply" : { + "comment" : "Async ping timeout output; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "no reply from %@" + } + } + } + }, + + "command.success.ping.pong" : { + "comment" : "Async ping success output; %@ is nickname, %lld is RTT ms, %2$@ is hop suffix", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "pong from %@: %lld ms%@" + } + } + } + }, + + "command.success.ping.hop_direct" : { + "comment" : "Hop suffix for a direct 1-hop pong", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : " · direct (1 hop)" + } + } + } + }, + + "command.success.ping.hop_many" : { + "comment" : "Hop suffix for multi-hop pong; %lld is hop count", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : " · %lld hops" + } + } + } + }, + + "command.success.trace.no_path" : { + "comment" : "Returned by /trace when no mesh path is known; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "no known path to %@" + } + } + } + }, + + "command.success.trace.path_one" : { + "comment" : "Estimated mesh path with one hop; %@ is chain, %lld is hop count", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hop)" + } + } + } + }, + + "command.success.trace.path_other" : { + "comment" : "Estimated mesh path with multiple hops; %@ is chain, %lld is hop count", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "estimated path: %@ (%lld hops)" + } + } + } + }, + + "command.usage.pay" : { + "comment" : "Usage/help returned by /pay with no token argument", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "usage: /pay — paste a cashu token: /pay cashuA…" + } + } + } + }, + + "command.error.pay.not_token" : { + "comment" : "Returned when /pay argument does not look like a cashu token", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "that doesn't look like a cashu token — expected cashuA… or cashuB…" + } + } + } + }, + + "command.error.pay.invalid" : { + "comment" : "Returned when /pay token fails to decode", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "invalid cashu token — it doesn't decode to a known token with an amount, not sending it" + } + } + } + }, + + "command.success.pay.sent_private" : { + "comment" : "Success after sending a cashu token privately; %@ is amount summary", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds" + } + } + } + }, + + "command.error.pay.public_confirm" : { + "comment" : "Returned when /pay is used publicly without confirmation suffix", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public" + } + } + } + }, + + "command.success.pay.sent_public" : { + "comment" : "Success after sending a cashu token publicly; %@ is amount summary", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "sent %@ to the public channel — anyone here can redeem it" + } + } + } + }, + + "command.error.favorite.not_found" : { + "comment" : "Returned by /fav or /unfav when peer cannot be resolved; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "can't find peer: %@" + } + } + } + }, + + "command.success.favorite.already" : { + "comment" : "Returned by /fav when already favorited; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is already a favorite" + } + } + } + }, + + "command.success.favorite.not_favorite" : { + "comment" : "Returned by /unfav when not a favorite; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ is not a favorite" + } + } + } + }, + + "command.success.favorite.added" : { + "comment" : "Success after adding a favorite; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "added %@ to favorites" + } + } + } + }, + + "command.success.favorite.removed" : { + "comment" : "Success after removing a favorite; %@ is the nickname", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "bn" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "fa" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "ne" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "ta" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "removed %@ from favorites" + } + } + } + }, + "common.cancel" : { "extractionState" : "manual", "localizations" : { diff --git a/bitchat/Services/CommandProcessor.swift b/bitchat/Services/CommandProcessor.swift index f86f2eca..fa83810f 100644 --- a/bitchat/Services/CommandProcessor.swift +++ b/bitchat/Services/CommandProcessor.swift @@ -105,7 +105,7 @@ final class CommandProcessor { @MainActor func process(_ command: String) -> CommandResult { let parts = command.split(separator: " ", maxSplits: 1, omittingEmptySubsequences: false) - guard let cmd = parts.first else { return .error(message: "Invalid command") } + guard let cmd = parts.first else { return .error(message: Strings.invalidCommand) } let args = parts.count > 1 ? String(parts[1]) : "" // Geohash context: disable favoriting in public geohash or GeoDM @@ -133,52 +133,35 @@ final class CommandProcessor { case "/unblock": return handleUnblock(args) case "/group": - if inGeoPublic || inGeoDM { return .error(message: "groups are only for mesh peers in #mesh") } + if inGeoPublic || inGeoDM { return .error(message: Strings.groupsMeshOnly) } return handleGroup(args) case "/fav": - if inGeoPublic || inGeoDM { return .error(message: "favorites are only for mesh peers in #mesh") } + if inGeoPublic || inGeoDM { return .error(message: Strings.favoritesMeshOnly) } return handleFavorite(args, add: true) case "/unfav": - if inGeoPublic || inGeoDM { return .error(message: "favorites are only for mesh peers in #mesh") } + if inGeoPublic || inGeoDM { return .error(message: Strings.favoritesMeshOnly) } return handleFavorite(args, add: false) case "/ping": - if inGeoPublic || inGeoDM { return .error(message: "ping only works for mesh peers in #mesh") } + if inGeoPublic || inGeoDM { return .error(message: Strings.pingMeshOnly) } return handlePing(args) case "/trace": - if inGeoPublic || inGeoDM { return .error(message: "trace only works for mesh peers in #mesh") } + if inGeoPublic || inGeoDM { return .error(message: Strings.traceMeshOnly) } return handleTrace(args) case "/pay": return handlePay(args) case "/drop": return handleDrop(args) case "/help": - return .success(message: Self.helpText) + return .success(message: Strings.helpText) default: - return .error(message: "unknown command: \(cmd) — type /help for commands") + return .error(message: Strings.unknownCommand(String(cmd))) } } /// Local-only command reference, printed as a system message. The /// suggestion panel hides once arguments are typed, and typos used to /// dead-end in a bare "unknown command" — this is the way out. - static let helpText = """ - commands: - /msg @name [message] — start a private chat - /who — list who's here - /clear — clear this chat - /hug @name — send a hug - /slap @name — slap with a large trout - /block @name · /unblock @name - /fav @name · /unfav @name — favorites (mesh only) - /group create — start an encrypted group - /group invite @name · /group remove @name — manage members (creator) - /group leave · /group list — leave or list your groups - /ping @name — measure round-trip time (mesh only) - /trace @name — estimated mesh path (mesh only) - /pay — send a cashu ecash token in this chat - /drop — pin a note to this place for 24h (needs location) - /help — this list - """ + static var helpText: String { Strings.helpText } /// /drop — a dead drop: pins a note to the current building-level /// geohash with a 24h NIP-40 expiry. Anyone who passes through here and @@ -186,28 +169,28 @@ final class CommandProcessor { /// reads it. private func handleDrop(_ args: String) -> CommandResult { guard LocationNotesSettings.enabled else { - return .error(message: "location notes are off — enable them in the info screen") + return .error(message: Strings.dropNotesOff) } guard let content = args.trimmedOrNilIfEmpty else { - return .error(message: "usage: /drop ") + return .error(message: Strings.dropUsage) } let location = LocationChannelManager.shared guard location.permissionState == .authorized else { - return .error(message: "leaving a note needs location — enable it in the info screen") + return .error(message: Strings.dropNeedsLocation) } guard let geohash = location.availableChannels.first(where: { $0.level == .building })?.geohash else { location.refreshChannels() - return .error(message: "still finding this place — try again in a moment") + return .error(message: Strings.dropFindingPlace) } guard let nickname = contextProvider?.nickname, LocationNotesManager.postDrop(content: content, nickname: nickname, geohash: geohash) else { - return .error(message: "no geo relays reachable — note not left") + return .error(message: Strings.dropNoRelays) } // Leaving a note is an explicit notes act: it unlocks the passive // nearby-notes counter (tap-to-reveal) so the sender sees their own // drop counted on the timeline. NearbyNotesCounter.shared.reveal() - return .success(message: "📍 note left here — it fades in 24h") + return .success(message: Strings.dropLeft) } // MARK: - Command Handlers @@ -215,14 +198,14 @@ final class CommandProcessor { private func handleMessage(_ args: String) -> CommandResult { let parts = args.split(separator: " ", maxSplits: 1, omittingEmptySubsequences: false) guard !parts.isEmpty else { - return .error(message: "usage: /msg @nickname [message]") + return .error(message: Strings.msgUsage) } let targetName = String(parts[0]) let nickname = targetName.hasPrefix("@") ? String(targetName.dropFirst()) : targetName guard let peerID = contextProvider?.getPeerIDForNickname(nickname) else { - return .error(message: "'\(nickname)' not found") + return .error(message: Strings.msgNotFound(nickname)) } contextProvider?.startPrivateChat(with: peerID) @@ -232,7 +215,7 @@ final class CommandProcessor { contextProvider?.sendPrivateMessage(message, to: peerID) } - return .success(message: "started private chat with \(nickname)") + return .success(message: Strings.msgStarted(nickname)) } private func handleWho() -> CommandResult { @@ -240,22 +223,22 @@ final class CommandProcessor { switch contextProvider?.activeChannel ?? .mesh { case .location(let ch): // Geohash context: show visible geohash participants (exclude self) - guard let vm = contextProvider else { return .success(message: "nobody around") } + guard let vm = contextProvider else { return .success(message: Strings.whoNobody) } let myHex = (try? vm.idBridge.deriveIdentity(forGeohash: ch.geohash))?.publicKeyHex.lowercased() let people = vm.getVisibleGeoParticipants().filter { person in if let me = myHex { return person.id.lowercased() != me } return true } let names = people.map { $0.displayName } - if names.isEmpty { return .success(message: "no one else is online right now") } - return .success(message: "online: " + names.sorted().joined(separator: ", ")) + if names.isEmpty { return .success(message: Strings.whoEmpty) } + return .success(message: Strings.whoOnline(names.sorted().joined(separator: ", "))) case .mesh: // Mesh context: show connected peer nicknames guard let peers = meshService?.getPeerNicknames(), !peers.isEmpty else { - return .success(message: "no one else is online right now") + return .success(message: Strings.whoEmpty) } let onlineList = peers.values.sorted().joined(separator: ", ") - return .success(message: "online: \(onlineList)") + return .success(message: Strings.whoOnline(onlineList)) } } @@ -271,16 +254,17 @@ final class CommandProcessor { private func handleEmote(_ args: String, command: String, action: String, emoji: String, suffix: String = "") -> CommandResult { let targetName = args.trimmed guard !targetName.isEmpty else { - return .error(message: "usage: /\(command) ") + return .error(message: Strings.namedUsage(command)) } let nickname = targetName.hasPrefix("@") ? String(targetName.dropFirst()) : targetName guard let targetPeerID = contextProvider?.getPeerIDForNickname(nickname), let myNickname = contextProvider?.nickname else { - return .error(message: "cannot \(command) \(nickname): not found") + return .error(message: Strings.emoteNotFound(command: command, nickname: nickname)) } + // Emote mesh content stays English — it is chat/wire-visible protocol text. let emoteContent = "* \(emoji) \(myNickname) \(action) \(nickname)\(suffix) *" if contextProvider?.selectedPrivateChatPeer != nil { @@ -343,9 +327,10 @@ final class CommandProcessor { } } - let meshList = blockedNicknames.isEmpty ? "none" : blockedNicknames.sorted().joined(separator: ", ") - let geoList = geoNames.isEmpty ? "none" : geoNames.sorted().joined(separator: ", ") - return .success(message: "blocked peers: \(meshList) | geohash blocks: \(geoList)") + let none = Strings.listNone + let meshList = blockedNicknames.isEmpty ? none : blockedNicknames.sorted().joined(separator: ", ") + let geoList = geoNames.isEmpty ? none : geoNames.sorted().joined(separator: ", ") + return .success(message: Strings.blockList(mesh: meshList, geo: geoList)) } let nickname = targetName.hasPrefix("@") ? String(targetName.dropFirst()) : targetName @@ -353,7 +338,7 @@ final class CommandProcessor { if let peerID = contextProvider?.getPeerIDForNickname(nickname), let fingerprint = meshService?.getFingerprint(for: peerID) { if identityManager.isBlocked(fingerprint: fingerprint) { - return .success(message: "\(nickname) is already blocked") + return .success(message: Strings.blockAlready(nickname)) } // Block the user (mesh/noise identity) if var identity = identityManager.getSocialIdentity(for: fingerprint) { @@ -375,24 +360,24 @@ final class CommandProcessor { // Scrub their carried public messages now, while the peerID is // resolvable, so they can't resurface as archived echoes. meshArchive?.purgeArchivedPublicMessages(from: peerID) - return .success(message: "blocked \(nickname). you will no longer receive messages from them") + return .success(message: Strings.blockMesh(nickname)) } // Mesh lookup failed; try geohash (Nostr) participant by display name if let pub = contextProvider?.nostrPubkeyForDisplayName(nickname) { if identityManager.isNostrBlocked(pubkeyHexLowercased: pub) { - return .success(message: "\(nickname) is already blocked") + return .success(message: Strings.blockAlready(nickname)) } identityManager.setNostrBlocked(pub, isBlocked: true) - return .success(message: "blocked \(nickname) in geohash chats") + return .success(message: Strings.blockGeohash(nickname)) } - return .error(message: "cannot block \(nickname): not found or unable to verify identity") + return .error(message: Strings.blockNotFound(nickname)) } private func handleUnblock(_ args: String) -> CommandResult { let targetName = args.trimmed guard !targetName.isEmpty else { - return .error(message: "usage: /unblock ") + return .error(message: Strings.unblockUsage) } let nickname = targetName.hasPrefix("@") ? String(targetName.dropFirst()) : targetName @@ -400,23 +385,23 @@ final class CommandProcessor { if let peerID = contextProvider?.getPeerIDForNickname(nickname), let fingerprint = meshService?.getFingerprint(for: peerID) { if !identityManager.isBlocked(fingerprint: fingerprint) { - return .success(message: "\(nickname) is not blocked") + return .success(message: Strings.unblockNotBlocked(nickname)) } identityManager.setBlocked(fingerprint, isBlocked: false) - return .success(message: "unblocked \(nickname)") + return .success(message: Strings.unblockMesh(nickname)) } // Try geohash unblock if let pub = contextProvider?.nostrPubkeyForDisplayName(nickname) { if !identityManager.isNostrBlocked(pubkeyHexLowercased: pub) { - return .success(message: "\(nickname) is not blocked") + return .success(message: Strings.unblockNotBlocked(nickname)) } identityManager.setNostrBlocked(pub, isBlocked: false) - return .success(message: "unblocked \(nickname) in geohash chats") + return .success(message: Strings.unblockGeohash(nickname)) } - return .error(message: "cannot unblock \(nickname): not found") + return .error(message: Strings.unblockNotFound(nickname)) } - private static let groupUsage = "usage: /group create · invite @name · remove @name · leave · list" + private static var groupUsage: String { Strings.groupUsage } private func handleGroup(_ args: String) -> CommandResult { let parts = args.split(separator: " ", maxSplits: 1, omittingEmptySubsequences: true) @@ -454,12 +439,12 @@ final class CommandProcessor { private func resolveMeshPeer(_ args: String, command: String) -> MeshPeerResolution { let targetName = args.trimmed guard !targetName.isEmpty else { - return .failed(.error(message: "usage: /\(command) ")) + return .failed(.error(message: Strings.namedUsage(command))) } let nickname = targetName.hasPrefix("@") ? String(targetName.dropFirst()) : targetName guard let peerID = contextProvider?.getPeerIDForNickname(nickname), !peerID.isGeoDM, !peerID.isGeoChat else { - return .failed(.error(message: "cannot \(command) \(nickname): not found on mesh")) + return .failed(.error(message: Strings.meshNotFound(command: command, nickname: nickname))) } return .resolved(peerID: peerID, nickname: nickname) } @@ -480,15 +465,15 @@ final class CommandProcessor { meshDiagnostics?.sendMeshPing(to: target.peerID) { [weak currentProvider] result in let provider = currentProvider guard let result else { - provider?.addCommandOutput("no reply from \(nickname)", to: destination) + provider?.addCommandOutput(Strings.pingNoReply(nickname), to: destination) return } let hopText: String = result.hops.map { hops in - hops == 1 ? " · direct (1 hop)" : " · \(hops) hops" + hops == 1 ? Strings.pingHopDirect : Strings.pingHopMany(hops) } ?? "" - provider?.addCommandOutput("pong from \(nickname): \(result.rttMs) ms\(hopText)", to: destination) + provider?.addCommandOutput(Strings.pingPong(nickname: nickname, rttMs: result.rttMs, hopText: hopText), to: destination) } - return .success(message: "pinging \(nickname)…") + return .success(message: Strings.pingPinging(nickname)) } private func handleTrace(_ args: String) -> CommandResult { @@ -500,7 +485,7 @@ final class CommandProcessor { guard let mesh = meshService, let intermediates = meshDiagnostics?.computeMeshPath(to: target.peerID) else { - return .success(message: "no known path to \(target.nickname)") + return .success(message: Strings.traceNoPath(target.nickname)) } // Graph-derived from gossiped neighbor claims, not route-recorded — // present it as an estimate. @@ -509,7 +494,7 @@ final class CommandProcessor { } let chain = (["you"] + hopNames + [target.nickname]).joined(separator: " → ") let hops = intermediates.count + 1 - return .success(message: "estimated path: \(chain) (\(hops) hop\(hops == 1 ? "" : "s"))") + return .success(message: Strings.tracePath(chain: chain, hops: hops)) } /// `/pay ` — validates the token decodes, then sends it as @@ -520,44 +505,44 @@ final class CommandProcessor { private func handlePay(_ args: String) -> CommandResult { var parts = args.trimmed.split(separator: " ").map(String.init) guard !parts.isEmpty else { - return .success(message: "usage: /pay — paste a cashu token: /pay cashuA…") + return .success(message: Strings.payUsage) } let confirmedPublic = parts.count > 1 && parts.last?.lowercased() == "public" if confirmedPublic { parts.removeLast() } guard parts.count == 1, let token = CashuTokenDecoder.bareToken(from: parts[0]) else { - return .error(message: "that doesn't look like a cashu token — expected cashuA… or cashuB…") + return .error(message: Strings.payNotToken) } guard let info = CashuTokenDecoder.decode(token, strict: true) else { - return .error(message: "invalid cashu token — it doesn't decode to a known token with an amount, not sending it") + return .error(message: Strings.payInvalid) } let summary = info.displayAmount ?? "a cashu token" if let peerID = contextProvider?.selectedPrivateChatPeer { contextProvider?.sendPrivateMessage(token, to: peerID) - return .success(message: "sent \(summary) — cashu is a bearer token; whoever redeems it first gets the funds") + return .success(message: Strings.paySentPrivate(summary)) } guard confirmedPublic else { - return .error(message: "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public") + return .error(message: Strings.payPublicConfirm) } contextProvider?.sendPublicMessage(token) - return .success(message: "sent \(summary) to the public channel — anyone here can redeem it") + return .success(message: Strings.paySentPublic(summary)) } private func handleFavorite(_ args: String, add: Bool) -> CommandResult { let targetName = args.trimmed guard !targetName.isEmpty else { - return .error(message: "usage: /\(add ? "fav" : "unfav") ") + return .error(message: Strings.namedUsage(add ? "fav" : "unfav")) } let nickname = targetName.hasPrefix("@") ? String(targetName.dropFirst()) : targetName guard let peerID = contextProvider?.getPeerIDForNickname(nickname) else { - return .error(message: "can't find peer: \(nickname)") + return .error(message: Strings.favoriteNotFound(nickname)) } // Resolve current state by the peer's real noise key. The resolved @@ -571,13 +556,322 @@ final class CommandProcessor { } guard add != isCurrentlyFavorite else { - return .success(message: add ? "\(nickname) is already a favorite" : "\(nickname) is not a favorite") + return .success(message: add ? Strings.favoriteAlready(nickname) : Strings.favoriteNotFavorite(nickname)) } // toggleFavorite persists by the real noise key and notifies the peer. contextProvider?.toggleFavorite(peerID: peerID) - return .success(message: add ? "added \(nickname) to favorites" : "removed \(nickname) from favorites") + return .success(message: add ? Strings.favoriteAdded(nickname) : Strings.favoriteRemoved(nickname)) + } + + // MARK: - Localized strings + + /// Local-only command result / help copy. Emote mesh content is intentionally + /// left in English so wire-visible text stays protocol-stable. + enum Strings { + static var invalidCommand: String { + String(localized: "command.error.invalid", defaultValue: "Invalid command", comment: "Returned when the command string has no leading token") + } + static var groupsMeshOnly: String { + String(localized: "command.error.groups.mesh_only", defaultValue: "groups are only for mesh peers in #mesh", comment: "Returned when /group is used outside mesh context") + } + static var favoritesMeshOnly: String { + String(localized: "command.error.favorites.mesh_only", defaultValue: "favorites are only for mesh peers in #mesh", comment: "Returned when /fav or /unfav is used outside mesh context") + } + static var pingMeshOnly: String { + String(localized: "command.error.ping.mesh_only", defaultValue: "ping only works for mesh peers in #mesh", comment: "Returned when /ping is used outside mesh context") + } + static var traceMeshOnly: String { + String(localized: "command.error.trace.mesh_only", defaultValue: "trace only works for mesh peers in #mesh", comment: "Returned when /trace is used outside mesh context") + } + static func unknownCommand(_ cmd: String) -> String { + String( + format: String(localized: "command.error.unknown", defaultValue: "unknown command: %@ — type /help for commands", comment: "Returned for an unrecognized slash command; %@ is the command token"), + locale: .current, + cmd + ) + } + static var helpText: String { + String(localized: "command.help.text", defaultValue: """ + commands: + /msg @name [message] — start a private chat + /who — list who's here + /clear — clear this chat + /hug @name — send a hug + /slap @name — slap with a large trout + /block @name · /unblock @name + /fav @name · /unfav @name — favorites (mesh only) + /group create — start an encrypted group + /group invite @name · /group remove @name — manage members (creator) + /group leave · /group list — leave or list your groups + /ping @name — measure round-trip time (mesh only) + /trace @name — estimated mesh path (mesh only) + /pay — send a cashu ecash token in this chat + /drop — pin a note to this place for 24h (needs location) + /help — this list + """, comment: "Full /help command reference printed as a system message") + } + static var dropNotesOff: String { + String(localized: "command.error.drop.notes_off", defaultValue: "location notes are off — enable them in the info screen", comment: "Returned by /drop when location notes are disabled") + } + static var dropUsage: String { + String(localized: "command.usage.drop", defaultValue: "usage: /drop ", comment: "Usage hint when /drop has no message argument") + } + static var dropNeedsLocation: String { + String(localized: "command.error.drop.needs_location", defaultValue: "leaving a note needs location — enable it in the info screen", comment: "Returned by /drop when location permission is not authorized") + } + static var dropFindingPlace: String { + String(localized: "command.error.drop.finding_place", defaultValue: "still finding this place — try again in a moment", comment: "Returned by /drop when building-level geohash is not yet available") + } + static var dropNoRelays: String { + String(localized: "command.error.drop.no_relays", defaultValue: "no geo relays reachable — note not left", comment: "Returned by /drop when posting to geo relays fails") + } + static var dropLeft: String { + String(localized: "command.success.drop.left", defaultValue: "📍 note left here — it fades in 24h", comment: "Success confirmation after leaving a location note via /drop") + } + static var msgUsage: String { + String(localized: "command.usage.msg", defaultValue: "usage: /msg @nickname [message]", comment: "Usage hint when /msg has no nickname argument") + } + static func msgNotFound(_ nickname: String) -> String { + String( + format: String(localized: "command.error.msg.not_found", defaultValue: "'%@' not found", comment: "Returned by /msg when the nickname cannot be resolved; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func msgStarted(_ nickname: String) -> String { + String( + format: String(localized: "command.success.msg.started", defaultValue: "started private chat with %@", comment: "Success after starting a private chat via /msg; %@ is the nickname"), + locale: .current, + nickname + ) + } + static var whoNobody: String { + String(localized: "command.success.who.nobody", defaultValue: "nobody around", comment: "Returned by /who in geohash when context provider is missing") + } + static var whoEmpty: String { + String(localized: "command.success.who.empty", defaultValue: "no one else is online right now", comment: "Returned by /who when no other peers are online") + } + static func whoOnline(_ list: String) -> String { + String( + format: String(localized: "command.success.who.online", defaultValue: "online: %@", comment: "Returned by /who listing online names; %@ is the comma-separated name list"), + locale: .current, + list + ) + } + static func namedUsage(_ command: String) -> String { + String( + format: String(localized: "command.usage.named", defaultValue: "usage: /%@ ", comment: "Usage for commands that take a nickname; %@ is the command name without slash"), + locale: .current, + command + ) + } + static func emoteNotFound(command: String, nickname: String) -> String { + String( + format: String(localized: "command.error.emote.not_found", defaultValue: "cannot %@ %@: not found", comment: "Returned by /hug or /slap when target is not found; first %@ is command, second %@ is nickname"), + locale: .current, + command, + nickname + ) + } + static var listNone: String { + String(localized: "command.list.none", defaultValue: "none", comment: "Placeholder when a /block listing has no entries") + } + static func blockList(mesh: String, geo: String) -> String { + String( + format: String(localized: "command.success.block.list", defaultValue: "blocked peers: %@ | geohash blocks: %@", comment: "Returned by /block with no args; first %@ is mesh list, second %@ is geohash list"), + locale: .current, + mesh, + geo + ) + } + static func blockAlready(_ nickname: String) -> String { + String( + format: String(localized: "command.success.block.already", defaultValue: "%@ is already blocked", comment: "Returned when blocking someone already blocked; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func blockMesh(_ nickname: String) -> String { + String( + format: String(localized: "command.success.block.mesh", defaultValue: "blocked %@. you will no longer receive messages from them", comment: "Success after blocking a mesh peer; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func blockGeohash(_ nickname: String) -> String { + String( + format: String(localized: "command.success.block.geohash", defaultValue: "blocked %@ in geohash chats", comment: "Success after blocking a geohash participant; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func blockNotFound(_ nickname: String) -> String { + String( + format: String(localized: "command.error.block.not_found", defaultValue: "cannot block %@: not found or unable to verify identity", comment: "Returned when /block target cannot be resolved; %@ is the nickname"), + locale: .current, + nickname + ) + } + static var unblockUsage: String { + String(localized: "command.usage.unblock", defaultValue: "usage: /unblock ", comment: "Usage hint when /unblock has no nickname argument") + } + static func unblockNotBlocked(_ nickname: String) -> String { + String( + format: String(localized: "command.success.unblock.not_blocked", defaultValue: "%@ is not blocked", comment: "Returned when unblocking someone who is not blocked; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func unblockMesh(_ nickname: String) -> String { + String( + format: String(localized: "command.success.unblock.mesh", defaultValue: "unblocked %@", comment: "Success after unblocking a mesh peer; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func unblockGeohash(_ nickname: String) -> String { + String( + format: String(localized: "command.success.unblock.geohash", defaultValue: "unblocked %@ in geohash chats", comment: "Success after unblocking a geohash participant; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func unblockNotFound(_ nickname: String) -> String { + String( + format: String(localized: "command.error.unblock.not_found", defaultValue: "cannot unblock %@: not found", comment: "Returned when /unblock target cannot be resolved; %@ is the nickname"), + locale: .current, + nickname + ) + } + static var groupUsage: String { + String(localized: "command.usage.group", defaultValue: "usage: /group create · invite @name · remove @name · leave · list", comment: "Usage for /group when subcommand is missing or unknown") + } + static func meshNotFound(command: String, nickname: String) -> String { + String( + format: String(localized: "command.error.mesh.not_found", defaultValue: "cannot %@ %@: not found on mesh", comment: "Returned by /ping or /trace when peer is not found on mesh; first %@ is command, second %@ is nickname"), + locale: .current, + command, + nickname + ) + } + static func pingPinging(_ nickname: String) -> String { + String( + format: String(localized: "command.success.ping.pinging", defaultValue: "pinging %@…", comment: "Immediate success after sending a mesh ping; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func pingNoReply(_ nickname: String) -> String { + String( + format: String(localized: "command.success.ping.no_reply", defaultValue: "no reply from %@", comment: "Async ping timeout output; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func pingPong(nickname: String, rttMs: Int, hopText: String) -> String { + String( + format: String(localized: "command.success.ping.pong", defaultValue: "pong from %@: %lld ms%@", comment: "Async ping success output; %@ is nickname, %lld is RTT ms, %2$@ is hop suffix"), + locale: .current, + nickname, + Int64(rttMs), + hopText + ) + } + static var pingHopDirect: String { + String(localized: "command.success.ping.hop_direct", defaultValue: " · direct (1 hop)", comment: "Hop suffix for a direct 1-hop pong") + } + static func pingHopMany(_ hops: Int) -> String { + String( + format: String(localized: "command.success.ping.hop_many", defaultValue: " · %lld hops", comment: "Hop suffix for multi-hop pong; %lld is hop count"), + locale: .current, + Int64(hops) + ) + } + static func traceNoPath(_ nickname: String) -> String { + String( + format: String(localized: "command.success.trace.no_path", defaultValue: "no known path to %@", comment: "Returned by /trace when no mesh path is known; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func tracePath(chain: String, hops: Int) -> String { + if hops == 1 { + return String( + format: String(localized: "command.success.trace.path_one", defaultValue: "estimated path: %@ (%lld hop)", comment: "Estimated mesh path with one hop; %@ is chain, %lld is hop count"), + locale: .current, + chain, + Int64(hops) + ) + } + return String( + format: String(localized: "command.success.trace.path_other", defaultValue: "estimated path: %@ (%lld hops)", comment: "Estimated mesh path with multiple hops; %@ is chain, %lld is hop count"), + locale: .current, + chain, + Int64(hops) + ) + } + static var payUsage: String { + String(localized: "command.usage.pay", defaultValue: "usage: /pay — paste a cashu token: /pay cashuA…", comment: "Usage/help returned by /pay with no token argument") + } + static var payNotToken: String { + String(localized: "command.error.pay.not_token", defaultValue: "that doesn't look like a cashu token — expected cashuA… or cashuB…", comment: "Returned when /pay argument does not look like a cashu token") + } + static var payInvalid: String { + String(localized: "command.error.pay.invalid", defaultValue: "invalid cashu token — it doesn't decode to a known token with an amount, not sending it", comment: "Returned when /pay token fails to decode") + } + static func paySentPrivate(_ summary: String) -> String { + String( + format: String(localized: "command.success.pay.sent_private", defaultValue: "sent %@ — cashu is a bearer token; whoever redeems it first gets the funds", comment: "Success after sending a cashu token privately; %@ is amount summary"), + locale: .current, + summary + ) + } + static var payPublicConfirm: String { + String(localized: "command.error.pay.public_confirm", defaultValue: "this is a public channel — anyone reading it can redeem the token. send anyway: /pay public", comment: "Returned when /pay is used publicly without confirmation suffix") + } + static func paySentPublic(_ summary: String) -> String { + String( + format: String(localized: "command.success.pay.sent_public", defaultValue: "sent %@ to the public channel — anyone here can redeem it", comment: "Success after sending a cashu token publicly; %@ is amount summary"), + locale: .current, + summary + ) + } + static func favoriteNotFound(_ nickname: String) -> String { + String( + format: String(localized: "command.error.favorite.not_found", defaultValue: "can't find peer: %@", comment: "Returned by /fav or /unfav when peer cannot be resolved; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func favoriteAlready(_ nickname: String) -> String { + String( + format: String(localized: "command.success.favorite.already", defaultValue: "%@ is already a favorite", comment: "Returned by /fav when already favorited; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func favoriteNotFavorite(_ nickname: String) -> String { + String( + format: String(localized: "command.success.favorite.not_favorite", defaultValue: "%@ is not a favorite", comment: "Returned by /unfav when not a favorite; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func favoriteAdded(_ nickname: String) -> String { + String( + format: String(localized: "command.success.favorite.added", defaultValue: "added %@ to favorites", comment: "Success after adding a favorite; %@ is the nickname"), + locale: .current, + nickname + ) + } + static func favoriteRemoved(_ nickname: String) -> String { + String( + format: String(localized: "command.success.favorite.removed", defaultValue: "removed %@ from favorites", comment: "Success after removing a favorite; %@ is the nickname"), + locale: .current, + nickname + ) + } } - } diff --git a/bitchatTests/CommandProcessorTests.swift b/bitchatTests/CommandProcessorTests.swift index e2d9d561..683ccc59 100644 --- a/bitchatTests/CommandProcessorTests.swift +++ b/bitchatTests/CommandProcessorTests.swift @@ -13,7 +13,7 @@ struct CommandProcessorTests { let result = processor.process("/slap @system") switch result { case .error(let message): - #expect(message == "cannot slap system: not found") + #expect(message == CommandProcessor.Strings.emoteNotFound(command: "slap", nickname: "system")) default: Issue.record("Expected error result") } @@ -26,7 +26,7 @@ struct CommandProcessorTests { let result = processor.process("/hug @system") switch result { case .error(let message): - #expect(message == "cannot hug system: not found") + #expect(message == CommandProcessor.Strings.emoteNotFound(command: "hug", nickname: "system")) default: Issue.record("Expected error result") } @@ -39,7 +39,7 @@ struct CommandProcessorTests { let result = processor.process("/slap") switch result { case .error(let message): - #expect(message == "usage: /slap ") + #expect(message == CommandProcessor.Strings.namedUsage("slap")) default: Issue.record("Expected error result for usage message") } @@ -59,7 +59,7 @@ struct CommandProcessorTests { switch result { case .success(let message): - #expect(message == "started private chat with alice") + #expect(message == CommandProcessor.Strings.msgStarted("alice")) default: Issue.record("Expected success result") } @@ -86,7 +86,7 @@ struct CommandProcessorTests { switch result { case .success(let message): - #expect(message == "online: alice, bob") + #expect(message == CommandProcessor.Strings.whoOnline("alice, bob")) default: Issue.record("Expected success result") } @@ -112,7 +112,7 @@ struct CommandProcessorTests { switch result { case .success(let message): - #expect(message == "online: bob") + #expect(message == CommandProcessor.Strings.whoOnline("bob")) default: Issue.record("Expected success result") } @@ -234,7 +234,7 @@ struct CommandProcessorTests { switch result { case .success(let message): - #expect(message == "blocked peers: bob | geohash blocks: carol") + #expect(message == CommandProcessor.Strings.blockList(mesh: "bob", geo: "carol")) default: Issue.record("Expected success result") } @@ -255,7 +255,7 @@ struct CommandProcessorTests { } switch blockResult { case .success(let message): - #expect(message == "blocked bob. you will no longer receive messages from them") + #expect(message == CommandProcessor.Strings.blockMesh("bob")) default: Issue.record("Expected success result") } @@ -266,7 +266,7 @@ struct CommandProcessorTests { } switch unblockResult { case .success(let message): - #expect(message == "unblocked bob") + #expect(message == CommandProcessor.Strings.unblockMesh("bob")) default: Issue.record("Expected success result") } @@ -285,7 +285,7 @@ struct CommandProcessorTests { } switch blockResult { case .success(let message): - #expect(message == "blocked carol in geohash chats") + #expect(message == CommandProcessor.Strings.blockGeohash("carol")) default: Issue.record("Expected success result") } @@ -296,7 +296,7 @@ struct CommandProcessorTests { } switch unblockResult { case .success(let message): - #expect(message == "unblocked carol in geohash chats") + #expect(message == CommandProcessor.Strings.unblockGeohash("carol")) default: Issue.record("Expected success result") } @@ -324,7 +324,7 @@ struct CommandProcessorTests { switch result { case .success(let message): - #expect(message == "added alice to favorites") + #expect(message == CommandProcessor.Strings.favoriteAdded("alice")) default: Issue.record("Expected success result") } @@ -340,7 +340,7 @@ struct CommandProcessorTests { } switch unfavResult { case .success(let message): - #expect(message == "alice is not a favorite") + #expect(message == CommandProcessor.Strings.favoriteNotFavorite("alice")) default: Issue.record("Expected success result") } @@ -364,7 +364,7 @@ struct CommandProcessorTests { switch result { case .error(let message): - #expect(message == "favorites are only for mesh peers in #mesh") + #expect(message == CommandProcessor.Strings.favoritesMeshOnly) default: Issue.record("Expected error result") } @@ -377,7 +377,7 @@ struct CommandProcessorTests { let processor = makePayProcessor(context: MockCommandContextProvider()) switch processor.process("/pay") { case .success(let message): - #expect(message?.contains("usage: /pay") == true) + #expect(message == CommandProcessor.Strings.payUsage) default: Issue.record("Expected success (usage) result") } @@ -426,7 +426,7 @@ struct CommandProcessorTests { switch processor.process("/pay \(Self.validV3Token)") { case .error(let message): - #expect(message.contains("public") == true) + #expect(message == CommandProcessor.Strings.payPublicConfirm) default: Issue.record("Expected error without confirm") } @@ -455,7 +455,7 @@ struct CommandProcessorTests { for bad in ["/pay \(truncatedV4)", "/pay \(junkV4)"] { switch processor.process(bad) { case .error(let message): - #expect(message.contains("invalid cashu token") == true) + #expect(message == CommandProcessor.Strings.payInvalid) default: Issue.record("Expected error for \(bad)") }