Merge pull request #2122 from RoboSats/mobile-multilanguage

Mobile multi-language
This commit is contained in:
KoalaSat
2025-07-28 09:50:55 +00:00
committed by GitHub
21 changed files with 489 additions and 29 deletions

View File

@ -3,7 +3,10 @@ package com.robosats
import android.Manifest import android.Manifest
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Application import android.app.Application
import android.content.Intent
import android.content.pm.ActivityInfo import android.content.pm.ActivityInfo
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
@ -20,9 +23,6 @@ import android.webkit.WebSettings
import android.webkit.WebStorage import android.webkit.WebStorage
import android.webkit.WebView import android.webkit.WebView
import android.webkit.WebViewClient import android.webkit.WebViewClient
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.widget.Button import android.widget.Button
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
@ -31,6 +31,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.robosats.models.EncryptedStorage import com.robosats.models.EncryptedStorage
import com.robosats.models.LanguageManager
import com.robosats.services.NotificationsService import com.robosats.services.NotificationsService
import com.robosats.tor.TorKmp import com.robosats.tor.TorKmp
import com.robosats.tor.TorKmpManager import com.robosats.tor.TorKmpManager
@ -50,8 +51,12 @@ class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
// Initialize EncryptedStorage
EncryptedStorage.init(this) EncryptedStorage.init(this)
// Initialize language manager with system language
LanguageManager.init(this)
// Lock the screen orientation to portrait mode // Lock the screen orientation to portrait mode
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
@ -70,7 +75,7 @@ class MainActivity : AppCompatActivity() {
} }
// Set initial status message // Set initial status message
updateStatus("Initializing Tor connection...") updateStatus(getString(R.string.init_tor))
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
ContextCompat.checkSelfPermission( ContextCompat.checkSelfPermission(
@ -86,6 +91,7 @@ class MainActivity : AppCompatActivity() {
} }
val intent = intent val intent = intent
intentData = ""
if (intent != null) { if (intent != null) {
val orderId = intent.getStringExtra("order_id") val orderId = intent.getStringExtra("order_id")
if (orderId?.isNotEmpty() == true) { if (orderId?.isNotEmpty() == true) {
@ -93,13 +99,14 @@ class MainActivity : AppCompatActivity() {
} }
} }
// Initialize Tor and setup WebView only after Tor is properly connected
initializeTor()
val settingProxy = EncryptedStorage.getEncryptedStorage("settings_use_proxy") val settingProxy = EncryptedStorage.getEncryptedStorage("settings_use_proxy")
if (settingProxy == "false") { if (settingProxy == "false") {
// Setup WebView to use Orbot if the user previously clicked // Setup WebView to use Orbot if the user previously clicked
onUseOrbotButtonClicked() onUseOrbotButtonClicked()
} else {
// Initialize Tor and setup WebView only after Tor is properly connected
initializeTor()
} }
} }
@ -126,7 +133,7 @@ class MainActivity : AppCompatActivity() {
// Show a message to the user // Show a message to the user
Toast.makeText( Toast.makeText(
this, this,
"Using Orbot. Make sure it's running!", getString(R.string.using_orbot),
Toast.LENGTH_LONG Toast.LENGTH_LONG
).show() ).show()
@ -181,7 +188,7 @@ class MainActivity : AppCompatActivity() {
// Show error message on the loading screen // Show error message on the loading screen
runOnUiThread { runOnUiThread {
updateStatus("Critical error: Tor initialization failed. App cannot proceed securely.") updateStatus(getString(R.string.tor_init_error))
} }
} }
} }
@ -200,7 +207,7 @@ class MainActivity : AppCompatActivity() {
try { try {
// Display connecting message // Display connecting message
runOnUiThread { runOnUiThread {
updateStatus("Connecting to Tor network...") updateStatus(getString(R.string.connecting_tor))
} }
// Wait for Tor to connect with retry mechanism // Wait for Tor to connect with retry mechanism
@ -214,7 +221,7 @@ class MainActivity : AppCompatActivity() {
// Update status on UI thread every few retries // Update status on UI thread every few retries
if (retries % 3 == 0) { if (retries % 3 == 0) {
runOnUiThread { runOnUiThread {
updateStatus("Still connecting to Tor (attempt $retries/$maxRetries)...") updateStatus(getString(R.string.still_connecting_tor))
} }
} }
} }
@ -225,7 +232,7 @@ class MainActivity : AppCompatActivity() {
// Show success message and proceed // Show success message and proceed
runOnUiThread { runOnUiThread {
updateStatus("Tor connected successfully. Setting up secure browser...") updateStatus(getString(R.string.connected_tor))
HttpClientManager.setDefaultProxy(getTorKmpObject().proxy) HttpClientManager.setDefaultProxy(getTorKmpObject().proxy)
@ -237,14 +244,14 @@ class MainActivity : AppCompatActivity() {
Log.e("TorInitialization", "Failed to connect to Tor after $maxRetries retries") Log.e("TorInitialization", "Failed to connect to Tor after $maxRetries retries")
runOnUiThread { runOnUiThread {
updateStatus("Failed to connect to Tor after multiple attempts. App cannot proceed securely.") updateStatus(getString(R.string.fail_tor))
} }
} }
} catch (e: Exception) { } catch (e: Exception) {
Log.e("TorInitialization", "Error during Tor connection: ${e.message}", e) Log.e("TorInitialization", "Error during Tor connection: ${e.message}", e)
runOnUiThread { runOnUiThread {
updateStatus("Error connecting to Tor: ${e.message}") updateStatus(getString(R.string.error_tor) + "${e.message}")
} }
} }
} }
@ -283,7 +290,7 @@ class MainActivity : AppCompatActivity() {
// Show message that we're setting up secure browsing // Show message that we're setting up secure browsing
runOnUiThread { runOnUiThread {
updateStatus(if (useProxy) "Setting up secure Tor browsing..." else "Setting up Orbot browsing...") updateStatus(if (useProxy) getString(R.string.setting_tor) else getString(R.string.setting_orbot))
} }
// Configure proxy for WebView in a background thread to avoid NetworkOnMainThreadException // Configure proxy for WebView in a background thread to avoid NetworkOnMainThreadException
@ -296,7 +303,7 @@ class MainActivity : AppCompatActivity() {
// Success - now configure WebViewClient and load URL on UI thread // Success - now configure WebViewClient and load URL on UI thread
runOnUiThread { runOnUiThread {
updateStatus("Secure connection established. Loading app...") updateStatus(getString(R.string.loading_app))
// Set up WebViewClient that allows external links and deep links to be opened // Set up WebViewClient that allows external links and deep links to be opened
webView.webViewClient = object : WebViewClient() { webView.webViewClient = object : WebViewClient() {
@ -369,6 +376,7 @@ class MainActivity : AppCompatActivity() {
val notifications = EncryptedStorage.getEncryptedStorage("settings_notifications") val notifications = EncryptedStorage.getEncryptedStorage("settings_notifications")
if (notifications != "false") initializeNotifications() if (notifications != "false") initializeNotifications()
if (intentData != "") {
webView.post { webView.post {
try { try {
webView.evaluateJavascript("javascript:window.AndroidDataRobosats = { navigateToPage: '$intentData' }", null) webView.evaluateJavascript("javascript:window.AndroidDataRobosats = { navigateToPage: '$intentData' }", null)
@ -377,6 +385,7 @@ class MainActivity : AppCompatActivity() {
} }
} }
} }
}
} catch (e: Exception) { } catch (e: Exception) {
Log.e("WebViewSetup", "Security error in WebView setup: ${e.message}", e) Log.e("WebViewSetup", "Security error in WebView setup: ${e.message}", e)
@ -441,9 +450,7 @@ class MainActivity : AppCompatActivity() {
cookieManager.setAcceptThirdPartyCookies(webView, false) // Block 3rd party cookies cookieManager.setAcceptThirdPartyCookies(webView, false) // Block 3rd party cookies
// 10. Disable Service Workers (not needed for our local app) // 10. Disable Service Workers (not needed for our local app)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
ServiceWorkerController.getInstance().setServiceWorkerClient(null) ServiceWorkerController.getInstance().setServiceWorkerClient(null)
}
// --- USABILITY SETTINGS --- // --- USABILITY SETTINGS ---
@ -458,6 +465,7 @@ class MainActivity : AppCompatActivity() {
webSettings.textZoom = 100 webSettings.textZoom = 100
} }
/** /**
* Clear all WebView data when activity is destroyed * Clear all WebView data when activity is destroyed
*/ */

View File

@ -0,0 +1,103 @@
package com.robosats.models
import android.content.res.Configuration
import android.content.res.Resources
import android.os.Build
import android.os.LocaleList
import android.util.Log
import com.robosats.MainActivity
import java.util.Locale
/**
* Manages the app's language settings
* Uses the system's default language if it's one of the supported languages,
* otherwise defaults to English
*/
object LanguageManager {
lateinit var resources: Resources
private val TAG = "LanguageManager"
private val SETTINGS_KEY = "settings_language"
// List of supported language codes based on the app's supported languages
private val SUPPORTED_LANGUAGES = setOf(
"en", // English
"es", // Spanish
"de", // German
"pl", // Polish
"fr", // French
"sw", // Swahili
"ru", // Russian
"ja", // Japanese
"it", // Italian
"pt", // Portuguese
"zh-si", // Simplified Chinese (special handling required)
"zh-tr", // Traditional Chinese (special handling required)
"sv", // Swedish
"cs", // Czech
"th", // Thai
"ca", // Catalan
"eu" // Basque
)
fun init(context: MainActivity) {
resources = context.resources
applySystemLanguage()
}
/**
* Apply the system's default language to the app if it's supported,
* otherwise use English as the default language
* This is called only once during app initialization
*/
fun applySystemLanguage() {
// Get system locale
val systemLocale =
Resources.getSystem().configuration.locales.get(0)
// Determine the locale to use
val localeToUse = getValidatedLocale(systemLocale)
Log.d(TAG, "System locale: ${systemLocale.language}, Using locale: ${localeToUse.language}")
val lang = systemLocale.language
if (EncryptedStorage.getEncryptedStorage(SETTINGS_KEY) == "" && SUPPORTED_LANGUAGES.contains(lang)) {
EncryptedStorage.setEncryptedStorage(SETTINGS_KEY, lang)
}
// Create configuration with the validated locale
val config = Configuration(resources.configuration)
val localeList = LocaleList(localeToUse)
LocaleList.setDefault(localeList)
config.setLocales(localeList)
// Update the configuration
@Suppress("DEPRECATION")
resources.updateConfiguration(config, resources.displayMetrics)
}
/**
* Validates if the system locale is supported by the app
* If not, returns the English locale as default
*/
private fun getValidatedLocale(systemLocale: Locale): Locale {
val languageCode = systemLocale.language
// Handle Chinese special cases
if (languageCode == "zh") {
val country = systemLocale.country
// Check if it's Simplified (China, Singapore) or Traditional (Taiwan, Hong Kong)
return when (country) {
"CN", "SG" -> Locale.SIMPLIFIED_CHINESE
"TW", "HK" -> Locale.TRADITIONAL_CHINESE
else -> Locale.ENGLISH // Default to English for other Chinese variants
}
}
// For other languages, check if they're in our supported list
return if (SUPPORTED_LANGUAGES.contains(languageCode.lowercase())) {
systemLocale
} else {
Locale.ENGLISH // Default to English if language not supported
}
}
}

View File

@ -15,9 +15,18 @@ import org.json.JSONObject
object NostrClient { object NostrClient {
private var subscriptionNotificationId = "robosatsNotificationId" private var subscriptionNotificationId = "robosatsNotificationId"
private var authors = garagePubKeys() private var authors = garagePubKeys()
private var initialized = false
fun init() { fun init() {
if (!initialized) {
try {
RelayPool.register(Client) RelayPool.register(Client)
initialized = true
} catch (e: Exception) {
Log.e("NostrClient", "Error initializing NostrClient: ${e.message}", e)
// Don't set initialized to true if there was an error
}
}
} }
fun stop() { fun stop() {

View File

@ -133,11 +133,20 @@ class NotificationsService : Service() {
} }
override fun onCreate() { override fun onCreate() {
try {
val connectivityManager = val connectivityManager =
(getSystemService(ConnectivityManager::class.java) as ConnectivityManager) (getSystemService(ConnectivityManager::class.java) as ConnectivityManager)
connectivityManager.registerDefaultNetworkCallback(networkCallback) connectivityManager.registerDefaultNetworkCallback(networkCallback)
// Initialize NostrClient safely
NostrClient.init() NostrClient.init()
super.onCreate() super.onCreate()
} catch (e: Exception) {
Log.e("NotificationsService", "Error in onCreate", e)
// Call super.onCreate() even if there's an error to ensure proper service lifecycle
super.onCreate()
}
} }
@RequiresPermission(Manifest.permission.POST_NOTIFICATIONS) @RequiresPermission(Manifest.permission.POST_NOTIFICATIONS)

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">Servei en segon pla</string>
<string name="connection">Connexió</string>
<string name="configuration">Configuració</string>
<string name="robosats_is_running_in_background">Robosats s\'està executant en segon pla cercant notificacions</string>
<string name="notifications">Notificacions</string>
<string name="useOrbotButton">Utilitzar Orbot</string>
<string name="init_tor">Inicialitzant connexió Tor...</string>
<string name="using_orbot">Utilitzant Orbot. Assegureu-vos que està en execució!</string>
<string name="tor_init_error">Error crític: La inicialització de Tor ha fallat. L\'aplicació no pot continuar de manera segura.</string>
<string name="connecting_tor">Connectant a la xarxa Tor...</string>
<string name="still_connecting_tor">Encara connectant a Tor...</string>
<string name="connected_tor">Tor connectat amb èxit. Configurant navegador segur...</string>
<string name="fail_tor">No s\'ha pogut connectar a Tor després de diversos intents. L\'aplicació no pot continuar de manera segura.</string>
<string name="error_tor">"Error en connectar a Tor: "</string>
<string name="setting_tor">Configurant navegació segura amb Tor...</string>
<string name="setting_orbot">Configurant navegació amb Orbot...</string>
<string name="loading_app">Connexió segura establerta. Carregant aplicació...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">Služba na pozadí</string>
<string name="connection">Připojení</string>
<string name="configuration">Konfigurace</string>
<string name="robosats_is_running_in_background">Robosats běží na pozadí a vyhledává oznámení</string>
<string name="notifications">Oznámení</string>
<string name="useOrbotButton">Použít Orbot</string>
<string name="init_tor">Inicializace připojení Tor...</string>
<string name="using_orbot">Používá se Orbot. Ujistěte se, že běží!</string>
<string name="tor_init_error">Kritická chyba: Inicializace Tor selhala. Aplikace nemůže bezpečně pokračovat.</string>
<string name="connecting_tor">Připojování k síti Tor...</string>
<string name="still_connecting_tor">Stále se připojuje k Tor...</string>
<string name="connected_tor">Tor úspěšně připojen. Nastavování bezpečného prohlížeče...</string>
<string name="fail_tor">Nepodařilo se připojit k Tor po několika pokusech. Aplikace nemůže bezpečně pokračovat.</string>
<string name="error_tor">"Chyba při připojování k Tor: "</string>
<string name="setting_tor">Nastavování bezpečného prohlížení přes Tor...</string>
<string name="setting_orbot">Nastavování prohlížení přes Orbot...</string>
<string name="loading_app">Bezpečné připojení navázáno. Načítání aplikace...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">Hintergrunddienst</string>
<string name="connection">Verbindung</string>
<string name="configuration">Konfiguration</string>
<string name="robosats_is_running_in_background">Robosats läuft im Hintergrund und sucht nach Benachrichtigungen</string>
<string name="notifications">Benachrichtigungen</string>
<string name="useOrbotButton">Orbot verwenden</string>
<string name="init_tor">Tor-Verbindung wird initialisiert...</string>
<string name="using_orbot">Orbot wird verwendet. Stellen Sie sicher, dass es läuft!</string>
<string name="tor_init_error">Kritischer Fehler: Tor-Initialisierung fehlgeschlagen. Die App kann nicht sicher fortfahren.</string>
<string name="connecting_tor">Verbindung zum Tor-Netzwerk wird hergestellt...</string>
<string name="still_connecting_tor">Verbindung zu Tor wird noch hergestellt...</string>
<string name="connected_tor">Tor erfolgreich verbunden. Sicherer Browser wird eingerichtet...</string>
<string name="fail_tor">Verbindung zu Tor nach mehreren Versuchen fehlgeschlagen. Die App kann nicht sicher fortfahren.</string>
<string name="error_tor">"Fehler bei der Verbindung zu Tor: "</string>
<string name="setting_tor">Sichere Tor-Navigation wird eingerichtet...</string>
<string name="setting_orbot">Orbot-Navigation wird eingerichtet...</string>
<string name="loading_app">Sichere Verbindung hergestellt. App wird geladen...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">Servicio en segundo plano</string>
<string name="connection">Conexión</string>
<string name="configuration">Configuración</string>
<string name="robosats_is_running_in_background">Robosats está ejecutándose en segundo plano buscando notificaciones</string>
<string name="notifications">Notificaciones</string>
<string name="useOrbotButton">Usar Orbot</string>
<string name="init_tor">Inicializando conexión Tor...</string>
<string name="using_orbot">Usando Orbot. ¡Asegúrese de que esté ejecutándose!</string>
<string name="tor_init_error">Error crítico: Falló la inicialización de Tor. La aplicación no puede proceder de forma segura.</string>
<string name="connecting_tor">Conectando a la red Tor...</string>
<string name="still_connecting_tor">Todavía conectando a Tor...</string>
<string name="connected_tor">Tor conectado exitosamente. Configurando navegador seguro...</string>
<string name="fail_tor">No se pudo conectar a Tor después de múltiples intentos. La aplicación no puede proceder de forma segura.</string>
<string name="error_tor">"Error al conectar a Tor: "</string>
<string name="setting_tor">Configurando navegación segura con Tor...</string>
<string name="setting_orbot">Configurando navegación con Orbot...</string>
<string name="loading_app">Conexión segura establecida. Cargando aplicación...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">Atzeko planoko zerbitzua</string>
<string name="connection">Konexioa</string>
<string name="configuration">Konfigurazioa</string>
<string name="robosats_is_running_in_background">Robosats atzeko planoan exekutatzen ari da jakinarazpenak bilatzen</string>
<string name="notifications">Jakinarazpenak</string>
<string name="useOrbotButton">Orbot erabili</string>
<string name="init_tor">Tor konexioa hasieratzen...</string>
<string name="using_orbot">Orbot erabiltzen. Ziurtatu martxan dagoela!</string>
<string name="tor_init_error">Errore kritikoa: Tor hasieratzeak huts egin du. Aplikazioak ezin du modu seguruan jarraitu.</string>
<string name="connecting_tor">Tor sarera konektatzen...</string>
<string name="still_connecting_tor">Oraindik Tor-era konektatzen...</string>
<string name="connected_tor">Tor arrakastaz konektatu da. Nabigatzaile segurua konfiguratzen...</string>
<string name="fail_tor">Ezin izan da Tor-era konektatu hainbat saiakera eta gero. Aplikazioak ezin du modu seguruan jarraitu.</string>
<string name="error_tor">"Errorea Tor-era konektatzean: "</string>
<string name="setting_tor">Tor-en bidezko nabigazio segurua konfiguratzen...</string>
<string name="setting_orbot">Orbot nabigazioa konfiguratzen...</string>
<string name="loading_app">Konexio segurua ezarri da. Aplikazioa kargatzen...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">Service en arrière-plan</string>
<string name="connection">Connexion</string>
<string name="configuration">Configuration</string>
<string name="robosats_is_running_in_background">Robosats fonctionne en arrière-plan et recherche des notifications</string>
<string name="notifications">Notifications</string>
<string name="useOrbotButton">Utiliser Orbot</string>
<string name="init_tor">Initialisation de la connexion Tor...</string>
<string name="using_orbot">Utilisation d\'Orbot. Assurez-vous qu\'il est en cours d\'exécution !</string>
<string name="tor_init_error">Erreur critique : Échec de l\'initialisation de Tor. L\'application ne peut pas continuer en toute sécurité.</string>
<string name="connecting_tor">Connexion au réseau Tor...</string>
<string name="still_connecting_tor">Toujours en cours de connexion à Tor...</string>
<string name="connected_tor">Tor connecté avec succès. Configuration du navigateur sécurisé...</string>
<string name="fail_tor">Échec de la connexion à Tor après plusieurs tentatives. L\'application ne peut pas continuer en toute sécurité.</string>
<string name="error_tor">"Erreur lors de la connexion à Tor : "</string>
<string name="setting_tor">Configuration de la navigation sécurisée avec Tor...</string>
<string name="setting_orbot">Configuration de la navigation avec Orbot...</string>
<string name="loading_app">Connexion sécurisée établie. Chargement de l\'application...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">Servizio in background</string>
<string name="connection">Connessione</string>
<string name="configuration">Configurazione</string>
<string name="robosats_is_running_in_background">Robosats è in esecuzione in background cercando notifiche</string>
<string name="notifications">Notifiche</string>
<string name="useOrbotButton">Usa Orbot</string>
<string name="init_tor">Inizializzazione connessione Tor...</string>
<string name="using_orbot">Utilizzo di Orbot. Assicurati che sia in esecuzione!</string>
<string name="tor_init_error">Errore critico: Inizializzazione di Tor fallita. L\'app non può procedere in modo sicuro.</string>
<string name="connecting_tor">Connessione alla rete Tor...</string>
<string name="still_connecting_tor">Ancora in connessione a Tor...</string>
<string name="connected_tor">Tor connesso con successo. Configurazione del browser sicuro...</string>
<string name="fail_tor">Impossibile connettersi a Tor dopo diversi tentativi. L\'app non può procedere in modo sicuro.</string>
<string name="error_tor">"Errore durante la connessione a Tor: "</string>
<string name="setting_tor">Configurazione della navigazione sicura con Tor...</string>
<string name="setting_orbot">Configurazione della navigazione con Orbot...</string>
<string name="loading_app">Connessione sicura stabilita. Caricamento dell\'app...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">バックグラウンドサービス</string>
<string name="connection">接続</string>
<string name="configuration">設定</string>
<string name="robosats_is_running_in_background">Robosatsはバックグラウンドで通知を取得しています</string>
<string name="notifications">通知</string>
<string name="useOrbotButton">Orbotを使用</string>
<string name="init_tor">Tor接続を初期化中...</string>
<string name="using_orbot">Orbotを使用中。実行中であることを確認してください</string>
<string name="tor_init_error">重大なエラーTorの初期化に失敗しました。アプリは安全に続行できません。</string>
<string name="connecting_tor">Torネットワークに接続中...</string>
<string name="still_connecting_tor">まだTorに接続中...</string>
<string name="connected_tor">Torに正常に接続されました。セキュアなブラウザを設定中...</string>
<string name="fail_tor">複数回の試行後、Torに接続できませんでした。アプリは安全に続行できません。</string>
<string name="error_tor">"Torへの接続エラー: "</string>
<string name="setting_tor">セキュアなTorブラウジングを設定中...</string>
<string name="setting_orbot">Orbotブラウジングを設定中...</string>
<string name="loading_app">セキュアな接続が確立されました。アプリを読み込み中...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">Usługa w tle</string>
<string name="connection">Połączenie</string>
<string name="configuration">Konfiguracja</string>
<string name="robosats_is_running_in_background">Robosats działa w tle, pobierając powiadomienia</string>
<string name="notifications">Powiadomienia</string>
<string name="useOrbotButton">Użyj Orbot</string>
<string name="init_tor">Inicjalizacja połączenia Tor...</string>
<string name="using_orbot">Korzystanie z Orbot. Upewnij się, że jest uruchomiony!</string>
<string name="tor_init_error">Błąd krytyczny: Inicjalizacja Tor nie powiodła się. Aplikacja nie może bezpiecznie kontynuować.</string>
<string name="connecting_tor">Łączenie z siecią Tor...</string>
<string name="still_connecting_tor">Nadal łączenie z Tor...</string>
<string name="connected_tor">Tor pomyślnie połączony. Konfigurowanie bezpiecznej przeglądarki...</string>
<string name="fail_tor">Nie udało się połączyć z Tor po wielu próbach. Aplikacja nie może bezpiecznie kontynuować.</string>
<string name="error_tor">"Błąd podczas łączenia z Tor: "</string>
<string name="setting_tor">Konfigurowanie bezpiecznego przeglądania przez Tor...</string>
<string name="setting_orbot">Konfigurowanie przeglądania przez Orbot...</string>
<string name="loading_app">Bezpieczne połączenie ustanowione. Ładowanie aplikacji...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">Serviço em segundo plano</string>
<string name="connection">Conexão</string>
<string name="configuration">Configuração</string>
<string name="robosats_is_running_in_background">Robosats está rodando em segundo plano buscando notificações</string>
<string name="notifications">Notificações</string>
<string name="useOrbotButton">Usar Orbot</string>
<string name="init_tor">Inicializando conexão Tor...</string>
<string name="using_orbot">Usando Orbot. Certifique-se de que está rodando!</string>
<string name="tor_init_error">Erro crítico: Falha na inicialização do Tor. O aplicativo não pode prosseguir com segurança.</string>
<string name="connecting_tor">Conectando à rede Tor...</string>
<string name="still_connecting_tor">Ainda conectando ao Tor...</string>
<string name="connected_tor">Tor conectado com sucesso. Configurando navegador seguro...</string>
<string name="fail_tor">Falha ao conectar ao Tor após várias tentativas. O aplicativo não pode prosseguir com segurança.</string>
<string name="error_tor">"Erro ao conectar ao Tor: "</string>
<string name="setting_tor">Configurando navegação segura com Tor...</string>
<string name="setting_orbot">Configurando navegação com Orbot...</string>
<string name="loading_app">Conexão segura estabelecida. Carregando aplicativo...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">Фоновая служба</string>
<string name="connection">Соединение</string>
<string name="configuration">Конфигурация</string>
<string name="robosats_is_running_in_background">Robosats работает в фоновом режиме и ищет уведомления</string>
<string name="notifications">Уведомления</string>
<string name="useOrbotButton">Использовать Orbot</string>
<string name="init_tor">Инициализация соединения Tor...</string>
<string name="using_orbot">Использование Orbot. Убедитесь, что он запущен!</string>
<string name="tor_init_error">Критическая ошибка: Не удалось инициализировать Tor. Приложение не может безопасно продолжить работу.</string>
<string name="connecting_tor">Подключение к сети Tor...</string>
<string name="still_connecting_tor">Всё ещё подключается к Tor...</string>
<string name="connected_tor">Tor успешно подключен. Настройка безопасного браузера...</string>
<string name="fail_tor">Не удалось подключиться к Tor после нескольких попыток. Приложение не может безопасно продолжить работу.</string>
<string name="error_tor">"Ошибка при подключении к Tor: "</string>
<string name="setting_tor">Настройка безопасного просмотра через Tor...</string>
<string name="setting_orbot">Настройка просмотра через Orbot...</string>
<string name="loading_app">Безопасное соединение установлено. Загрузка приложения...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">Bakgrundstjänst</string>
<string name="connection">Anslutning</string>
<string name="configuration">Konfiguration</string>
<string name="robosats_is_running_in_background">Robosats körs i bakgrunden och söker efter meddelanden</string>
<string name="notifications">Meddelanden</string>
<string name="useOrbotButton">Använd Orbot</string>
<string name="init_tor">Initierar Tor-anslutning...</string>
<string name="using_orbot">Använder Orbot. Se till att den körs!</string>
<string name="tor_init_error">Kritiskt fel: Initiering av Tor misslyckades. Appen kan inte fortsätta säkert.</string>
<string name="connecting_tor">Ansluter till Tor-nätverket...</string>
<string name="still_connecting_tor">Fortfarande ansluter till Tor...</string>
<string name="connected_tor">Tor ansluten framgångsrikt. Konfigurerar säker webbläsare...</string>
<string name="fail_tor">Det gick inte att ansluta till Tor efter flera försök. Appen kan inte fortsätta säkert.</string>
<string name="error_tor">"Fel vid anslutning till Tor: "</string>
<string name="setting_tor">Konfigurerar säker Tor-surfning...</string>
<string name="setting_orbot">Konfigurerar Orbot-surfning...</string>
<string name="loading_app">Säker anslutning etablerad. Laddar app...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">Huduma ya Usuli</string>
<string name="connection">Muunganisho</string>
<string name="configuration">Usanidi</string>
<string name="robosats_is_running_in_background">Robosats inaendesha katika usuli ikitafuta arifa</string>
<string name="notifications">Arifa</string>
<string name="useOrbotButton">Tumia Orbot</string>
<string name="init_tor">Inaanzisha muunganisho wa Tor...</string>
<string name="using_orbot">Inatumia Orbot. Hakikisha inafanya kazi!</string>
<string name="tor_init_error">Hitilafu muhimu: Kuanzisha Tor kumeshindwa. Programu haiwezi kuendelea kwa usalama.</string>
<string name="connecting_tor">Inaunganisha kwa mtandao wa Tor...</string>
<string name="still_connecting_tor">Bado inaunganisha na Tor...</string>
<string name="connected_tor">Tor imeunganishwa kwa mafanikio. Inaunda kivinjari salama...</string>
<string name="fail_tor">Imeshindwa kuunganisha na Tor baada ya majaribio mengi. Programu haiwezi kuendelea kwa usalama.</string>
<string name="error_tor">"Hitilafu wakati wa kuunganisha na Tor: "</string>
<string name="setting_tor">Inaunda uvinjari salama wa Tor...</string>
<string name="setting_orbot">Inaunda uvinjari wa Orbot...</string>
<string name="loading_app">Muunganisho salama umeundwa. Inapakia programu...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">บริการเบื้องหลัง</string>
<string name="connection">การเชื่อมต่อ</string>
<string name="configuration">การตั้งค่า</string>
<string name="robosats_is_running_in_background">Robosats กำลังทำงานในเบื้องหลังและค้นหาการแจ้งเตือน</string>
<string name="notifications">การแจ้งเตือน</string>
<string name="useOrbotButton">ใช้ Orbot</string>
<string name="init_tor">กำลังเริ่มต้นการเชื่อมต่อ Tor...</string>
<string name="using_orbot">กำลังใช้ Orbot ตรวจสอบให้แน่ใจว่ากำลังทำงานอยู่!</string>
<string name="tor_init_error">ข้อผิดพลาดร้ายแรง: การเริ่มต้น Tor ล้มเหลว แอปพลิเคชันไม่สามารถดำเนินการต่อได้อย่างปลอดภัย</string>
<string name="connecting_tor">กำลังเชื่อมต่อกับเครือข่าย Tor...</string>
<string name="still_connecting_tor">ยังคงเชื่อมต่อกับ Tor...</string>
<string name="connected_tor">เชื่อมต่อกับ Tor สำเร็จแล้ว กำลังตั้งค่าเบราว์เซอร์ที่ปลอดภัย...</string>
<string name="fail_tor">ไม่สามารถเชื่อมต่อกับ Tor หลังจากพยายามหลายครั้ง แอปพลิเคชันไม่สามารถดำเนินการต่อได้อย่างปลอดภัย</string>
<string name="error_tor">"เกิดข้อผิดพลาดในการเชื่อมต่อกับ Tor: "</string>
<string name="setting_tor">กำลังตั้งค่าการเบราว์ซิ่งที่ปลอดภัยด้วย Tor...</string>
<string name="setting_orbot">กำลังตั้งค่าการเบราว์ซิ่งด้วย Orbot...</string>
<string name="loading_app">การเชื่อมต่อที่ปลอดภัยถูกสร้างขึ้นแล้ว กำลังโหลดแอปพลิเคชัน...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">后台服务</string>
<string name="connection">连接</string>
<string name="configuration">配置</string>
<string name="robosats_is_running_in_background">Robosats 正在后台运行获取通知</string>
<string name="notifications">通知</string>
<string name="useOrbotButton">使用 Orbot</string>
<string name="init_tor">正在初始化 Tor 连接...</string>
<string name="using_orbot">正在使用 Orbot。请确保它正在运行</string>
<string name="tor_init_error">严重错误Tor 初始化失败。应用无法安全地继续。</string>
<string name="connecting_tor">正在连接到 Tor 网络...</string>
<string name="still_connecting_tor">仍在连接到 Tor...</string>
<string name="connected_tor">Tor 成功连接。正在设置安全浏览器...</string>
<string name="fail_tor">多次尝试后无法连接到 Tor。应用无法安全地继续。</string>
<string name="error_tor">"连接到 Tor 时出错: "</string>
<string name="setting_tor">正在设置安全的 Tor 浏览...</string>
<string name="setting_orbot">正在设置 Orbot 浏览...</string>
<string name="loading_app">安全连接已建立。正在加载应用...</string>
</resources>

View File

@ -0,0 +1,20 @@
<resources>
<string name="app_name">Robosats</string>
<string name="service">背景服務</string>
<string name="connection">連接</string>
<string name="configuration">配置</string>
<string name="robosats_is_running_in_background">Robosats 正在背景執行獲取通知</string>
<string name="notifications">通知</string>
<string name="useOrbotButton">使用 Orbot</string>
<string name="init_tor">正在初始化 Tor 連接...</string>
<string name="using_orbot">正在使用 Orbot。請確保它正在運行</string>
<string name="tor_init_error">嚴重錯誤Tor 初始化失敗。應用無法安全地繼續。</string>
<string name="connecting_tor">正在連接到 Tor 網絡...</string>
<string name="still_connecting_tor">仍在連接到 Tor...</string>
<string name="connected_tor">Tor 成功連接。正在設置安全瀏覽器...</string>
<string name="fail_tor">多次嘗試後無法連接到 Tor。應用無法安全地繼續。</string>
<string name="error_tor">"連接到 Tor 時出錯: "</string>
<string name="setting_tor">正在設置安全的 Tor 瀏覽...</string>
<string name="setting_orbot">正在設置 Orbot 瀏覽...</string>
<string name="loading_app">安全連接已建立。正在加載應用...</string>
</resources>

View File

@ -6,4 +6,15 @@
<string name="robosats_is_running_in_background">Robosats is running in background fetching for notifications</string> <string name="robosats_is_running_in_background">Robosats is running in background fetching for notifications</string>
<string name="notifications">Notifications</string> <string name="notifications">Notifications</string>
<string name="useOrbotButton">Use Orbot</string> <string name="useOrbotButton">Use Orbot</string>
<string name="init_tor">Initializing Tor connection...</string>
<string name="using_orbot">Using Orbot. Make sure it\'s running!</string>
<string name="tor_init_error">Critical error: Tor initialization failed. App cannot proceed securely.</string>
<string name="connecting_tor">Connecting to Tor network...</string>
<string name="still_connecting_tor">Still connecting to Tor...</string>
<string name="connected_tor">Tor connected successfully. Setting up secure browser...</string>
<string name="fail_tor">Failed to connect to Tor after multiple attempts. App cannot proceed securely.</string>
<string name="error_tor">"Error connecting to Tor: "</string>
<string name="setting_tor">Setting up secure Tor browsing...</string>
<string name="setting_orbot">Setting up Orbot browsing...</string>
<string name="loading_app">Secure connection established. Loading app...</string>
</resources> </resources>