mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 10:49:06 +01:00
Compare commits
7 Commits
1387-persi
...
remove-bac
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98e5d892a4 | ||
|
|
94f8f68336 | ||
|
|
2f8dd51ef8 | ||
|
|
5dd1c28e77 | ||
|
|
c1d0936a1e | ||
|
|
717be0178a | ||
|
|
34677eb3a7 |
@@ -1,9 +0,0 @@
|
|||||||
Translations for this project are managed through Transifex:
|
|
||||||
|
|
||||||
https://transifex.com/otf/briar
|
|
||||||
|
|
||||||
If you'd like to volunteer as a translator, please create a Transifex account and request to be
|
|
||||||
added to the project's translation team. The Localization Lab has some instructions and advice for
|
|
||||||
translators here:
|
|
||||||
|
|
||||||
https://wiki.localizationlab.org/index.php/Briar
|
|
||||||
@@ -11,8 +11,8 @@ android {
|
|||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 28
|
targetSdkVersion 28
|
||||||
versionCode 10209
|
versionCode 10207
|
||||||
versionName "1.2.9"
|
versionName "1.2.7"
|
||||||
consumerProguardFiles 'proguard-rules.txt'
|
consumerProguardFiles 'proguard-rules.txt'
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|||||||
@@ -9,10 +9,8 @@ import org.briarproject.bramble.api.account.AccountManager;
|
|||||||
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
||||||
import org.briarproject.bramble.api.db.DatabaseConfig;
|
import org.briarproject.bramble.api.db.DatabaseConfig;
|
||||||
import org.briarproject.bramble.api.identity.IdentityManager;
|
import org.briarproject.bramble.api.identity.IdentityManager;
|
||||||
import org.briarproject.bramble.api.logging.PersistentLogManager;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -22,21 +20,17 @@ import javax.annotation.Nullable;
|
|||||||
import javax.annotation.concurrent.GuardedBy;
|
import javax.annotation.concurrent.GuardedBy;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import static android.content.Context.MODE_PRIVATE;
|
|
||||||
import static android.os.Build.VERSION.SDK_INT;
|
import static android.os.Build.VERSION.SDK_INT;
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
import static java.util.logging.Level.INFO;
|
import static java.util.logging.Level.INFO;
|
||||||
import static java.util.logging.Level.WARNING;
|
|
||||||
import static java.util.logging.Logger.getLogger;
|
|
||||||
import static org.briarproject.bramble.util.IoUtils.deleteFileOrDir;
|
import static org.briarproject.bramble.util.IoUtils.deleteFileOrDir;
|
||||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
|
||||||
import static org.briarproject.bramble.util.LogUtils.logFileOrDir;
|
import static org.briarproject.bramble.util.LogUtils.logFileOrDir;
|
||||||
|
|
||||||
class AndroidAccountManager extends AccountManagerImpl
|
class AndroidAccountManager extends AccountManagerImpl
|
||||||
implements AccountManager {
|
implements AccountManager {
|
||||||
|
|
||||||
private static final Logger LOG =
|
private static final Logger LOG =
|
||||||
getLogger(AndroidAccountManager.class.getName());
|
Logger.getLogger(AndroidAccountManager.class.getName());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Directories that shouldn't be deleted when deleting the user's account.
|
* Directories that shouldn't be deleted when deleting the user's account.
|
||||||
@@ -46,16 +40,13 @@ class AndroidAccountManager extends AccountManagerImpl
|
|||||||
|
|
||||||
protected final Context appContext;
|
protected final Context appContext;
|
||||||
private final SharedPreferences prefs;
|
private final SharedPreferences prefs;
|
||||||
private final PersistentLogManager logManager;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
AndroidAccountManager(DatabaseConfig databaseConfig,
|
AndroidAccountManager(DatabaseConfig databaseConfig,
|
||||||
CryptoComponent crypto, IdentityManager identityManager,
|
CryptoComponent crypto, IdentityManager identityManager,
|
||||||
SharedPreferences prefs, PersistentLogManager logManager,
|
SharedPreferences prefs, Application app) {
|
||||||
Application app) {
|
|
||||||
super(databaseConfig, crypto, identityManager);
|
super(databaseConfig, crypto, identityManager);
|
||||||
this.prefs = prefs;
|
this.prefs = prefs;
|
||||||
this.logManager = logManager;
|
|
||||||
appContext = app.getApplicationContext();
|
appContext = app.getApplicationContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,7 +74,6 @@ class AndroidAccountManager extends AccountManagerImpl
|
|||||||
LOG.info("Contents of account directory after deleting:");
|
LOG.info("Contents of account directory after deleting:");
|
||||||
logFileOrDir(LOG, INFO, getDataDir());
|
logFileOrDir(LOG, INFO, getDataDir());
|
||||||
}
|
}
|
||||||
replacePersistentLogger();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,13 +134,4 @@ class AndroidAccountManager extends AccountManagerImpl
|
|||||||
private void addIfNotNull(Set<File> files, @Nullable File file) {
|
private void addIfNotNull(Set<File> files, @Nullable File file) {
|
||||||
if (file != null) files.add(file);
|
if (file != null) files.add(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void replacePersistentLogger() {
|
|
||||||
File logDir = appContext.getDir("log", MODE_PRIVATE);
|
|
||||||
try {
|
|
||||||
logManager.addLogHandler(logDir, getLogger(""));
|
|
||||||
} catch (IOException e) {
|
|
||||||
logException(LOG, WARNING, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import android.content.IntentFilter;
|
|||||||
import org.briarproject.bramble.api.io.TimeoutMonitor;
|
import org.briarproject.bramble.api.io.TimeoutMonitor;
|
||||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.PluginException;
|
import org.briarproject.bramble.api.plugin.PluginException;
|
||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
|
||||||
@@ -82,10 +81,10 @@ class AndroidBluetoothPlugin extends BluetoothPlugin<BluetoothServerSocket> {
|
|||||||
TimeoutMonitor timeoutMonitor, Executor ioExecutor,
|
TimeoutMonitor timeoutMonitor, Executor ioExecutor,
|
||||||
SecureRandom secureRandom, ScheduledExecutorService scheduler,
|
SecureRandom secureRandom, ScheduledExecutorService scheduler,
|
||||||
AndroidExecutor androidExecutor, Context appContext, Clock clock,
|
AndroidExecutor androidExecutor, Context appContext, Clock clock,
|
||||||
Backoff backoff, PluginCallback callback, int maxLatency,
|
PluginCallback callback, int maxLatency, int maxIdleTime,
|
||||||
int maxIdleTime) {
|
int pollingInterval) {
|
||||||
super(connectionLimiter, timeoutMonitor, ioExecutor, secureRandom,
|
super(connectionLimiter, timeoutMonitor, ioExecutor, secureRandom,
|
||||||
backoff, callback, maxLatency, maxIdleTime);
|
callback, maxLatency, maxIdleTime, pollingInterval);
|
||||||
this.scheduler = scheduler;
|
this.scheduler = scheduler;
|
||||||
this.androidExecutor = androidExecutor;
|
this.androidExecutor = androidExecutor;
|
||||||
this.appContext = appContext;
|
this.appContext = appContext;
|
||||||
|
|||||||
@@ -5,8 +5,6 @@ import android.content.Context;
|
|||||||
import org.briarproject.bramble.api.event.EventBus;
|
import org.briarproject.bramble.api.event.EventBus;
|
||||||
import org.briarproject.bramble.api.io.TimeoutMonitor;
|
import org.briarproject.bramble.api.io.TimeoutMonitor;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.BackoffFactory;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
||||||
@@ -20,17 +18,17 @@ import java.util.concurrent.ScheduledExecutorService;
|
|||||||
|
|
||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
|
|
||||||
|
import static java.util.concurrent.TimeUnit.MINUTES;
|
||||||
|
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||||
import static org.briarproject.bramble.api.plugin.BluetoothConstants.ID;
|
import static org.briarproject.bramble.api.plugin.BluetoothConstants.ID;
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public class AndroidBluetoothPluginFactory implements DuplexPluginFactory {
|
public class AndroidBluetoothPluginFactory implements DuplexPluginFactory {
|
||||||
|
|
||||||
private static final int MAX_LATENCY = 30 * 1000; // 30 seconds
|
private static final int MAX_LATENCY = (int) SECONDS.toMillis(30);
|
||||||
private static final int MAX_IDLE_TIME = 30 * 1000; // 30 seconds
|
private static final int MAX_IDLE_TIME = (int) SECONDS.toMillis(30);
|
||||||
private static final int MIN_POLLING_INTERVAL = 60 * 1000; // 1 minute
|
private static final int POLLING_INTERVAL = (int) MINUTES.toMillis(2);
|
||||||
private static final int MAX_POLLING_INTERVAL = 10 * 60 * 1000; // 10 mins
|
|
||||||
private static final double BACKOFF_BASE = 1.2;
|
|
||||||
|
|
||||||
private final Executor ioExecutor;
|
private final Executor ioExecutor;
|
||||||
private final ScheduledExecutorService scheduler;
|
private final ScheduledExecutorService scheduler;
|
||||||
@@ -40,13 +38,12 @@ public class AndroidBluetoothPluginFactory implements DuplexPluginFactory {
|
|||||||
private final EventBus eventBus;
|
private final EventBus eventBus;
|
||||||
private final Clock clock;
|
private final Clock clock;
|
||||||
private final TimeoutMonitor timeoutMonitor;
|
private final TimeoutMonitor timeoutMonitor;
|
||||||
private final BackoffFactory backoffFactory;
|
|
||||||
|
|
||||||
public AndroidBluetoothPluginFactory(Executor ioExecutor,
|
public AndroidBluetoothPluginFactory(Executor ioExecutor,
|
||||||
ScheduledExecutorService scheduler,
|
ScheduledExecutorService scheduler,
|
||||||
AndroidExecutor androidExecutor, Context appContext,
|
AndroidExecutor androidExecutor, Context appContext,
|
||||||
SecureRandom secureRandom, EventBus eventBus, Clock clock,
|
SecureRandom secureRandom, EventBus eventBus, Clock clock,
|
||||||
TimeoutMonitor timeoutMonitor, BackoffFactory backoffFactory) {
|
TimeoutMonitor timeoutMonitor) {
|
||||||
this.ioExecutor = ioExecutor;
|
this.ioExecutor = ioExecutor;
|
||||||
this.scheduler = scheduler;
|
this.scheduler = scheduler;
|
||||||
this.androidExecutor = androidExecutor;
|
this.androidExecutor = androidExecutor;
|
||||||
@@ -55,7 +52,6 @@ public class AndroidBluetoothPluginFactory implements DuplexPluginFactory {
|
|||||||
this.eventBus = eventBus;
|
this.eventBus = eventBus;
|
||||||
this.clock = clock;
|
this.clock = clock;
|
||||||
this.timeoutMonitor = timeoutMonitor;
|
this.timeoutMonitor = timeoutMonitor;
|
||||||
this.backoffFactory = backoffFactory;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -72,12 +68,10 @@ public class AndroidBluetoothPluginFactory implements DuplexPluginFactory {
|
|||||||
public DuplexPlugin createPlugin(PluginCallback callback) {
|
public DuplexPlugin createPlugin(PluginCallback callback) {
|
||||||
BluetoothConnectionLimiter connectionLimiter =
|
BluetoothConnectionLimiter connectionLimiter =
|
||||||
new BluetoothConnectionLimiterImpl(eventBus);
|
new BluetoothConnectionLimiterImpl(eventBus);
|
||||||
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
|
|
||||||
MAX_POLLING_INTERVAL, BACKOFF_BASE);
|
|
||||||
AndroidBluetoothPlugin plugin = new AndroidBluetoothPlugin(
|
AndroidBluetoothPlugin plugin = new AndroidBluetoothPlugin(
|
||||||
connectionLimiter, timeoutMonitor, ioExecutor, secureRandom,
|
connectionLimiter, timeoutMonitor, ioExecutor, secureRandom,
|
||||||
scheduler, androidExecutor, appContext, clock, backoff,
|
scheduler, androidExecutor, appContext, clock, callback,
|
||||||
callback, MAX_LATENCY, MAX_IDLE_TIME);
|
MAX_LATENCY, MAX_IDLE_TIME, POLLING_INTERVAL);
|
||||||
eventBus.addListener(plugin);
|
eventBus.addListener(plugin);
|
||||||
return plugin;
|
return plugin;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import org.briarproject.bramble.api.Pair;
|
|||||||
import org.briarproject.bramble.api.event.Event;
|
import org.briarproject.bramble.api.event.Event;
|
||||||
import org.briarproject.bramble.api.network.event.NetworkStatusEvent;
|
import org.briarproject.bramble.api.network.event.NetworkStatusEvent;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.settings.Settings;
|
import org.briarproject.bramble.api.settings.Settings;
|
||||||
|
|
||||||
@@ -62,9 +61,9 @@ class AndroidLanTcpPlugin extends LanTcpPlugin {
|
|||||||
private volatile SocketFactory socketFactory;
|
private volatile SocketFactory socketFactory;
|
||||||
|
|
||||||
AndroidLanTcpPlugin(Executor ioExecutor, Context appContext,
|
AndroidLanTcpPlugin(Executor ioExecutor, Context appContext,
|
||||||
Backoff backoff, PluginCallback callback, int maxLatency,
|
PluginCallback callback, int maxLatency, int maxIdleTime,
|
||||||
int maxIdleTime, int connectionTimeout) {
|
int pollingInterval, int connectionTimeout) {
|
||||||
super(ioExecutor, backoff, callback, maxLatency, maxIdleTime,
|
super(ioExecutor, callback, maxLatency, maxIdleTime, pollingInterval,
|
||||||
connectionTimeout);
|
connectionTimeout);
|
||||||
// Don't execute more than one connection status check at a time
|
// Don't execute more than one connection status check at a time
|
||||||
connectionStatusExecutor =
|
connectionStatusExecutor =
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import android.content.Context;
|
|||||||
|
|
||||||
import org.briarproject.bramble.api.event.EventBus;
|
import org.briarproject.bramble.api.event.EventBus;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.BackoffFactory;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
||||||
@@ -15,29 +13,27 @@ import java.util.concurrent.Executor;
|
|||||||
|
|
||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
|
|
||||||
|
import static java.util.concurrent.TimeUnit.MINUTES;
|
||||||
|
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||||
import static org.briarproject.bramble.api.plugin.LanTcpConstants.ID;
|
import static org.briarproject.bramble.api.plugin.LanTcpConstants.ID;
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public class AndroidLanTcpPluginFactory implements DuplexPluginFactory {
|
public class AndroidLanTcpPluginFactory implements DuplexPluginFactory {
|
||||||
|
|
||||||
private static final int MAX_LATENCY = 30_000; // 30 seconds
|
private static final int MAX_LATENCY = (int) SECONDS.toMillis(30);
|
||||||
private static final int MAX_IDLE_TIME = 30_000; // 30 seconds
|
private static final int MAX_IDLE_TIME = (int) SECONDS.toMillis(30);
|
||||||
private static final int CONNECTION_TIMEOUT = 3_000; // 3 seconds
|
private static final int POLLING_INTERVAL = (int) MINUTES.toMillis(1);
|
||||||
private static final int MIN_POLLING_INTERVAL = 60_000; // 1 minute
|
private static final int CONNECTION_TIMEOUT = (int) SECONDS.toMillis(3);
|
||||||
private static final int MAX_POLLING_INTERVAL = 600_000; // 10 mins
|
|
||||||
private static final double BACKOFF_BASE = 1.2;
|
|
||||||
|
|
||||||
private final Executor ioExecutor;
|
private final Executor ioExecutor;
|
||||||
private final EventBus eventBus;
|
private final EventBus eventBus;
|
||||||
private final BackoffFactory backoffFactory;
|
|
||||||
private final Context appContext;
|
private final Context appContext;
|
||||||
|
|
||||||
public AndroidLanTcpPluginFactory(Executor ioExecutor, EventBus eventBus,
|
public AndroidLanTcpPluginFactory(Executor ioExecutor, EventBus eventBus,
|
||||||
BackoffFactory backoffFactory, Context appContext) {
|
Context appContext) {
|
||||||
this.ioExecutor = ioExecutor;
|
this.ioExecutor = ioExecutor;
|
||||||
this.eventBus = eventBus;
|
this.eventBus = eventBus;
|
||||||
this.backoffFactory = backoffFactory;
|
|
||||||
this.appContext = appContext;
|
this.appContext = appContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,11 +49,9 @@ public class AndroidLanTcpPluginFactory implements DuplexPluginFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DuplexPlugin createPlugin(PluginCallback callback) {
|
public DuplexPlugin createPlugin(PluginCallback callback) {
|
||||||
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
|
|
||||||
MAX_POLLING_INTERVAL, BACKOFF_BASE);
|
|
||||||
AndroidLanTcpPlugin plugin = new AndroidLanTcpPlugin(ioExecutor,
|
AndroidLanTcpPlugin plugin = new AndroidLanTcpPlugin(ioExecutor,
|
||||||
appContext, backoff, callback, MAX_LATENCY, MAX_IDLE_TIME,
|
appContext, callback, MAX_LATENCY, MAX_IDLE_TIME,
|
||||||
CONNECTION_TIMEOUT);
|
POLLING_INTERVAL, CONNECTION_TIMEOUT);
|
||||||
eventBus.addListener(plugin);
|
eventBus.addListener(plugin);
|
||||||
return plugin;
|
return plugin;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import org.briarproject.bramble.api.battery.BatteryManager;
|
|||||||
import org.briarproject.bramble.api.network.NetworkManager;
|
import org.briarproject.bramble.api.network.NetworkManager;
|
||||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.system.Clock;
|
import org.briarproject.bramble.api.system.Clock;
|
||||||
import org.briarproject.bramble.api.system.LocationUtils;
|
import org.briarproject.bramble.api.system.LocationUtils;
|
||||||
@@ -41,13 +40,15 @@ class AndroidTorPlugin extends TorPlugin {
|
|||||||
LocationUtils locationUtils, SocketFactory torSocketFactory,
|
LocationUtils locationUtils, SocketFactory torSocketFactory,
|
||||||
Clock clock, ResourceProvider resourceProvider,
|
Clock clock, ResourceProvider resourceProvider,
|
||||||
CircumventionProvider circumventionProvider,
|
CircumventionProvider circumventionProvider,
|
||||||
BatteryManager batteryManager, Backoff backoff,
|
BatteryManager batteryManager,
|
||||||
TorRendezvousCrypto torRendezvousCrypto,
|
TorRendezvousCrypto torRendezvousCrypto,
|
||||||
PluginCallback callback, String architecture, int maxLatency,
|
PluginCallback callback, String architecture, int maxLatency,
|
||||||
int maxIdleTime) {
|
int maxIdleTime, int initialPollingInterval,
|
||||||
|
int stablePollingInterval) {
|
||||||
super(ioExecutor, networkManager, locationUtils, torSocketFactory,
|
super(ioExecutor, networkManager, locationUtils, torSocketFactory,
|
||||||
clock, resourceProvider, circumventionProvider, batteryManager,
|
clock, resourceProvider, circumventionProvider, batteryManager,
|
||||||
backoff, torRendezvousCrypto, callback, architecture, maxLatency, maxIdleTime,
|
torRendezvousCrypto, callback, architecture, maxLatency,
|
||||||
|
maxIdleTime, initialPollingInterval, stablePollingInterval,
|
||||||
appContext.getDir("tor", MODE_PRIVATE));
|
appContext.getDir("tor", MODE_PRIVATE));
|
||||||
this.appContext = appContext;
|
this.appContext = appContext;
|
||||||
PowerManager pm = (PowerManager)
|
PowerManager pm = (PowerManager)
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ import org.briarproject.bramble.api.battery.BatteryManager;
|
|||||||
import org.briarproject.bramble.api.event.EventBus;
|
import org.briarproject.bramble.api.event.EventBus;
|
||||||
import org.briarproject.bramble.api.network.NetworkManager;
|
import org.briarproject.bramble.api.network.NetworkManager;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.BackoffFactory;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.TorConstants;
|
import org.briarproject.bramble.api.plugin.TorConstants;
|
||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
@@ -25,18 +23,33 @@ import java.util.logging.Logger;
|
|||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
import javax.net.SocketFactory;
|
import javax.net.SocketFactory;
|
||||||
|
|
||||||
|
import static java.util.concurrent.TimeUnit.MINUTES;
|
||||||
|
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||||
|
import static java.util.logging.Logger.getLogger;
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public class AndroidTorPluginFactory implements DuplexPluginFactory {
|
public class AndroidTorPluginFactory implements DuplexPluginFactory {
|
||||||
|
|
||||||
private static final Logger LOG =
|
private static final Logger LOG =
|
||||||
Logger.getLogger(AndroidTorPluginFactory.class.getName());
|
getLogger(AndroidTorPluginFactory.class.getName());
|
||||||
|
|
||||||
private static final int MAX_LATENCY = 30 * 1000; // 30 seconds
|
private static final int MAX_LATENCY = (int) SECONDS.toMillis(30);
|
||||||
private static final int MAX_IDLE_TIME = 30 * 1000; // 30 seconds
|
private static final int MAX_IDLE_TIME = (int) SECONDS.toMillis(30);
|
||||||
private static final int MIN_POLLING_INTERVAL = 60 * 1000; // 1 minute
|
|
||||||
private static final int MAX_POLLING_INTERVAL = 10 * 60 * 1000; // 10 mins
|
/**
|
||||||
private static final double BACKOFF_BASE = 1.2;
|
* How often to poll before our hidden service becomes reachable.
|
||||||
|
*/
|
||||||
|
private static final int INITIAL_POLLING_INTERVAL =
|
||||||
|
(int) MINUTES.toMillis(1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How often to poll when our hidden service is reachable. Our contacts
|
||||||
|
* will poll when they come online, so our polling is just a fallback in
|
||||||
|
* case of repeated connection failures.
|
||||||
|
*/
|
||||||
|
private static final int STABLE_POLLING_INTERVAL =
|
||||||
|
(int) MINUTES.toMillis(15);
|
||||||
|
|
||||||
private final Executor ioExecutor;
|
private final Executor ioExecutor;
|
||||||
private final ScheduledExecutorService scheduler;
|
private final ScheduledExecutorService scheduler;
|
||||||
@@ -45,7 +58,6 @@ public class AndroidTorPluginFactory implements DuplexPluginFactory {
|
|||||||
private final LocationUtils locationUtils;
|
private final LocationUtils locationUtils;
|
||||||
private final EventBus eventBus;
|
private final EventBus eventBus;
|
||||||
private final SocketFactory torSocketFactory;
|
private final SocketFactory torSocketFactory;
|
||||||
private final BackoffFactory backoffFactory;
|
|
||||||
private final ResourceProvider resourceProvider;
|
private final ResourceProvider resourceProvider;
|
||||||
private final CircumventionProvider circumventionProvider;
|
private final CircumventionProvider circumventionProvider;
|
||||||
private final BatteryManager batteryManager;
|
private final BatteryManager batteryManager;
|
||||||
@@ -55,7 +67,7 @@ public class AndroidTorPluginFactory implements DuplexPluginFactory {
|
|||||||
ScheduledExecutorService scheduler, Context appContext,
|
ScheduledExecutorService scheduler, Context appContext,
|
||||||
NetworkManager networkManager, LocationUtils locationUtils,
|
NetworkManager networkManager, LocationUtils locationUtils,
|
||||||
EventBus eventBus, SocketFactory torSocketFactory,
|
EventBus eventBus, SocketFactory torSocketFactory,
|
||||||
BackoffFactory backoffFactory, ResourceProvider resourceProvider,
|
ResourceProvider resourceProvider,
|
||||||
CircumventionProvider circumventionProvider,
|
CircumventionProvider circumventionProvider,
|
||||||
BatteryManager batteryManager, Clock clock) {
|
BatteryManager batteryManager, Clock clock) {
|
||||||
this.ioExecutor = ioExecutor;
|
this.ioExecutor = ioExecutor;
|
||||||
@@ -65,7 +77,6 @@ public class AndroidTorPluginFactory implements DuplexPluginFactory {
|
|||||||
this.locationUtils = locationUtils;
|
this.locationUtils = locationUtils;
|
||||||
this.eventBus = eventBus;
|
this.eventBus = eventBus;
|
||||||
this.torSocketFactory = torSocketFactory;
|
this.torSocketFactory = torSocketFactory;
|
||||||
this.backoffFactory = backoffFactory;
|
|
||||||
this.resourceProvider = resourceProvider;
|
this.resourceProvider = resourceProvider;
|
||||||
this.circumventionProvider = circumventionProvider;
|
this.circumventionProvider = circumventionProvider;
|
||||||
this.batteryManager = batteryManager;
|
this.batteryManager = batteryManager;
|
||||||
@@ -109,14 +120,13 @@ public class AndroidTorPluginFactory implements DuplexPluginFactory {
|
|||||||
// Use position-independent executable
|
// Use position-independent executable
|
||||||
architecture += "_pie";
|
architecture += "_pie";
|
||||||
|
|
||||||
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
|
|
||||||
MAX_POLLING_INTERVAL, BACKOFF_BASE);
|
|
||||||
TorRendezvousCrypto torRendezvousCrypto = new TorRendezvousCryptoImpl();
|
TorRendezvousCrypto torRendezvousCrypto = new TorRendezvousCryptoImpl();
|
||||||
AndroidTorPlugin plugin = new AndroidTorPlugin(ioExecutor, scheduler,
|
AndroidTorPlugin plugin = new AndroidTorPlugin(ioExecutor, scheduler,
|
||||||
appContext, networkManager, locationUtils, torSocketFactory,
|
appContext, networkManager, locationUtils, torSocketFactory,
|
||||||
clock, resourceProvider, circumventionProvider, batteryManager,
|
clock, resourceProvider, circumventionProvider, batteryManager,
|
||||||
backoff, torRendezvousCrypto, callback, architecture,
|
torRendezvousCrypto, callback, architecture, MAX_LATENCY,
|
||||||
MAX_LATENCY, MAX_IDLE_TIME);
|
MAX_IDLE_TIME, INITIAL_POLLING_INTERVAL,
|
||||||
|
STABLE_POLLING_INTERVAL);
|
||||||
eventBus.addListener(plugin);
|
eventBus.addListener(plugin);
|
||||||
return plugin;
|
return plugin;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import android.content.pm.ApplicationInfo;
|
|||||||
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
||||||
import org.briarproject.bramble.api.db.DatabaseConfig;
|
import org.briarproject.bramble.api.db.DatabaseConfig;
|
||||||
import org.briarproject.bramble.api.identity.IdentityManager;
|
import org.briarproject.bramble.api.identity.IdentityManager;
|
||||||
import org.briarproject.bramble.api.logging.PersistentLogManager;
|
|
||||||
import org.briarproject.bramble.test.BrambleMockTestCase;
|
import org.briarproject.bramble.test.BrambleMockTestCase;
|
||||||
import org.jmock.Expectations;
|
import org.jmock.Expectations;
|
||||||
import org.jmock.lib.legacy.ClassImposteriser;
|
import org.jmock.lib.legacy.ClassImposteriser;
|
||||||
@@ -16,9 +15,7 @@ import org.junit.Before;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import static android.content.Context.MODE_PRIVATE;
|
|
||||||
import static junit.framework.Assert.assertFalse;
|
import static junit.framework.Assert.assertFalse;
|
||||||
import static junit.framework.Assert.assertTrue;
|
import static junit.framework.Assert.assertTrue;
|
||||||
import static org.briarproject.bramble.test.TestUtils.deleteTestDirectory;
|
import static org.briarproject.bramble.test.TestUtils.deleteTestDirectory;
|
||||||
@@ -30,8 +27,6 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
|
|||||||
context.mock(SharedPreferences.class, "prefs");
|
context.mock(SharedPreferences.class, "prefs");
|
||||||
private final SharedPreferences defaultPrefs =
|
private final SharedPreferences defaultPrefs =
|
||||||
context.mock(SharedPreferences.class, "defaultPrefs");
|
context.mock(SharedPreferences.class, "defaultPrefs");
|
||||||
private final PersistentLogManager logManager =
|
|
||||||
context.mock(PersistentLogManager.class);
|
|
||||||
private final DatabaseConfig databaseConfig =
|
private final DatabaseConfig databaseConfig =
|
||||||
context.mock(DatabaseConfig.class);
|
context.mock(DatabaseConfig.class);
|
||||||
private final CryptoComponent crypto = context.mock(CryptoComponent.class);
|
private final CryptoComponent crypto = context.mock(CryptoComponent.class);
|
||||||
@@ -45,7 +40,6 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
|
|||||||
private final File testDir = getTestDirectory();
|
private final File testDir = getTestDirectory();
|
||||||
private final File keyDir = new File(testDir, "key");
|
private final File keyDir = new File(testDir, "key");
|
||||||
private final File dbDir = new File(testDir, "db");
|
private final File dbDir = new File(testDir, "db");
|
||||||
private final File logDir = new File(testDir, "log");
|
|
||||||
|
|
||||||
private AndroidAccountManager accountManager;
|
private AndroidAccountManager accountManager;
|
||||||
|
|
||||||
@@ -67,7 +61,7 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
|
|||||||
will(returnValue(app));
|
will(returnValue(app));
|
||||||
}});
|
}});
|
||||||
accountManager = new AndroidAccountManager(databaseConfig, crypto,
|
accountManager = new AndroidAccountManager(databaseConfig, crypto,
|
||||||
identityManager, prefs, logManager, app) {
|
identityManager, prefs, app) {
|
||||||
@Override
|
@Override
|
||||||
SharedPreferences getDefaultSharedPreferences() {
|
SharedPreferences getDefaultSharedPreferences() {
|
||||||
return defaultPrefs;
|
return defaultPrefs;
|
||||||
@@ -115,15 +109,10 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
|
|||||||
will(returnValue(cacheDir));
|
will(returnValue(cacheDir));
|
||||||
oneOf(app).getExternalCacheDir();
|
oneOf(app).getExternalCacheDir();
|
||||||
will(returnValue(externalCacheDir));
|
will(returnValue(externalCacheDir));
|
||||||
oneOf(app).getDir("log", MODE_PRIVATE);
|
|
||||||
will(returnValue(logDir));
|
|
||||||
oneOf(logManager).addLogHandler(with(logDir),
|
|
||||||
with(any(Logger.class)));
|
|
||||||
}});
|
}});
|
||||||
|
|
||||||
assertTrue(dbDir.mkdirs());
|
assertTrue(dbDir.mkdirs());
|
||||||
assertTrue(keyDir.mkdirs());
|
assertTrue(keyDir.mkdirs());
|
||||||
assertTrue(logDir.mkdirs());
|
|
||||||
assertTrue(codeCacheDir.mkdirs());
|
assertTrue(codeCacheDir.mkdirs());
|
||||||
assertTrue(codeCacheFile.createNewFile());
|
assertTrue(codeCacheFile.createNewFile());
|
||||||
assertTrue(libDir.mkdirs());
|
assertTrue(libDir.mkdirs());
|
||||||
@@ -141,7 +130,6 @@ public class AndroidAccountManagerTest extends BrambleMockTestCase {
|
|||||||
|
|
||||||
assertFalse(dbDir.exists());
|
assertFalse(dbDir.exists());
|
||||||
assertFalse(keyDir.exists());
|
assertFalse(keyDir.exists());
|
||||||
assertFalse(logDir.exists());
|
|
||||||
assertTrue(codeCacheDir.exists());
|
assertTrue(codeCacheDir.exists());
|
||||||
assertTrue(codeCacheFile.exists());
|
assertTrue(codeCacheFile.exists());
|
||||||
assertTrue(libDir.exists());
|
assertTrue(libDir.exists());
|
||||||
|
|||||||
@@ -1,16 +1,8 @@
|
|||||||
package org.briarproject.bramble.api;
|
package org.briarproject.bramble.api;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
|
||||||
|
|
||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import static org.briarproject.bramble.util.StringUtils.fromHexString;
|
|
||||||
import static org.briarproject.bramble.util.StringUtils.toHexString;
|
|
||||||
|
|
||||||
@NotNullByDefault
|
|
||||||
public abstract class StringMap extends Hashtable<String, String> {
|
public abstract class StringMap extends Hashtable<String, String> {
|
||||||
|
|
||||||
protected StringMap(Map<String, String> m) {
|
protected StringMap(Map<String, String> m) {
|
||||||
@@ -60,19 +52,4 @@ public abstract class StringMap extends Hashtable<String, String> {
|
|||||||
public void putLong(String key, long value) {
|
public void putLong(String key, long value) {
|
||||||
put(key, String.valueOf(value));
|
put(key, String.valueOf(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public byte[] getBytes(String key) {
|
|
||||||
String s = get(key);
|
|
||||||
if (s == null) return null;
|
|
||||||
try {
|
|
||||||
return fromHexString(s);
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void putBytes(String key, byte[] value) {
|
|
||||||
put(key, toHexString(value));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,10 +19,4 @@ public interface StreamDecrypterFactory {
|
|||||||
*/
|
*/
|
||||||
StreamDecrypter createContactExchangeStreamDecrypter(InputStream in,
|
StreamDecrypter createContactExchangeStreamDecrypter(InputStream in,
|
||||||
SecretKey headerKey);
|
SecretKey headerKey);
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a {@link StreamDecrypter} for decrypting a log stream.
|
|
||||||
*/
|
|
||||||
StreamDecrypter createLogStreamDecrypter(InputStream in,
|
|
||||||
SecretKey headerKey);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,12 +17,6 @@ public interface StreamEncrypterFactory {
|
|||||||
* Creates a {@link StreamEncrypter} for encrypting a contact exchange
|
* Creates a {@link StreamEncrypter} for encrypting a contact exchange
|
||||||
* stream.
|
* stream.
|
||||||
*/
|
*/
|
||||||
StreamEncrypter createContactExchangeStreamEncrypter(OutputStream out,
|
StreamEncrypter createContactExchangeStreamDecrypter(OutputStream out,
|
||||||
SecretKey headerKey);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a {@link StreamEncrypter} for encrypting a log stream.
|
|
||||||
*/
|
|
||||||
StreamEncrypter createLogStreamEncrypter(OutputStream out,
|
|
||||||
SecretKey headerKey);
|
SecretKey headerKey);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,46 +0,0 @@
|
|||||||
package org.briarproject.bramble.api.logging;
|
|
||||||
|
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
|
||||||
import org.briarproject.bramble.api.settings.Settings;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Scanner;
|
|
||||||
import java.util.logging.Handler;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
@NotNullByDefault
|
|
||||||
public interface PersistentLogManager {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The namespace of the (@link Settings) where the log key is stored.
|
|
||||||
*/
|
|
||||||
String LOG_SETTINGS_NAMESPACE = "log";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The {@link Settings} key under which the log key is stored.
|
|
||||||
*/
|
|
||||||
String LOG_KEY_KEY = "logKey";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and returns a persistent log handler that stores its logs in
|
|
||||||
* the given directory.
|
|
||||||
*/
|
|
||||||
Handler createLogHandler(File dir) throws IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a persistent log handler that stores its logs in the given
|
|
||||||
* directory and adds the handler to the given logger, replacing any
|
|
||||||
* existing persistent log handler.
|
|
||||||
*/
|
|
||||||
void addLogHandler(File dir, Logger logger) throws IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a {@link Scanner} for reading the persistent log entries stored
|
|
||||||
* in the given directory.
|
|
||||||
*
|
|
||||||
* @param old True if the previous session's log should be loaded, or false
|
|
||||||
* if the current session's log should be loaded
|
|
||||||
*/
|
|
||||||
Scanner getPersistedLog(File dir, boolean old) throws IOException;
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
package org.briarproject.bramble.api.plugin;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates polling intervals for transport plugins that use backoff.
|
|
||||||
*/
|
|
||||||
public interface Backoff {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the current polling interval.
|
|
||||||
*/
|
|
||||||
int getPollingInterval();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Increments the backoff counter.
|
|
||||||
*/
|
|
||||||
void increment();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets the backoff counter.
|
|
||||||
*/
|
|
||||||
void reset();
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
package org.briarproject.bramble.api.plugin;
|
|
||||||
|
|
||||||
public interface BackoffFactory {
|
|
||||||
|
|
||||||
Backoff createBackoff(int minInterval, int maxInterval,
|
|
||||||
double base);
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package org.briarproject.bramble.api.plugin;
|
package org.briarproject.bramble.api.plugin;
|
||||||
|
|
||||||
|
import static java.util.concurrent.TimeUnit.DAYS;
|
||||||
|
|
||||||
public interface TorConstants {
|
public interface TorConstants {
|
||||||
|
|
||||||
TransportId ID = new TransportId("org.briarproject.bramble.tor");
|
TransportId ID = new TransportId("org.briarproject.bramble.tor");
|
||||||
@@ -19,6 +21,14 @@ public interface TorConstants {
|
|||||||
String PREF_TOR_PORT = "port";
|
String PREF_TOR_PORT = "port";
|
||||||
String PREF_TOR_MOBILE = "useMobileData";
|
String PREF_TOR_MOBILE = "useMobileData";
|
||||||
String PREF_TOR_ONLY_WHEN_CHARGING = "onlyWhenCharging";
|
String PREF_TOR_ONLY_WHEN_CHARGING = "onlyWhenCharging";
|
||||||
|
String HS_PRIVATE_KEY_V2 = "onionPrivKey";
|
||||||
|
String HS_PRIVATE_KEY_V3 = "onionPrivKey3";
|
||||||
|
String HS_V3_CREATED = "onionPrivKey3Created";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How long to publish a v3 hidden service before retiring the v2 service.
|
||||||
|
*/
|
||||||
|
long V3_MIGRATION_PERIOD_MS = DAYS.toMillis(180);
|
||||||
|
|
||||||
// Values for PREF_TOR_NETWORK
|
// Values for PREF_TOR_NETWORK
|
||||||
int PREF_TOR_NETWORK_AUTOMATIC = 0;
|
int PREF_TOR_NETWORK_AUTOMATIC = 0;
|
||||||
|
|||||||
@@ -16,13 +16,8 @@ public interface StreamReaderFactory {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an {@link InputStream InputStream} for reading from a contact
|
* Creates an {@link InputStream InputStream} for reading from a contact
|
||||||
* exchange stream.
|
* exchangestream.
|
||||||
*/
|
*/
|
||||||
InputStream createContactExchangeStreamReader(InputStream in,
|
InputStream createContactExchangeStreamReader(InputStream in,
|
||||||
SecretKey headerKey);
|
SecretKey headerKey);
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an {@link InputStream} for reading from a log stream.
|
|
||||||
*/
|
|
||||||
InputStream createLogStreamReader(InputStream in, SecretKey headerKey);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,18 +9,15 @@ import java.io.OutputStream;
|
|||||||
public interface StreamWriterFactory {
|
public interface StreamWriterFactory {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a {@link StreamWriter} for writing to a transport stream.
|
* Creates an {@link OutputStream OutputStream} for writing to a
|
||||||
|
* transport stream
|
||||||
*/
|
*/
|
||||||
StreamWriter createStreamWriter(OutputStream out, StreamContext ctx);
|
StreamWriter createStreamWriter(OutputStream out, StreamContext ctx);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a {@link StreamWriter} for writing to a contact exchange stream.
|
* Creates an {@link OutputStream OutputStream} for writing to a contact
|
||||||
|
* exchange stream.
|
||||||
*/
|
*/
|
||||||
StreamWriter createContactExchangeStreamWriter(OutputStream out,
|
StreamWriter createContactExchangeStreamWriter(OutputStream out,
|
||||||
SecretKey headerKey);
|
SecretKey headerKey);
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a {@link StreamWriter} for writing to a log stream.
|
|
||||||
*/
|
|
||||||
StreamWriter createLogStreamWriter(OutputStream out, SecretKey headerKey);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import org.briarproject.bramble.identity.IdentityModule;
|
|||||||
import org.briarproject.bramble.io.IoModule;
|
import org.briarproject.bramble.io.IoModule;
|
||||||
import org.briarproject.bramble.keyagreement.KeyAgreementModule;
|
import org.briarproject.bramble.keyagreement.KeyAgreementModule;
|
||||||
import org.briarproject.bramble.lifecycle.LifecycleModule;
|
import org.briarproject.bramble.lifecycle.LifecycleModule;
|
||||||
import org.briarproject.bramble.logging.LoggingModule;
|
|
||||||
import org.briarproject.bramble.plugin.PluginModule;
|
import org.briarproject.bramble.plugin.PluginModule;
|
||||||
import org.briarproject.bramble.properties.PropertiesModule;
|
import org.briarproject.bramble.properties.PropertiesModule;
|
||||||
import org.briarproject.bramble.record.RecordModule;
|
import org.briarproject.bramble.record.RecordModule;
|
||||||
@@ -42,7 +41,6 @@ import dagger.Module;
|
|||||||
IoModule.class,
|
IoModule.class,
|
||||||
KeyAgreementModule.class,
|
KeyAgreementModule.class,
|
||||||
LifecycleModule.class,
|
LifecycleModule.class,
|
||||||
LoggingModule.class,
|
|
||||||
PluginModule.class,
|
PluginModule.class,
|
||||||
PropertiesModule.class,
|
PropertiesModule.class,
|
||||||
RecordModule.class,
|
RecordModule.class,
|
||||||
|
|||||||
@@ -36,10 +36,4 @@ class StreamDecrypterFactoryImpl implements StreamDecrypterFactory {
|
|||||||
SecretKey headerKey) {
|
SecretKey headerKey) {
|
||||||
return new StreamDecrypterImpl(in, cipherProvider.get(), 0, headerKey);
|
return new StreamDecrypterImpl(in, cipherProvider.get(), 0, headerKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public StreamDecrypter createLogStreamDecrypter(InputStream in,
|
|
||||||
SecretKey headerKey) {
|
|
||||||
return createContactExchangeStreamDecrypter(in, headerKey);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ class StreamEncrypterFactoryImpl implements StreamEncrypterFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public StreamEncrypter createContactExchangeStreamEncrypter(
|
public StreamEncrypter createContactExchangeStreamDecrypter(
|
||||||
OutputStream out, SecretKey headerKey) {
|
OutputStream out, SecretKey headerKey) {
|
||||||
AuthenticatedCipher cipher = cipherProvider.get();
|
AuthenticatedCipher cipher = cipherProvider.get();
|
||||||
byte[] streamHeaderNonce = new byte[STREAM_HEADER_NONCE_LENGTH];
|
byte[] streamHeaderNonce = new byte[STREAM_HEADER_NONCE_LENGTH];
|
||||||
@@ -60,10 +60,4 @@ class StreamEncrypterFactoryImpl implements StreamEncrypterFactory {
|
|||||||
return new StreamEncrypterImpl(out, cipher, 0, null, streamHeaderNonce,
|
return new StreamEncrypterImpl(out, cipher, 0, null, streamHeaderNonce,
|
||||||
headerKey, frameKey);
|
headerKey, frameKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public StreamEncrypter createLogStreamEncrypter(OutputStream out,
|
|
||||||
SecretKey headerKey) {
|
|
||||||
return createContactExchangeStreamEncrypter(out, headerKey);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
package org.briarproject.bramble.logging;
|
|
||||||
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.util.concurrent.Executor;
|
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
|
||||||
import java.util.logging.Formatter;
|
|
||||||
import java.util.logging.LogRecord;
|
|
||||||
import java.util.logging.StreamHandler;
|
|
||||||
|
|
||||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
|
||||||
|
|
||||||
class FlushingStreamHandler extends StreamHandler {
|
|
||||||
|
|
||||||
private static final int FLUSH_DELAY_MS = 5_000;
|
|
||||||
|
|
||||||
private final ScheduledExecutorService scheduler;
|
|
||||||
private final Executor ioExecutor;
|
|
||||||
private final AtomicBoolean flushScheduled = new AtomicBoolean(false);
|
|
||||||
|
|
||||||
FlushingStreamHandler(ScheduledExecutorService scheduler,
|
|
||||||
Executor ioExecutor, OutputStream out, Formatter formatter) {
|
|
||||||
super(out, formatter);
|
|
||||||
this.scheduler = scheduler;
|
|
||||||
this.ioExecutor = ioExecutor;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void publish(LogRecord record) {
|
|
||||||
super.publish(record);
|
|
||||||
if (!flushScheduled.getAndSet(true)) {
|
|
||||||
scheduler.schedule(this::scheduledFlush,
|
|
||||||
FLUSH_DELAY_MS, MILLISECONDS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void scheduledFlush() {
|
|
||||||
ioExecutor.execute(() -> {
|
|
||||||
flushScheduled.set(false);
|
|
||||||
flush();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
package org.briarproject.bramble.logging;
|
|
||||||
|
|
||||||
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
|
||||||
import org.briarproject.bramble.api.logging.PersistentLogManager;
|
|
||||||
|
|
||||||
import java.util.logging.Formatter;
|
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
|
||||||
|
|
||||||
import dagger.Module;
|
|
||||||
import dagger.Provides;
|
|
||||||
|
|
||||||
@Module
|
|
||||||
public class LoggingModule {
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
Formatter provideFormatter() {
|
|
||||||
return new BriefLogFormatter();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
PersistentLogManager providePersistentLogManager(
|
|
||||||
LifecycleManager lifecycleManager,
|
|
||||||
PersistentLogManagerImpl persistentLogManager) {
|
|
||||||
lifecycleManager.registerOpenDatabaseHook(persistentLogManager);
|
|
||||||
return persistentLogManager;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,177 +0,0 @@
|
|||||||
package org.briarproject.bramble.logging;
|
|
||||||
|
|
||||||
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
|
||||||
import org.briarproject.bramble.api.crypto.SecretKey;
|
|
||||||
import org.briarproject.bramble.api.db.DatabaseComponent;
|
|
||||||
import org.briarproject.bramble.api.db.DbException;
|
|
||||||
import org.briarproject.bramble.api.db.Transaction;
|
|
||||||
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
|
||||||
import org.briarproject.bramble.api.lifecycle.LifecycleManager.OpenDatabaseHook;
|
|
||||||
import org.briarproject.bramble.api.lifecycle.ShutdownManager;
|
|
||||||
import org.briarproject.bramble.api.logging.PersistentLogManager;
|
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
|
||||||
import org.briarproject.bramble.api.settings.Settings;
|
|
||||||
import org.briarproject.bramble.api.system.Scheduler;
|
|
||||||
import org.briarproject.bramble.api.transport.StreamReaderFactory;
|
|
||||||
import org.briarproject.bramble.api.transport.StreamWriter;
|
|
||||||
import org.briarproject.bramble.api.transport.StreamWriterFactory;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.util.Scanner;
|
|
||||||
import java.util.concurrent.Executor;
|
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
|
||||||
import java.util.logging.Formatter;
|
|
||||||
import java.util.logging.Handler;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
import java.util.logging.StreamHandler;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import javax.annotation.concurrent.ThreadSafe;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import static java.util.logging.Level.WARNING;
|
|
||||||
import static java.util.logging.Logger.getLogger;
|
|
||||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
|
||||||
|
|
||||||
@ThreadSafe
|
|
||||||
@NotNullByDefault
|
|
||||||
class PersistentLogManagerImpl implements PersistentLogManager,
|
|
||||||
OpenDatabaseHook {
|
|
||||||
|
|
||||||
private static final Logger LOG =
|
|
||||||
getLogger(PersistentLogManagerImpl.class.getName());
|
|
||||||
|
|
||||||
private static final String LOG_FILE = "briar.log";
|
|
||||||
private static final String OLD_LOG_FILE = "briar.log.old";
|
|
||||||
|
|
||||||
private final ScheduledExecutorService scheduler;
|
|
||||||
private final Executor ioExecutor;
|
|
||||||
private final ShutdownManager shutdownManager;
|
|
||||||
private final DatabaseComponent db;
|
|
||||||
private final StreamReaderFactory streamReaderFactory;
|
|
||||||
private final StreamWriterFactory streamWriterFactory;
|
|
||||||
private final Formatter formatter;
|
|
||||||
private final SecretKey logKey;
|
|
||||||
private final AtomicReference<Integer> shutdownHookHandle =
|
|
||||||
new AtomicReference<>();
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private volatile SecretKey oldLogKey = null;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
PersistentLogManagerImpl(
|
|
||||||
@Scheduler ScheduledExecutorService scheduler,
|
|
||||||
@IoExecutor Executor ioExecutor,
|
|
||||||
ShutdownManager shutdownManager,
|
|
||||||
DatabaseComponent db,
|
|
||||||
StreamReaderFactory streamReaderFactory,
|
|
||||||
StreamWriterFactory streamWriterFactory,
|
|
||||||
Formatter formatter,
|
|
||||||
CryptoComponent crypto) {
|
|
||||||
this.scheduler = scheduler;
|
|
||||||
this.ioExecutor = ioExecutor;
|
|
||||||
this.shutdownManager = shutdownManager;
|
|
||||||
this.db = db;
|
|
||||||
this.streamReaderFactory = streamReaderFactory;
|
|
||||||
this.streamWriterFactory = streamWriterFactory;
|
|
||||||
this.formatter = formatter;
|
|
||||||
logKey = crypto.generateSecretKey();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDatabaseOpened(Transaction txn) throws DbException {
|
|
||||||
Settings s = db.getSettings(txn, LOG_SETTINGS_NAMESPACE);
|
|
||||||
// Load the old log key, if any
|
|
||||||
byte[] oldKeyBytes = s.getBytes(LOG_KEY_KEY);
|
|
||||||
if (oldKeyBytes != null && oldKeyBytes.length == SecretKey.LENGTH) {
|
|
||||||
LOG.info("Loaded old log key");
|
|
||||||
oldLogKey = new SecretKey(oldKeyBytes);
|
|
||||||
}
|
|
||||||
// Store the current log key
|
|
||||||
s.putBytes(LOG_KEY_KEY, logKey.getBytes());
|
|
||||||
db.mergeSettings(txn, s, LOG_SETTINGS_NAMESPACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Handler createLogHandler(File dir) throws IOException {
|
|
||||||
File logFile = new File(dir, LOG_FILE);
|
|
||||||
File oldLogFile = new File(dir, OLD_LOG_FILE);
|
|
||||||
if (oldLogFile.exists() && !oldLogFile.delete())
|
|
||||||
LOG.warning("Failed to delete old log file");
|
|
||||||
if (logFile.exists() && !logFile.renameTo(oldLogFile))
|
|
||||||
LOG.warning("Failed to rename log file");
|
|
||||||
try {
|
|
||||||
OutputStream out = new FileOutputStream(logFile);
|
|
||||||
StreamWriter writer =
|
|
||||||
streamWriterFactory.createLogStreamWriter(out, logKey);
|
|
||||||
StreamHandler handler = new FlushingStreamHandler(scheduler,
|
|
||||||
ioExecutor, writer.getOutputStream(), formatter);
|
|
||||||
// Flush the log and terminate the stream at shutdown
|
|
||||||
Runnable shutdownHook = () -> {
|
|
||||||
LOG.info("Shutting down");
|
|
||||||
handler.flush();
|
|
||||||
try {
|
|
||||||
writer.sendEndOfStream();
|
|
||||||
} catch (IOException e) {
|
|
||||||
logException(LOG, WARNING, e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
int handle = shutdownManager.addShutdownHook(shutdownHook);
|
|
||||||
// If a previous handler registered a shutdown hook, remove it
|
|
||||||
Integer oldHandle = shutdownHookHandle.getAndSet(handle);
|
|
||||||
if (oldHandle != null) {
|
|
||||||
shutdownManager.removeShutdownHook(oldHandle);
|
|
||||||
}
|
|
||||||
return handler;
|
|
||||||
} catch (SecurityException e) {
|
|
||||||
throw new IOException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addLogHandler(File dir, Logger logger) throws IOException {
|
|
||||||
for (Handler h : logger.getHandlers()) {
|
|
||||||
if (h instanceof FlushingStreamHandler) logger.removeHandler(h);
|
|
||||||
}
|
|
||||||
logger.addHandler(createLogHandler(dir));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Scanner getPersistedLog(File dir, boolean old)
|
|
||||||
throws IOException {
|
|
||||||
if (old) {
|
|
||||||
SecretKey oldLogKey = this.oldLogKey;
|
|
||||||
if (oldLogKey == null) {
|
|
||||||
LOG.info("Old log key has not been loaded");
|
|
||||||
return emptyScanner();
|
|
||||||
}
|
|
||||||
return getPersistedLog(new File(dir, OLD_LOG_FILE), oldLogKey);
|
|
||||||
} else {
|
|
||||||
return getPersistedLog(new File(dir, LOG_FILE), logKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Scanner getPersistedLog(File logFile, SecretKey key)
|
|
||||||
throws IOException {
|
|
||||||
if (logFile.exists()) {
|
|
||||||
LOG.info("Reading log file");
|
|
||||||
InputStream in = new FileInputStream(logFile);
|
|
||||||
return new Scanner(streamReaderFactory.createLogStreamReader(in,
|
|
||||||
key));
|
|
||||||
} else {
|
|
||||||
LOG.info("Log file does not exist");
|
|
||||||
return emptyScanner();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Scanner emptyScanner() {
|
|
||||||
return new Scanner(new ByteArrayInputStream(new byte[0]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
package org.briarproject.bramble.plugin;
|
|
||||||
|
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.BackoffFactory;
|
|
||||||
|
|
||||||
import javax.annotation.concurrent.Immutable;
|
|
||||||
|
|
||||||
@Immutable
|
|
||||||
@NotNullByDefault
|
|
||||||
class BackoffFactoryImpl implements BackoffFactory {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Backoff createBackoff(int minInterval, int maxInterval,
|
|
||||||
double base) {
|
|
||||||
return new BackoffImpl(minInterval, maxInterval, base);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
package org.briarproject.bramble.plugin;
|
|
||||||
|
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
|
||||||
|
|
||||||
import javax.annotation.concurrent.ThreadSafe;
|
|
||||||
|
|
||||||
@ThreadSafe
|
|
||||||
@NotNullByDefault
|
|
||||||
class BackoffImpl implements Backoff {
|
|
||||||
|
|
||||||
private final int minInterval, maxInterval;
|
|
||||||
private final double base;
|
|
||||||
private final AtomicInteger backoff;
|
|
||||||
|
|
||||||
BackoffImpl(int minInterval, int maxInterval, double base) {
|
|
||||||
this.minInterval = minInterval;
|
|
||||||
this.maxInterval = maxInterval;
|
|
||||||
this.base = base;
|
|
||||||
backoff = new AtomicInteger(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPollingInterval() {
|
|
||||||
double multiplier = Math.pow(base, backoff.get());
|
|
||||||
// Large or infinite values will be rounded to Integer.MAX_VALUE
|
|
||||||
int interval = (int) (minInterval * multiplier);
|
|
||||||
return Math.min(interval, maxInterval);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void increment() {
|
|
||||||
backoff.incrementAndGet();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reset() {
|
|
||||||
backoff.set(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,6 @@ package org.briarproject.bramble.plugin;
|
|||||||
|
|
||||||
import org.briarproject.bramble.api.event.EventBus;
|
import org.briarproject.bramble.api.event.EventBus;
|
||||||
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
||||||
import org.briarproject.bramble.api.plugin.BackoffFactory;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginConfig;
|
import org.briarproject.bramble.api.plugin.PluginConfig;
|
||||||
import org.briarproject.bramble.api.plugin.PluginManager;
|
import org.briarproject.bramble.api.plugin.PluginManager;
|
||||||
|
|
||||||
@@ -22,11 +21,6 @@ public class PluginModule {
|
|||||||
Poller poller;
|
Poller poller;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
|
||||||
BackoffFactory provideBackoffFactory() {
|
|
||||||
return new BackoffFactoryImpl();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
PluginManager providePluginManager(LifecycleManager lifecycleManager,
|
PluginManager providePluginManager(LifecycleManager lifecycleManager,
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import org.briarproject.bramble.api.plugin.TransportId;
|
|||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
|
||||||
import org.briarproject.bramble.api.plugin.event.ConnectionClosedEvent;
|
import org.briarproject.bramble.api.plugin.event.ConnectionClosedEvent;
|
||||||
import org.briarproject.bramble.api.plugin.event.ConnectionOpenedEvent;
|
|
||||||
import org.briarproject.bramble.api.plugin.event.TransportActiveEvent;
|
import org.briarproject.bramble.api.plugin.event.TransportActiveEvent;
|
||||||
import org.briarproject.bramble.api.plugin.event.TransportInactiveEvent;
|
import org.briarproject.bramble.api.plugin.event.TransportInactiveEvent;
|
||||||
import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin;
|
import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin;
|
||||||
@@ -96,16 +95,10 @@ class PollerImpl implements Poller, EventListener {
|
|||||||
connectToContact(c.getContactId());
|
connectToContact(c.getContactId());
|
||||||
} else if (e instanceof ConnectionClosedEvent) {
|
} else if (e instanceof ConnectionClosedEvent) {
|
||||||
ConnectionClosedEvent c = (ConnectionClosedEvent) e;
|
ConnectionClosedEvent c = (ConnectionClosedEvent) e;
|
||||||
// Reschedule polling, the polling interval may have decreased
|
|
||||||
reschedule(c.getTransportId());
|
|
||||||
// If an outgoing connection failed, try to reconnect
|
// If an outgoing connection failed, try to reconnect
|
||||||
if (!c.isIncoming() && c.isException()) {
|
if (!c.isIncoming() && c.isException()) {
|
||||||
connectToContact(c.getContactId(), c.getTransportId());
|
connectToContact(c.getContactId(), c.getTransportId());
|
||||||
}
|
}
|
||||||
} else if (e instanceof ConnectionOpenedEvent) {
|
|
||||||
ConnectionOpenedEvent c = (ConnectionOpenedEvent) e;
|
|
||||||
// Reschedule polling, the polling interval may have decreased
|
|
||||||
reschedule(c.getTransportId());
|
|
||||||
} else if (e instanceof TransportActiveEvent) {
|
} else if (e instanceof TransportActiveEvent) {
|
||||||
TransportActiveEvent t = (TransportActiveEvent) e;
|
TransportActiveEvent t = (TransportActiveEvent) e;
|
||||||
// Poll the newly activated transport
|
// Poll the newly activated transport
|
||||||
@@ -164,12 +157,6 @@ class PollerImpl implements Poller, EventListener {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void reschedule(TransportId t) {
|
|
||||||
Plugin p = pluginManager.getPlugin(t);
|
|
||||||
if (p != null && p.shouldPoll())
|
|
||||||
schedule(p, p.getPollingInterval(), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void pollNow(TransportId t) {
|
private void pollNow(TransportId t) {
|
||||||
Plugin p = pluginManager.getPlugin(t);
|
Plugin p = pluginManager.getPlugin(t);
|
||||||
// Randomise next polling interval
|
// Randomise next polling interval
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
|||||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.ConnectionHandler;
|
import org.briarproject.bramble.api.plugin.ConnectionHandler;
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.PluginException;
|
import org.briarproject.bramble.api.plugin.PluginException;
|
||||||
@@ -73,9 +72,8 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
|
|||||||
|
|
||||||
private final Executor ioExecutor;
|
private final Executor ioExecutor;
|
||||||
private final SecureRandom secureRandom;
|
private final SecureRandom secureRandom;
|
||||||
private final Backoff backoff;
|
|
||||||
private final PluginCallback callback;
|
private final PluginCallback callback;
|
||||||
private final int maxLatency, maxIdleTime;
|
private final int maxLatency, maxIdleTime, pollingInterval;
|
||||||
private final AtomicBoolean used = new AtomicBoolean(false);
|
private final AtomicBoolean used = new AtomicBoolean(false);
|
||||||
|
|
||||||
protected final PluginState state = new PluginState();
|
protected final PluginState state = new PluginState();
|
||||||
@@ -116,16 +114,16 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
|
|||||||
|
|
||||||
BluetoothPlugin(BluetoothConnectionLimiter connectionLimiter,
|
BluetoothPlugin(BluetoothConnectionLimiter connectionLimiter,
|
||||||
TimeoutMonitor timeoutMonitor, Executor ioExecutor,
|
TimeoutMonitor timeoutMonitor, Executor ioExecutor,
|
||||||
SecureRandom secureRandom, Backoff backoff,
|
SecureRandom secureRandom, PluginCallback callback, int maxLatency, int maxIdleTime,
|
||||||
PluginCallback callback, int maxLatency, int maxIdleTime) {
|
int pollingInterval) {
|
||||||
this.connectionLimiter = connectionLimiter;
|
this.connectionLimiter = connectionLimiter;
|
||||||
this.timeoutMonitor = timeoutMonitor;
|
this.timeoutMonitor = timeoutMonitor;
|
||||||
this.ioExecutor = ioExecutor;
|
this.ioExecutor = ioExecutor;
|
||||||
this.secureRandom = secureRandom;
|
this.secureRandom = secureRandom;
|
||||||
this.backoff = backoff;
|
|
||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
this.maxLatency = maxLatency;
|
this.maxLatency = maxLatency;
|
||||||
this.maxIdleTime = maxIdleTime;
|
this.maxIdleTime = maxIdleTime;
|
||||||
|
this.pollingInterval = pollingInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void onAdapterEnabled() {
|
void onAdapterEnabled() {
|
||||||
@@ -196,7 +194,6 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
|
|||||||
tryToClose(ss);
|
tryToClose(ss);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
backoff.reset();
|
|
||||||
acceptContactConnections(ss);
|
acceptContactConnections(ss);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -239,7 +236,6 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
|
|||||||
}
|
}
|
||||||
LOG.info("Connection received");
|
LOG.info("Connection received");
|
||||||
connectionLimiter.connectionOpened(conn);
|
connectionLimiter.connectionOpened(conn);
|
||||||
backoff.reset();
|
|
||||||
callback.handleConnection(conn);
|
callback.handleConnection(conn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -268,14 +264,13 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getPollingInterval() {
|
public int getPollingInterval() {
|
||||||
return backoff.getPollingInterval();
|
return pollingInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void poll(Collection<Pair<TransportProperties, ConnectionHandler>>
|
public void poll(Collection<Pair<TransportProperties, ConnectionHandler>>
|
||||||
properties) {
|
properties) {
|
||||||
if (getState() != ACTIVE) return;
|
if (getState() != ACTIVE) return;
|
||||||
backoff.increment();
|
|
||||||
for (Pair<TransportProperties, ConnectionHandler> p : properties) {
|
for (Pair<TransportProperties, ConnectionHandler> p : properties) {
|
||||||
connect(p.getFirst(), p.getSecond());
|
connect(p.getFirst(), p.getSecond());
|
||||||
}
|
}
|
||||||
@@ -288,10 +283,7 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
|
|||||||
if (isNullOrEmpty(uuid)) return;
|
if (isNullOrEmpty(uuid)) return;
|
||||||
ioExecutor.execute(() -> {
|
ioExecutor.execute(() -> {
|
||||||
DuplexTransportConnection d = createConnection(p);
|
DuplexTransportConnection d = createConnection(p);
|
||||||
if (d != null) {
|
if (d != null) h.handleConnection(d);
|
||||||
backoff.reset();
|
|
||||||
h.handleConnection(d);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import org.briarproject.bramble.api.data.BdfList;
|
|||||||
import org.briarproject.bramble.api.keyagreement.KeyAgreementConnection;
|
import org.briarproject.bramble.api.keyagreement.KeyAgreementConnection;
|
||||||
import org.briarproject.bramble.api.keyagreement.KeyAgreementListener;
|
import org.briarproject.bramble.api.keyagreement.KeyAgreementListener;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
|
||||||
@@ -88,9 +87,9 @@ class LanTcpPlugin extends TcpPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LanTcpPlugin(Executor ioExecutor, Backoff backoff, PluginCallback callback,
|
LanTcpPlugin(Executor ioExecutor, PluginCallback callback, int maxLatency,
|
||||||
int maxLatency, int maxIdleTime, int connectionTimeout) {
|
int maxIdleTime, int pollingInterval, int connectionTimeout) {
|
||||||
super(ioExecutor, backoff, callback, maxLatency, maxIdleTime,
|
super(ioExecutor, callback, maxLatency, maxIdleTime, pollingInterval,
|
||||||
connectionTimeout);
|
connectionTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,7 +348,7 @@ class LanTcpPlugin extends TcpPlugin {
|
|||||||
tryToClose(ss, LOG, WARNING);
|
tryToClose(ss, LOG, WARNING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ss == null || !ss.isBound()) {
|
if (ss == null) {
|
||||||
LOG.info("Could not bind server socket for key agreement");
|
LOG.info("Could not bind server socket for key agreement");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,6 @@ package org.briarproject.bramble.plugin.tcp;
|
|||||||
|
|
||||||
import org.briarproject.bramble.api.event.EventBus;
|
import org.briarproject.bramble.api.event.EventBus;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.BackoffFactory;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
||||||
@@ -13,28 +11,25 @@ import java.util.concurrent.Executor;
|
|||||||
|
|
||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
|
|
||||||
|
import static java.util.concurrent.TimeUnit.MINUTES;
|
||||||
|
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||||
import static org.briarproject.bramble.api.plugin.LanTcpConstants.ID;
|
import static org.briarproject.bramble.api.plugin.LanTcpConstants.ID;
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public class LanTcpPluginFactory implements DuplexPluginFactory {
|
public class LanTcpPluginFactory implements DuplexPluginFactory {
|
||||||
|
|
||||||
private static final int MAX_LATENCY = 30_000; // 30 seconds
|
private static final int MAX_LATENCY = (int) SECONDS.toMillis(30);
|
||||||
private static final int MAX_IDLE_TIME = 30_000; // 30 seconds
|
private static final int MAX_IDLE_TIME = (int) SECONDS.toMillis(30);
|
||||||
private static final int CONNECTION_TIMEOUT = 3_000; // 3 seconds
|
private static final int POLLING_INTERVAL = (int) MINUTES.toMillis(1);
|
||||||
private static final int MIN_POLLING_INTERVAL = 60_000; // 1 minute
|
private static final int CONNECTION_TIMEOUT = (int) SECONDS.toMillis(3);
|
||||||
private static final int MAX_POLLING_INTERVAL = 600_000; // 10 mins
|
|
||||||
private static final double BACKOFF_BASE = 1.2;
|
|
||||||
|
|
||||||
private final Executor ioExecutor;
|
private final Executor ioExecutor;
|
||||||
private final EventBus eventBus;
|
private final EventBus eventBus;
|
||||||
private final BackoffFactory backoffFactory;
|
|
||||||
|
|
||||||
public LanTcpPluginFactory(Executor ioExecutor, EventBus eventBus,
|
public LanTcpPluginFactory(Executor ioExecutor, EventBus eventBus) {
|
||||||
BackoffFactory backoffFactory) {
|
|
||||||
this.ioExecutor = ioExecutor;
|
this.ioExecutor = ioExecutor;
|
||||||
this.eventBus = eventBus;
|
this.eventBus = eventBus;
|
||||||
this.backoffFactory = backoffFactory;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -49,10 +44,9 @@ public class LanTcpPluginFactory implements DuplexPluginFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DuplexPlugin createPlugin(PluginCallback callback) {
|
public DuplexPlugin createPlugin(PluginCallback callback) {
|
||||||
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
|
LanTcpPlugin plugin = new LanTcpPlugin(ioExecutor, callback,
|
||||||
MAX_POLLING_INTERVAL, BACKOFF_BASE);
|
MAX_LATENCY, MAX_IDLE_TIME, POLLING_INTERVAL,
|
||||||
LanTcpPlugin plugin = new LanTcpPlugin(ioExecutor, backoff, callback, MAX_LATENCY,
|
CONNECTION_TIMEOUT);
|
||||||
MAX_IDLE_TIME, CONNECTION_TIMEOUT);
|
|
||||||
eventBus.addListener(plugin);
|
eventBus.addListener(plugin);
|
||||||
return plugin;
|
return plugin;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
|||||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.ConnectionHandler;
|
import org.briarproject.bramble.api.plugin.ConnectionHandler;
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
||||||
@@ -67,9 +66,8 @@ abstract class TcpPlugin implements DuplexPlugin, EventListener {
|
|||||||
Pattern.compile("^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$");
|
Pattern.compile("^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$");
|
||||||
|
|
||||||
protected final Executor ioExecutor, bindExecutor;
|
protected final Executor ioExecutor, bindExecutor;
|
||||||
protected final Backoff backoff;
|
|
||||||
protected final PluginCallback callback;
|
protected final PluginCallback callback;
|
||||||
protected final int maxLatency, maxIdleTime;
|
protected final int maxLatency, maxIdleTime, pollingInterval;
|
||||||
protected final int connectionTimeout, socketTimeout;
|
protected final int connectionTimeout, socketTimeout;
|
||||||
protected final AtomicBoolean used = new AtomicBoolean(false);
|
protected final AtomicBoolean used = new AtomicBoolean(false);
|
||||||
protected final PluginState state = new PluginState();
|
protected final PluginState state = new PluginState();
|
||||||
@@ -107,13 +105,13 @@ abstract class TcpPlugin implements DuplexPlugin, EventListener {
|
|||||||
*/
|
*/
|
||||||
protected abstract boolean isEnabledByDefault();
|
protected abstract boolean isEnabledByDefault();
|
||||||
|
|
||||||
TcpPlugin(Executor ioExecutor, Backoff backoff, PluginCallback callback,
|
TcpPlugin(Executor ioExecutor, PluginCallback callback, int maxLatency,
|
||||||
int maxLatency, int maxIdleTime, int connectionTimeout) {
|
int maxIdleTime, int pollingInterval, int connectionTimeout) {
|
||||||
this.ioExecutor = ioExecutor;
|
this.ioExecutor = ioExecutor;
|
||||||
this.backoff = backoff;
|
|
||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
this.maxLatency = maxLatency;
|
this.maxLatency = maxLatency;
|
||||||
this.maxIdleTime = maxIdleTime;
|
this.maxIdleTime = maxIdleTime;
|
||||||
|
this.pollingInterval = pollingInterval;
|
||||||
this.connectionTimeout = connectionTimeout;
|
this.connectionTimeout = connectionTimeout;
|
||||||
if (maxIdleTime > Integer.MAX_VALUE / 2)
|
if (maxIdleTime > Integer.MAX_VALUE / 2)
|
||||||
socketTimeout = Integer.MAX_VALUE;
|
socketTimeout = Integer.MAX_VALUE;
|
||||||
@@ -162,7 +160,7 @@ abstract class TcpPlugin implements DuplexPlugin, EventListener {
|
|||||||
tryToClose(ss, LOG, WARNING);
|
tryToClose(ss, LOG, WARNING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ss == null || !ss.isBound()) {
|
if (ss == null) {
|
||||||
LOG.info("Could not bind server socket");
|
LOG.info("Could not bind server socket");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -171,7 +169,6 @@ abstract class TcpPlugin implements DuplexPlugin, EventListener {
|
|||||||
tryToClose(ss, LOG, WARNING);
|
tryToClose(ss, LOG, WARNING);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
backoff.reset();
|
|
||||||
InetSocketAddress local =
|
InetSocketAddress local =
|
||||||
(InetSocketAddress) ss.getLocalSocketAddress();
|
(InetSocketAddress) ss.getLocalSocketAddress();
|
||||||
setLocalSocketAddress(local, ipv4);
|
setLocalSocketAddress(local, ipv4);
|
||||||
@@ -204,7 +201,6 @@ abstract class TcpPlugin implements DuplexPlugin, EventListener {
|
|||||||
LOG.info("Connection from " +
|
LOG.info("Connection from " +
|
||||||
scrubSocketAddress(s.getRemoteSocketAddress()));
|
scrubSocketAddress(s.getRemoteSocketAddress()));
|
||||||
}
|
}
|
||||||
backoff.reset();
|
|
||||||
callback.handleConnection(new TcpTransportConnection(this, s));
|
callback.handleConnection(new TcpTransportConnection(this, s));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -231,14 +227,13 @@ abstract class TcpPlugin implements DuplexPlugin, EventListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getPollingInterval() {
|
public int getPollingInterval() {
|
||||||
return backoff.getPollingInterval();
|
return pollingInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void poll(Collection<Pair<TransportProperties, ConnectionHandler>>
|
public void poll(Collection<Pair<TransportProperties, ConnectionHandler>>
|
||||||
properties) {
|
properties) {
|
||||||
if (getState() != ACTIVE) return;
|
if (getState() != ACTIVE) return;
|
||||||
backoff.increment();
|
|
||||||
for (Pair<TransportProperties, ConnectionHandler> p : properties) {
|
for (Pair<TransportProperties, ConnectionHandler> p : properties) {
|
||||||
connect(p.getFirst(), p.getSecond());
|
connect(p.getFirst(), p.getSecond());
|
||||||
}
|
}
|
||||||
@@ -247,10 +242,7 @@ abstract class TcpPlugin implements DuplexPlugin, EventListener {
|
|||||||
private void connect(TransportProperties p, ConnectionHandler h) {
|
private void connect(TransportProperties p, ConnectionHandler h) {
|
||||||
ioExecutor.execute(() -> {
|
ioExecutor.execute(() -> {
|
||||||
DuplexTransportConnection d = createConnection(p);
|
DuplexTransportConnection d = createConnection(p);
|
||||||
if (d != null) {
|
if (d != null) h.handleConnection(d);
|
||||||
backoff.reset();
|
|
||||||
h.handleConnection(d);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package org.briarproject.bramble.plugin.tcp;
|
|||||||
|
|
||||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
import org.briarproject.bramble.api.properties.TransportProperties;
|
import org.briarproject.bramble.api.properties.TransportProperties;
|
||||||
@@ -30,10 +29,10 @@ class WanTcpPlugin extends TcpPlugin {
|
|||||||
|
|
||||||
private volatile MappingResult mappingResult;
|
private volatile MappingResult mappingResult;
|
||||||
|
|
||||||
WanTcpPlugin(Executor ioExecutor, Backoff backoff, PortMapper portMapper,
|
WanTcpPlugin(Executor ioExecutor, PortMapper portMapper,
|
||||||
PluginCallback callback, int maxLatency, int maxIdleTime,
|
PluginCallback callback, int maxLatency, int maxIdleTime,
|
||||||
int connectionTimeout) {
|
int pollingInterval, int connectionTimeout) {
|
||||||
super(ioExecutor, backoff, callback, maxLatency, maxIdleTime,
|
super(ioExecutor, callback, maxLatency, maxIdleTime, pollingInterval,
|
||||||
connectionTimeout);
|
connectionTimeout);
|
||||||
this.portMapper = portMapper;
|
this.portMapper = portMapper;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ package org.briarproject.bramble.plugin.tcp;
|
|||||||
import org.briarproject.bramble.api.event.EventBus;
|
import org.briarproject.bramble.api.event.EventBus;
|
||||||
import org.briarproject.bramble.api.lifecycle.ShutdownManager;
|
import org.briarproject.bramble.api.lifecycle.ShutdownManager;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.BackoffFactory;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
||||||
@@ -14,29 +12,27 @@ import java.util.concurrent.Executor;
|
|||||||
|
|
||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
|
|
||||||
|
import static java.util.concurrent.TimeUnit.MINUTES;
|
||||||
|
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||||
import static org.briarproject.bramble.api.plugin.WanTcpConstants.ID;
|
import static org.briarproject.bramble.api.plugin.WanTcpConstants.ID;
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public class WanTcpPluginFactory implements DuplexPluginFactory {
|
public class WanTcpPluginFactory implements DuplexPluginFactory {
|
||||||
|
|
||||||
private static final int MAX_LATENCY = 30_000; // 30 seconds
|
private static final int MAX_LATENCY = (int) SECONDS.toMillis(30);
|
||||||
private static final int MAX_IDLE_TIME = 30_000; // 30 seconds
|
private static final int MAX_IDLE_TIME = (int) SECONDS.toMillis(30);
|
||||||
private static final int CONNECTION_TIMEOUT = 30_000; // 30 seconds
|
private static final int POLLING_INTERVAL = (int) MINUTES.toMillis(1);
|
||||||
private static final int MIN_POLLING_INTERVAL = 60_000; // 1 minute
|
private static final int CONNECTION_TIMEOUT = (int) SECONDS.toMillis(30);
|
||||||
private static final int MAX_POLLING_INTERVAL = 600_000; // 10 mins
|
|
||||||
private static final double BACKOFF_BASE = 1.2;
|
|
||||||
|
|
||||||
private final Executor ioExecutor;
|
private final Executor ioExecutor;
|
||||||
private final EventBus eventBus;
|
private final EventBus eventBus;
|
||||||
private final BackoffFactory backoffFactory;
|
|
||||||
private final ShutdownManager shutdownManager;
|
private final ShutdownManager shutdownManager;
|
||||||
|
|
||||||
public WanTcpPluginFactory(Executor ioExecutor, EventBus eventBus,
|
public WanTcpPluginFactory(Executor ioExecutor, EventBus eventBus,
|
||||||
BackoffFactory backoffFactory, ShutdownManager shutdownManager) {
|
ShutdownManager shutdownManager) {
|
||||||
this.ioExecutor = ioExecutor;
|
this.ioExecutor = ioExecutor;
|
||||||
this.eventBus = eventBus;
|
this.eventBus = eventBus;
|
||||||
this.backoffFactory = backoffFactory;
|
|
||||||
this.shutdownManager = shutdownManager;
|
this.shutdownManager = shutdownManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,11 +48,9 @@ public class WanTcpPluginFactory implements DuplexPluginFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DuplexPlugin createPlugin(PluginCallback callback) {
|
public DuplexPlugin createPlugin(PluginCallback callback) {
|
||||||
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
|
WanTcpPlugin plugin = new WanTcpPlugin(ioExecutor,
|
||||||
MAX_POLLING_INTERVAL, BACKOFF_BASE);
|
|
||||||
WanTcpPlugin plugin = new WanTcpPlugin(ioExecutor, backoff,
|
|
||||||
new PortMapperImpl(shutdownManager), callback, MAX_LATENCY,
|
new PortMapperImpl(shutdownManager), callback, MAX_LATENCY,
|
||||||
MAX_IDLE_TIME, CONNECTION_TIMEOUT);
|
MAX_IDLE_TIME, POLLING_INTERVAL, CONNECTION_TIMEOUT);
|
||||||
eventBus.addListener(plugin);
|
eventBus.addListener(plugin);
|
||||||
return plugin;
|
return plugin;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import org.briarproject.bramble.api.network.event.NetworkStatusEvent;
|
|||||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.ConnectionHandler;
|
import org.briarproject.bramble.api.plugin.ConnectionHandler;
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.PluginException;
|
import org.briarproject.bramble.api.plugin.PluginException;
|
||||||
@@ -46,9 +45,11 @@ import java.net.ServerSocket;
|
|||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Scanner;
|
import java.util.Scanner;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
@@ -79,6 +80,9 @@ import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_PREF_PLUG
|
|||||||
import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_PREF_TOR_MOBILE;
|
import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_PREF_TOR_MOBILE;
|
||||||
import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_PREF_TOR_NETWORK;
|
import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_PREF_TOR_NETWORK;
|
||||||
import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_PREF_TOR_ONLY_WHEN_CHARGING;
|
import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_PREF_TOR_ONLY_WHEN_CHARGING;
|
||||||
|
import static org.briarproject.bramble.api.plugin.TorConstants.HS_PRIVATE_KEY_V2;
|
||||||
|
import static org.briarproject.bramble.api.plugin.TorConstants.HS_PRIVATE_KEY_V3;
|
||||||
|
import static org.briarproject.bramble.api.plugin.TorConstants.HS_V3_CREATED;
|
||||||
import static org.briarproject.bramble.api.plugin.TorConstants.ID;
|
import static org.briarproject.bramble.api.plugin.TorConstants.ID;
|
||||||
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_MOBILE;
|
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_MOBILE;
|
||||||
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK;
|
import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK;
|
||||||
@@ -92,6 +96,7 @@ import static org.briarproject.bramble.api.plugin.TorConstants.PROP_ONION_V3;
|
|||||||
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_BATTERY;
|
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_BATTERY;
|
||||||
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_COUNTRY_BLOCKED;
|
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_COUNTRY_BLOCKED;
|
||||||
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_MOBILE_DATA;
|
import static org.briarproject.bramble.api.plugin.TorConstants.REASON_MOBILE_DATA;
|
||||||
|
import static org.briarproject.bramble.api.plugin.TorConstants.V3_MIGRATION_PERIOD_MS;
|
||||||
import static org.briarproject.bramble.plugin.tor.TorRendezvousCrypto.SEED_BYTES;
|
import static org.briarproject.bramble.plugin.tor.TorRendezvousCrypto.SEED_BYTES;
|
||||||
import static org.briarproject.bramble.util.IoUtils.copyAndClose;
|
import static org.briarproject.bramble.util.IoUtils.copyAndClose;
|
||||||
import static org.briarproject.bramble.util.IoUtils.tryToClose;
|
import static org.briarproject.bramble.util.IoUtils.tryToClose;
|
||||||
@@ -105,28 +110,59 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
|
|
||||||
private static final Logger LOG = getLogger(TorPlugin.class.getName());
|
private static final Logger LOG = getLogger(TorPlugin.class.getName());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller events we want to receive.
|
||||||
|
*/
|
||||||
private static final String[] EVENTS = {
|
private static final String[] EVENTS = {
|
||||||
"CIRC", "ORCONN", "HS_DESC", "NOTICE", "WARN", "ERR"
|
"CIRC", "ORCONN", "HS_DESC", "NOTICE", "WARN", "ERR"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Command-line argument to set our process as Tor's owning controller
|
||||||
|
* so Tor exits when our process dies.
|
||||||
|
*/
|
||||||
private static final String OWNER = "__OwningControllerProcess";
|
private static final String OWNER = "__OwningControllerProcess";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How long to wait for the authentication cookie file to be created.
|
||||||
|
*/
|
||||||
private static final int COOKIE_TIMEOUT_MS = 3000;
|
private static final int COOKIE_TIMEOUT_MS = 3000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How often to check whether the authentication cookie file has been
|
||||||
|
* created.
|
||||||
|
*/
|
||||||
private static final int COOKIE_POLLING_INTERVAL_MS = 200;
|
private static final int COOKIE_POLLING_INTERVAL_MS = 200;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regex for matching v2 hidden service names.
|
||||||
|
*/
|
||||||
private static final Pattern ONION_V2 = Pattern.compile("[a-z2-7]{16}");
|
private static final Pattern ONION_V2 = Pattern.compile("[a-z2-7]{16}");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regex for matching v3 hidden service names.
|
||||||
|
*/
|
||||||
private static final Pattern ONION_V3 = Pattern.compile("[a-z2-7]{56}");
|
private static final Pattern ONION_V3 = Pattern.compile("[a-z2-7]{56}");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How many copies of our descriptor must be uploaded before we consider
|
||||||
|
* our hidden service to be reachable and switch to less frequent polling.
|
||||||
|
*/
|
||||||
|
private static final int MIN_DESCRIPTORS_UPLOADED = 5;
|
||||||
|
|
||||||
private final Executor ioExecutor, connectionStatusExecutor;
|
private final Executor ioExecutor, connectionStatusExecutor;
|
||||||
private final NetworkManager networkManager;
|
private final NetworkManager networkManager;
|
||||||
private final LocationUtils locationUtils;
|
private final LocationUtils locationUtils;
|
||||||
private final SocketFactory torSocketFactory;
|
private final SocketFactory torSocketFactory;
|
||||||
private final Clock clock;
|
private final Clock clock;
|
||||||
private final BatteryManager batteryManager;
|
private final BatteryManager batteryManager;
|
||||||
private final Backoff backoff;
|
|
||||||
private final TorRendezvousCrypto torRendezvousCrypto;
|
private final TorRendezvousCrypto torRendezvousCrypto;
|
||||||
private final PluginCallback callback;
|
private final PluginCallback callback;
|
||||||
private final String architecture;
|
private final String architecture;
|
||||||
private final CircumventionProvider circumventionProvider;
|
private final CircumventionProvider circumventionProvider;
|
||||||
private final ResourceProvider resourceProvider;
|
private final ResourceProvider resourceProvider;
|
||||||
private final int maxLatency, maxIdleTime, socketTimeout;
|
private final int maxLatency, maxIdleTime, socketTimeout;
|
||||||
|
private final int initialPollingInterval, stablePollingInterval;
|
||||||
private final File torDirectory, torFile, geoIpFile, obfs4File, configFile;
|
private final File torDirectory, torFile, geoIpFile, obfs4File, configFile;
|
||||||
private final File doneFile, cookieFile;
|
private final File doneFile, cookieFile;
|
||||||
private final AtomicBoolean used = new AtomicBoolean(false);
|
private final AtomicBoolean used = new AtomicBoolean(false);
|
||||||
@@ -145,10 +181,11 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
LocationUtils locationUtils, SocketFactory torSocketFactory,
|
LocationUtils locationUtils, SocketFactory torSocketFactory,
|
||||||
Clock clock, ResourceProvider resourceProvider,
|
Clock clock, ResourceProvider resourceProvider,
|
||||||
CircumventionProvider circumventionProvider,
|
CircumventionProvider circumventionProvider,
|
||||||
BatteryManager batteryManager, Backoff backoff,
|
BatteryManager batteryManager,
|
||||||
TorRendezvousCrypto torRendezvousCrypto,
|
TorRendezvousCrypto torRendezvousCrypto,
|
||||||
PluginCallback callback, String architecture, int maxLatency,
|
PluginCallback callback, String architecture, int maxLatency,
|
||||||
int maxIdleTime, File torDirectory) {
|
int maxIdleTime, int initialPollingInterval,
|
||||||
|
int stablePollingInterval, File torDirectory) {
|
||||||
this.ioExecutor = ioExecutor;
|
this.ioExecutor = ioExecutor;
|
||||||
this.networkManager = networkManager;
|
this.networkManager = networkManager;
|
||||||
this.locationUtils = locationUtils;
|
this.locationUtils = locationUtils;
|
||||||
@@ -157,7 +194,6 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
this.resourceProvider = resourceProvider;
|
this.resourceProvider = resourceProvider;
|
||||||
this.circumventionProvider = circumventionProvider;
|
this.circumventionProvider = circumventionProvider;
|
||||||
this.batteryManager = batteryManager;
|
this.batteryManager = batteryManager;
|
||||||
this.backoff = backoff;
|
|
||||||
this.torRendezvousCrypto = torRendezvousCrypto;
|
this.torRendezvousCrypto = torRendezvousCrypto;
|
||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
this.architecture = architecture;
|
this.architecture = architecture;
|
||||||
@@ -166,6 +202,8 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
if (maxIdleTime > Integer.MAX_VALUE / 2)
|
if (maxIdleTime > Integer.MAX_VALUE / 2)
|
||||||
socketTimeout = Integer.MAX_VALUE;
|
socketTimeout = Integer.MAX_VALUE;
|
||||||
else socketTimeout = maxIdleTime * 2;
|
else socketTimeout = maxIdleTime * 2;
|
||||||
|
this.initialPollingInterval = initialPollingInterval;
|
||||||
|
this.stablePollingInterval = stablePollingInterval;
|
||||||
this.torDirectory = torDirectory;
|
this.torDirectory = torDirectory;
|
||||||
torFile = new File(torDirectory, "tor");
|
torFile = new File(torDirectory, "tor");
|
||||||
geoIpFile = new File(torDirectory, "geoip");
|
geoIpFile = new File(torDirectory, "geoip");
|
||||||
@@ -430,7 +468,6 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
callback.mergeSettings(s);
|
callback.mergeSettings(s);
|
||||||
// Create a hidden service if necessary
|
// Create a hidden service if necessary
|
||||||
ioExecutor.execute(() -> publishHiddenService(localPort));
|
ioExecutor.execute(() -> publishHiddenService(localPort));
|
||||||
backoff.reset();
|
|
||||||
// Accept incoming hidden service connections from Tor
|
// Accept incoming hidden service connections from Tor
|
||||||
acceptContactConnections(ss);
|
acceptContactConnections(ss);
|
||||||
});
|
});
|
||||||
@@ -438,15 +475,66 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
|
|
||||||
private void publishHiddenService(String port) {
|
private void publishHiddenService(String port) {
|
||||||
if (!state.isTorRunning()) return;
|
if (!state.isTorRunning()) return;
|
||||||
LOG.info("Creating hidden service");
|
// TODO: Remove support for v2 hidden services after a reasonable
|
||||||
String privKey = settings.get(HS_PRIVKEY);
|
// migration period (migration started 2020-06-30)
|
||||||
|
String privKey2 = settings.get(HS_PRIVATE_KEY_V2);
|
||||||
|
String privKey3 = settings.get(HS_PRIVATE_KEY_V3);
|
||||||
|
String v3Created = settings.get(HS_V3_CREATED);
|
||||||
|
// Publish a v2 hidden service if we've already created one, and
|
||||||
|
// either we've never published a v3 hidden service or we're still
|
||||||
|
// in the migration period since first publishing it
|
||||||
|
if (!isNullOrEmpty(privKey2)) {
|
||||||
|
long now = clock.currentTimeMillis();
|
||||||
|
long then = v3Created == null ? now : Long.valueOf(v3Created);
|
||||||
|
if (now - then >= V3_MIGRATION_PERIOD_MS) retireV2HiddenService();
|
||||||
|
else publishV2HiddenService(port, privKey2);
|
||||||
|
}
|
||||||
|
publishV3HiddenService(port, privKey3);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void publishV2HiddenService(String port, String privKey) {
|
||||||
|
LOG.info("Creating v2 hidden service");
|
||||||
|
Map<Integer, String> portLines = singletonMap(80, "127.0.0.1:" + port);
|
||||||
|
Map<String, String> response;
|
||||||
|
try {
|
||||||
|
response = controlConnection.addOnion(privKey, portLines);
|
||||||
|
} catch (IOException e) {
|
||||||
|
logException(LOG, WARNING, e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!response.containsKey(HS_ADDRESS)) {
|
||||||
|
LOG.warning("Tor did not return a hidden service address");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String onion2 = response.get(HS_ADDRESS);
|
||||||
|
if (LOG.isLoggable(INFO)) {
|
||||||
|
LOG.info("V2 hidden service " + scrubOnion(onion2));
|
||||||
|
}
|
||||||
|
// The hostname has already been published and the private key stored
|
||||||
|
}
|
||||||
|
|
||||||
|
private void retireV2HiddenService() {
|
||||||
|
LOG.info("Retiring v2 hidden service");
|
||||||
|
TransportProperties p = new TransportProperties();
|
||||||
|
p.put(PROP_ONION_V2, "");
|
||||||
|
callback.mergeLocalProperties(p);
|
||||||
|
Settings s = new Settings();
|
||||||
|
s.put(HS_PRIVATE_KEY_V2, "");
|
||||||
|
callback.mergeSettings(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void publishV3HiddenService(String port, @Nullable String privKey) {
|
||||||
|
LOG.info("Creating v3 hidden service");
|
||||||
Map<Integer, String> portLines = singletonMap(80, "127.0.0.1:" + port);
|
Map<Integer, String> portLines = singletonMap(80, "127.0.0.1:" + port);
|
||||||
Map<String, String> response;
|
Map<String, String> response;
|
||||||
try {
|
try {
|
||||||
// Use the control connection to set up the hidden service
|
// Use the control connection to set up the hidden service
|
||||||
if (privKey == null)
|
if (privKey == null) {
|
||||||
response = controlConnection.addOnion(portLines);
|
response = controlConnection.addOnion("NEW:ED25519-V3",
|
||||||
else response = controlConnection.addOnion(privKey, portLines);
|
portLines, null);
|
||||||
|
} else {
|
||||||
|
response = controlConnection.addOnion(privKey, portLines);
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
logException(LOG, WARNING, e);
|
logException(LOG, WARNING, e);
|
||||||
return;
|
return;
|
||||||
@@ -460,16 +548,18 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Publish the hidden service's onion hostname in transport properties
|
// Publish the hidden service's onion hostname in transport properties
|
||||||
String onion2 = response.get(HS_ADDRESS);
|
String onion3 = response.get(HS_ADDRESS);
|
||||||
if (LOG.isLoggable(INFO))
|
if (LOG.isLoggable(INFO)) {
|
||||||
LOG.info("Hidden service " + scrubOnion(onion2));
|
LOG.info("V3 hidden service " + scrubOnion(onion3));
|
||||||
|
}
|
||||||
TransportProperties p = new TransportProperties();
|
TransportProperties p = new TransportProperties();
|
||||||
p.put(PROP_ONION_V2, onion2);
|
p.put(PROP_ONION_V3, onion3);
|
||||||
callback.mergeLocalProperties(p);
|
callback.mergeLocalProperties(p);
|
||||||
if (privKey == null) {
|
if (privKey == null) {
|
||||||
// Save the hidden service's private key for next time
|
// Save the hidden service's private key for next time
|
||||||
Settings s = new Settings();
|
Settings s = new Settings();
|
||||||
s.put(HS_PRIVKEY, response.get(HS_PRIVKEY));
|
s.put(HS_PRIVATE_KEY_V3, response.get(HS_PRIVKEY));
|
||||||
|
s.put(HS_V3_CREATED, String.valueOf(clock.currentTimeMillis()));
|
||||||
callback.mergeSettings(s);
|
callback.mergeSettings(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -487,7 +577,6 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LOG.info("Connection received");
|
LOG.info("Connection received");
|
||||||
backoff.reset();
|
|
||||||
callback.handleConnection(new TorTransportConnection(this, s));
|
callback.handleConnection(new TorTransportConnection(this, s));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -549,14 +638,19 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getPollingInterval() {
|
public int getPollingInterval() {
|
||||||
return backoff.getPollingInterval();
|
if (state.isDescriptorPublished()) {
|
||||||
|
LOG.info("Using stable polling interval");
|
||||||
|
return stablePollingInterval;
|
||||||
|
} else {
|
||||||
|
LOG.info("Using initial polling interval");
|
||||||
|
return initialPollingInterval;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void poll(Collection<Pair<TransportProperties, ConnectionHandler>>
|
public void poll(Collection<Pair<TransportProperties, ConnectionHandler>>
|
||||||
properties) {
|
properties) {
|
||||||
if (getState() != ACTIVE) return;
|
if (getState() != ACTIVE) return;
|
||||||
backoff.increment();
|
|
||||||
for (Pair<TransportProperties, ConnectionHandler> p : properties) {
|
for (Pair<TransportProperties, ConnectionHandler> p : properties) {
|
||||||
connect(p.getFirst(), p.getSecond());
|
connect(p.getFirst(), p.getSecond());
|
||||||
}
|
}
|
||||||
@@ -565,22 +659,22 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
private void connect(TransportProperties p, ConnectionHandler h) {
|
private void connect(TransportProperties p, ConnectionHandler h) {
|
||||||
ioExecutor.execute(() -> {
|
ioExecutor.execute(() -> {
|
||||||
DuplexTransportConnection d = createConnection(p);
|
DuplexTransportConnection d = createConnection(p);
|
||||||
if (d != null) {
|
if (d != null) h.handleConnection(d);
|
||||||
backoff.reset();
|
|
||||||
h.handleConnection(d);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DuplexTransportConnection createConnection(TransportProperties p) {
|
public DuplexTransportConnection createConnection(TransportProperties p) {
|
||||||
if (getState() != ACTIVE) return null;
|
if (getState() != ACTIVE) return null;
|
||||||
String bestOnion = null;
|
// TODO: Remove support for v2 hidden services after a reasonable
|
||||||
|
// migration period (migration started 2020-06-30)
|
||||||
|
String bestOnion = null, version = null;
|
||||||
String onion2 = p.get(PROP_ONION_V2);
|
String onion2 = p.get(PROP_ONION_V2);
|
||||||
String onion3 = p.get(PROP_ONION_V3);
|
String onion3 = p.get(PROP_ONION_V3);
|
||||||
if (!isNullOrEmpty(onion2)) {
|
if (!isNullOrEmpty(onion2)) {
|
||||||
if (ONION_V2.matcher(onion2).matches()) {
|
if (ONION_V2.matcher(onion2).matches()) {
|
||||||
bestOnion = onion2;
|
bestOnion = onion2;
|
||||||
|
version = "v2";
|
||||||
} else {
|
} else {
|
||||||
// Don't scrub the address so we can find the problem
|
// Don't scrub the address so we can find the problem
|
||||||
if (LOG.isLoggable(INFO))
|
if (LOG.isLoggable(INFO))
|
||||||
@@ -590,6 +684,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
if (!isNullOrEmpty(onion3)) {
|
if (!isNullOrEmpty(onion3)) {
|
||||||
if (ONION_V3.matcher(onion3).matches()) {
|
if (ONION_V3.matcher(onion3).matches()) {
|
||||||
bestOnion = onion3;
|
bestOnion = onion3;
|
||||||
|
version = "v3";
|
||||||
} else {
|
} else {
|
||||||
// Don't scrub the address so we can find the problem
|
// Don't scrub the address so we can find the problem
|
||||||
if (LOG.isLoggable(INFO))
|
if (LOG.isLoggable(INFO))
|
||||||
@@ -599,17 +694,21 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
if (bestOnion == null) return null;
|
if (bestOnion == null) return null;
|
||||||
Socket s = null;
|
Socket s = null;
|
||||||
try {
|
try {
|
||||||
if (LOG.isLoggable(INFO))
|
if (LOG.isLoggable(INFO)) {
|
||||||
LOG.info("Connecting to " + scrubOnion(bestOnion));
|
LOG.info("Connecting to " + version + " "
|
||||||
|
+ scrubOnion(bestOnion));
|
||||||
|
}
|
||||||
s = torSocketFactory.createSocket(bestOnion + ".onion", 80);
|
s = torSocketFactory.createSocket(bestOnion + ".onion", 80);
|
||||||
s.setSoTimeout(socketTimeout);
|
s.setSoTimeout(socketTimeout);
|
||||||
if (LOG.isLoggable(INFO))
|
if (LOG.isLoggable(INFO)) {
|
||||||
LOG.info("Connected to " + scrubOnion(bestOnion));
|
LOG.info("Connected to " + version + " "
|
||||||
|
+ scrubOnion(bestOnion));
|
||||||
|
}
|
||||||
return new TorTransportConnection(this, s);
|
return new TorTransportConnection(this, s);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
if (LOG.isLoggable(INFO)) {
|
if (LOG.isLoggable(INFO)) {
|
||||||
LOG.info("Could not connect to " + scrubOnion(bestOnion)
|
LOG.info("Could not connect to " + version + " "
|
||||||
+ ": " + e.toString());
|
+ scrubOnion(bestOnion) + ": " + e.toString());
|
||||||
}
|
}
|
||||||
tryToClose(s, LOG, WARNING);
|
tryToClose(s, LOG, WARNING);
|
||||||
return null;
|
return null;
|
||||||
@@ -690,10 +789,8 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void circuitStatus(String status, String id, String path) {
|
public void circuitStatus(String status, String id, String path) {
|
||||||
if (status.equals("BUILT") &&
|
if (status.equals("BUILT") && state.getAndSetCircuitBuilt()) {
|
||||||
state.getAndSetCircuitBuilt()) {
|
|
||||||
LOG.info("First circuit built");
|
LOG.info("First circuit built");
|
||||||
backoff.reset();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -703,8 +800,8 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void orConnStatus(String status, String orName) {
|
public void orConnStatus(String status, String orName) {
|
||||||
if (LOG.isLoggable(INFO))
|
if (LOG.isLoggable(INFO)) LOG.info("OR connection " + status);
|
||||||
LOG.info("OR connection " + status + " " + orName);
|
state.setOrConnectionStatus(orName, status);
|
||||||
if (status.equals("CLOSED") || status.equals("FAILED")) {
|
if (status.equals("CLOSED") || status.equals("FAILED")) {
|
||||||
// Check whether we've lost connectivity
|
// Check whether we've lost connectivity
|
||||||
updateConnectionStatus(networkManager.getNetworkStatus(),
|
updateConnectionStatus(networkManager.getNetworkStatus(),
|
||||||
@@ -725,14 +822,20 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
if (LOG.isLoggable(INFO)) LOG.info(severity + " " + msg);
|
if (LOG.isLoggable(INFO)) LOG.info(severity + " " + msg);
|
||||||
if (severity.equals("NOTICE") && msg.startsWith("Bootstrapped 100%")) {
|
if (severity.equals("NOTICE") && msg.startsWith("Bootstrapped 100%")) {
|
||||||
state.setBootstrapped();
|
state.setBootstrapped();
|
||||||
backoff.reset();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void unrecognized(String type, String msg) {
|
public void unrecognized(String type, String msg) {
|
||||||
if (type.equals("HS_DESC") && msg.startsWith("UPLOADED"))
|
if (type.equals("HS_DESC") && msg.startsWith("UPLOADED")) {
|
||||||
LOG.info("Descriptor uploaded");
|
String[] words = msg.split(" ");
|
||||||
|
if (words.length > 1 && ONION_V3.matcher(words[1]).matches()) {
|
||||||
|
LOG.info("V3 descriptor uploaded");
|
||||||
|
state.descriptorUploaded();
|
||||||
|
} else {
|
||||||
|
LOG.info("V2 descriptor uploaded");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -886,6 +989,12 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private ServerSocket serverSocket = null;
|
private ServerSocket serverSocket = null;
|
||||||
|
|
||||||
|
@GuardedBy("this")
|
||||||
|
private final Set<String> orConnections = new HashSet<>();
|
||||||
|
|
||||||
|
@GuardedBy("this")
|
||||||
|
private int descriptorsUploaded = 0;
|
||||||
|
|
||||||
synchronized void setStarted() {
|
synchronized void setStarted() {
|
||||||
started = true;
|
started = true;
|
||||||
callback.pluginStateChanged(getState());
|
callback.pluginStateChanged(getState());
|
||||||
@@ -919,7 +1028,10 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
synchronized void enableNetwork(boolean enable) {
|
synchronized void enableNetwork(boolean enable) {
|
||||||
networkInitialised = true;
|
networkInitialised = true;
|
||||||
networkEnabled = enable;
|
networkEnabled = enable;
|
||||||
if (!enable) circuitBuilt = false;
|
if (!enable) {
|
||||||
|
circuitBuilt = false;
|
||||||
|
descriptorsUploaded = 0;
|
||||||
|
}
|
||||||
callback.pluginStateChanged(getState());
|
callback.pluginStateChanged(getState());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -929,6 +1041,34 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
callback.pluginStateChanged(getState());
|
callback.pluginStateChanged(getState());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
synchronized void setOrConnectionStatus(String orName, String status) {
|
||||||
|
if (status.equals("CONNECTED")) {
|
||||||
|
if (!orConnections.add(orName)) {
|
||||||
|
LOG.warning("Duplicate OR connection");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
orConnections.remove(orName);
|
||||||
|
if (orConnections.isEmpty()) descriptorsUploaded = 0;
|
||||||
|
}
|
||||||
|
if (LOG.isLoggable(INFO)) {
|
||||||
|
LOG.info(orConnections.size() + " OR connections");
|
||||||
|
}
|
||||||
|
callback.pluginStateChanged(getState());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Doesn't affect getState()
|
||||||
|
synchronized void descriptorUploaded() {
|
||||||
|
if (networkEnabled && !orConnections.isEmpty()) {
|
||||||
|
descriptorsUploaded++;
|
||||||
|
} else {
|
||||||
|
LOG.warning("Descriptor was uploaded with no OR connection");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
synchronized boolean isDescriptorPublished() {
|
||||||
|
return descriptorsUploaded >= MIN_DESCRIPTORS_UPLOADED;
|
||||||
|
}
|
||||||
|
|
||||||
// Doesn't affect getState()
|
// Doesn't affect getState()
|
||||||
synchronized boolean setServerSocket(ServerSocket ss) {
|
synchronized boolean setServerSocket(ServerSocket ss) {
|
||||||
if (stopped || serverSocket != null) return false;
|
if (stopped || serverSocket != null) return false;
|
||||||
@@ -948,7 +1088,8 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
|||||||
if (reasonsDisabled != 0) return DISABLED;
|
if (reasonsDisabled != 0) return DISABLED;
|
||||||
if (!networkInitialised) return ENABLING;
|
if (!networkInitialised) return ENABLING;
|
||||||
if (!networkEnabled) return INACTIVE;
|
if (!networkEnabled) return INACTIVE;
|
||||||
return bootstrapped && circuitBuilt ? ACTIVE : ENABLING;
|
return bootstrapped && circuitBuilt && !orConnections.isEmpty()
|
||||||
|
? ACTIVE : ENABLING;
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized int getReasonsDisabled() {
|
synchronized int getReasonsDisabled() {
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import org.briarproject.bramble.api.versioning.ClientVersioningManager;
|
|||||||
import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook;
|
import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
@@ -41,6 +42,7 @@ import static org.briarproject.bramble.api.properties.TransportPropertyConstants
|
|||||||
import static org.briarproject.bramble.api.properties.TransportPropertyConstants.MSG_KEY_LOCAL;
|
import static org.briarproject.bramble.api.properties.TransportPropertyConstants.MSG_KEY_LOCAL;
|
||||||
import static org.briarproject.bramble.api.properties.TransportPropertyConstants.MSG_KEY_TRANSPORT_ID;
|
import static org.briarproject.bramble.api.properties.TransportPropertyConstants.MSG_KEY_TRANSPORT_ID;
|
||||||
import static org.briarproject.bramble.api.properties.TransportPropertyConstants.MSG_KEY_VERSION;
|
import static org.briarproject.bramble.api.properties.TransportPropertyConstants.MSG_KEY_VERSION;
|
||||||
|
import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty;
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
@@ -272,14 +274,22 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
|
|||||||
LatestUpdate latest = findLatest(txn, localGroup.getId(), t,
|
LatestUpdate latest = findLatest(txn, localGroup.getId(), t,
|
||||||
true);
|
true);
|
||||||
if (latest == null) {
|
if (latest == null) {
|
||||||
merged = p;
|
merged = new TransportProperties(p);
|
||||||
|
Iterator<String> it = merged.values().iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
if (isNullOrEmpty(it.next())) it.remove();
|
||||||
|
}
|
||||||
changed = true;
|
changed = true;
|
||||||
} else {
|
} else {
|
||||||
BdfList message = clientHelper.getMessageAsList(txn,
|
BdfList message = clientHelper.getMessageAsList(txn,
|
||||||
latest.messageId);
|
latest.messageId);
|
||||||
TransportProperties old = parseProperties(message);
|
TransportProperties old = parseProperties(message);
|
||||||
merged = new TransportProperties(old);
|
merged = new TransportProperties(old);
|
||||||
merged.putAll(p);
|
for (Entry<String, String> e : p.entrySet()) {
|
||||||
|
String key = e.getKey(), value = e.getValue();
|
||||||
|
if (isNullOrEmpty(value)) merged.remove(key);
|
||||||
|
else merged.put(key, value);
|
||||||
|
}
|
||||||
changed = !merged.equals(old);
|
changed = !merged.equals(old);
|
||||||
}
|
}
|
||||||
if (changed) {
|
if (changed) {
|
||||||
|
|||||||
@@ -24,21 +24,15 @@ class StreamReaderFactoryImpl implements StreamReaderFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream createStreamReader(InputStream in, StreamContext ctx) {
|
public InputStream createStreamReader(InputStream in, StreamContext ctx) {
|
||||||
return new StreamReaderImpl(streamDecrypterFactory
|
return new StreamReaderImpl(
|
||||||
.createStreamDecrypter(in, ctx));
|
streamDecrypterFactory.createStreamDecrypter(in, ctx));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream createContactExchangeStreamReader(InputStream in,
|
public InputStream createContactExchangeStreamReader(InputStream in,
|
||||||
SecretKey headerKey) {
|
SecretKey headerKey) {
|
||||||
return new StreamReaderImpl(streamDecrypterFactory
|
return new StreamReaderImpl(
|
||||||
.createContactExchangeStreamDecrypter(in, headerKey));
|
streamDecrypterFactory.createContactExchangeStreamDecrypter(in,
|
||||||
}
|
headerKey));
|
||||||
|
|
||||||
@Override
|
|
||||||
public InputStream createLogStreamReader(InputStream in,
|
|
||||||
SecretKey headerKey) {
|
|
||||||
return new StreamReaderImpl(streamDecrypterFactory
|
|
||||||
.createLogStreamDecrypter(in, headerKey));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,21 +26,15 @@ class StreamWriterFactoryImpl implements StreamWriterFactory {
|
|||||||
@Override
|
@Override
|
||||||
public StreamWriter createStreamWriter(OutputStream out,
|
public StreamWriter createStreamWriter(OutputStream out,
|
||||||
StreamContext ctx) {
|
StreamContext ctx) {
|
||||||
return new StreamWriterImpl(streamEncrypterFactory
|
return new StreamWriterImpl(
|
||||||
.createStreamEncrypter(out, ctx));
|
streamEncrypterFactory.createStreamEncrypter(out, ctx));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public StreamWriter createContactExchangeStreamWriter(OutputStream out,
|
public StreamWriter createContactExchangeStreamWriter(OutputStream out,
|
||||||
SecretKey headerKey) {
|
SecretKey headerKey) {
|
||||||
return new StreamWriterImpl(streamEncrypterFactory
|
return new StreamWriterImpl(
|
||||||
.createContactExchangeStreamEncrypter(out, headerKey));
|
streamEncrypterFactory.createContactExchangeStreamDecrypter(out,
|
||||||
}
|
headerKey));
|
||||||
|
|
||||||
@Override
|
|
||||||
public StreamWriter createLogStreamWriter(OutputStream out,
|
|
||||||
SecretKey headerKey) {
|
|
||||||
return new StreamWriterImpl(streamEncrypterFactory
|
|
||||||
.createLogStreamEncrypter(out, headerKey));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
package org.briarproject.bramble.plugin;
|
|
||||||
|
|
||||||
import org.briarproject.bramble.test.BrambleTestCase;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
public class BackoffImplTest extends BrambleTestCase {
|
|
||||||
|
|
||||||
private static final int MIN_INTERVAL = 60 * 1000;
|
|
||||||
private static final int MAX_INTERVAL = 60 * 60 * 1000;
|
|
||||||
private static final double BASE = 1.2;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testPollingIntervalStartsAtMinimum() {
|
|
||||||
BackoffImpl b = new BackoffImpl(MIN_INTERVAL, MAX_INTERVAL, BASE);
|
|
||||||
assertEquals(MIN_INTERVAL, b.getPollingInterval());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testIncrementIncreasesPollingInterval() {
|
|
||||||
BackoffImpl b = new BackoffImpl(MIN_INTERVAL, MAX_INTERVAL, BASE);
|
|
||||||
b.increment();
|
|
||||||
assertTrue(b.getPollingInterval() > MIN_INTERVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testResetResetsPollingInterval() {
|
|
||||||
BackoffImpl b = new BackoffImpl(MIN_INTERVAL, MAX_INTERVAL, BASE);
|
|
||||||
b.increment();
|
|
||||||
b.increment();
|
|
||||||
b.reset();
|
|
||||||
assertEquals(MIN_INTERVAL, b.getPollingInterval());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testBaseAffectsBackoffSpeed() {
|
|
||||||
BackoffImpl b = new BackoffImpl(MIN_INTERVAL, MAX_INTERVAL, BASE);
|
|
||||||
b.increment();
|
|
||||||
int interval = b.getPollingInterval();
|
|
||||||
BackoffImpl b1 = new BackoffImpl(MIN_INTERVAL, MAX_INTERVAL, BASE * 2);
|
|
||||||
b1.increment();
|
|
||||||
int interval1 = b1.getPollingInterval();
|
|
||||||
assertTrue(interval < interval1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testIntervalDoesNotExceedMaxInterval() {
|
|
||||||
BackoffImpl b = new BackoffImpl(MIN_INTERVAL, MAX_INTERVAL, BASE);
|
|
||||||
for (int i = 0; i < 100; i++) b.increment();
|
|
||||||
assertEquals(MAX_INTERVAL, b.getPollingInterval());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testIntervalDoesNotExceedMaxIntervalWithInfiniteMultiplier() {
|
|
||||||
BackoffImpl b = new BackoffImpl(MIN_INTERVAL, MAX_INTERVAL,
|
|
||||||
Double.POSITIVE_INFINITY);
|
|
||||||
b.increment();
|
|
||||||
assertEquals(MAX_INTERVAL, b.getPollingInterval());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -12,7 +12,6 @@ import org.briarproject.bramble.api.plugin.TransportId;
|
|||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
|
||||||
import org.briarproject.bramble.api.plugin.event.ConnectionClosedEvent;
|
import org.briarproject.bramble.api.plugin.event.ConnectionClosedEvent;
|
||||||
import org.briarproject.bramble.api.plugin.event.ConnectionOpenedEvent;
|
|
||||||
import org.briarproject.bramble.api.plugin.event.TransportActiveEvent;
|
import org.briarproject.bramble.api.plugin.event.TransportActiveEvent;
|
||||||
import org.briarproject.bramble.api.plugin.event.TransportInactiveEvent;
|
import org.briarproject.bramble.api.plugin.event.TransportInactiveEvent;
|
||||||
import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin;
|
import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin;
|
||||||
@@ -157,22 +156,20 @@ public class PollerImplTest extends BrambleMockTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRescheduleOnOutgoingConnectionClosed() {
|
public void testDoesNotReconnectOnOutgoingConnectionClosed() {
|
||||||
DuplexPlugin plugin = context.mock(DuplexPlugin.class);
|
DuplexPlugin plugin = context.mock(DuplexPlugin.class);
|
||||||
|
|
||||||
context.checking(new Expectations() {{
|
context.checking(new Expectations() {{
|
||||||
allowing(plugin).getId();
|
allowing(plugin).getId();
|
||||||
will(returnValue(transportId));
|
will(returnValue(transportId));
|
||||||
}});
|
}});
|
||||||
expectReschedule(plugin);
|
|
||||||
|
|
||||||
poller.eventOccurred(new ConnectionClosedEvent(contactId, transportId,
|
poller.eventOccurred(new ConnectionClosedEvent(contactId, transportId,
|
||||||
false, false));
|
false, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRescheduleAndReconnectOnOutgoingConnectionFailed()
|
public void testReconnectsOnOutgoingConnectionFailed() throws Exception {
|
||||||
throws Exception {
|
|
||||||
DuplexPlugin plugin = context.mock(DuplexPlugin.class);
|
DuplexPlugin plugin = context.mock(DuplexPlugin.class);
|
||||||
DuplexTransportConnection duplexConnection =
|
DuplexTransportConnection duplexConnection =
|
||||||
context.mock(DuplexTransportConnection.class);
|
context.mock(DuplexTransportConnection.class);
|
||||||
@@ -181,7 +178,6 @@ public class PollerImplTest extends BrambleMockTestCase {
|
|||||||
allowing(plugin).getId();
|
allowing(plugin).getId();
|
||||||
will(returnValue(transportId));
|
will(returnValue(transportId));
|
||||||
}});
|
}});
|
||||||
expectReschedule(plugin);
|
|
||||||
expectReconnect(plugin, duplexConnection);
|
expectReconnect(plugin, duplexConnection);
|
||||||
|
|
||||||
poller.eventOccurred(new ConnectionClosedEvent(contactId, transportId,
|
poller.eventOccurred(new ConnectionClosedEvent(contactId, transportId,
|
||||||
@@ -189,147 +185,31 @@ public class PollerImplTest extends BrambleMockTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRescheduleOnIncomingConnectionClosed() {
|
public void testDoesNotReconnectOnIncomingConnectionClosed() {
|
||||||
DuplexPlugin plugin = context.mock(DuplexPlugin.class);
|
DuplexPlugin plugin = context.mock(DuplexPlugin.class);
|
||||||
|
|
||||||
context.checking(new Expectations() {{
|
context.checking(new Expectations() {{
|
||||||
allowing(plugin).getId();
|
allowing(plugin).getId();
|
||||||
will(returnValue(transportId));
|
will(returnValue(transportId));
|
||||||
}});
|
}});
|
||||||
expectReschedule(plugin);
|
|
||||||
|
|
||||||
poller.eventOccurred(new ConnectionClosedEvent(contactId, transportId,
|
poller.eventOccurred(new ConnectionClosedEvent(contactId, transportId,
|
||||||
true, false));
|
true, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRescheduleOnIncomingConnectionFailed() {
|
public void testDoesNotReconnectOnIncomingConnectionFailed() {
|
||||||
DuplexPlugin plugin = context.mock(DuplexPlugin.class);
|
DuplexPlugin plugin = context.mock(DuplexPlugin.class);
|
||||||
|
|
||||||
context.checking(new Expectations() {{
|
context.checking(new Expectations() {{
|
||||||
allowing(plugin).getId();
|
allowing(plugin).getId();
|
||||||
will(returnValue(transportId));
|
will(returnValue(transportId));
|
||||||
}});
|
}});
|
||||||
expectReschedule(plugin);
|
|
||||||
|
|
||||||
poller.eventOccurred(new ConnectionClosedEvent(contactId, transportId,
|
poller.eventOccurred(new ConnectionClosedEvent(contactId, transportId,
|
||||||
true, false));
|
true, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testRescheduleOnConnectionOpened() {
|
|
||||||
Plugin plugin = context.mock(Plugin.class);
|
|
||||||
|
|
||||||
context.checking(new Expectations() {{
|
|
||||||
allowing(plugin).getId();
|
|
||||||
will(returnValue(transportId));
|
|
||||||
// Get the plugin
|
|
||||||
oneOf(pluginManager).getPlugin(transportId);
|
|
||||||
will(returnValue(plugin));
|
|
||||||
// The plugin supports polling
|
|
||||||
oneOf(plugin).shouldPoll();
|
|
||||||
will(returnValue(true));
|
|
||||||
// Schedule the next poll
|
|
||||||
oneOf(plugin).getPollingInterval();
|
|
||||||
will(returnValue(pollingInterval));
|
|
||||||
oneOf(clock).currentTimeMillis();
|
|
||||||
will(returnValue(now));
|
|
||||||
oneOf(scheduler).schedule(with(any(Runnable.class)),
|
|
||||||
with((long) pollingInterval), with(MILLISECONDS));
|
|
||||||
will(returnValue(future));
|
|
||||||
}});
|
|
||||||
|
|
||||||
poller.eventOccurred(new ConnectionOpenedEvent(contactId, transportId,
|
|
||||||
false));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testRescheduleDoesNotReplaceEarlierTask() {
|
|
||||||
Plugin plugin = context.mock(Plugin.class);
|
|
||||||
|
|
||||||
context.checking(new Expectations() {{
|
|
||||||
allowing(plugin).getId();
|
|
||||||
will(returnValue(transportId));
|
|
||||||
// First event
|
|
||||||
// Get the plugin
|
|
||||||
oneOf(pluginManager).getPlugin(transportId);
|
|
||||||
will(returnValue(plugin));
|
|
||||||
// The plugin supports polling
|
|
||||||
oneOf(plugin).shouldPoll();
|
|
||||||
will(returnValue(true));
|
|
||||||
// Schedule the next poll
|
|
||||||
oneOf(plugin).getPollingInterval();
|
|
||||||
will(returnValue(pollingInterval));
|
|
||||||
oneOf(clock).currentTimeMillis();
|
|
||||||
will(returnValue(now));
|
|
||||||
oneOf(scheduler).schedule(with(any(Runnable.class)),
|
|
||||||
with((long) pollingInterval), with(MILLISECONDS));
|
|
||||||
will(returnValue(future));
|
|
||||||
// Second event
|
|
||||||
// Get the plugin
|
|
||||||
oneOf(pluginManager).getPlugin(transportId);
|
|
||||||
will(returnValue(plugin));
|
|
||||||
// The plugin supports polling
|
|
||||||
oneOf(plugin).shouldPoll();
|
|
||||||
will(returnValue(true));
|
|
||||||
// Don't replace the previously scheduled task, due earlier
|
|
||||||
oneOf(plugin).getPollingInterval();
|
|
||||||
will(returnValue(pollingInterval));
|
|
||||||
oneOf(clock).currentTimeMillis();
|
|
||||||
will(returnValue(now + 1));
|
|
||||||
}});
|
|
||||||
|
|
||||||
poller.eventOccurred(new ConnectionOpenedEvent(contactId, transportId,
|
|
||||||
false));
|
|
||||||
poller.eventOccurred(new ConnectionOpenedEvent(contactId, transportId,
|
|
||||||
false));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testRescheduleReplacesLaterTask() {
|
|
||||||
Plugin plugin = context.mock(Plugin.class);
|
|
||||||
|
|
||||||
context.checking(new Expectations() {{
|
|
||||||
allowing(plugin).getId();
|
|
||||||
will(returnValue(transportId));
|
|
||||||
// First event
|
|
||||||
// Get the plugin
|
|
||||||
oneOf(pluginManager).getPlugin(transportId);
|
|
||||||
will(returnValue(plugin));
|
|
||||||
// The plugin supports polling
|
|
||||||
oneOf(plugin).shouldPoll();
|
|
||||||
will(returnValue(true));
|
|
||||||
// Schedule the next poll
|
|
||||||
oneOf(plugin).getPollingInterval();
|
|
||||||
will(returnValue(pollingInterval));
|
|
||||||
oneOf(clock).currentTimeMillis();
|
|
||||||
will(returnValue(now));
|
|
||||||
oneOf(scheduler).schedule(with(any(Runnable.class)),
|
|
||||||
with((long) pollingInterval), with(MILLISECONDS));
|
|
||||||
will(returnValue(future));
|
|
||||||
// Second event
|
|
||||||
// Get the plugin
|
|
||||||
oneOf(pluginManager).getPlugin(transportId);
|
|
||||||
will(returnValue(plugin));
|
|
||||||
// The plugin supports polling
|
|
||||||
oneOf(plugin).shouldPoll();
|
|
||||||
will(returnValue(true));
|
|
||||||
// Replace the previously scheduled task, due later
|
|
||||||
oneOf(plugin).getPollingInterval();
|
|
||||||
will(returnValue(pollingInterval - 2));
|
|
||||||
oneOf(clock).currentTimeMillis();
|
|
||||||
will(returnValue(now + 1));
|
|
||||||
oneOf(future).cancel(false);
|
|
||||||
oneOf(scheduler).schedule(with(any(Runnable.class)),
|
|
||||||
with((long) pollingInterval - 2), with(MILLISECONDS));
|
|
||||||
}});
|
|
||||||
|
|
||||||
poller.eventOccurred(new ConnectionOpenedEvent(contactId, transportId,
|
|
||||||
false));
|
|
||||||
poller.eventOccurred(new ConnectionOpenedEvent(contactId, transportId,
|
|
||||||
false));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPollsOnTransportActivated() throws Exception {
|
public void testPollsOnTransportActivated() throws Exception {
|
||||||
DuplexPlugin plugin = context.mock(DuplexPlugin.class);
|
DuplexPlugin plugin = context.mock(DuplexPlugin.class);
|
||||||
@@ -441,25 +321,6 @@ public class PollerImplTest extends BrambleMockTestCase {
|
|||||||
poller.eventOccurred(new TransportInactiveEvent(transportId));
|
poller.eventOccurred(new TransportInactiveEvent(transportId));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void expectReschedule(Plugin plugin) {
|
|
||||||
context.checking(new Expectations() {{
|
|
||||||
// Get the plugin
|
|
||||||
oneOf(pluginManager).getPlugin(transportId);
|
|
||||||
will(returnValue(plugin));
|
|
||||||
// The plugin supports polling
|
|
||||||
oneOf(plugin).shouldPoll();
|
|
||||||
will(returnValue(true));
|
|
||||||
// Schedule the next poll
|
|
||||||
oneOf(plugin).getPollingInterval();
|
|
||||||
will(returnValue(pollingInterval));
|
|
||||||
oneOf(clock).currentTimeMillis();
|
|
||||||
will(returnValue(now));
|
|
||||||
oneOf(scheduler).schedule(with(any(Runnable.class)),
|
|
||||||
with((long) pollingInterval), with(MILLISECONDS));
|
|
||||||
will(returnValue(future));
|
|
||||||
}});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void expectReconnect(DuplexPlugin plugin,
|
private void expectReconnect(DuplexPlugin plugin,
|
||||||
DuplexTransportConnection duplexConnection) throws Exception {
|
DuplexTransportConnection duplexConnection) throws Exception {
|
||||||
context.checking(new Expectations() {{
|
context.checking(new Expectations() {{
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package org.briarproject.bramble.plugin.tcp;
|
|||||||
import org.briarproject.bramble.api.data.BdfList;
|
import org.briarproject.bramble.api.data.BdfList;
|
||||||
import org.briarproject.bramble.api.keyagreement.KeyAgreementListener;
|
import org.briarproject.bramble.api.keyagreement.KeyAgreementListener;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.Plugin.State;
|
import org.briarproject.bramble.api.plugin.Plugin.State;
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.TransportConnectionReader;
|
import org.briarproject.bramble.api.plugin.TransportConnectionReader;
|
||||||
@@ -42,7 +41,6 @@ import static org.junit.Assume.assumeTrue;
|
|||||||
|
|
||||||
public class LanTcpPluginTest extends BrambleTestCase {
|
public class LanTcpPluginTest extends BrambleTestCase {
|
||||||
|
|
||||||
private final Backoff backoff = new TestBackoff();
|
|
||||||
private final ExecutorService ioExecutor = newCachedThreadPool();
|
private final ExecutorService ioExecutor = newCachedThreadPool();
|
||||||
|
|
||||||
private Callback callback = null;
|
private Callback callback = null;
|
||||||
@@ -51,7 +49,7 @@ public class LanTcpPluginTest extends BrambleTestCase {
|
|||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
callback = new Callback();
|
callback = new Callback();
|
||||||
plugin = new LanTcpPlugin(ioExecutor, backoff, callback, 0, 0, 1000) {
|
plugin = new LanTcpPlugin(ioExecutor, callback, 0, 0, 0, 1000) {
|
||||||
@Override
|
@Override
|
||||||
protected boolean canConnectToOwnAddress() {
|
protected boolean canConnectToOwnAddress() {
|
||||||
return true;
|
return true;
|
||||||
@@ -347,20 +345,4 @@ public class LanTcpPluginTest extends BrambleTestCase {
|
|||||||
public void handleWriter(TransportConnectionWriter w) {
|
public void handleWriter(TransportConnectionWriter w) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class TestBackoff implements Backoff {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPollingInterval() {
|
|
||||||
return 60 * 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void increment() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reset() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -566,6 +566,10 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
Contact contact = getContact();
|
Contact contact = getContact();
|
||||||
Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
|
Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION);
|
||||||
|
|
||||||
|
// Property with an empty value should be discarded
|
||||||
|
TransportProperties properties = new TransportProperties(fooProperties);
|
||||||
|
properties.put("fooKey3", "");
|
||||||
|
|
||||||
context.checking(new DbExpectations() {{
|
context.checking(new DbExpectations() {{
|
||||||
oneOf(db).transaction(with(false), withDbRunnable(txn));
|
oneOf(db).transaction(with(false), withDbRunnable(txn));
|
||||||
// There are no existing properties to merge with
|
// There are no existing properties to merge with
|
||||||
@@ -589,7 +593,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
}});
|
}});
|
||||||
|
|
||||||
TransportPropertyManagerImpl t = createInstance();
|
TransportPropertyManagerImpl t = createInstance();
|
||||||
t.mergeLocalProperties(new TransportId("foo"), fooProperties);
|
t.mergeLocalProperties(new TransportId("foo"), properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -605,16 +609,24 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
MessageId localGroupUpdateId = new MessageId(getRandomId());
|
MessageId localGroupUpdateId = new MessageId(getRandomId());
|
||||||
Map<MessageId, BdfDictionary> localGroupMessageMetadata =
|
Map<MessageId, BdfDictionary> localGroupMessageMetadata =
|
||||||
singletonMap(localGroupUpdateId, oldMetadata);
|
singletonMap(localGroupUpdateId, oldMetadata);
|
||||||
|
|
||||||
MessageId contactGroupUpdateId = new MessageId(getRandomId());
|
MessageId contactGroupUpdateId = new MessageId(getRandomId());
|
||||||
Map<MessageId, BdfDictionary> contactGroupMessageMetadata =
|
Map<MessageId, BdfDictionary> contactGroupMessageMetadata =
|
||||||
singletonMap(contactGroupUpdateId, oldMetadata);
|
singletonMap(contactGroupUpdateId, oldMetadata);
|
||||||
|
|
||||||
TransportProperties oldProperties = new TransportProperties();
|
TransportProperties oldProperties = new TransportProperties();
|
||||||
oldProperties.put("fooKey1", "oldFooValue1");
|
oldProperties.put("fooKey1", "oldFooValue1");
|
||||||
|
oldProperties.put("fooKey3", "oldFooValue3");
|
||||||
BdfDictionary oldPropertiesDict = BdfDictionary.of(
|
BdfDictionary oldPropertiesDict = BdfDictionary.of(
|
||||||
new BdfEntry("fooKey1", "oldFooValue1")
|
new BdfEntry("fooKey1", "oldFooValue1"),
|
||||||
|
new BdfEntry("fooKey3", "oldFooValue3")
|
||||||
);
|
);
|
||||||
BdfList oldUpdate = BdfList.of("foo", 1, oldPropertiesDict);
|
BdfList oldUpdate = BdfList.of("foo", 1, oldPropertiesDict);
|
||||||
|
|
||||||
|
// Property assigned an empty value should be removed
|
||||||
|
TransportProperties properties = new TransportProperties(fooProperties);
|
||||||
|
properties.put("fooKey3", "");
|
||||||
|
|
||||||
context.checking(new DbExpectations() {{
|
context.checking(new DbExpectations() {{
|
||||||
oneOf(db).transaction(with(false), withDbRunnable(txn));
|
oneOf(db).transaction(with(false), withDbRunnable(txn));
|
||||||
// Merge the new properties with the existing properties
|
// Merge the new properties with the existing properties
|
||||||
@@ -647,7 +659,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase {
|
|||||||
}});
|
}});
|
||||||
|
|
||||||
TransportPropertyManagerImpl t = createInstance();
|
TransportPropertyManagerImpl t = createInstance();
|
||||||
t.mergeLocalProperties(new TransportId("foo"), fooProperties);
|
t.mergeLocalProperties(new TransportId("foo"), properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void expectGetLocalProperties(Transaction txn) throws Exception {
|
private void expectGetLocalProperties(Transaction txn) throws Exception {
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import org.briarproject.bramble.api.io.TimeoutMonitor;
|
|||||||
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
||||||
import org.briarproject.bramble.api.lifecycle.ShutdownManager;
|
import org.briarproject.bramble.api.lifecycle.ShutdownManager;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.BackoffFactory;
|
|
||||||
import org.briarproject.bramble.api.plugin.BluetoothConstants;
|
import org.briarproject.bramble.api.plugin.BluetoothConstants;
|
||||||
import org.briarproject.bramble.api.plugin.LanTcpConstants;
|
import org.briarproject.bramble.api.plugin.LanTcpConstants;
|
||||||
import org.briarproject.bramble.api.plugin.PluginConfig;
|
import org.briarproject.bramble.api.plugin.PluginConfig;
|
||||||
@@ -37,18 +36,16 @@ public class DesktopPluginModule extends PluginModule {
|
|||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
PluginConfig getPluginConfig(@IoExecutor Executor ioExecutor,
|
PluginConfig getPluginConfig(@IoExecutor Executor ioExecutor,
|
||||||
SecureRandom random, BackoffFactory backoffFactory,
|
SecureRandom random, ReliabilityLayerFactory reliabilityFactory,
|
||||||
ReliabilityLayerFactory reliabilityFactory,
|
|
||||||
ShutdownManager shutdownManager, EventBus eventBus,
|
ShutdownManager shutdownManager, EventBus eventBus,
|
||||||
TimeoutMonitor timeoutMonitor) {
|
TimeoutMonitor timeoutMonitor) {
|
||||||
DuplexPluginFactory bluetooth = new JavaBluetoothPluginFactory(
|
DuplexPluginFactory bluetooth = new JavaBluetoothPluginFactory(
|
||||||
ioExecutor, random, eventBus, timeoutMonitor, backoffFactory);
|
ioExecutor, random, eventBus, timeoutMonitor);
|
||||||
DuplexPluginFactory modem = new ModemPluginFactory(ioExecutor,
|
DuplexPluginFactory modem = new ModemPluginFactory(ioExecutor,
|
||||||
reliabilityFactory);
|
reliabilityFactory);
|
||||||
DuplexPluginFactory lan = new LanTcpPluginFactory(ioExecutor, eventBus,
|
DuplexPluginFactory lan = new LanTcpPluginFactory(ioExecutor, eventBus);
|
||||||
backoffFactory);
|
|
||||||
DuplexPluginFactory wan = new WanTcpPluginFactory(ioExecutor, eventBus,
|
DuplexPluginFactory wan = new WanTcpPluginFactory(ioExecutor, eventBus,
|
||||||
backoffFactory, shutdownManager);
|
shutdownManager);
|
||||||
Collection<DuplexPluginFactory> duplex =
|
Collection<DuplexPluginFactory> duplex =
|
||||||
asList(bluetooth, modem, lan, wan);
|
asList(bluetooth, modem, lan, wan);
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package org.briarproject.bramble.plugin.bluetooth;
|
|||||||
import org.briarproject.bramble.api.io.TimeoutMonitor;
|
import org.briarproject.bramble.api.io.TimeoutMonitor;
|
||||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
|
||||||
|
|
||||||
@@ -36,10 +35,10 @@ class JavaBluetoothPlugin extends BluetoothPlugin<StreamConnectionNotifier> {
|
|||||||
|
|
||||||
JavaBluetoothPlugin(BluetoothConnectionLimiter connectionManager,
|
JavaBluetoothPlugin(BluetoothConnectionLimiter connectionManager,
|
||||||
TimeoutMonitor timeoutMonitor, Executor ioExecutor,
|
TimeoutMonitor timeoutMonitor, Executor ioExecutor,
|
||||||
SecureRandom secureRandom, Backoff backoff,
|
SecureRandom secureRandom, PluginCallback callback, int maxLatency,
|
||||||
PluginCallback callback, int maxLatency, int maxIdleTime) {
|
int maxIdleTime, int pollingInterval) {
|
||||||
super(connectionManager, timeoutMonitor, ioExecutor, secureRandom,
|
super(connectionManager, timeoutMonitor, ioExecutor, secureRandom,
|
||||||
backoff, callback, maxLatency, maxIdleTime);
|
callback, maxLatency, maxIdleTime, pollingInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ package org.briarproject.bramble.plugin.bluetooth;
|
|||||||
import org.briarproject.bramble.api.event.EventBus;
|
import org.briarproject.bramble.api.event.EventBus;
|
||||||
import org.briarproject.bramble.api.io.TimeoutMonitor;
|
import org.briarproject.bramble.api.io.TimeoutMonitor;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.BackoffFactory;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
||||||
@@ -15,32 +13,30 @@ import java.util.concurrent.Executor;
|
|||||||
|
|
||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
|
|
||||||
|
import static java.util.concurrent.TimeUnit.MINUTES;
|
||||||
|
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||||
import static org.briarproject.bramble.api.plugin.BluetoothConstants.ID;
|
import static org.briarproject.bramble.api.plugin.BluetoothConstants.ID;
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public class JavaBluetoothPluginFactory implements DuplexPluginFactory {
|
public class JavaBluetoothPluginFactory implements DuplexPluginFactory {
|
||||||
|
|
||||||
private static final int MAX_LATENCY = 30 * 1000; // 30 seconds
|
private static final int MAX_LATENCY = (int) SECONDS.toMillis(30);
|
||||||
private static final int MAX_IDLE_TIME = 30 * 1000; // 30 seconds
|
private static final int MAX_IDLE_TIME = (int) SECONDS.toMillis(30);
|
||||||
private static final int MIN_POLLING_INTERVAL = 60 * 1000; // 1 minute
|
private static final int POLLING_INTERVAL = (int) MINUTES.toMillis(2);
|
||||||
private static final int MAX_POLLING_INTERVAL = 10 * 60 * 1000; // 10 mins
|
|
||||||
private static final double BACKOFF_BASE = 1.2;
|
|
||||||
|
|
||||||
private final Executor ioExecutor;
|
private final Executor ioExecutor;
|
||||||
private final SecureRandom secureRandom;
|
private final SecureRandom secureRandom;
|
||||||
private final EventBus eventBus;
|
private final EventBus eventBus;
|
||||||
private final TimeoutMonitor timeoutMonitor;
|
private final TimeoutMonitor timeoutMonitor;
|
||||||
private final BackoffFactory backoffFactory;
|
|
||||||
|
|
||||||
public JavaBluetoothPluginFactory(Executor ioExecutor,
|
public JavaBluetoothPluginFactory(Executor ioExecutor,
|
||||||
SecureRandom secureRandom, EventBus eventBus,
|
SecureRandom secureRandom, EventBus eventBus,
|
||||||
TimeoutMonitor timeoutMonitor, BackoffFactory backoffFactory) {
|
TimeoutMonitor timeoutMonitor) {
|
||||||
this.ioExecutor = ioExecutor;
|
this.ioExecutor = ioExecutor;
|
||||||
this.secureRandom = secureRandom;
|
this.secureRandom = secureRandom;
|
||||||
this.eventBus = eventBus;
|
this.eventBus = eventBus;
|
||||||
this.timeoutMonitor = timeoutMonitor;
|
this.timeoutMonitor = timeoutMonitor;
|
||||||
this.backoffFactory = backoffFactory;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -57,11 +53,9 @@ public class JavaBluetoothPluginFactory implements DuplexPluginFactory {
|
|||||||
public DuplexPlugin createPlugin(PluginCallback callback) {
|
public DuplexPlugin createPlugin(PluginCallback callback) {
|
||||||
BluetoothConnectionLimiter connectionLimiter =
|
BluetoothConnectionLimiter connectionLimiter =
|
||||||
new BluetoothConnectionLimiterImpl(eventBus);
|
new BluetoothConnectionLimiterImpl(eventBus);
|
||||||
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
|
|
||||||
MAX_POLLING_INTERVAL, BACKOFF_BASE);
|
|
||||||
JavaBluetoothPlugin plugin = new JavaBluetoothPlugin(connectionLimiter,
|
JavaBluetoothPlugin plugin = new JavaBluetoothPlugin(connectionLimiter,
|
||||||
timeoutMonitor, ioExecutor, secureRandom, backoff, callback,
|
timeoutMonitor, ioExecutor, secureRandom, callback, MAX_LATENCY,
|
||||||
MAX_LATENCY, MAX_IDLE_TIME);
|
MAX_IDLE_TIME, POLLING_INTERVAL);
|
||||||
eventBus.addListener(plugin);
|
eventBus.addListener(plugin);
|
||||||
return plugin;
|
return plugin;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package org.briarproject.bramble.plugin.tor;
|
|||||||
import org.briarproject.bramble.api.battery.BatteryManager;
|
import org.briarproject.bramble.api.battery.BatteryManager;
|
||||||
import org.briarproject.bramble.api.network.NetworkManager;
|
import org.briarproject.bramble.api.network.NetworkManager;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.system.Clock;
|
import org.briarproject.bramble.api.system.Clock;
|
||||||
import org.briarproject.bramble.api.system.LocationUtils;
|
import org.briarproject.bramble.api.system.LocationUtils;
|
||||||
@@ -24,14 +23,16 @@ abstract class JavaTorPlugin extends TorPlugin {
|
|||||||
LocationUtils locationUtils, SocketFactory torSocketFactory,
|
LocationUtils locationUtils, SocketFactory torSocketFactory,
|
||||||
Clock clock, ResourceProvider resourceProvider,
|
Clock clock, ResourceProvider resourceProvider,
|
||||||
CircumventionProvider circumventionProvider,
|
CircumventionProvider circumventionProvider,
|
||||||
BatteryManager batteryManager, Backoff backoff,
|
BatteryManager batteryManager,
|
||||||
TorRendezvousCrypto torRendezvousCrypto,
|
TorRendezvousCrypto torRendezvousCrypto,
|
||||||
PluginCallback callback, String architecture, int maxLatency,
|
PluginCallback callback, String architecture, int maxLatency,
|
||||||
int maxIdleTime, File torDirectory) {
|
int maxIdleTime, int initialPollingInterval,
|
||||||
|
int stablePollingInterval, File torDirectory) {
|
||||||
super(ioExecutor, networkManager, locationUtils, torSocketFactory,
|
super(ioExecutor, networkManager, locationUtils, torSocketFactory,
|
||||||
clock, resourceProvider, circumventionProvider, batteryManager,
|
clock, resourceProvider, circumventionProvider, batteryManager,
|
||||||
backoff, torRendezvousCrypto, callback, architecture,
|
torRendezvousCrypto, callback, architecture, maxLatency,
|
||||||
maxLatency, maxIdleTime, torDirectory);
|
maxIdleTime, initialPollingInterval, stablePollingInterval,
|
||||||
|
torDirectory);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import com.sun.jna.Native;
|
|||||||
import org.briarproject.bramble.api.battery.BatteryManager;
|
import org.briarproject.bramble.api.battery.BatteryManager;
|
||||||
import org.briarproject.bramble.api.network.NetworkManager;
|
import org.briarproject.bramble.api.network.NetworkManager;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.system.Clock;
|
import org.briarproject.bramble.api.system.Clock;
|
||||||
import org.briarproject.bramble.api.system.LocationUtils;
|
import org.briarproject.bramble.api.system.LocationUtils;
|
||||||
@@ -24,14 +23,16 @@ class UnixTorPlugin extends JavaTorPlugin {
|
|||||||
LocationUtils locationUtils, SocketFactory torSocketFactory,
|
LocationUtils locationUtils, SocketFactory torSocketFactory,
|
||||||
Clock clock, ResourceProvider resourceProvider,
|
Clock clock, ResourceProvider resourceProvider,
|
||||||
CircumventionProvider circumventionProvider,
|
CircumventionProvider circumventionProvider,
|
||||||
BatteryManager batteryManager, Backoff backoff,
|
BatteryManager batteryManager,
|
||||||
TorRendezvousCrypto torRendezvousCrypto,
|
TorRendezvousCrypto torRendezvousCrypto,
|
||||||
PluginCallback callback, String architecture, int maxLatency,
|
PluginCallback callback, String architecture, int maxLatency,
|
||||||
int maxIdleTime, File torDirectory) {
|
int maxIdleTime, int initialPollingInterval,
|
||||||
|
int stablePollingInterval, File torDirectory) {
|
||||||
super(ioExecutor, networkManager, locationUtils, torSocketFactory,
|
super(ioExecutor, networkManager, locationUtils, torSocketFactory,
|
||||||
clock, resourceProvider, circumventionProvider, batteryManager,
|
clock, resourceProvider, circumventionProvider, batteryManager,
|
||||||
backoff, torRendezvousCrypto, callback, architecture,
|
torRendezvousCrypto, callback, architecture,
|
||||||
maxLatency, maxIdleTime, torDirectory);
|
maxLatency, maxIdleTime, initialPollingInterval,
|
||||||
|
stablePollingInterval, torDirectory);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import org.briarproject.bramble.api.battery.BatteryManager;
|
|||||||
import org.briarproject.bramble.api.event.EventBus;
|
import org.briarproject.bramble.api.event.EventBus;
|
||||||
import org.briarproject.bramble.api.network.NetworkManager;
|
import org.briarproject.bramble.api.network.NetworkManager;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.Backoff;
|
|
||||||
import org.briarproject.bramble.api.plugin.BackoffFactory;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginCallback;
|
import org.briarproject.bramble.api.plugin.PluginCallback;
|
||||||
import org.briarproject.bramble.api.plugin.TorConstants;
|
import org.briarproject.bramble.api.plugin.TorConstants;
|
||||||
import org.briarproject.bramble.api.plugin.TransportId;
|
import org.briarproject.bramble.api.plugin.TransportId;
|
||||||
@@ -22,6 +20,8 @@ import java.util.logging.Logger;
|
|||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
import javax.net.SocketFactory;
|
import javax.net.SocketFactory;
|
||||||
|
|
||||||
|
import static java.util.concurrent.TimeUnit.MINUTES;
|
||||||
|
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||||
import static java.util.logging.Logger.getLogger;
|
import static java.util.logging.Logger.getLogger;
|
||||||
import static org.briarproject.bramble.util.OsUtils.isLinux;
|
import static org.briarproject.bramble.util.OsUtils.isLinux;
|
||||||
|
|
||||||
@@ -32,18 +32,28 @@ public class UnixTorPluginFactory implements DuplexPluginFactory {
|
|||||||
private static final Logger LOG =
|
private static final Logger LOG =
|
||||||
getLogger(UnixTorPluginFactory.class.getName());
|
getLogger(UnixTorPluginFactory.class.getName());
|
||||||
|
|
||||||
private static final int MAX_LATENCY = 30 * 1000; // 30 seconds
|
private static final int MAX_LATENCY = (int) SECONDS.toMillis(30);
|
||||||
private static final int MAX_IDLE_TIME = 30 * 1000; // 30 seconds
|
private static final int MAX_IDLE_TIME = (int) SECONDS.toMillis(30);
|
||||||
private static final int MIN_POLLING_INTERVAL = 60 * 1000; // 1 minute
|
|
||||||
private static final int MAX_POLLING_INTERVAL = 10 * 60 * 1000; // 10 mins
|
/**
|
||||||
private static final double BACKOFF_BASE = 1.2;
|
* How often to poll before our hidden service becomes reachable.
|
||||||
|
*/
|
||||||
|
private static final int INITIAL_POLLING_INTERVAL =
|
||||||
|
(int) MINUTES.toMillis(1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How often to poll when our hidden service is reachable. Our contacts
|
||||||
|
* will poll when they come online, so our polling is just a fallback in
|
||||||
|
* case of repeated connection failures.
|
||||||
|
*/
|
||||||
|
private static final int STABLE_POLLING_INTERVAL =
|
||||||
|
(int) MINUTES.toMillis(15);
|
||||||
|
|
||||||
private final Executor ioExecutor;
|
private final Executor ioExecutor;
|
||||||
private final NetworkManager networkManager;
|
private final NetworkManager networkManager;
|
||||||
private final LocationUtils locationUtils;
|
private final LocationUtils locationUtils;
|
||||||
private final EventBus eventBus;
|
private final EventBus eventBus;
|
||||||
private final SocketFactory torSocketFactory;
|
private final SocketFactory torSocketFactory;
|
||||||
private final BackoffFactory backoffFactory;
|
|
||||||
private final ResourceProvider resourceProvider;
|
private final ResourceProvider resourceProvider;
|
||||||
private final CircumventionProvider circumventionProvider;
|
private final CircumventionProvider circumventionProvider;
|
||||||
private final BatteryManager batteryManager;
|
private final BatteryManager batteryManager;
|
||||||
@@ -53,7 +63,7 @@ public class UnixTorPluginFactory implements DuplexPluginFactory {
|
|||||||
public UnixTorPluginFactory(Executor ioExecutor,
|
public UnixTorPluginFactory(Executor ioExecutor,
|
||||||
NetworkManager networkManager, LocationUtils locationUtils,
|
NetworkManager networkManager, LocationUtils locationUtils,
|
||||||
EventBus eventBus, SocketFactory torSocketFactory,
|
EventBus eventBus, SocketFactory torSocketFactory,
|
||||||
BackoffFactory backoffFactory, ResourceProvider resourceProvider,
|
ResourceProvider resourceProvider,
|
||||||
CircumventionProvider circumventionProvider,
|
CircumventionProvider circumventionProvider,
|
||||||
BatteryManager batteryManager, Clock clock, File torDirectory) {
|
BatteryManager batteryManager, Clock clock, File torDirectory) {
|
||||||
this.ioExecutor = ioExecutor;
|
this.ioExecutor = ioExecutor;
|
||||||
@@ -61,7 +71,6 @@ public class UnixTorPluginFactory implements DuplexPluginFactory {
|
|||||||
this.locationUtils = locationUtils;
|
this.locationUtils = locationUtils;
|
||||||
this.eventBus = eventBus;
|
this.eventBus = eventBus;
|
||||||
this.torSocketFactory = torSocketFactory;
|
this.torSocketFactory = torSocketFactory;
|
||||||
this.backoffFactory = backoffFactory;
|
|
||||||
this.resourceProvider = resourceProvider;
|
this.resourceProvider = resourceProvider;
|
||||||
this.circumventionProvider = circumventionProvider;
|
this.circumventionProvider = circumventionProvider;
|
||||||
this.batteryManager = batteryManager;
|
this.batteryManager = batteryManager;
|
||||||
@@ -94,14 +103,13 @@ public class UnixTorPluginFactory implements DuplexPluginFactory {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL,
|
|
||||||
MAX_POLLING_INTERVAL, BACKOFF_BASE);
|
|
||||||
TorRendezvousCrypto torRendezvousCrypto = new TorRendezvousCryptoImpl();
|
TorRendezvousCrypto torRendezvousCrypto = new TorRendezvousCryptoImpl();
|
||||||
UnixTorPlugin plugin = new UnixTorPlugin(ioExecutor, networkManager,
|
UnixTorPlugin plugin = new UnixTorPlugin(ioExecutor, networkManager,
|
||||||
locationUtils, torSocketFactory, clock, resourceProvider,
|
locationUtils, torSocketFactory, clock, resourceProvider,
|
||||||
circumventionProvider, batteryManager, backoff,
|
circumventionProvider, batteryManager, torRendezvousCrypto,
|
||||||
torRendezvousCrypto, callback, architecture, MAX_LATENCY,
|
callback, architecture, MAX_LATENCY, MAX_IDLE_TIME,
|
||||||
MAX_IDLE_TIME, torDirectory);
|
INITIAL_POLLING_INTERVAL, STABLE_POLLING_INTERVAL,
|
||||||
|
torDirectory);
|
||||||
eventBus.addListener(plugin);
|
eventBus.addListener(plugin);
|
||||||
return plugin;
|
return plugin;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import org.briarproject.bramble.api.battery.BatteryManager;
|
|||||||
import org.briarproject.bramble.api.event.EventBus;
|
import org.briarproject.bramble.api.event.EventBus;
|
||||||
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
||||||
import org.briarproject.bramble.api.network.NetworkManager;
|
import org.briarproject.bramble.api.network.NetworkManager;
|
||||||
import org.briarproject.bramble.api.plugin.BackoffFactory;
|
|
||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
import org.briarproject.bramble.api.plugin.duplex.DuplexPlugin;
|
||||||
import org.briarproject.bramble.api.system.Clock;
|
import org.briarproject.bramble.api.system.Clock;
|
||||||
import org.briarproject.bramble.api.system.LocationUtils;
|
import org.briarproject.bramble.api.system.LocationUtils;
|
||||||
@@ -69,8 +68,6 @@ public class BridgeTest extends BrambleTestCase {
|
|||||||
@Inject
|
@Inject
|
||||||
EventBus eventBus;
|
EventBus eventBus;
|
||||||
@Inject
|
@Inject
|
||||||
BackoffFactory backoffFactory;
|
|
||||||
@Inject
|
|
||||||
Clock clock;
|
Clock clock;
|
||||||
|
|
||||||
private final File torDir = getTestDirectory();
|
private final File torDir = getTestDirectory();
|
||||||
@@ -120,9 +117,8 @@ public class BridgeTest extends BrambleTestCase {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
factory = new UnixTorPluginFactory(ioExecutor, networkManager,
|
factory = new UnixTorPluginFactory(ioExecutor, networkManager,
|
||||||
locationUtils, eventBus, torSocketFactory, backoffFactory,
|
locationUtils, eventBus, torSocketFactory, resourceProvider,
|
||||||
resourceProvider, bridgeProvider, batteryManager, clock,
|
bridgeProvider, batteryManager, clock, torDir);
|
||||||
torDir);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ android {
|
|||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 28
|
targetSdkVersion 28
|
||||||
versionCode 10209
|
versionCode 10207
|
||||||
versionName "1.2.9"
|
versionName "1.2.7"
|
||||||
applicationId "org.briarproject.briar.android"
|
applicationId "org.briarproject.briar.android"
|
||||||
buildConfigField "String", "GitHash",
|
buildConfigField "String", "GitHash",
|
||||||
"\"${getStdout(['git', 'rev-parse', '--short=7', 'HEAD'], 'No commit hash')}\""
|
"\"${getStdout(['git', 'rev-parse', '--short=7', 'HEAD'], 'No commit hash')}\""
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import android.content.SharedPreferences;
|
|||||||
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
||||||
import org.briarproject.bramble.api.db.DatabaseConfig;
|
import org.briarproject.bramble.api.db.DatabaseConfig;
|
||||||
import org.briarproject.bramble.api.identity.IdentityManager;
|
import org.briarproject.bramble.api.identity.IdentityManager;
|
||||||
import org.briarproject.bramble.api.logging.PersistentLogManager;
|
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.Localizer;
|
import org.briarproject.briar.android.Localizer;
|
||||||
import org.briarproject.briar.android.util.UiUtils;
|
import org.briarproject.briar.android.util.UiUtils;
|
||||||
@@ -18,8 +17,8 @@ class BriarAccountManager extends AndroidAccountManager {
|
|||||||
@Inject
|
@Inject
|
||||||
BriarAccountManager(DatabaseConfig databaseConfig, CryptoComponent crypto,
|
BriarAccountManager(DatabaseConfig databaseConfig, CryptoComponent crypto,
|
||||||
IdentityManager identityManager, SharedPreferences prefs,
|
IdentityManager identityManager, SharedPreferences prefs,
|
||||||
PersistentLogManager logManager, Application app) {
|
Application app) {
|
||||||
super(databaseConfig, crypto, identityManager, prefs, logManager, app);
|
super(databaseConfig, crypto, identityManager, prefs, app);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import org.briarproject.bramble.api.keyagreement.PayloadEncoder;
|
|||||||
import org.briarproject.bramble.api.keyagreement.PayloadParser;
|
import org.briarproject.bramble.api.keyagreement.PayloadParser;
|
||||||
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
||||||
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
||||||
import org.briarproject.bramble.api.logging.PersistentLogManager;
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginManager;
|
import org.briarproject.bramble.api.plugin.PluginManager;
|
||||||
import org.briarproject.bramble.api.settings.SettingsManager;
|
import org.briarproject.bramble.api.settings.SettingsManager;
|
||||||
import org.briarproject.bramble.api.system.AndroidExecutor;
|
import org.briarproject.bramble.api.system.AndroidExecutor;
|
||||||
@@ -57,7 +56,6 @@ import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager
|
|||||||
import org.briarproject.briar.api.test.TestDataCreator;
|
import org.briarproject.briar.api.test.TestDataCreator;
|
||||||
|
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.logging.Formatter;
|
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
@@ -167,10 +165,6 @@ public interface AndroidComponent
|
|||||||
|
|
||||||
FeatureFlags featureFlags();
|
FeatureFlags featureFlags();
|
||||||
|
|
||||||
PersistentLogManager persistentLogManager();
|
|
||||||
|
|
||||||
Formatter formatter();
|
|
||||||
|
|
||||||
void inject(SignInReminderReceiver briarService);
|
void inject(SignInReminderReceiver briarService);
|
||||||
|
|
||||||
void inject(BriarService briarService);
|
void inject(BriarService briarService);
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
|||||||
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
||||||
import org.briarproject.bramble.api.network.NetworkManager;
|
import org.briarproject.bramble.api.network.NetworkManager;
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
import org.briarproject.bramble.api.plugin.BackoffFactory;
|
|
||||||
import org.briarproject.bramble.api.plugin.BluetoothConstants;
|
import org.briarproject.bramble.api.plugin.BluetoothConstants;
|
||||||
import org.briarproject.bramble.api.plugin.LanTcpConstants;
|
import org.briarproject.bramble.api.plugin.LanTcpConstants;
|
||||||
import org.briarproject.bramble.api.plugin.PluginConfig;
|
import org.briarproject.bramble.api.plugin.PluginConfig;
|
||||||
@@ -127,23 +126,22 @@ public class AppModule {
|
|||||||
PluginConfig providePluginConfig(@IoExecutor Executor ioExecutor,
|
PluginConfig providePluginConfig(@IoExecutor Executor ioExecutor,
|
||||||
@Scheduler ScheduledExecutorService scheduler,
|
@Scheduler ScheduledExecutorService scheduler,
|
||||||
AndroidExecutor androidExecutor, SecureRandom random,
|
AndroidExecutor androidExecutor, SecureRandom random,
|
||||||
SocketFactory torSocketFactory, BackoffFactory backoffFactory,
|
SocketFactory torSocketFactory, Application app,
|
||||||
Application app, NetworkManager networkManager,
|
NetworkManager networkManager, LocationUtils locationUtils,
|
||||||
LocationUtils locationUtils, EventBus eventBus,
|
EventBus eventBus, ResourceProvider resourceProvider,
|
||||||
ResourceProvider resourceProvider,
|
|
||||||
CircumventionProvider circumventionProvider,
|
CircumventionProvider circumventionProvider,
|
||||||
BatteryManager batteryManager, Clock clock,
|
BatteryManager batteryManager, Clock clock,
|
||||||
TimeoutMonitor timeoutMonitor) {
|
TimeoutMonitor timeoutMonitor) {
|
||||||
Context appContext = app.getApplicationContext();
|
Context appContext = app.getApplicationContext();
|
||||||
DuplexPluginFactory bluetooth = new AndroidBluetoothPluginFactory(
|
DuplexPluginFactory bluetooth = new AndroidBluetoothPluginFactory(
|
||||||
ioExecutor, scheduler, androidExecutor, appContext, random,
|
ioExecutor, scheduler, androidExecutor, appContext, random,
|
||||||
eventBus, clock, timeoutMonitor, backoffFactory);
|
eventBus, clock, timeoutMonitor);
|
||||||
DuplexPluginFactory tor = new AndroidTorPluginFactory(ioExecutor,
|
DuplexPluginFactory tor = new AndroidTorPluginFactory(ioExecutor,
|
||||||
scheduler, appContext, networkManager, locationUtils, eventBus,
|
scheduler, appContext, networkManager, locationUtils, eventBus,
|
||||||
torSocketFactory, backoffFactory, resourceProvider,
|
torSocketFactory, resourceProvider, circumventionProvider,
|
||||||
circumventionProvider, batteryManager, clock);
|
batteryManager, clock);
|
||||||
DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor,
|
DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor,
|
||||||
eventBus, backoffFactory, appContext);
|
eventBus, appContext);
|
||||||
Collection<DuplexPluginFactory> duplex = asList(bluetooth, tor, lan);
|
Collection<DuplexPluginFactory> duplex = asList(bluetooth, tor, lan);
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
PluginConfig pluginConfig = new PluginConfig() {
|
PluginConfig pluginConfig = new PluginConfig() {
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import org.acra.ReportingInteractionMode;
|
|||||||
import org.acra.annotation.ReportsCrashes;
|
import org.acra.annotation.ReportsCrashes;
|
||||||
import org.briarproject.bramble.BrambleAndroidEagerSingletons;
|
import org.briarproject.bramble.BrambleAndroidEagerSingletons;
|
||||||
import org.briarproject.bramble.BrambleCoreEagerSingletons;
|
import org.briarproject.bramble.BrambleCoreEagerSingletons;
|
||||||
import org.briarproject.bramble.api.logging.PersistentLogManager;
|
|
||||||
import org.briarproject.briar.BriarCoreEagerSingletons;
|
import org.briarproject.briar.BriarCoreEagerSingletons;
|
||||||
import org.briarproject.briar.BuildConfig;
|
import org.briarproject.briar.BuildConfig;
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
@@ -29,8 +28,6 @@ import org.briarproject.briar.android.reporting.BriarReportSenderFactory;
|
|||||||
import org.briarproject.briar.android.reporting.DevReportActivity;
|
import org.briarproject.briar.android.reporting.DevReportActivity;
|
||||||
import org.briarproject.briar.android.util.UiUtils;
|
import org.briarproject.briar.android.util.UiUtils;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.logging.Handler;
|
import java.util.logging.Handler;
|
||||||
import java.util.logging.LogRecord;
|
import java.util.logging.LogRecord;
|
||||||
@@ -39,7 +36,6 @@ import java.util.logging.Logger;
|
|||||||
import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
|
import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
|
||||||
import static java.util.logging.Level.FINE;
|
import static java.util.logging.Level.FINE;
|
||||||
import static java.util.logging.Level.INFO;
|
import static java.util.logging.Level.INFO;
|
||||||
import static java.util.logging.Level.WARNING;
|
|
||||||
import static java.util.logging.Logger.getLogger;
|
import static java.util.logging.Logger.getLogger;
|
||||||
import static org.acra.ReportField.ANDROID_VERSION;
|
import static org.acra.ReportField.ANDROID_VERSION;
|
||||||
import static org.acra.ReportField.APP_VERSION_CODE;
|
import static org.acra.ReportField.APP_VERSION_CODE;
|
||||||
@@ -58,7 +54,6 @@ import static org.acra.ReportField.REPORT_ID;
|
|||||||
import static org.acra.ReportField.STACK_TRACE;
|
import static org.acra.ReportField.STACK_TRACE;
|
||||||
import static org.acra.ReportField.USER_APP_START_DATE;
|
import static org.acra.ReportField.USER_APP_START_DATE;
|
||||||
import static org.acra.ReportField.USER_CRASH_DATE;
|
import static org.acra.ReportField.USER_CRASH_DATE;
|
||||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
|
||||||
import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
|
import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
|
||||||
|
|
||||||
@ReportsCrashes(
|
@ReportsCrashes(
|
||||||
@@ -125,19 +120,9 @@ public class BriarApplicationImpl extends Application
|
|||||||
rootLogger.addHandler(logHandler);
|
rootLogger.addHandler(logHandler);
|
||||||
rootLogger.setLevel(IS_DEBUG_BUILD ? FINE : INFO);
|
rootLogger.setLevel(IS_DEBUG_BUILD ? FINE : INFO);
|
||||||
|
|
||||||
applicationComponent = createApplicationComponent();
|
|
||||||
|
|
||||||
PersistentLogManager logManager =
|
|
||||||
applicationComponent.persistentLogManager();
|
|
||||||
File logDir = getDir("log", MODE_PRIVATE);
|
|
||||||
try {
|
|
||||||
rootLogger.addHandler(logManager.createLogHandler(logDir));
|
|
||||||
} catch (IOException e) {
|
|
||||||
logException(LOG, WARNING, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG.info("Created");
|
LOG.info("Created");
|
||||||
|
|
||||||
|
applicationComponent = createApplicationComponent();
|
||||||
EmojiManager.install(new GoogleEmojiProvider());
|
EmojiManager.install(new GoogleEmojiProvider());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,5 @@ public interface RequestCodes {
|
|||||||
int REQUEST_KEYGUARD_UNLOCK = 12;
|
int REQUEST_KEYGUARD_UNLOCK = 12;
|
||||||
int REQUEST_ATTACH_IMAGE = 13;
|
int REQUEST_ATTACH_IMAGE = 13;
|
||||||
int REQUEST_SAVE_ATTACHMENT = 14;
|
int REQUEST_SAVE_ATTACHMENT = 14;
|
||||||
int REQUEST_EXPORT_LOG = 15;
|
|
||||||
int REQUEST_EXPORT_OLD_LOG = 16;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.briarproject.bramble.logging;
|
package org.briarproject.briar.android.logging;
|
||||||
|
|
||||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||||
|
|
||||||
@@ -47,7 +47,6 @@ public class BriefLogFormatter extends Formatter {
|
|||||||
sb.append('\n');
|
sb.append('\n');
|
||||||
appendThrowable(sb, t);
|
appendThrowable(sb, t);
|
||||||
}
|
}
|
||||||
sb.append('\n');
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,7 +71,6 @@ import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE;
|
|||||||
import static org.briarproject.bramble.api.plugin.Plugin.State.ENABLING;
|
import static org.briarproject.bramble.api.plugin.Plugin.State.ENABLING;
|
||||||
import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING;
|
import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING;
|
||||||
import static org.briarproject.briar.android.BriarService.EXTRA_STARTUP_FAILED;
|
import static org.briarproject.briar.android.BriarService.EXTRA_STARTUP_FAILED;
|
||||||
import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
|
|
||||||
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSWORD;
|
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSWORD;
|
||||||
import static org.briarproject.briar.android.navdrawer.IntentRouter.handleExternalIntent;
|
import static org.briarproject.briar.android.navdrawer.IntentRouter.handleExternalIntent;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.getDaysUntilExpiry;
|
import static org.briarproject.briar.android.util.UiUtils.getDaysUntilExpiry;
|
||||||
@@ -129,10 +128,8 @@ public class NavDrawerActivity extends BriarActivity implements
|
|||||||
navDrawerViewModel = provider.get(NavDrawerViewModel.class);
|
navDrawerViewModel = provider.get(NavDrawerViewModel.class);
|
||||||
pluginViewModel = provider.get(PluginViewModel.class);
|
pluginViewModel = provider.get(PluginViewModel.class);
|
||||||
|
|
||||||
if (IS_DEBUG_BUILD) {
|
navDrawerViewModel.showExpiryWarning()
|
||||||
navDrawerViewModel.showExpiryWarning()
|
.observe(this, this::showExpiryWarning);
|
||||||
.observe(this, this::showExpiryWarning);
|
|
||||||
}
|
|
||||||
navDrawerViewModel.shouldAskForDozeWhitelisting().observe(this, ask -> {
|
navDrawerViewModel.shouldAskForDozeWhitelisting().observe(this, ask -> {
|
||||||
if (ask) showDozeDialog(getString(R.string.setup_doze_intro));
|
if (ask) showDozeDialog(getString(R.string.setup_doze_intro));
|
||||||
});
|
});
|
||||||
@@ -174,7 +171,7 @@ public class NavDrawerActivity extends BriarActivity implements
|
|||||||
public void onStart() {
|
public void onStart() {
|
||||||
super.onStart();
|
super.onStart();
|
||||||
lockManager.checkIfLockable();
|
lockManager.checkIfLockable();
|
||||||
if (IS_DEBUG_BUILD) navDrawerViewModel.checkExpiryWarning();
|
navDrawerViewModel.checkExpiryWarning();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -353,7 +350,7 @@ public class NavDrawerActivity extends BriarActivity implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void showExpiryWarning(boolean show) {
|
private void showExpiryWarning(boolean show) {
|
||||||
long daysUntilExpiry = getDaysUntilExpiry();
|
int daysUntilExpiry = getDaysUntilExpiry();
|
||||||
if (daysUntilExpiry < 0) {
|
if (daysUntilExpiry < 0) {
|
||||||
signOut();
|
signOut();
|
||||||
return;
|
return;
|
||||||
@@ -365,8 +362,7 @@ public class NavDrawerActivity extends BriarActivity implements
|
|||||||
TextView expiryWarningText =
|
TextView expiryWarningText =
|
||||||
expiryWarning.findViewById(R.id.expiryWarningText);
|
expiryWarning.findViewById(R.id.expiryWarningText);
|
||||||
String text = getResources().getQuantityString(
|
String text = getResources().getQuantityString(
|
||||||
R.plurals.expiry_warning, (int) daysUntilExpiry,
|
R.plurals.expiry_warning, daysUntilExpiry, daysUntilExpiry);
|
||||||
(int) daysUntilExpiry);
|
|
||||||
expiryWarningText.setText(text);
|
expiryWarningText.setText(text);
|
||||||
// make close button functional
|
// make close button functional
|
||||||
ImageView expiryWarningClose =
|
ImageView expiryWarningClose =
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import static java.util.logging.Level.WARNING;
|
|||||||
import static java.util.logging.Logger.getLogger;
|
import static java.util.logging.Logger.getLogger;
|
||||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||||
import static org.briarproject.briar.android.TestingConstants.EXPIRY_DATE;
|
import static org.briarproject.briar.android.TestingConstants.EXPIRY_DATE;
|
||||||
|
import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD;
|
||||||
import static org.briarproject.briar.android.controller.BriarControllerImpl.DOZE_ASK_AGAIN;
|
import static org.briarproject.briar.android.controller.BriarControllerImpl.DOZE_ASK_AGAIN;
|
||||||
import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE;
|
import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE;
|
||||||
import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting;
|
import static org.briarproject.briar.android.util.UiUtils.needsDozeWhitelisting;
|
||||||
@@ -58,6 +59,10 @@ public class NavDrawerViewModel extends AndroidViewModel {
|
|||||||
|
|
||||||
@UiThread
|
@UiThread
|
||||||
void checkExpiryWarning() {
|
void checkExpiryWarning() {
|
||||||
|
if (!IS_DEBUG_BUILD) {
|
||||||
|
showExpiryWarning.setValue(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
dbExecutor.execute(() -> {
|
dbExecutor.execute(() -> {
|
||||||
try {
|
try {
|
||||||
Settings settings =
|
Settings settings =
|
||||||
|
|||||||
@@ -14,21 +14,17 @@ import android.os.Looper;
|
|||||||
import org.acra.builder.ReportBuilder;
|
import org.acra.builder.ReportBuilder;
|
||||||
import org.acra.builder.ReportPrimer;
|
import org.acra.builder.ReportPrimer;
|
||||||
import org.briarproject.bramble.api.Pair;
|
import org.briarproject.bramble.api.Pair;
|
||||||
import org.briarproject.bramble.api.logging.PersistentLogManager;
|
|
||||||
import org.briarproject.briar.BuildConfig;
|
import org.briarproject.briar.BuildConfig;
|
||||||
import org.briarproject.briar.android.AndroidComponent;
|
|
||||||
import org.briarproject.briar.android.BriarApplication;
|
import org.briarproject.briar.android.BriarApplication;
|
||||||
|
import org.briarproject.briar.android.logging.BriefLogFormatter;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Scanner;
|
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.FutureTask;
|
import java.util.concurrent.FutureTask;
|
||||||
@@ -41,7 +37,6 @@ import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE;
|
|||||||
import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE;
|
import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE;
|
||||||
import static android.content.Context.ACTIVITY_SERVICE;
|
import static android.content.Context.ACTIVITY_SERVICE;
|
||||||
import static android.content.Context.CONNECTIVITY_SERVICE;
|
import static android.content.Context.CONNECTIVITY_SERVICE;
|
||||||
import static android.content.Context.MODE_PRIVATE;
|
|
||||||
import static android.content.Context.WIFI_P2P_SERVICE;
|
import static android.content.Context.WIFI_P2P_SERVICE;
|
||||||
import static android.content.Context.WIFI_SERVICE;
|
import static android.content.Context.WIFI_SERVICE;
|
||||||
import static android.net.ConnectivityManager.TYPE_MOBILE;
|
import static android.net.ConnectivityManager.TYPE_MOBILE;
|
||||||
@@ -56,8 +51,6 @@ import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty;
|
|||||||
|
|
||||||
public class BriarReportPrimer implements ReportPrimer {
|
public class BriarReportPrimer implements ReportPrimer {
|
||||||
|
|
||||||
private static final int MAX_PERSISTED_LOG_LINES = 1_000;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void primeReport(@NonNull Context ctx,
|
public void primeReport(@NonNull Context ctx,
|
||||||
@NonNull ReportBuilder builder) {
|
@NonNull ReportBuilder builder) {
|
||||||
@@ -88,23 +81,13 @@ public class BriarReportPrimer implements ReportPrimer {
|
|||||||
// Log
|
// Log
|
||||||
BriarApplication app =
|
BriarApplication app =
|
||||||
(BriarApplication) ctx.getApplicationContext();
|
(BriarApplication) ctx.getApplicationContext();
|
||||||
AndroidComponent appComponent = app.getApplicationComponent();
|
|
||||||
PersistentLogManager logManager =
|
|
||||||
appComponent.persistentLogManager();
|
|
||||||
Formatter formatter = appComponent.formatter();
|
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
Formatter formatter = new BriefLogFormatter();
|
||||||
for (LogRecord record : app.getRecentLogRecords()) {
|
for (LogRecord record : app.getRecentLogRecords()) {
|
||||||
sb.append(formatter.format(record));
|
sb.append(formatter.format(record)).append('\n');
|
||||||
}
|
}
|
||||||
customData.put("Log", sb.toString());
|
customData.put("Log", sb.toString());
|
||||||
|
|
||||||
customData.put("Persisted log",
|
|
||||||
getPersistedLog(ctx, logManager, false));
|
|
||||||
|
|
||||||
customData.put("Previous persisted log",
|
|
||||||
getPersistedLog(ctx, logManager, true));
|
|
||||||
|
|
||||||
// System memory
|
// System memory
|
||||||
Object o = ctx.getSystemService(ACTIVITY_SERVICE);
|
Object o = ctx.getSystemService(ACTIVITY_SERVICE);
|
||||||
ActivityManager am = (ActivityManager) o;
|
ActivityManager am = (ActivityManager) o;
|
||||||
@@ -269,27 +252,6 @@ public class BriarReportPrimer implements ReportPrimer {
|
|||||||
|
|
||||||
return unmodifiableMap(customData);
|
return unmodifiableMap(customData);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getPersistedLog(Context ctx,
|
|
||||||
PersistentLogManager logManager, boolean old) {
|
|
||||||
File logDir = ctx.getDir("log", MODE_PRIVATE);
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
try {
|
|
||||||
Scanner scanner = logManager.getPersistedLog(logDir, old);
|
|
||||||
LinkedList<String> lines = new LinkedList<>();
|
|
||||||
int numLines = 0;
|
|
||||||
while (scanner.hasNextLine()) {
|
|
||||||
lines.add(scanner.nextLine());
|
|
||||||
if (numLines == MAX_PERSISTED_LOG_LINES) lines.pollFirst();
|
|
||||||
else numLines++;
|
|
||||||
}
|
|
||||||
scanner.close();
|
|
||||||
for (String line : lines) sb.append(line).append('\n');
|
|
||||||
} catch (IOException e) {
|
|
||||||
sb.append("Could not recover persisted log: ").append(e);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class SingleShotAndroidExecutor extends Thread {
|
private static class SingleShotAndroidExecutor extends Thread {
|
||||||
|
|||||||
@@ -1,65 +1,18 @@
|
|||||||
package org.briarproject.briar.android.settings;
|
package org.briarproject.briar.android.settings;
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
|
||||||
import org.briarproject.bramble.api.logging.PersistentLogManager;
|
|
||||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
|
||||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
|
||||||
import org.briarproject.briar.R;
|
import org.briarproject.briar.R;
|
||||||
import org.briarproject.briar.android.activity.ActivityComponent;
|
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||||
import org.briarproject.briar.android.activity.BriarActivity;
|
import org.briarproject.briar.android.activity.BriarActivity;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.io.PrintWriter;
|
|
||||||
import java.util.Scanner;
|
|
||||||
import java.util.concurrent.Executor;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import androidx.annotation.RequiresApi;
|
|
||||||
import androidx.appcompat.app.ActionBar;
|
import androidx.appcompat.app.ActionBar;
|
||||||
|
|
||||||
import static android.content.Intent.ACTION_CREATE_DOCUMENT;
|
|
||||||
import static android.content.Intent.CATEGORY_OPENABLE;
|
|
||||||
import static android.content.Intent.EXTRA_TITLE;
|
|
||||||
import static android.os.Build.VERSION.SDK_INT;
|
|
||||||
import static android.os.Environment.DIRECTORY_DOWNLOADS;
|
|
||||||
import static android.os.Environment.getExternalStoragePublicDirectory;
|
|
||||||
import static android.widget.Toast.LENGTH_LONG;
|
|
||||||
import static java.util.logging.Level.WARNING;
|
|
||||||
import static java.util.logging.Logger.getLogger;
|
|
||||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
|
||||||
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_EXPORT_LOG;
|
|
||||||
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_EXPORT_OLD_LOG;
|
|
||||||
|
|
||||||
@MethodsNotNullByDefault
|
|
||||||
@ParametersNotNullByDefault
|
|
||||||
public class SettingsActivity extends BriarActivity {
|
public class SettingsActivity extends BriarActivity {
|
||||||
|
|
||||||
private static final Logger LOG =
|
|
||||||
getLogger(SettingsActivity.class.getName());
|
|
||||||
|
|
||||||
private static final String LOG_EXPORT_FILENAME = "briar-log.txt";
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
@IoExecutor
|
|
||||||
Executor ioExecutor;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
PersistentLogManager logManager;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(@Nullable Bundle bundle) {
|
public void onCreate(Bundle bundle) {
|
||||||
super.onCreate(bundle);
|
super.onCreate(bundle);
|
||||||
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
@@ -84,96 +37,4 @@ public class SettingsActivity extends BriarActivity {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onActivityResult(int request, int result,
|
|
||||||
@Nullable Intent data) {
|
|
||||||
super.onActivityResult(request, result, data);
|
|
||||||
if (request == REQUEST_EXPORT_LOG && result == RESULT_OK &&
|
|
||||||
data != null && data.getData() != null) {
|
|
||||||
exportLog(false, data.getData());
|
|
||||||
} else if (request == REQUEST_EXPORT_OLD_LOG && result == RESULT_OK &&
|
|
||||||
data != null && data.getData() != null) {
|
|
||||||
exportLog(true, data.getData());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void exportLog(boolean old, Uri uri) {
|
|
||||||
copyLog(old, () -> getOutputStream(uri));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void copyLog(boolean old, OutputStreamProvider osp) {
|
|
||||||
ioExecutor.execute(() -> {
|
|
||||||
try {
|
|
||||||
File logDir = getApplication().getDir("log", MODE_PRIVATE);
|
|
||||||
Scanner scanner = logManager.getPersistedLog(logDir, old);
|
|
||||||
if (!scanner.hasNextLine()) {
|
|
||||||
scanner.close();
|
|
||||||
runOnUiThreadUnlessDestroyed(() ->
|
|
||||||
Toast.makeText(getApplication(), "Log is empty",
|
|
||||||
LENGTH_LONG).show());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
PrintWriter w = new PrintWriter(osp.getOutputStream());
|
|
||||||
while (scanner.hasNextLine()) w.println(scanner.nextLine());
|
|
||||||
w.flush();
|
|
||||||
w.close();
|
|
||||||
scanner.close();
|
|
||||||
runOnUiThreadUnlessDestroyed(() ->
|
|
||||||
Toast.makeText(getApplication(), "Log exported",
|
|
||||||
LENGTH_LONG).show());
|
|
||||||
} catch (IOException e) {
|
|
||||||
logException(LOG, WARNING, e);
|
|
||||||
runOnUiThreadUnlessDestroyed(() ->
|
|
||||||
Toast.makeText(getApplication(), "Failed to export log",
|
|
||||||
LENGTH_LONG).show());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void onExportLogClick(boolean old) {
|
|
||||||
if (SDK_INT >= 19) {
|
|
||||||
Intent intent = getExportLogIntent();
|
|
||||||
int request = old ? REQUEST_EXPORT_OLD_LOG : REQUEST_EXPORT_LOG;
|
|
||||||
startActivityForResult(intent, request);
|
|
||||||
} else {
|
|
||||||
exportLog(old);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequiresApi(api = 19)
|
|
||||||
private Intent getExportLogIntent() {
|
|
||||||
Intent intent = new Intent(ACTION_CREATE_DOCUMENT);
|
|
||||||
intent.addCategory(CATEGORY_OPENABLE);
|
|
||||||
intent.setType("text/plain");
|
|
||||||
intent.putExtra(EXTRA_TITLE, LOG_EXPORT_FILENAME);
|
|
||||||
return intent;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void exportLog(boolean old) {
|
|
||||||
File file = getLogOutputFile();
|
|
||||||
copyLog(old, () -> getOutputStream(file));
|
|
||||||
}
|
|
||||||
|
|
||||||
private File getLogOutputFile() {
|
|
||||||
File path = getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS);
|
|
||||||
//noinspection ResultOfMethodCallIgnored
|
|
||||||
path.mkdirs();
|
|
||||||
return new File(path, LOG_EXPORT_FILENAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
private OutputStream getOutputStream(File file) throws IOException {
|
|
||||||
return new FileOutputStream(file);
|
|
||||||
}
|
|
||||||
|
|
||||||
private OutputStream getOutputStream(Uri uri) throws IOException {
|
|
||||||
OutputStream os =
|
|
||||||
getApplication().getContentResolver().openOutputStream(uri);
|
|
||||||
if (os == null) throw new IOException();
|
|
||||||
return os;
|
|
||||||
}
|
|
||||||
|
|
||||||
private interface OutputStreamProvider {
|
|
||||||
OutputStream getOutputStream() throws IOException;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package org.briarproject.briar.android.settings;
|
package org.briarproject.briar.android.settings;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -75,7 +74,6 @@ import static android.widget.Toast.LENGTH_SHORT;
|
|||||||
import static androidx.core.view.ViewCompat.LAYOUT_DIRECTION_LTR;
|
import static androidx.core.view.ViewCompat.LAYOUT_DIRECTION_LTR;
|
||||||
import static java.util.logging.Level.INFO;
|
import static java.util.logging.Level.INFO;
|
||||||
import static java.util.logging.Level.WARNING;
|
import static java.util.logging.Level.WARNING;
|
||||||
import static java.util.logging.Logger.getLogger;
|
|
||||||
import static org.briarproject.bramble.api.plugin.Plugin.PREF_PLUGIN_ENABLE;
|
import static org.briarproject.bramble.api.plugin.Plugin.PREF_PLUGIN_ENABLE;
|
||||||
import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_PREF_TOR_MOBILE;
|
import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_PREF_TOR_MOBILE;
|
||||||
import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_PREF_TOR_NETWORK;
|
import static org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_PREF_TOR_NETWORK;
|
||||||
@@ -135,7 +133,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
|||||||
"pref_key_tor_only_when_charging";
|
"pref_key_tor_only_when_charging";
|
||||||
|
|
||||||
private static final Logger LOG =
|
private static final Logger LOG =
|
||||||
getLogger(SettingsFragment.class.getName());
|
Logger.getLogger(SettingsFragment.class.getName());
|
||||||
|
|
||||||
private SettingsActivity listener;
|
private SettingsActivity listener;
|
||||||
private ListPreference language;
|
private ListPreference language;
|
||||||
@@ -253,25 +251,8 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
|||||||
throw new RuntimeException("Boom!");
|
throw new RuntimeException("Boom!");
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
findPreference("pref_key_export_log").setOnPreferenceClickListener(
|
|
||||||
preference -> {
|
|
||||||
((SettingsActivity) requireActivity())
|
|
||||||
.onExportLogClick(false);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
findPreference("pref_key_export_old_log")
|
|
||||||
.setOnPreferenceClickListener(
|
|
||||||
preference -> {
|
|
||||||
((SettingsActivity) requireActivity())
|
|
||||||
.onExportLogClick(true);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
findPreference("pref_key_explode").setVisible(false);
|
findPreference("pref_key_explode").setVisible(false);
|
||||||
findPreference("pref_key_export_log").setVisible(false);
|
|
||||||
findPreference("pref_key_export_old_log").setVisible(false);
|
|
||||||
findPreference("pref_key_test_data").setVisible(false);
|
findPreference("pref_key_test_data").setVisible(false);
|
||||||
PreferenceGroup testing =
|
PreferenceGroup testing =
|
||||||
findPreference("pref_key_explode").getParent();
|
findPreference("pref_key_explode").getParent();
|
||||||
@@ -350,7 +331,6 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
|||||||
return direction == LAYOUT_DIRECTION_LTR;
|
return direction == LAYOUT_DIRECTION_LTR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("StringFormatInvalid")
|
|
||||||
private void setTorNetworkSummary(int torNetworkSetting) {
|
private void setTorNetworkSummary(int torNetworkSetting) {
|
||||||
if (torNetworkSetting != PREF_TOR_NETWORK_AUTOMATIC) {
|
if (torNetworkSetting != PREF_TOR_NETWORK_AUTOMATIC) {
|
||||||
torNetwork.setSummary("%s"); // use setting value
|
torNetwork.setSummary("%s"); // use setting value
|
||||||
|
|||||||
@@ -159,9 +159,10 @@ public class UiUtils {
|
|||||||
return DateUtils.formatDateTime(ctx, time, flags);
|
return DateUtils.formatDateTime(ctx, time, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long getDaysUntilExpiry() {
|
public static int getDaysUntilExpiry() {
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
return (EXPIRY_DATE - now) / DAYS.toMillis(1);
|
long daysBeforeExpiry = (EXPIRY_DATE - now) / DAYS.toMillis(1);
|
||||||
|
return (int) daysBeforeExpiry;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SpannableStringBuilder getTeaser(Context ctx, Spanned text) {
|
public static SpannableStringBuilder getTeaser(Context ctx, Spanned text) {
|
||||||
|
|||||||
@@ -116,6 +116,7 @@
|
|||||||
<string name="delete">حذف</string>
|
<string name="delete">حذف</string>
|
||||||
<string name="accept">قبول</string>
|
<string name="accept">قبول</string>
|
||||||
<string name="decline">رفض</string>
|
<string name="decline">رفض</string>
|
||||||
|
<string name="options">الخيارات</string>
|
||||||
<string name="online">متصل</string>
|
<string name="online">متصل</string>
|
||||||
<string name="offline">غير متصل</string>
|
<string name="offline">غير متصل</string>
|
||||||
<string name="send">ارسال</string>
|
<string name="send">ارسال</string>
|
||||||
@@ -192,6 +193,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">إضافة جهة اتصال عن بعد </string>
|
<string name="add_contact_remotely_title_case">إضافة جهة اتصال عن بعد </string>
|
||||||
<string name="add_contact_nearby_title">إضافة جهة اتصال قريبة</string>
|
<string name="add_contact_nearby_title">إضافة جهة اتصال قريبة</string>
|
||||||
<string name="add_contact_remotely_title">إضافة جهة اتصال عن بعد </string>
|
<string name="add_contact_remotely_title">إضافة جهة اتصال عن بعد </string>
|
||||||
|
<string name="contact_name_hint">إعطاء اسم مستعار لجهة الاتصال</string>
|
||||||
<string name="contact_link_intro">أدخلوا الرّابط المرسل من جهة الاتصال هنا </string>
|
<string name="contact_link_intro">أدخلوا الرّابط المرسل من جهة الاتصال هنا </string>
|
||||||
<string name="contact_link_hint">رابط جهة الاتصال</string>
|
<string name="contact_link_hint">رابط جهة الاتصال</string>
|
||||||
<string name="paste_button">لصق</string>
|
<string name="paste_button">لصق</string>
|
||||||
@@ -209,6 +211,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">هناك طلبات للاتصال بكم في الانتظار </string>
|
<string name="pending_contact_requests_snackbar">هناك طلبات للاتصال بكم في الانتظار </string>
|
||||||
<string name="pending_contact_requests">طلبات التواصل القائمة </string>
|
<string name="pending_contact_requests">طلبات التواصل القائمة </string>
|
||||||
<string name="no_pending_contacts">لا توجد جهات اتصال قيد الإضافة</string>
|
<string name="no_pending_contacts">لا توجد جهات اتصال قيد الإضافة</string>
|
||||||
|
<string name="add_contact_remote_connecting">جاري الاتصال ...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">بانتظار ظهور جهة الاتصال على الانترنت. </string>
|
<string name="waiting_for_contact_to_come_online">بانتظار ظهور جهة الاتصال على الانترنت. </string>
|
||||||
<string name="connecting">جاري الاتصال ...</string>
|
<string name="connecting">جاري الاتصال ...</string>
|
||||||
<string name="adding_contact">جاري إضافة جهة الاتصال ...</string>
|
<string name="adding_contact">جاري إضافة جهة الاتصال ...</string>
|
||||||
@@ -233,6 +236,9 @@
|
|||||||
<item quantity="many">تمّت إضافة %d من جهات الاتصال</item>
|
<item quantity="many">تمّت إضافة %d من جهات الاتصال</item>
|
||||||
<item quantity="other">تمّت إضافة %d من جهات الاتصال.</item>
|
<item quantity="other">تمّت إضافة %d من جهات الاتصال.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">إضافة جهة الاتصال هذه تستغرق وقتاً أكثر من العادة</string>
|
||||||
|
<string name="adding_contact_slow_title">لم يمكن الاتصال بجهة الاتصال </string>
|
||||||
|
<string name="adding_contact_slow_text">إضافة جهة الاتصال هذه تستغرق وقتاً أكثر من العادة. \n\n يرجى التأكّد من أن جهة الاتصال استلمت الرّابط الخاص بك ومن ثمّ أضافتك:</string>
|
||||||
<string name="offline_state">لا اتصال بالانترنت </string>
|
<string name="offline_state">لا اتصال بالانترنت </string>
|
||||||
<string name="duplicate_link_dialog_title">الرّابط مكرّر </string>
|
<string name="duplicate_link_dialog_title">الرّابط مكرّر </string>
|
||||||
<string name="duplicate_link_dialog_text_1">لديكم جهة اتصال معلّقة تحمل نفس هذا الرّابط: %s</string>
|
<string name="duplicate_link_dialog_text_1">لديكم جهة اتصال معلّقة تحمل نفس هذا الرّابط: %s</string>
|
||||||
@@ -260,6 +266,7 @@
|
|||||||
<string name="introduction_button">عمل تقديم</string>
|
<string name="introduction_button">عمل تقديم</string>
|
||||||
<string name="introduction_sent">تم إرسال تقديمك.</string>
|
<string name="introduction_sent">تم إرسال تقديمك.</string>
|
||||||
<string name="introduction_error">حدث خطأ في عمل التقديم.</string>
|
<string name="introduction_error">حدث خطأ في عمل التقديم.</string>
|
||||||
|
<string name="introduction_response_error">خطأ في الإجابة على التقديم</string>
|
||||||
<string name="introduction_request_sent">لقد طلبت تقديم %1$s إلى %2$s.</string>
|
<string name="introduction_request_sent">لقد طلبت تقديم %1$s إلى %2$s.</string>
|
||||||
<string name="introduction_request_received">قد طلب %1$s أن يقوم بتقديمك إلى %2$s. فهل توافق أن يتم إضافة %2$s إلى قائمة جهات اتصالك؟</string>
|
<string name="introduction_request_received">قد طلب %1$s أن يقوم بتقديمك إلى %2$s. فهل توافق أن يتم إضافة %2$s إلى قائمة جهات اتصالك؟</string>
|
||||||
<string name="introduction_request_exists_received">قد طلب %1$s أن يقدمك إلى %2$s، لكن %2$s هو بالفعل في قائمة جهات اتصالك. حيث أن %1$s قد لا يعرف هذا، فلا زال يمكنك الرد:</string>
|
<string name="introduction_request_exists_received">قد طلب %1$s أن يقدمك إلى %2$s، لكن %2$s هو بالفعل في قائمة جهات اتصالك. حيث أن %1$s قد لا يعرف هذا، فلا زال يمكنك الرد:</string>
|
||||||
@@ -447,11 +454,20 @@
|
|||||||
<string name="pref_theme_dark">ليلي</string>
|
<string name="pref_theme_dark">ليلي</string>
|
||||||
<string name="pref_theme_auto">تلقائي (توقيت النهار)</string>
|
<string name="pref_theme_auto">تلقائي (توقيت النهار)</string>
|
||||||
<string name="pref_theme_system">النظام الافتراضي</string>
|
<string name="pref_theme_system">النظام الافتراضي</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">الشبكات</string>
|
||||||
|
<string name="bluetooth_setting">الإتصال عبر بلوتوث</string>
|
||||||
|
<string name="bluetooth_setting_enabled">متى ما كان أحد جهات الاتصال قريبًا</string>
|
||||||
|
<string name="bluetooth_setting_disabled">فقط عند إضافة جهة إتصال</string>
|
||||||
|
<string name="tor_network_setting">اتصال عبر الانترنت (تور)</string>
|
||||||
<string name="tor_network_setting_automatic">تلقائيًا حسب الموقع</string>
|
<string name="tor_network_setting_automatic">تلقائيًا حسب الموقع</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">استخدام تور بلا جسور</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">استخدام تور مع الجسور</string>
|
||||||
|
<string name="tor_network_setting_never">عدم الاتصال</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">تلقائيا: %1$s (في %2$s)</string>
|
<string name="tor_network_setting_summary">تلقائيا: %1$s (في %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">إستخدام بيانات الجوال</string>
|
<string name="tor_mobile_data_title">إستخدام بيانات الجوال</string>
|
||||||
|
<string name="tor_only_when_charging_title">الاتصال عبر الانترنت (تور أو Tor) عند اتصال الجهار بالشّاحن فقط</string>
|
||||||
<string name="tor_only_when_charging_summary">تعطيل الاتصال بالانترنت عند تشغيل الجهاز على البطارية</string>
|
<string name="tor_only_when_charging_summary">تعطيل الاتصال بالانترنت عند تشغيل الجهاز على البطارية</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">الأمان</string>
|
<string name="security_settings_title">الأمان</string>
|
||||||
@@ -492,6 +508,8 @@
|
|||||||
<string name="panic_setting_signout_summary">تسجيل الخروج من Briar (براير) عند ضغط زر الذعر</string>
|
<string name="panic_setting_signout_summary">تسجيل الخروج من Briar (براير) عند ضغط زر الذعر</string>
|
||||||
<string name="purge_setting_title">حذف الحساب</string>
|
<string name="purge_setting_title">حذف الحساب</string>
|
||||||
<string name="purge_setting_summary">احذف حساب Briar (براير) إذا تم ضغط زر الذعر. انتبه: هذا سيسبب حذف دائم لكل معرفات وحساباتك ورسائلك.</string>
|
<string name="purge_setting_summary">احذف حساب Briar (براير) إذا تم ضغط زر الذعر. انتبه: هذا سيسبب حذف دائم لكل معرفات وحساباتك ورسائلك.</string>
|
||||||
|
<string name="uninstall_setting_title">ألغ تثبيت Briar (براير)</string>
|
||||||
|
<string name="uninstall_setting_summary">هذا يتطلب تأكيد يدوي في حالة الذعر</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">الإشعارات</string>
|
<string name="notification_settings_title">الإشعارات</string>
|
||||||
<string name="notify_sign_in_title">ذكرني لتسجيل الدخول</string>
|
<string name="notify_sign_in_title">ذكرني لتسجيل الدخول</string>
|
||||||
|
|||||||
@@ -96,6 +96,7 @@
|
|||||||
<string name="delete">Sil</string>
|
<string name="delete">Sil</string>
|
||||||
<string name="accept">Qəbul et</string>
|
<string name="accept">Qəbul et</string>
|
||||||
<string name="decline">Azaldılma</string>
|
<string name="decline">Azaldılma</string>
|
||||||
|
<string name="options">Seçimlər</string>
|
||||||
<string name="online">Online</string>
|
<string name="online">Online</string>
|
||||||
<string name="offline">Offline</string>
|
<string name="offline">Offline</string>
|
||||||
<string name="send">Göndər</string>
|
<string name="send">Göndər</string>
|
||||||
@@ -165,6 +166,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Məsafədə kontakt əlavə etmək </string>
|
<string name="add_contact_remotely_title_case">Məsafədə kontakt əlavə etmək </string>
|
||||||
<string name="add_contact_nearby_title">Yaxında kontakt əlavə etmək </string>
|
<string name="add_contact_nearby_title">Yaxında kontakt əlavə etmək </string>
|
||||||
<string name="add_contact_remotely_title">Məsafədə kontakt əlavə etmək </string>
|
<string name="add_contact_remotely_title">Məsafədə kontakt əlavə etmək </string>
|
||||||
|
<string name="contact_name_hint">Niklə kontakt saxlayın</string>
|
||||||
<string name="contact_link_intro">Kontaktın linkini buraya daxil edin</string>
|
<string name="contact_link_intro">Kontaktın linkini buraya daxil edin</string>
|
||||||
<string name="contact_link_hint">Kontaktın linki</string>
|
<string name="contact_link_hint">Kontaktın linki</string>
|
||||||
<string name="paste_button">Yapışdır</string>
|
<string name="paste_button">Yapışdır</string>
|
||||||
@@ -182,6 +184,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Gözləyən kontakt sorğuları var. </string>
|
<string name="pending_contact_requests_snackbar">Gözləyən kontakt sorğuları var. </string>
|
||||||
<string name="pending_contact_requests">Kənara qoyulmuş kontak sorğuları</string>
|
<string name="pending_contact_requests">Kənara qoyulmuş kontak sorğuları</string>
|
||||||
<string name="no_pending_contacts">Gözləyən kontakt yoxdur</string>
|
<string name="no_pending_contacts">Gözləyən kontakt yoxdur</string>
|
||||||
|
<string name="add_contact_remote_connecting">Qoşulur...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Kontaktı xəttdə gözləyin ...</string>
|
<string name="waiting_for_contact_to_come_online">Kontaktı xəttdə gözləyin ...</string>
|
||||||
<string name="connecting">Qoşulur...</string>
|
<string name="connecting">Qoşulur...</string>
|
||||||
<string name="adding_contact">Kontaktın əlavə etməsi... </string>
|
<string name="adding_contact">Kontaktın əlavə etməsi... </string>
|
||||||
@@ -202,6 +205,9 @@
|
|||||||
<item quantity="one">New contact added.</item>
|
<item quantity="one">New contact added.</item>
|
||||||
<item quantity="other">%d yeni kontakt əlavə olundu. </item>
|
<item quantity="other">%d yeni kontakt əlavə olundu. </item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Bu kontaktın əlavə edilməsi adi haldan daha uzun sürür</string>
|
||||||
|
<string name="adding_contact_slow_title">Kontakta qoşula bilmir</string>
|
||||||
|
<string name="adding_contact_slow_text">Bu kontaktın əlavə edilməsi normaldan daha çox vaxt tələb edir.\n\nYoxlayın ki kontakt sizin linkinizi qəbul edib və sizi əlavə etdi: </string>
|
||||||
<string name="offline_state">İnternet bağlantısı yoxdur</string>
|
<string name="offline_state">İnternet bağlantısı yoxdur</string>
|
||||||
<string name="duplicate_link_dialog_title">Dublikat Link</string>
|
<string name="duplicate_link_dialog_title">Dublikat Link</string>
|
||||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||||
@@ -225,6 +231,7 @@
|
|||||||
<string name="introduction_button">Şərh edin</string>
|
<string name="introduction_button">Şərh edin</string>
|
||||||
<string name="introduction_sent">Şərhiniz göndərildi.</string>
|
<string name="introduction_sent">Şərhiniz göndərildi.</string>
|
||||||
<string name="introduction_error">Şərhinizi gödərəndə xəta baş verdi.</string>
|
<string name="introduction_error">Şərhinizi gödərəndə xəta baş verdi.</string>
|
||||||
|
<string name="introduction_response_error">Cavab verərkən səhv</string>
|
||||||
<string name="introduction_request_sent">Siz %1$s-i %2$s-ə təqdim etmək istədiniz.</string>
|
<string name="introduction_request_sent">Siz %1$s-i %2$s-ə təqdim etmək istədiniz.</string>
|
||||||
<string name="introduction_request_received">%1$ssizi%2$s-ə təqdim etmək istədi. %2$s-i kontakt siyahınıza əlavə etmək istəyirsiniz?</string>
|
<string name="introduction_request_received">%1$ssizi%2$s-ə təqdim etmək istədi. %2$s-i kontakt siyahınıza əlavə etmək istəyirsiniz?</string>
|
||||||
<string name="introduction_request_exists_received">%1$ssizi %2$s-ə tanıtmaq istədi, ancaq %2$s sizin kontaklarinizda var. %1$sbilənə qədər cavab verə bilərsiniz:</string>
|
<string name="introduction_request_exists_received">%1$ssizi %2$s-ə tanıtmaq istədi, ancaq %2$s sizin kontaklarinizda var. %1$sbilənə qədər cavab verə bilərsiniz:</string>
|
||||||
@@ -365,10 +372,19 @@
|
|||||||
<string name="pref_theme_dark">Tünd</string>
|
<string name="pref_theme_dark">Tünd</string>
|
||||||
<string name="pref_theme_auto">Avtomatik (Gündüz)</string>
|
<string name="pref_theme_auto">Avtomatik (Gündüz)</string>
|
||||||
<string name="pref_theme_system">Sistem Olduğu kimi</string>
|
<string name="pref_theme_system">Sistem Olduğu kimi</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Şəbəkələr</string>
|
||||||
|
<string name="bluetooth_setting">Bluetooth-la bağlantı</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Kontaktlar yaxın olduqda</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Yalnız kontakt əlavə edərkən</string>
|
||||||
|
<string name="tor_network_setting">İnternet (Tor)-la qoşulma</string>
|
||||||
<string name="tor_network_setting_automatic">Yerə görə avtomatik olaraq</string>
|
<string name="tor_network_setting_automatic">Yerə görə avtomatik olaraq</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Köprü olmadan Tor-u istifadə edin</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Tor ilə körpülərdən istifadə edin</string>
|
||||||
|
<string name="tor_network_setting_never">Qoşulmamaq</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_mobile_data_title">Mobil interneti istifadə etmək</string>
|
<string name="tor_mobile_data_title">Mobil interneti istifadə etmək</string>
|
||||||
|
<string name="tor_only_when_charging_title">Yalnız şarj edərkən İnternet (Tor) vasitəsilə qoşun</string>
|
||||||
<string name="tor_only_when_charging_summary">Cihaz batareyadan işləyərkən internet bağlantısını kəsir</string>
|
<string name="tor_only_when_charging_summary">Cihaz batareyadan işləyərkən internet bağlantısını kəsir</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Təhlükəsizlik</string>
|
<string name="security_settings_title">Təhlükəsizlik</string>
|
||||||
@@ -407,6 +423,8 @@
|
|||||||
<string name="panic_setting_signout_title">Çıxış</string>
|
<string name="panic_setting_signout_title">Çıxış</string>
|
||||||
<string name="panic_setting_signout_summary">Panik düyməsi basarkən Briar-dan çıxın</string>
|
<string name="panic_setting_signout_summary">Panik düyməsi basarkən Briar-dan çıxın</string>
|
||||||
<string name="purge_setting_title">Hesabı sil</string>
|
<string name="purge_setting_title">Hesabı sil</string>
|
||||||
|
<string name="uninstall_setting_title">Briar-i sil</string>
|
||||||
|
<string name="uninstall_setting_summary">Çaxnaşma zamanı əllə dəstəkləmək tələb olunur</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Bildirişler</string>
|
<string name="notification_settings_title">Bildirişler</string>
|
||||||
<string name="notify_sign_in_title">Daxil olmaq üçün mənim yadıma salmaq</string>
|
<string name="notify_sign_in_title">Daxil olmaq üçün mənim yadıma salmaq</string>
|
||||||
|
|||||||
@@ -74,6 +74,7 @@
|
|||||||
<string name="delete">Obriši</string>
|
<string name="delete">Obriši</string>
|
||||||
<string name="accept">Prihvati</string>
|
<string name="accept">Prihvati</string>
|
||||||
<string name="decline">Odbij</string>
|
<string name="decline">Odbij</string>
|
||||||
|
<string name="options">Opcije</string>
|
||||||
<string name="online">Online</string>
|
<string name="online">Online</string>
|
||||||
<string name="offline">Offline</string>
|
<string name="offline">Offline</string>
|
||||||
<string name="send">Pošalji</string>
|
<string name="send">Pošalji</string>
|
||||||
@@ -137,6 +138,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Dodaj udaljeni konktakt</string>
|
<string name="add_contact_remotely_title_case">Dodaj udaljeni konktakt</string>
|
||||||
<string name="add_contact_nearby_title">Dodaj kontakt koji je u blizini</string>
|
<string name="add_contact_nearby_title">Dodaj kontakt koji je u blizini</string>
|
||||||
<string name="add_contact_remotely_title">Dodaj udaljeni kontakt</string>
|
<string name="add_contact_remotely_title">Dodaj udaljeni kontakt</string>
|
||||||
|
<string name="contact_name_hint">Dodjeli kontaktu nadimak</string>
|
||||||
<string name="contact_link_intro">Unesite link vašeg kontakta ovdje</string>
|
<string name="contact_link_intro">Unesite link vašeg kontakta ovdje</string>
|
||||||
<string name="contact_link_hint">Kontaktov link</string>
|
<string name="contact_link_hint">Kontaktov link</string>
|
||||||
<string name="paste_button">Zalepi</string>
|
<string name="paste_button">Zalepi</string>
|
||||||
@@ -154,6 +156,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Postoje zahtjevi za kontaktima koji čekanju</string>
|
<string name="pending_contact_requests_snackbar">Postoje zahtjevi za kontaktima koji čekanju</string>
|
||||||
<string name="pending_contact_requests">Zahtjevi za kontaktima na čekanju</string>
|
<string name="pending_contact_requests">Zahtjevi za kontaktima na čekanju</string>
|
||||||
<string name="no_pending_contacts">Nema Zahtjeva za kontaktima na čekanju</string>
|
<string name="no_pending_contacts">Nema Zahtjeva za kontaktima na čekanju</string>
|
||||||
|
<string name="add_contact_remote_connecting">Konektovanje…</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Čekanje da kontakt bude online…</string>
|
<string name="waiting_for_contact_to_come_online">Čekanje da kontakt bude online…</string>
|
||||||
<string name="connecting">Konektovanje…</string>
|
<string name="connecting">Konektovanje…</string>
|
||||||
<string name="adding_contact">Dodavanje kontakta...</string>
|
<string name="adding_contact">Dodavanje kontakta...</string>
|
||||||
@@ -170,6 +173,9 @@
|
|||||||
<string name="step_1">1</string>
|
<string name="step_1">1</string>
|
||||||
<!--This is a numeral indicating the second step in a series of screens-->
|
<!--This is a numeral indicating the second step in a series of screens-->
|
||||||
<string name="step_2">2</string>
|
<string name="step_2">2</string>
|
||||||
|
<string name="adding_contact_slow_warning">Dodavanje ovog kontakta traje duže nego obično</string>
|
||||||
|
<string name="adding_contact_slow_title">Nije moguće povezivanje sa kontaktom</string>
|
||||||
|
<string name="adding_contact_slow_text">Dodavanje ovog kontakta traje duže nego obično.\n\nMolim vas provjerite da li je vaš kontakt dobio vaš link i dodao vas:</string>
|
||||||
<string name="offline_state">Nema konekcije na internet</string>
|
<string name="offline_state">Nema konekcije na internet</string>
|
||||||
<string name="duplicate_link_dialog_title">Duliciran Link</string>
|
<string name="duplicate_link_dialog_title">Duliciran Link</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Već imate kontakta na čekanju sa ovim linkom: %s</string>
|
<string name="duplicate_link_dialog_text_1">Već imate kontakta na čekanju sa ovim linkom: %s</string>
|
||||||
@@ -196,6 +202,7 @@
|
|||||||
<string name="introduction_button">Izvršite upoznavanje</string>
|
<string name="introduction_button">Izvršite upoznavanje</string>
|
||||||
<string name="introduction_sent">Vaše poziv na upoznavanje je poslat</string>
|
<string name="introduction_sent">Vaše poziv na upoznavanje je poslat</string>
|
||||||
<string name="introduction_error">Došlo je do greške pri izvršenju upoznavanja.</string>
|
<string name="introduction_error">Došlo je do greške pri izvršenju upoznavanja.</string>
|
||||||
|
<string name="introduction_response_error">Greška pri odgovoru na upoznavanje</string>
|
||||||
<string name="introduction_request_sent">Tražili ste da se %1$s i %2$s upoznaju.</string>
|
<string name="introduction_request_sent">Tražili ste da se %1$s i %2$s upoznaju.</string>
|
||||||
<string name="introduction_request_received">%1$s je tražio da vas upozna sa %2$s. Da li želite da dodate %2$s u vašu listu kontakata?</string>
|
<string name="introduction_request_received">%1$s je tražio da vas upozna sa %2$s. Da li želite da dodate %2$s u vašu listu kontakata?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s je tražio da vas upozna sa %2$s, ali %2$s je već u vašoj listi kontakata. Pošto %1$s to možda ne zna, vi i dalje možete da odgovorite: </string>
|
<string name="introduction_request_exists_received">%1$s je tražio da vas upozna sa %2$s, ali %2$s je već u vašoj listi kontakata. Pošto %1$s to možda ne zna, vi i dalje možete da odgovorite: </string>
|
||||||
@@ -350,11 +357,20 @@
|
|||||||
<string name="pref_theme_dark">Tamna</string>
|
<string name="pref_theme_dark">Tamna</string>
|
||||||
<string name="pref_theme_auto">Automatski (Dnevno)</string>
|
<string name="pref_theme_auto">Automatski (Dnevno)</string>
|
||||||
<string name="pref_theme_system">Podrazumjevane postavke sistema</string>
|
<string name="pref_theme_system">Podrazumjevane postavke sistema</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Mreže</string>
|
||||||
|
<string name="bluetooth_setting">Povežite se preko Bluetooth-a</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Kad god su kontakti blizu</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Samo pri dodavanju kontakata</string>
|
||||||
|
<string name="tor_network_setting">Konektuj se preko Interneta (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automatski prema na lokaciji</string>
|
<string name="tor_network_setting_automatic">Automatski prema na lokaciji</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Koristi Tor bez mostova</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Koristi Tor sa mostovima</string>
|
||||||
|
<string name="tor_network_setting_never">Ne konektuj se</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automatski: %1$s (za %2$s)</string>
|
<string name="tor_network_setting_summary">Automatski: %1$s (za %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Koristi mobilinu mrežu</string>
|
<string name="tor_mobile_data_title">Koristi mobilinu mrežu</string>
|
||||||
|
<string name="tor_only_when_charging_title">Konektuj se preko Interneta (Tor) samo tokom punjenja uređaja</string>
|
||||||
<string name="tor_only_when_charging_summary">Onemogući interent konekciju kada se uređaj napaja samo sa baterijie</string>
|
<string name="tor_only_when_charging_summary">Onemogući interent konekciju kada se uređaj napaja samo sa baterijie</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Sigurnost</string>
|
<string name="security_settings_title">Sigurnost</string>
|
||||||
@@ -395,6 +411,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Izloguj se iz Briar-a ako je pritisnuto panik dugme</string>
|
<string name="panic_setting_signout_summary">Izloguj se iz Briar-a ako je pritisnuto panik dugme</string>
|
||||||
<string name="purge_setting_title">Izbriši račun</string>
|
<string name="purge_setting_title">Izbriši račun</string>
|
||||||
<string name="purge_setting_summary">Izbriši Briar račun ako je panik dugme pritisnuto. Pažnja: Ovo će trajno izbrisati vaše identitete, kontakte i poruke</string>
|
<string name="purge_setting_summary">Izbriši Briar račun ako je panik dugme pritisnuto. Pažnja: Ovo će trajno izbrisati vaše identitete, kontakte i poruke</string>
|
||||||
|
<string name="uninstall_setting_title">Deinstaliraj Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Ovo zahtijeva ručnu potvrdu u slučaju panike</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Obavještenja</string>
|
<string name="notification_settings_title">Obavještenja</string>
|
||||||
<string name="notify_sign_in_title">Podsjeti me da se prijavim</string>
|
<string name="notify_sign_in_title">Podsjeti me da se prijavim</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Contrasenya</string>
|
<string name="enter_password">Contrasenya</string>
|
||||||
<string name="try_again">La contrasenya és incorrecta, torneu a escriure-la</string>
|
<string name="try_again">La contrasenya és incorrecta, torneu a escriure-la</string>
|
||||||
<string name="dialog_title_cannot_check_password">No es pot verificar la contrasenya</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">El Briar no pot verificar la contrasenya. Proveu de reiniciar el vostre aparell per a solucionar aquest problema.</string>
|
|
||||||
<string name="sign_in_button">Inicia la sessió</string>
|
<string name="sign_in_button">Inicia la sessió</string>
|
||||||
<string name="forgotten_password">No recordo la contrasenya</string>
|
<string name="forgotten_password">No recordo la contrasenya</string>
|
||||||
<string name="dialog_title_lost_password">Contrasenya perduda</string>
|
<string name="dialog_title_lost_password">Contrasenya perduda</string>
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<string name="delete">Suprimeix</string>
|
<string name="delete">Suprimeix</string>
|
||||||
<string name="accept">Accepta</string>
|
<string name="accept">Accepta</string>
|
||||||
<string name="decline">Refusa</string>
|
<string name="decline">Refusa</string>
|
||||||
|
<string name="options">Opcions</string>
|
||||||
<string name="online">En línia</string>
|
<string name="online">En línia</string>
|
||||||
<string name="offline">Fora de línia</string>
|
<string name="offline">Fora de línia</string>
|
||||||
<string name="send">Envia</string>
|
<string name="send">Envia</string>
|
||||||
@@ -129,13 +128,6 @@
|
|||||||
<string name="dialog_title_delete_all_messages">Confirmeu la supressió dels missatges</string>
|
<string name="dialog_title_delete_all_messages">Confirmeu la supressió dels missatges</string>
|
||||||
<string name="dialog_message_delete_all_messages">Esteu segur que voleu suprimir tots els missatges?</string>
|
<string name="dialog_message_delete_all_messages">Esteu segur que voleu suprimir tots els missatges?</string>
|
||||||
<string name="dialog_title_not_all_messages_deleted">No s\'ha pogut suprimir tots els missatges</string>
|
<string name="dialog_title_not_all_messages_deleted">No s\'ha pogut suprimir tots els missatges</string>
|
||||||
<string name="dialog_message_not_deleted_ongoing_both">Els missatges relacionats amb introduccions i invitacions pendents no es poden suprimir fins que es finalitzin.</string>
|
|
||||||
<string name="dialog_message_not_deleted_ongoing_introductions">Els missatges relacionats amb introduccions pendents no es poden suprimir fins que es finalitzin.</string>
|
|
||||||
<string name="dialog_message_not_deleted_ongoing_invitations">Els missatges relacionats amb invitacions pendents no es poden suprimir fins que es finalitzin.</string>
|
|
||||||
<string name="dialog_message_not_deleted_partly_downloaded">Els missatges baixats parcialment no es poden suprimir fins que s\'acabin de baixar.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_both">Per a suprimir una invitació o una introducció, cal que seleccioneu la sol·licitdu i la resposta.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_introductions">Per a suprimir una introducció, cal que seleccioneu la sol·licitud i la resposta.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_invitations">Per a suprimir una invitació, cal que seleccioneu la sol·licitud i la resposta.</string>
|
|
||||||
<string name="delete_contact">Suprimeix aquest contacte</string>
|
<string name="delete_contact">Suprimeix aquest contacte</string>
|
||||||
<string name="dialog_title_delete_contact">Confirmeu la supressió del contacte</string>
|
<string name="dialog_title_delete_contact">Confirmeu la supressió del contacte</string>
|
||||||
<string name="dialog_message_delete_contact">Segur que voleu suprimir aquest contacte i tots els missatges que us heu intercanviat?</string>
|
<string name="dialog_message_delete_contact">Segur que voleu suprimir aquest contacte i tots els missatges que us heu intercanviat?</string>
|
||||||
@@ -175,6 +167,7 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
|||||||
<string name="add_contact_remotely_title_case">Afegeix un contacte llunyà</string>
|
<string name="add_contact_remotely_title_case">Afegeix un contacte llunyà</string>
|
||||||
<string name="add_contact_nearby_title">Afegeix un contacte proper</string>
|
<string name="add_contact_nearby_title">Afegeix un contacte proper</string>
|
||||||
<string name="add_contact_remotely_title">Afegeix un contacte llunyà</string>
|
<string name="add_contact_remotely_title">Afegeix un contacte llunyà</string>
|
||||||
|
<string name="contact_name_hint">Doneu un sobrenom al contacte</string>
|
||||||
<string name="contact_link_intro">Escriviu l\'enllaç del vostre contacte</string>
|
<string name="contact_link_intro">Escriviu l\'enllaç del vostre contacte</string>
|
||||||
<string name="contact_link_hint">Enllaç del contacte</string>
|
<string name="contact_link_hint">Enllaç del contacte</string>
|
||||||
<string name="paste_button">Enganxa</string>
|
<string name="paste_button">Enganxa</string>
|
||||||
@@ -192,6 +185,7 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
|||||||
<string name="pending_contact_requests_snackbar">Hi ha sol·licituds de contacte pendents</string>
|
<string name="pending_contact_requests_snackbar">Hi ha sol·licituds de contacte pendents</string>
|
||||||
<string name="pending_contact_requests">Sol·licituds de contacte pendents</string>
|
<string name="pending_contact_requests">Sol·licituds de contacte pendents</string>
|
||||||
<string name="no_pending_contacts">No hi ha sol·licituds de contacte pendents</string>
|
<string name="no_pending_contacts">No hi ha sol·licituds de contacte pendents</string>
|
||||||
|
<string name="add_contact_remote_connecting">S\'està connectant...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">S\'està esperant que el contacte estigui connectat…</string>
|
<string name="waiting_for_contact_to_come_online">S\'està esperant que el contacte estigui connectat…</string>
|
||||||
<string name="connecting">S\'està connectant...</string>
|
<string name="connecting">S\'està connectant...</string>
|
||||||
<string name="adding_contact">S\'està afegint el contacte…</string>
|
<string name="adding_contact">S\'està afegint el contacte…</string>
|
||||||
@@ -212,6 +206,9 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
|||||||
<item quantity="one">S\'ha afegit el nou contacte </item>
|
<item quantity="one">S\'ha afegit el nou contacte </item>
|
||||||
<item quantity="other">S\'han afegit %d nous contactes.</item>
|
<item quantity="other">S\'han afegit %d nous contactes.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Afegir aquest contacte està trigant més que de costum…</string>
|
||||||
|
<string name="adding_contact_slow_title">No pot connectar-se al contacte</string>
|
||||||
|
<string name="adding_contact_slow_text">Afegir aquest contacte està trigant més que de costum.\n\nComproveu que el contacte ha rebut el vostre enllaç i també us ha afegit.</string>
|
||||||
<string name="offline_state">No hi ha connexió a Internet</string>
|
<string name="offline_state">No hi ha connexió a Internet</string>
|
||||||
<string name="duplicate_link_dialog_title">Enllaç duplicat</string>
|
<string name="duplicate_link_dialog_title">Enllaç duplicat</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Teniu una sol·licitud de contacte pendent amb l\'enllaç %s</string>
|
<string name="duplicate_link_dialog_text_1">Teniu una sol·licitud de contacte pendent amb l\'enllaç %s</string>
|
||||||
@@ -239,6 +236,7 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
|||||||
<string name="introduction_button">Presenta\'ls</string>
|
<string name="introduction_button">Presenta\'ls</string>
|
||||||
<string name="introduction_sent">S\'ha enviat la vostra presentació.</string>
|
<string name="introduction_sent">S\'ha enviat la vostra presentació.</string>
|
||||||
<string name="introduction_error">Hi ha hagut un error en presentar els contactes.</string>
|
<string name="introduction_error">Hi ha hagut un error en presentar els contactes.</string>
|
||||||
|
<string name="introduction_response_error">Error en respondre a la presentació</string>
|
||||||
<string name="introduction_request_sent">Heu demanat fer les presentacions per a que %1$s i %2$s es coneguin.</string>
|
<string name="introduction_request_sent">Heu demanat fer les presentacions per a que %1$s i %2$s es coneguin.</string>
|
||||||
<string name="introduction_request_received">%1$s us vol presentar a %2$s. Voleu afegir a%2$s a la vostra llista de contactes?</string>
|
<string name="introduction_request_received">%1$s us vol presentar a %2$s. Voleu afegir a%2$s a la vostra llista de contactes?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s us vol presentar a %2$s, però ja teniu a %2$s a la llista de contactes. Atès que segurament %1$s no ho sabia, encara el podeu contestar:</string>
|
<string name="introduction_request_exists_received">%1$s us vol presentar a %2$s, però ja teniu a %2$s a la llista de contactes. Atès que segurament %1$s no ho sabia, encara el podeu contestar:</string>
|
||||||
@@ -409,11 +407,20 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
|||||||
<string name="pref_theme_dark">Fosc</string>
|
<string name="pref_theme_dark">Fosc</string>
|
||||||
<string name="pref_theme_auto">Automàtic (segons l\'hora)</string>
|
<string name="pref_theme_auto">Automàtic (segons l\'hora)</string>
|
||||||
<string name="pref_theme_system">Valor per defecte del sistema</string>
|
<string name="pref_theme_system">Valor per defecte del sistema</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Xarxes</string>
|
||||||
|
<string name="bluetooth_setting">Connecta via bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Sempre que hi hagi contactes propers</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Només quan s\'afegeixen contactes</string>
|
||||||
|
<string name="tor_network_setting">Connecta a través d\'Internet (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automàtic, basat en la posició</string>
|
<string name="tor_network_setting_automatic">Automàtic, basat en la posició</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Usa Tor sense ponts</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Usa Tor amb ponts</string>
|
||||||
|
<string name="tor_network_setting_never">No et connectis</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automàtic: %1$s (a %2$s)</string>
|
<string name="tor_network_setting_summary">Automàtic: %1$s (a %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Usa dades mòbils</string>
|
<string name="tor_mobile_data_title">Usa dades mòbils</string>
|
||||||
|
<string name="tor_only_when_charging_title">Connecta a través d\'Internet (Tor) només quan s\'estigui carregant</string>
|
||||||
<string name="tor_only_when_charging_summary">Desactiva la connexió a Internet quan el dispositiu estigui funcionant amb la bateria</string>
|
<string name="tor_only_when_charging_summary">Desactiva la connexió a Internet quan el dispositiu estigui funcionant amb la bateria</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Seguretat</string>
|
<string name="security_settings_title">Seguretat</string>
|
||||||
@@ -454,6 +461,8 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
|||||||
<string name="panic_setting_signout_summary">Tanca la sessió de Briar si es prem un botó de pànic</string>
|
<string name="panic_setting_signout_summary">Tanca la sessió de Briar si es prem un botó de pànic</string>
|
||||||
<string name="purge_setting_title">Esborreu el compte</string>
|
<string name="purge_setting_title">Esborreu el compte</string>
|
||||||
<string name="purge_setting_summary">Suprimeix el compte de Briar si es prem el botó de pànic. Atenció: En aquest cas, s\'eliminarien permanentment les vostres identitats, contactes i missatges</string>
|
<string name="purge_setting_summary">Suprimeix el compte de Briar si es prem el botó de pànic. Atenció: En aquest cas, s\'eliminarien permanentment les vostres identitats, contactes i missatges</string>
|
||||||
|
<string name="uninstall_setting_title">Desinstal·leu Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Això requeria la confirmació manual malgrat ser en una situació de pànic</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Notificacions</string>
|
<string name="notification_settings_title">Notificacions</string>
|
||||||
<string name="notify_sign_in_title">Recorda\'m que iniciï la sessió</string>
|
<string name="notify_sign_in_title">Recorda\'m que iniciï la sessió</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Passwort</string>
|
<string name="enter_password">Passwort</string>
|
||||||
<string name="try_again">Passwort falsch, bitte erneut versuchen</string>
|
<string name="try_again">Passwort falsch, bitte erneut versuchen</string>
|
||||||
<string name="dialog_title_cannot_check_password">Passwort kann nicht überprüft werden</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar kann dein Passwort nicht überprüfen. Starte bitte dein Gerät neu und versuche damit, dieses Problem zu lösen.</string>
|
|
||||||
<string name="sign_in_button">Anmelden</string>
|
<string name="sign_in_button">Anmelden</string>
|
||||||
<string name="forgotten_password">Ich habe mein Passwort vergessen</string>
|
<string name="forgotten_password">Ich habe mein Passwort vergessen</string>
|
||||||
<string name="dialog_title_lost_password">Passwort vergessen</string>
|
<string name="dialog_title_lost_password">Passwort vergessen</string>
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<string name="delete">Löschen</string>
|
<string name="delete">Löschen</string>
|
||||||
<string name="accept">Annehmen</string>
|
<string name="accept">Annehmen</string>
|
||||||
<string name="decline">Ablehnen</string>
|
<string name="decline">Ablehnen</string>
|
||||||
|
<string name="options">Optionen</string>
|
||||||
<string name="online">Online</string>
|
<string name="online">Online</string>
|
||||||
<string name="offline">Offline</string>
|
<string name="offline">Offline</string>
|
||||||
<string name="send">Senden</string>
|
<string name="send">Senden</string>
|
||||||
@@ -110,7 +109,7 @@
|
|||||||
<string name="fix">Behoben</string>
|
<string name="fix">Behoben</string>
|
||||||
<string name="help">Hilfe</string>
|
<string name="help">Hilfe</string>
|
||||||
<string name="sorry">Entschuldigung</string>
|
<string name="sorry">Entschuldigung</string>
|
||||||
<string name="error_start_activity">Nicht Verfügbar für dein System</string>
|
<string name="error_start_activity">Nicht Verfügbar auf deinem Gerät</string>
|
||||||
<!--Contacts and Private Conversations-->
|
<!--Contacts and Private Conversations-->
|
||||||
<string name="no_contacts">Keine Kontakte vorhanden</string>
|
<string name="no_contacts">Keine Kontakte vorhanden</string>
|
||||||
<string name="no_contacts_action">Tippe auf das + Symbol, um einen Kontakt hinzuzufügen</string>
|
<string name="no_contacts_action">Tippe auf das + Symbol, um einen Kontakt hinzuzufügen</string>
|
||||||
@@ -128,20 +127,17 @@
|
|||||||
<string name="delete_all_messages">Alle Nachrichten löschen</string>
|
<string name="delete_all_messages">Alle Nachrichten löschen</string>
|
||||||
<string name="dialog_title_delete_all_messages">Löschen der Nachrichten bestätigen</string>
|
<string name="dialog_title_delete_all_messages">Löschen der Nachrichten bestätigen</string>
|
||||||
<string name="dialog_message_delete_all_messages">Bist Du sicher, dass Du alle Nachrichten löschen willst?</string>
|
<string name="dialog_message_delete_all_messages">Bist Du sicher, dass Du alle Nachrichten löschen willst?</string>
|
||||||
<string name="dialog_title_not_all_messages_deleted">Es konnten nicht alle Nachrichten gelöscht werden</string>
|
<string name="dialog_title_not_all_messages_deleted">Konnte nicht alle Nachrichten löschen</string>
|
||||||
<string name="dialog_message_not_deleted_ongoing_both">Nachrichten, die sich auf laufende Einladungen und Kontaktempfehlungen beziehen, können nicht gelöscht werden, bis sie abgeschlossen sind.</string>
|
<string name="dialog_message_not_deleted_ongoing_both">Nachrichten, die sich auf laufende Einladungen und Kontaktempfehlungen beziehen, können nicht gelöscht werden, bis sie abgeschlossen sind.</string>
|
||||||
<string name="dialog_message_not_deleted_ongoing_introductions">Nachrichten, die sich auf laufende Kontaktempfehlungen beziehen, können nicht gelöscht werden, bis sie abgeschlossen sind.</string>
|
<string name="dialog_message_not_deleted_ongoing_introductions">Nachrichten, die sich auf laufende Kontaktempfehlungen beziehen, können nicht gelöscht werden, bis sie abgeschlossen sind.</string>
|
||||||
<string name="dialog_message_not_deleted_ongoing_invitations">Nachrichten, die sich auf laufende Einladungen beziehen, können nicht gelöscht werden, bis sie abgeschlossen sind.</string>
|
<string name="dialog_message_not_deleted_ongoing_invitations">Nachrichten, die sich auf laufende Einladungen beziehen, können nicht gelöscht werden, bis sie abgeschlossen sind.</string>
|
||||||
<string name="dialog_message_not_deleted_partly_downloaded">Teilweise heruntergeladene Nachrichten können erst nach dem Ende des Downloads gelöscht werden.</string>
|
<string name="dialog_message_not_deleted_partly_downloaded">Teilweise heruntergeladene Nachrichten können erst nach dem Ende des Downloads gelöscht werden.</string>
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_both">Um eine Einladung oder Kontaktempfehlung zu löschen, musst du die Anfrage und die Antwort auswählen.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_introductions">Um eine Kontaktempfehlung zu löschen, musst du die Anfrage und die Antwort auswählen.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_invitations">Um eine Einladung zu löschen, musst du die Anfrage und die Antwort auswählen.</string>
|
|
||||||
<string name="delete_contact">Kontakt löschen</string>
|
<string name="delete_contact">Kontakt löschen</string>
|
||||||
<string name="dialog_title_delete_contact">Löschen des Kontakts bestätigen</string>
|
<string name="dialog_title_delete_contact">Löschen des Kontakts bestätigen</string>
|
||||||
<string name="dialog_message_delete_contact">Bist du sicher, dass du diesen Kontakt und alle dazugehörigen Nachrichten löschen möchtest?</string>
|
<string name="dialog_message_delete_contact">Bist du sicher, dass du diesen Kontakt und alle dazugehörigen Nachrichten löschen möchtest?</string>
|
||||||
<string name="contact_deleted_toast">Kontakt gelöscht</string>
|
<string name="contact_deleted_toast">Kontakt gelöscht</string>
|
||||||
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
|
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
|
||||||
<string name="you">Du</string>
|
<string name="you">Sie</string>
|
||||||
<string name="save_image">Bild speichern</string>
|
<string name="save_image">Bild speichern</string>
|
||||||
<string name="dialog_title_save_image">Bild speichern?</string>
|
<string name="dialog_title_save_image">Bild speichern?</string>
|
||||||
<string name="dialog_message_save_image">Gespeicherte Bilder können von vielen anderen Apps eingesehen werden.\n\nBist du sicher, dass du das Bild speichern möchtest?</string>
|
<string name="dialog_message_save_image">Gespeicherte Bilder können von vielen anderen Apps eingesehen werden.\n\nBist du sicher, dass du das Bild speichern möchtest?</string>
|
||||||
@@ -157,7 +153,7 @@
|
|||||||
<string name="face_to_face">Um einen neuen Kontakt hinzuzufügen, ist es notwendig, dass sich beide Kontakte an einem Ort treffen.\n\nDadurch wird betrügerische Identitätsvortäuschung und unautorisierter Kommunikationszugriff verhindert.</string>
|
<string name="face_to_face">Um einen neuen Kontakt hinzuzufügen, ist es notwendig, dass sich beide Kontakte an einem Ort treffen.\n\nDadurch wird betrügerische Identitätsvortäuschung und unautorisierter Kommunikationszugriff verhindert.</string>
|
||||||
<string name="continue_button">Weiter</string>
|
<string name="continue_button">Weiter</string>
|
||||||
<string name="try_again_button">Noch einmal versuchen</string>
|
<string name="try_again_button">Noch einmal versuchen</string>
|
||||||
<string name="waiting_for_contact_to_scan">Warten auf Kontakt zum scannen und verbinden\u2026</string>
|
<string name="waiting_for_contact_to_scan">Warte auf Scan und Verbindung mit dem Kontakt\u2026</string>
|
||||||
<string name="exchanging_contact_details">Kontaktdetails werden ausgetauscht\u2026</string>
|
<string name="exchanging_contact_details">Kontaktdetails werden ausgetauscht\u2026</string>
|
||||||
<string name="contact_added_toast">Kontakt hinzugefügt: %s</string>
|
<string name="contact_added_toast">Kontakt hinzugefügt: %s</string>
|
||||||
<string name="contact_already_exists">Kontakt %s existiert bereits</string>
|
<string name="contact_already_exists">Kontakt %s existiert bereits</string>
|
||||||
@@ -173,7 +169,8 @@
|
|||||||
<!--Adding Contacts Remotely-->
|
<!--Adding Contacts Remotely-->
|
||||||
<string name="add_contact_remotely_title_case">Kontakt aus der Ferne hinzufügen</string>
|
<string name="add_contact_remotely_title_case">Kontakt aus der Ferne hinzufügen</string>
|
||||||
<string name="add_contact_nearby_title">Kontakt in der Nähe hinzufügen</string>
|
<string name="add_contact_nearby_title">Kontakt in der Nähe hinzufügen</string>
|
||||||
<string name="add_contact_remotely_title">Kontakt in der Ferne hinzufügen</string>
|
<string name="add_contact_remotely_title">Kontakt aus der Ferne hinzufügen</string>
|
||||||
|
<string name="contact_name_hint">Gib dem Kontakt einen Spitznamen</string>
|
||||||
<string name="contact_link_intro">Füge hier den Link des Kontakts ein, den du hinzufügen möchtest:</string>
|
<string name="contact_link_intro">Füge hier den Link des Kontakts ein, den du hinzufügen möchtest:</string>
|
||||||
<string name="contact_link_hint">Kontakt Link</string>
|
<string name="contact_link_hint">Kontakt Link</string>
|
||||||
<string name="paste_button">Einfügen</string>
|
<string name="paste_button">Einfügen</string>
|
||||||
@@ -191,6 +188,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Es gibt ausstehende Kontaktanfragen</string>
|
<string name="pending_contact_requests_snackbar">Es gibt ausstehende Kontaktanfragen</string>
|
||||||
<string name="pending_contact_requests">Ausstehende Kontaktanfragen</string>
|
<string name="pending_contact_requests">Ausstehende Kontaktanfragen</string>
|
||||||
<string name="no_pending_contacts">Keine ausstehenden Kontakte</string>
|
<string name="no_pending_contacts">Keine ausstehenden Kontakte</string>
|
||||||
|
<string name="add_contact_remote_connecting">Verbindung wird aufgebaut …</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Warte auf Online-Aktivität des Kontakts ...</string>
|
<string name="waiting_for_contact_to_come_online">Warte auf Online-Aktivität des Kontakts ...</string>
|
||||||
<string name="connecting">Verbindung wird aufgebaut …</string>
|
<string name="connecting">Verbindung wird aufgebaut …</string>
|
||||||
<string name="adding_contact">Kontakt hinzufügen...</string>
|
<string name="adding_contact">Kontakt hinzufügen...</string>
|
||||||
@@ -211,6 +209,9 @@
|
|||||||
<item quantity="one">Neuer Kontakt hinzugefügt.</item>
|
<item quantity="one">Neuer Kontakt hinzugefügt.</item>
|
||||||
<item quantity="other">%d neue Kontakte hinzugefügt.</item>
|
<item quantity="other">%d neue Kontakte hinzugefügt.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Das Hinzufügen des Kontakts dauert länger als normal</string>
|
||||||
|
<string name="adding_contact_slow_title">Kann nicht zu Kontakt verbinden</string>
|
||||||
|
<string name="adding_contact_slow_text">Das Hinzufügen des Kontakts dauert länger als normal.\n\nBitte kontrolliere, dass dein Kontakt deinen Link erhalten und eingegeben hat:</string>
|
||||||
<string name="offline_state">Keine Internetverbindung</string>
|
<string name="offline_state">Keine Internetverbindung</string>
|
||||||
<string name="duplicate_link_dialog_title">Link duplizieren</string>
|
<string name="duplicate_link_dialog_title">Link duplizieren</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Du hast bereits einen Kontakt mit diesem Link ausstehend: %s</string>
|
<string name="duplicate_link_dialog_text_1">Du hast bereits einen Kontakt mit diesem Link ausstehend: %s</string>
|
||||||
@@ -238,6 +239,7 @@
|
|||||||
<string name="introduction_button">Kontaktempfehlung abgeben</string>
|
<string name="introduction_button">Kontaktempfehlung abgeben</string>
|
||||||
<string name="introduction_sent">Deine Kontaktempfehlung wurde verschickt.</string>
|
<string name="introduction_sent">Deine Kontaktempfehlung wurde verschickt.</string>
|
||||||
<string name="introduction_error">Es gab einen Fehler beim Versuch, die Kontaktempfehlung zu verschicken.</string>
|
<string name="introduction_error">Es gab einen Fehler beim Versuch, die Kontaktempfehlung zu verschicken.</string>
|
||||||
|
<string name="introduction_response_error">Fehler bei Antwort auf Kontaktempfehlung</string>
|
||||||
<string name="introduction_request_sent">Du wolltest %1$s an %2$s als Kontakt empfehlen</string>
|
<string name="introduction_request_sent">Du wolltest %1$s an %2$s als Kontakt empfehlen</string>
|
||||||
<string name="introduction_request_received">%1$s schlägt vor, dich als Kontakt an %2$s zu empfehlen. Möchtest du %2$s zu deiner Kontaktliste hinzufügen?</string>
|
<string name="introduction_request_received">%1$s schlägt vor, dich als Kontakt an %2$s zu empfehlen. Möchtest du %2$s zu deiner Kontaktliste hinzufügen?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s schlägt vor, dich als Kontakt an %2$s zu empfehlen. %2$s ist allerdings bereits in deiner Kontaktliste. Da %1$s das vielleicht nicht weiss, kannst du trotzdem antworten:</string>
|
<string name="introduction_request_exists_received">%1$s schlägt vor, dich als Kontakt an %2$s zu empfehlen. %2$s ist allerdings bereits in deiner Kontaktliste. Da %1$s das vielleicht nicht weiss, kannst du trotzdem antworten:</string>
|
||||||
@@ -408,12 +410,20 @@
|
|||||||
<string name="pref_theme_dark">Dunkel</string>
|
<string name="pref_theme_dark">Dunkel</string>
|
||||||
<string name="pref_theme_auto">Automatisch (Tageszeit)</string>
|
<string name="pref_theme_auto">Automatisch (Tageszeit)</string>
|
||||||
<string name="pref_theme_system">Systemstandard</string>
|
<string name="pref_theme_system">Systemstandard</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
<string name="network_settings_title">Verbindungen</string>
|
<string name="network_settings_title">Netzwerke</string>
|
||||||
|
<string name="bluetooth_setting">Über Bluetooth verbinden</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Sobald Kontakte in der Nähe sind</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Nur beim Hinzufügen von Kontakten</string>
|
||||||
|
<string name="tor_network_setting">Über Internet (Tor) verbinden</string>
|
||||||
<string name="tor_network_setting_automatic">Automatisch (standortbasiert)</string>
|
<string name="tor_network_setting_automatic">Automatisch (standortbasiert)</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Tor ohne Bridges nutzen</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Tor mit Bridges nutzen</string>
|
||||||
|
<string name="tor_network_setting_never">Nicht verbinden</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automatisch: %1$s (in %2$s)</string>
|
<string name="tor_network_setting_summary">Automatisch: %1$s (in %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Mobile Daten benutzen</string>
|
<string name="tor_mobile_data_title">Mobile Daten benutzen</string>
|
||||||
|
<string name="tor_only_when_charging_title">Verbindung über Internet (Tor) nur während des Ladevorgangs herstellen</string>
|
||||||
<string name="tor_only_when_charging_summary">Deaktiviert die Internetverbindung, wenn das Gerät mit Akku betrieben wird</string>
|
<string name="tor_only_when_charging_summary">Deaktiviert die Internetverbindung, wenn das Gerät mit Akku betrieben wird</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Sicherheit</string>
|
<string name="security_settings_title">Sicherheit</string>
|
||||||
@@ -454,6 +464,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Von Briar abmelden, wenn ein Panik-Button aktiviert wird</string>
|
<string name="panic_setting_signout_summary">Von Briar abmelden, wenn ein Panik-Button aktiviert wird</string>
|
||||||
<string name="purge_setting_title">Konto löschen</string>
|
<string name="purge_setting_title">Konto löschen</string>
|
||||||
<string name="purge_setting_summary">Briar-Konto löschen, wenn der Panik-Button gedrückt wird. Achtung: Es werden alle Identitäten, Kontakte und Nachrichten unwiderruflich gelöscht</string>
|
<string name="purge_setting_summary">Briar-Konto löschen, wenn der Panik-Button gedrückt wird. Achtung: Es werden alle Identitäten, Kontakte und Nachrichten unwiderruflich gelöscht</string>
|
||||||
|
<string name="uninstall_setting_title">Briar deinstallieren</string>
|
||||||
|
<string name="uninstall_setting_summary">Diese Aktion benötigt eine manuelle Bestätigung im Falle eines Panik-Ereignisses</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Benachrichtigungen</string>
|
<string name="notification_settings_title">Benachrichtigungen</string>
|
||||||
<string name="notify_sign_in_title">Anmeldeerinnerung</string>
|
<string name="notify_sign_in_title">Anmeldeerinnerung</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Contraseña</string>
|
<string name="enter_password">Contraseña</string>
|
||||||
<string name="try_again">Contraseña incorrecta, inténtalo de nuevo</string>
|
<string name="try_again">Contraseña incorrecta, inténtalo de nuevo</string>
|
||||||
<string name="dialog_title_cannot_check_password">Imposible comprobar la contraseña</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar no ha podido comprobar tu contraseña. Por favor, prueba a reiniciar tu dispositivo para resolver el problema.</string>
|
|
||||||
<string name="sign_in_button">Iniciar sesión</string>
|
<string name="sign_in_button">Iniciar sesión</string>
|
||||||
<string name="forgotten_password">He olvidado mi contraseña</string>
|
<string name="forgotten_password">He olvidado mi contraseña</string>
|
||||||
<string name="dialog_title_lost_password">Contraseña perdida</string>
|
<string name="dialog_title_lost_password">Contraseña perdida</string>
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<string name="delete">Borrar</string>
|
<string name="delete">Borrar</string>
|
||||||
<string name="accept">Aceptar</string>
|
<string name="accept">Aceptar</string>
|
||||||
<string name="decline">Rechazar</string>
|
<string name="decline">Rechazar</string>
|
||||||
|
<string name="options">Opciones</string>
|
||||||
<string name="online">En línea</string>
|
<string name="online">En línea</string>
|
||||||
<string name="offline">Fuera de línea</string>
|
<string name="offline">Fuera de línea</string>
|
||||||
<string name="send">Enviar</string>
|
<string name="send">Enviar</string>
|
||||||
@@ -126,7 +125,7 @@
|
|||||||
<string name="set_contact_alias_hint">Nombre del contacto</string>
|
<string name="set_contact_alias_hint">Nombre del contacto</string>
|
||||||
<string name="set_alias_button">Cambiar</string>
|
<string name="set_alias_button">Cambiar</string>
|
||||||
<string name="delete_all_messages">Eliminar todos los mensajes</string>
|
<string name="delete_all_messages">Eliminar todos los mensajes</string>
|
||||||
<string name="dialog_title_delete_all_messages">Confirmar la eliminación del mensaje</string>
|
<string name="dialog_title_delete_all_messages">Confirmar eliminación de mensajes</string>
|
||||||
<string name="dialog_message_delete_all_messages">¿Estás seguro de que deseas eliminar todos los mensajes?</string>
|
<string name="dialog_message_delete_all_messages">¿Estás seguro de que deseas eliminar todos los mensajes?</string>
|
||||||
<string name="dialog_title_not_all_messages_deleted">No se pudieron eliminar todos los mensajes.</string>
|
<string name="dialog_title_not_all_messages_deleted">No se pudieron eliminar todos los mensajes.</string>
|
||||||
<string name="dialog_message_not_deleted_ongoing_both">Los mensajes relacionados con presentaciones o invitaciones en curso no se pueden eliminar hasta que finalicen.</string>
|
<string name="dialog_message_not_deleted_ongoing_both">Los mensajes relacionados con presentaciones o invitaciones en curso no se pueden eliminar hasta que finalicen.</string>
|
||||||
@@ -153,7 +152,7 @@
|
|||||||
<string name="dialog_message_image_support">Pulsa este ícono para adjuntar imágenes.</string>
|
<string name="dialog_message_image_support">Pulsa este ícono para adjuntar imágenes.</string>
|
||||||
<string name="messaging_too_many_attachments_toast">Solo se enviarán las primeras %d imágenes</string>
|
<string name="messaging_too_many_attachments_toast">Solo se enviarán las primeras %d imágenes</string>
|
||||||
<!--Adding Contacts-->
|
<!--Adding Contacts-->
|
||||||
<string name="add_contact_title">Agregar contacto cercano</string>
|
<string name="add_contact_title">Agregar Contacto Cercano</string>
|
||||||
<string name="face_to_face">Debes reunirte con la persona a la que quieras añadir como contacto.\n\nHaciéndolo así prevendrás que nadie te suplante o pueda leer tus mensajes en el futuro.</string>
|
<string name="face_to_face">Debes reunirte con la persona a la que quieras añadir como contacto.\n\nHaciéndolo así prevendrás que nadie te suplante o pueda leer tus mensajes en el futuro.</string>
|
||||||
<string name="continue_button">Continuar</string>
|
<string name="continue_button">Continuar</string>
|
||||||
<string name="try_again_button">Prueba de nuevo</string>
|
<string name="try_again_button">Prueba de nuevo</string>
|
||||||
@@ -174,6 +173,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Añadir un Contacto a Distancia</string>
|
<string name="add_contact_remotely_title_case">Añadir un Contacto a Distancia</string>
|
||||||
<string name="add_contact_nearby_title">Agregar un contacto cercano</string>
|
<string name="add_contact_nearby_title">Agregar un contacto cercano</string>
|
||||||
<string name="add_contact_remotely_title">Añadir un contacto a distancia</string>
|
<string name="add_contact_remotely_title">Añadir un contacto a distancia</string>
|
||||||
|
<string name="contact_name_hint">Ponerle un sobrenombre al contacto</string>
|
||||||
<string name="contact_link_intro">Introduzca el enlace de su contacto aquí</string>
|
<string name="contact_link_intro">Introduzca el enlace de su contacto aquí</string>
|
||||||
<string name="contact_link_hint">Enlace de contacto</string>
|
<string name="contact_link_hint">Enlace de contacto</string>
|
||||||
<string name="paste_button">Pegar</string>
|
<string name="paste_button">Pegar</string>
|
||||||
@@ -191,6 +191,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Hay solicitudes de contacto pendientes</string>
|
<string name="pending_contact_requests_snackbar">Hay solicitudes de contacto pendientes</string>
|
||||||
<string name="pending_contact_requests">Solicitudes de contacto pendientes</string>
|
<string name="pending_contact_requests">Solicitudes de contacto pendientes</string>
|
||||||
<string name="no_pending_contacts">No hay contactos pendientes</string>
|
<string name="no_pending_contacts">No hay contactos pendientes</string>
|
||||||
|
<string name="add_contact_remote_connecting">Conectando...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Esperando que el contacto se ponga en línea....</string>
|
<string name="waiting_for_contact_to_come_online">Esperando que el contacto se ponga en línea....</string>
|
||||||
<string name="connecting">Conectando...</string>
|
<string name="connecting">Conectando...</string>
|
||||||
<string name="adding_contact">Añadir contacto....</string>
|
<string name="adding_contact">Añadir contacto....</string>
|
||||||
@@ -211,6 +212,9 @@
|
|||||||
<item quantity="one">Nuevo contacto añadido.</item>
|
<item quantity="one">Nuevo contacto añadido.</item>
|
||||||
<item quantity="other">%d nuevos contactos añadidos.</item>
|
<item quantity="other">%d nuevos contactos añadidos.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Añadir este contacto tarda más de lo habitual</string>
|
||||||
|
<string name="adding_contact_slow_title">No se puede conectar con el contacto</string>
|
||||||
|
<string name="adding_contact_slow_text">Agregar este contacto está tomando más tiempo de lo normal.\n\nPor favor, compruebe que su contacto ha recibido su enlace y lo ha agregado:</string>
|
||||||
<string name="offline_state">No hay conexión a Internet</string>
|
<string name="offline_state">No hay conexión a Internet</string>
|
||||||
<string name="duplicate_link_dialog_title">Duplicar enlace</string>
|
<string name="duplicate_link_dialog_title">Duplicar enlace</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Ya tiene un contacto pendiente con este enlace: %s</string>
|
<string name="duplicate_link_dialog_text_1">Ya tiene un contacto pendiente con este enlace: %s</string>
|
||||||
@@ -238,6 +242,7 @@
|
|||||||
<string name="introduction_button">Hacer presentación</string>
|
<string name="introduction_button">Hacer presentación</string>
|
||||||
<string name="introduction_sent">Tu presentación se ha mandado.</string>
|
<string name="introduction_sent">Tu presentación se ha mandado.</string>
|
||||||
<string name="introduction_error">Ocurrió un error realizando la presentación.</string>
|
<string name="introduction_error">Ocurrió un error realizando la presentación.</string>
|
||||||
|
<string name="introduction_response_error">Error al responder a la presentación</string>
|
||||||
<string name="introduction_request_sent">Le has preguntado a %1$s si quiere que le presentes a %2$s.</string>
|
<string name="introduction_request_sent">Le has preguntado a %1$s si quiere que le presentes a %2$s.</string>
|
||||||
<string name="introduction_request_received">%1$s ha pedido presentarte a %2$s. ¿Quieres añadir a %2$s a tu lista de contactos?</string>
|
<string name="introduction_request_received">%1$s ha pedido presentarte a %2$s. ¿Quieres añadir a %2$s a tu lista de contactos?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s ha pedido presentarte a %2$s, pero %2$s ya está en tu lista de contactos. %1$s puede no saberlo, así que puedes responderle de todas maneras:</string>
|
<string name="introduction_request_exists_received">%1$s ha pedido presentarte a %2$s, pero %2$s ya está en tu lista de contactos. %1$s puede no saberlo, así que puedes responderle de todas maneras:</string>
|
||||||
@@ -408,12 +413,20 @@
|
|||||||
<string name="pref_theme_dark">Oscuro</string>
|
<string name="pref_theme_dark">Oscuro</string>
|
||||||
<string name="pref_theme_auto">Automático (Diurno)</string>
|
<string name="pref_theme_auto">Automático (Diurno)</string>
|
||||||
<string name="pref_theme_system">Predeterminado del sistema</string>
|
<string name="pref_theme_system">Predeterminado del sistema</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
<string name="network_settings_title">Conexiones</string>
|
<string name="network_settings_title">Redes</string>
|
||||||
|
<string name="bluetooth_setting">Conectar mediante Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Cuando haya contactos cerca</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Solo al añadir contactos</string>
|
||||||
|
<string name="tor_network_setting">Conectar vía Internet (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automático basado en ubicación</string>
|
<string name="tor_network_setting_automatic">Automático basado en ubicación</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Usar Tor sin puentes de red</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Usar Tor con puentes de red</string>
|
||||||
|
<string name="tor_network_setting_never">No conectar</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automática: %1$s (en %2$s)</string>
|
<string name="tor_network_setting_summary">Automática: %1$s (en %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Usar datos móviles</string>
|
<string name="tor_mobile_data_title">Usar datos móviles</string>
|
||||||
|
<string name="tor_only_when_charging_title">Conectar vía Internet (Tor) solamente cuando está cargando</string>
|
||||||
<string name="tor_only_when_charging_summary">Deshabilita la conexión a Internet cuando el dispositivo está corriendo con batería.</string>
|
<string name="tor_only_when_charging_summary">Deshabilita la conexión a Internet cuando el dispositivo está corriendo con batería.</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Seguridad</string>
|
<string name="security_settings_title">Seguridad</string>
|
||||||
@@ -454,6 +467,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Cerrar la sesión de Briar si se pulsa un botón de pánico</string>
|
<string name="panic_setting_signout_summary">Cerrar la sesión de Briar si se pulsa un botón de pánico</string>
|
||||||
<string name="purge_setting_title">Eliminar cuenta</string>
|
<string name="purge_setting_title">Eliminar cuenta</string>
|
||||||
<string name="purge_setting_summary">Eliminar tu cuenta de Briar si se pulsa un botón de pánico. Precaución: esto eliminará permanentemente tus identidades, contactos y mensajes</string>
|
<string name="purge_setting_summary">Eliminar tu cuenta de Briar si se pulsa un botón de pánico. Precaución: esto eliminará permanentemente tus identidades, contactos y mensajes</string>
|
||||||
|
<string name="uninstall_setting_title">Desinstalar Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Requerirá confirmación manual en un evento de pánico</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Notificaciones</string>
|
<string name="notification_settings_title">Notificaciones</string>
|
||||||
<string name="notify_sign_in_title">Recordarme para iniciar sesión</string>
|
<string name="notify_sign_in_title">Recordarme para iniciar sesión</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Pasahitza</string>
|
<string name="enter_password">Pasahitza</string>
|
||||||
<string name="try_again">Pasahitz okerra, saiatu berriro</string>
|
<string name="try_again">Pasahitz okerra, saiatu berriro</string>
|
||||||
<string name="dialog_title_cannot_check_password">Ezin izan da pasahitza egiaztatu</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar-ek ezin du zure pasahitza egiaztatu. Saiatu gailua berrabiarazten arazo hau konpontzeko.</string>
|
|
||||||
<string name="sign_in_button">Hasi saioa</string>
|
<string name="sign_in_button">Hasi saioa</string>
|
||||||
<string name="forgotten_password">Nire pasahitza ahaztu dut</string>
|
<string name="forgotten_password">Nire pasahitza ahaztu dut</string>
|
||||||
<string name="dialog_title_lost_password">Pasahitzaren galera</string>
|
<string name="dialog_title_lost_password">Pasahitzaren galera</string>
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<string name="delete">Ezabatu</string>
|
<string name="delete">Ezabatu</string>
|
||||||
<string name="accept">Onartu</string>
|
<string name="accept">Onartu</string>
|
||||||
<string name="decline">Errefusatu</string>
|
<string name="decline">Errefusatu</string>
|
||||||
|
<string name="options">Aukerak</string>
|
||||||
<string name="online">Konektatuta</string>
|
<string name="online">Konektatuta</string>
|
||||||
<string name="offline">Deskonektatuta</string>
|
<string name="offline">Deskonektatuta</string>
|
||||||
<string name="send">Bidali</string>
|
<string name="send">Bidali</string>
|
||||||
@@ -174,6 +173,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Gehitu urruneko kontaktua</string>
|
<string name="add_contact_remotely_title_case">Gehitu urruneko kontaktua</string>
|
||||||
<string name="add_contact_nearby_title">Gehitu inguruko kontaktua</string>
|
<string name="add_contact_nearby_title">Gehitu inguruko kontaktua</string>
|
||||||
<string name="add_contact_remotely_title">Gehitu urruneko kontaktua</string>
|
<string name="add_contact_remotely_title">Gehitu urruneko kontaktua</string>
|
||||||
|
<string name="contact_name_hint">Eman ezizena kontaktuari</string>
|
||||||
<string name="contact_link_intro">Sartu hemen zure kontaktuaren esteka</string>
|
<string name="contact_link_intro">Sartu hemen zure kontaktuaren esteka</string>
|
||||||
<string name="contact_link_hint">Kontaktuaren esteka</string>
|
<string name="contact_link_hint">Kontaktuaren esteka</string>
|
||||||
<string name="paste_button">Itsatsi</string>
|
<string name="paste_button">Itsatsi</string>
|
||||||
@@ -191,6 +191,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Kontaktu eskaerak daude aztertzeke</string>
|
<string name="pending_contact_requests_snackbar">Kontaktu eskaerak daude aztertzeke</string>
|
||||||
<string name="pending_contact_requests">Kontaktu eskaerak aztertzeke</string>
|
<string name="pending_contact_requests">Kontaktu eskaerak aztertzeke</string>
|
||||||
<string name="no_pending_contacts">Ez dago kontakturik aztertzeke</string>
|
<string name="no_pending_contacts">Ez dago kontakturik aztertzeke</string>
|
||||||
|
<string name="add_contact_remote_connecting">Konektatzen...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Kontaktua konektatu bitartean zain...</string>
|
<string name="waiting_for_contact_to_come_online">Kontaktua konektatu bitartean zain...</string>
|
||||||
<string name="connecting">Konektatzen...</string>
|
<string name="connecting">Konektatzen...</string>
|
||||||
<string name="adding_contact">Kontaktua gehitzen...</string>
|
<string name="adding_contact">Kontaktua gehitzen...</string>
|
||||||
@@ -211,6 +212,9 @@
|
|||||||
<item quantity="one">Kontaktu berria gehitu da</item>
|
<item quantity="one">Kontaktu berria gehitu da</item>
|
||||||
<item quantity="other">%d kontaktu berri gehitu dira.</item>
|
<item quantity="other">%d kontaktu berri gehitu dira.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Kontaktu hau gehitzeak ohi baino denbora gehiago hartzen ari da</string>
|
||||||
|
<string name="adding_contact_slow_title">Ezin da kontaktuarekin kontaktatu</string>
|
||||||
|
<string name="adding_contact_slow_text">Kontaktu hau gehitzeak ohi baino denbora gehiago hartzen du.\n\nEgiaztatu kontaktua esteka jaso duela eta zu gehitu zaituela:</string>
|
||||||
<string name="offline_state">Internet konexiorik ez</string>
|
<string name="offline_state">Internet konexiorik ez</string>
|
||||||
<string name="duplicate_link_dialog_title">Bikoiztutako esteka</string>
|
<string name="duplicate_link_dialog_title">Bikoiztutako esteka</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Baduzu kontaktu bat aztertzeke esteka honekin: %s</string>
|
<string name="duplicate_link_dialog_text_1">Baduzu kontaktu bat aztertzeke esteka honekin: %s</string>
|
||||||
@@ -238,6 +242,7 @@
|
|||||||
<string name="introduction_button">Egin aurkezpena</string>
|
<string name="introduction_button">Egin aurkezpena</string>
|
||||||
<string name="introduction_sent">Zure aurkezpena bidali da.</string>
|
<string name="introduction_sent">Zure aurkezpena bidali da.</string>
|
||||||
<string name="introduction_error">Errorea gertatu da aurkezpena egitean.</string>
|
<string name="introduction_error">Errorea gertatu da aurkezpena egitean.</string>
|
||||||
|
<string name="introduction_response_error">Errorea aurkezpenari erantzutean</string>
|
||||||
<string name="introduction_request_sent">%1$s erabiltzailea %2$s erabiltzaileari aurkeztea eskatu duzu</string>
|
<string name="introduction_request_sent">%1$s erabiltzailea %2$s erabiltzaileari aurkeztea eskatu duzu</string>
|
||||||
<string name="introduction_request_received">%1$s erabiltzaileak zu %2$s(e)ri aurkeztea eskatu du. %2$s zure kontaktuen zerrendara gehitu nahi duzu?</string>
|
<string name="introduction_request_received">%1$s erabiltzaileak zu %2$s(e)ri aurkeztea eskatu du. %2$s zure kontaktuen zerrendara gehitu nahi duzu?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s erabiltzaileak zu %2$s(e)ri aurkeztea eskatu du, baina %2$s badago zure kontaktuen zerrendan. %1$s erabiltzaileak agian hori ez dakienez, erantzun dezakezu:</string>
|
<string name="introduction_request_exists_received">%1$s erabiltzaileak zu %2$s(e)ri aurkeztea eskatu du, baina %2$s badago zure kontaktuen zerrendan. %1$s erabiltzaileak agian hori ez dakienez, erantzun dezakezu:</string>
|
||||||
@@ -408,11 +413,20 @@
|
|||||||
<string name="pref_theme_dark">Iluna</string>
|
<string name="pref_theme_dark">Iluna</string>
|
||||||
<string name="pref_theme_auto">Automatikoa (Egunez)</string>
|
<string name="pref_theme_auto">Automatikoa (Egunez)</string>
|
||||||
<string name="pref_theme_system">Sistemak lehenetsitakoa</string>
|
<string name="pref_theme_system">Sistemak lehenetsitakoa</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Sareak</string>
|
||||||
|
<string name="bluetooth_setting">Konektatu Bluetooth bidez</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Kontaktuak hurbil daudeneak</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Kontaktuak gehitzean besterik ez</string>
|
||||||
|
<string name="tor_network_setting">Konektatu Internet bidez (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automatikoa kokalekuan oinarritua</string>
|
<string name="tor_network_setting_automatic">Automatikoa kokalekuan oinarritua</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Erabili Tor zubirik gabe</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Erabili Tor zubiekin</string>
|
||||||
|
<string name="tor_network_setting_never">Ez konektatu</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automatikoa: %1$s (%2$s(e)n)</string>
|
<string name="tor_network_setting_summary">Automatikoa: %1$s (%2$s(e)n)</string>
|
||||||
<string name="tor_mobile_data_title">Erabili datu mugikorrak</string>
|
<string name="tor_mobile_data_title">Erabili datu mugikorrak</string>
|
||||||
|
<string name="tor_only_when_charging_title">Konektatu Internet bidez (Tor) kargatu bitartean besterik ez</string>
|
||||||
<string name="tor_only_when_charging_summary">Internet konexio desgaitzen du gailuak bateria darabilenean</string>
|
<string name="tor_only_when_charging_summary">Internet konexio desgaitzen du gailuak bateria darabilenean</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Segurtasuna</string>
|
<string name="security_settings_title">Segurtasuna</string>
|
||||||
@@ -453,6 +467,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Amaitu Briar saioa larrialdi-botoia zapaltzen bada</string>
|
<string name="panic_setting_signout_summary">Amaitu Briar saioa larrialdi-botoia zapaltzen bada</string>
|
||||||
<string name="purge_setting_title">Ezabatu kontua</string>
|
<string name="purge_setting_title">Ezabatu kontua</string>
|
||||||
<string name="purge_setting_summary">Ezabatu zure Briar kontua larrialdi-botoia zapaltzen bada. Kontuz: Honek behin betiko ezabatuko ditu zure identitateak, kontaktuak eta mezuak</string>
|
<string name="purge_setting_summary">Ezabatu zure Briar kontua larrialdi-botoia zapaltzen bada. Kontuz: Honek behin betiko ezabatuko ditu zure identitateak, kontaktuak eta mezuak</string>
|
||||||
|
<string name="uninstall_setting_title">Desinstalatu Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Hau eskuz baieztatu behar da larrialdi egoera batean</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Jakinarazpenak</string>
|
<string name="notification_settings_title">Jakinarazpenak</string>
|
||||||
<string name="notify_sign_in_title">Gogorarazi niri saioa hastea</string>
|
<string name="notify_sign_in_title">Gogorarazi niri saioa hastea</string>
|
||||||
|
|||||||
@@ -28,8 +28,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">گذرواژه</string>
|
<string name="enter_password">گذرواژه</string>
|
||||||
<string name="try_again">گذرواژه اشتباه است، لطفا دوباره سعی کنید</string>
|
<string name="try_again">گذرواژه اشتباه است، لطفا دوباره سعی کنید</string>
|
||||||
<string name="dialog_title_cannot_check_password">قادر به بررسی رمز عبور نیست</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar قادر به بررسی رمز عبور شما نیست. لطفا دستگاه خود را برای حل این مشکل راه اندازی مجدد کنید.</string>
|
|
||||||
<string name="sign_in_button">ورود</string>
|
<string name="sign_in_button">ورود</string>
|
||||||
<string name="forgotten_password">گذرواژه خود را فراموش کرده ام</string>
|
<string name="forgotten_password">گذرواژه خود را فراموش کرده ام</string>
|
||||||
<string name="dialog_title_lost_password">گذرواژه گمشده</string>
|
<string name="dialog_title_lost_password">گذرواژه گمشده</string>
|
||||||
@@ -104,6 +102,7 @@
|
|||||||
<string name="delete">حذف</string>
|
<string name="delete">حذف</string>
|
||||||
<string name="accept">پذیرفتن</string>
|
<string name="accept">پذیرفتن</string>
|
||||||
<string name="decline">رد کردن</string>
|
<string name="decline">رد کردن</string>
|
||||||
|
<string name="options">گزینه ها</string>
|
||||||
<string name="online">آنلاین</string>
|
<string name="online">آنلاین</string>
|
||||||
<string name="offline">آفلاین</string>
|
<string name="offline">آفلاین</string>
|
||||||
<string name="send">ارسال</string>
|
<string name="send">ارسال</string>
|
||||||
@@ -188,6 +187,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">افزودن مخاطب از دور</string>
|
<string name="add_contact_remotely_title_case">افزودن مخاطب از دور</string>
|
||||||
<string name="add_contact_nearby_title">افزودن مخاطب از نزدیک</string>
|
<string name="add_contact_nearby_title">افزودن مخاطب از نزدیک</string>
|
||||||
<string name="add_contact_remotely_title">افزودن مخاطب از راه دور</string>
|
<string name="add_contact_remotely_title">افزودن مخاطب از راه دور</string>
|
||||||
|
<string name="contact_name_hint">دادن یک نام مستعار به مخاطب</string>
|
||||||
<string name="contact_link_intro">پیوند آمده از مخاطب خود را اینجا وارد کنید</string>
|
<string name="contact_link_intro">پیوند آمده از مخاطب خود را اینجا وارد کنید</string>
|
||||||
<string name="contact_link_hint">پیوند مخاطب</string>
|
<string name="contact_link_hint">پیوند مخاطب</string>
|
||||||
<string name="paste_button">چسباندن</string>
|
<string name="paste_button">چسباندن</string>
|
||||||
@@ -205,6 +205,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">درخواست های مخاطب معلق وجود دارند</string>
|
<string name="pending_contact_requests_snackbar">درخواست های مخاطب معلق وجود دارند</string>
|
||||||
<string name="pending_contact_requests">درخواست های مخاطب معلق</string>
|
<string name="pending_contact_requests">درخواست های مخاطب معلق</string>
|
||||||
<string name="no_pending_contacts">هیچ مخاطب معلقی وجود ندارد</string>
|
<string name="no_pending_contacts">هیچ مخاطب معلقی وجود ندارد</string>
|
||||||
|
<string name="add_contact_remote_connecting">در حال اتصال…</string>
|
||||||
<string name="waiting_for_contact_to_come_online">انتظار برای آنلاین شدن مخاطب...</string>
|
<string name="waiting_for_contact_to_come_online">انتظار برای آنلاین شدن مخاطب...</string>
|
||||||
<string name="connecting">در حال اتصال…</string>
|
<string name="connecting">در حال اتصال…</string>
|
||||||
<string name="adding_contact">در حال افزودن مخاطب...</string>
|
<string name="adding_contact">در حال افزودن مخاطب...</string>
|
||||||
@@ -225,6 +226,11 @@
|
|||||||
<item quantity="one">مخاطب جدید افزوده شد.</item>
|
<item quantity="one">مخاطب جدید افزوده شد.</item>
|
||||||
<item quantity="other">%d مخاطب جدید افزوده شد.</item>
|
<item quantity="other">%d مخاطب جدید افزوده شد.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">افزودن این مخاطب بیشتر از حد معمول وقت گرفته است</string>
|
||||||
|
<string name="adding_contact_slow_title">عدم توانایی در اتصال به مخاطب</string>
|
||||||
|
<string name="adding_contact_slow_text">افزودن این مخاطب بیش تر از معمول وقت گرفته است.
|
||||||
|
|
||||||
|
لطفا بررسی کنید که مخاطب شما پیوندتان را دریافت کرده و شما را افزوده است:</string>
|
||||||
<string name="offline_state">ارتباط با اینترنت برقرار نیست</string>
|
<string name="offline_state">ارتباط با اینترنت برقرار نیست</string>
|
||||||
<string name="duplicate_link_dialog_title">پیوند تکراری</string>
|
<string name="duplicate_link_dialog_title">پیوند تکراری</string>
|
||||||
<string name="duplicate_link_dialog_text_1">شما هم اکنون یک مخاطب معلق با این پیوند دارید: %s</string>
|
<string name="duplicate_link_dialog_text_1">شما هم اکنون یک مخاطب معلق با این پیوند دارید: %s</string>
|
||||||
@@ -256,6 +262,7 @@
|
|||||||
<string name="introduction_button">معرفی کردن</string>
|
<string name="introduction_button">معرفی کردن</string>
|
||||||
<string name="introduction_sent">معرفی شما فرستاده شد.</string>
|
<string name="introduction_sent">معرفی شما فرستاده شد.</string>
|
||||||
<string name="introduction_error">خطایی در معرفی کردن رخ داده است.</string>
|
<string name="introduction_error">خطایی در معرفی کردن رخ داده است.</string>
|
||||||
|
<string name="introduction_response_error">خطا در هنگام پاسخ به معرفی</string>
|
||||||
<string name="introduction_request_sent">شما میخواهید %1$s را به %2$s معرفی کنید.</string>
|
<string name="introduction_request_sent">شما میخواهید %1$s را به %2$s معرفی کنید.</string>
|
||||||
<string name="introduction_request_received">%1$s مایل است شما را به %2$s کند. آیا میخواهید %2$s را به لیست مخاطبانتان اضافه کنید؟</string>
|
<string name="introduction_request_received">%1$s مایل است شما را به %2$s کند. آیا میخواهید %2$s را به لیست مخاطبانتان اضافه کنید؟</string>
|
||||||
<string name="introduction_request_exists_received">%1$s مایل است شما را به %2$s معرفی کند، اما %2$s از قبل جزء لیست مخاطبان شما می باشد. از آنجایی که %1$s ممکن است از این موضوع خبر نداشته باشد، شما هم چنان میتوانید پاسخ دهید:</string>
|
<string name="introduction_request_exists_received">%1$s مایل است شما را به %2$s معرفی کند، اما %2$s از قبل جزء لیست مخاطبان شما می باشد. از آنجایی که %1$s ممکن است از این موضوع خبر نداشته باشد، شما هم چنان میتوانید پاسخ دهید:</string>
|
||||||
@@ -448,11 +455,20 @@
|
|||||||
<string name="pref_theme_dark">تاریک</string>
|
<string name="pref_theme_dark">تاریک</string>
|
||||||
<string name="pref_theme_auto">خودکار ( روز)</string>
|
<string name="pref_theme_auto">خودکار ( روز)</string>
|
||||||
<string name="pref_theme_system">پیش فرض سیستم</string>
|
<string name="pref_theme_system">پیش فرض سیستم</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">شبکه ها</string>
|
||||||
|
<string name="bluetooth_setting">اتصال از طریق بلوتوث</string>
|
||||||
|
<string name="bluetooth_setting_enabled">هر زمانی که مخاطبان نزدیک هستند</string>
|
||||||
|
<string name="bluetooth_setting_disabled">فقط در هنگام افزودن مخاطبان</string>
|
||||||
|
<string name="tor_network_setting">اتصال از طریق اینترنت (تور)</string>
|
||||||
<string name="tor_network_setting_automatic">خودکار مبتنی بر موقعیت</string>
|
<string name="tor_network_setting_automatic">خودکار مبتنی بر موقعیت</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">استفاده از تور بدون پل ها</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">استفاده از تور با پل ها</string>
|
||||||
|
<string name="tor_network_setting_never">وصل نشو</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">خودکار: %1$s(در %2$s)</string>
|
<string name="tor_network_setting_summary">خودکار: %1$s(در %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">استفاده از داده موبایل</string>
|
<string name="tor_mobile_data_title">استفاده از داده موبایل</string>
|
||||||
|
<string name="tor_only_when_charging_title">اتصال از طریق اینترنت (تور) فقط در هنگام شارژ</string>
|
||||||
<string name="tor_only_when_charging_summary">ارتباط اینترنت را هنگامی که دستگاه در حال استفاده از باتری خود می باشد را غیرفعال می کند</string>
|
<string name="tor_only_when_charging_summary">ارتباط اینترنت را هنگامی که دستگاه در حال استفاده از باتری خود می باشد را غیرفعال می کند</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">امنیت</string>
|
<string name="security_settings_title">امنیت</string>
|
||||||
@@ -493,6 +509,8 @@
|
|||||||
<string name="panic_setting_signout_summary">در صورت کلیک بر روی کلید هراس از Briar (برایر) خارج شو</string>
|
<string name="panic_setting_signout_summary">در صورت کلیک بر روی کلید هراس از Briar (برایر) خارج شو</string>
|
||||||
<string name="purge_setting_title">حذف حساب کاربری</string>
|
<string name="purge_setting_title">حذف حساب کاربری</string>
|
||||||
<string name="purge_setting_summary">در صورت فشار دادن دکمه هراس حساب کاربری Briar (برایر) شما حذف خواهد شد. اخطار: این باعث حذف دائمی تمام هویت ها، مخاطبان و پیام های شما خواهد شد</string>
|
<string name="purge_setting_summary">در صورت فشار دادن دکمه هراس حساب کاربری Briar (برایر) شما حذف خواهد شد. اخطار: این باعث حذف دائمی تمام هویت ها، مخاطبان و پیام های شما خواهد شد</string>
|
||||||
|
<string name="uninstall_setting_title">پاک کردن Briar (برایر)</string>
|
||||||
|
<string name="uninstall_setting_summary">این نیازمند تایید دستی در موعد هراس میباشد</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">نوتیفیکیشن ها</string>
|
<string name="notification_settings_title">نوتیفیکیشن ها</string>
|
||||||
<string name="notify_sign_in_title">به من یاد آوری کن تا دوباره وارد شوم</string>
|
<string name="notify_sign_in_title">به من یاد آوری کن تا دوباره وارد شوم</string>
|
||||||
|
|||||||
@@ -10,9 +10,9 @@
|
|||||||
<string name="setup_doze_intro">Pour recevoir des messages, Briar a besoin de rester connectée en arrière-plan.</string>
|
<string name="setup_doze_intro">Pour recevoir des messages, Briar a besoin de rester connectée en arrière-plan.</string>
|
||||||
<string name="setup_doze_explanation">Pour recevoir des messages, Briar a besoin de rester connectée en arrière-plan. Veuillez désactiver les optimisations de la batterie afin que Briar puisse rester connectée.</string>
|
<string name="setup_doze_explanation">Pour recevoir des messages, Briar a besoin de rester connectée en arrière-plan. Veuillez désactiver les optimisations de la batterie afin que Briar puisse rester connectée.</string>
|
||||||
<string name="setup_doze_button">Autoriser les connexions</string>
|
<string name="setup_doze_button">Autoriser les connexions</string>
|
||||||
<string name="choose_nickname">Choisissez votre pseudonyme</string>
|
<string name="choose_nickname">Choisir votre pseudonyme</string>
|
||||||
<string name="choose_password">Choisissez votre mot de passe</string>
|
<string name="choose_password">Choisir votre mot de passe</string>
|
||||||
<string name="confirm_password">Confirmez votre mot de passe</string>
|
<string name="confirm_password">Confirmer votre mot de passe</string>
|
||||||
<string name="name_too_long">Le nom est trop long</string>
|
<string name="name_too_long">Le nom est trop long</string>
|
||||||
<string name="password_too_weak">Le mot de passe est trop faible</string>
|
<string name="password_too_weak">Le mot de passe est trop faible</string>
|
||||||
<string name="passwords_do_not_match">Les mots de passe ne correspondent pas</string>
|
<string name="passwords_do_not_match">Les mots de passe ne correspondent pas</string>
|
||||||
@@ -26,12 +26,10 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Mot de passe</string>
|
<string name="enter_password">Mot de passe</string>
|
||||||
<string name="try_again">Le mot de passe est erroné, ressayez</string>
|
<string name="try_again">Le mot de passe est erroné, ressayez</string>
|
||||||
<string name="dialog_title_cannot_check_password">Impossible de vérifier le mot de passe</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar ne peut pas vérifier votre mot de passe. Veuillez essayer de redémarrer votre appareil pour résoudre ce problème.</string>
|
|
||||||
<string name="sign_in_button">Connexion</string>
|
<string name="sign_in_button">Connexion</string>
|
||||||
<string name="forgotten_password">J’ai oublié mon mot de passe</string>
|
<string name="forgotten_password">J’ai oublié mon mot de passe</string>
|
||||||
<string name="dialog_title_lost_password">Mot de passe oublié</string>
|
<string name="dialog_title_lost_password">Mot de passe oublié</string>
|
||||||
<string name="dialog_message_lost_password">Votre compte Briar est enregistré chiffré sur votre appareil, pas dans le nuage, et nous ne pouvons donc pas réinitialiser votre mot de passe. Voulez-vous supprimer votre compte et recommencer ?\n\nAttention : vos identités, contacts et messages seront perdus irrémédiablement.</string>
|
<string name="dialog_message_lost_password">Votre compte Briar est enregistré chiffré sur votre appareil, pas dans le nuage, et nous ne pouvons donc pas réinitialiser votre mot de passe. Voulez-vous supprimer votre compte et recommencer ?\n\nAttention : vos identités, contacts et messages seront perdus irrémédiablement.</string>
|
||||||
<string name="startup_failed_notification_title">Impossible de démarrer Briar</string>
|
<string name="startup_failed_notification_title">Impossible de démarrer Briar</string>
|
||||||
<string name="startup_failed_notification_text">Toucher pour plus d’informations.</string>
|
<string name="startup_failed_notification_text">Toucher pour plus d’informations.</string>
|
||||||
<string name="startup_failed_activity_title">Échec de démarrage de Briar</string>
|
<string name="startup_failed_activity_title">Échec de démarrage de Briar</string>
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<string name="delete">Supprimer</string>
|
<string name="delete">Supprimer</string>
|
||||||
<string name="accept">Accepter</string>
|
<string name="accept">Accepter</string>
|
||||||
<string name="decline">Refuser</string>
|
<string name="decline">Refuser</string>
|
||||||
|
<string name="options">Options</string>
|
||||||
<string name="online">En ligne</string>
|
<string name="online">En ligne</string>
|
||||||
<string name="offline">Hors ligne</string>
|
<string name="offline">Hors ligne</string>
|
||||||
<string name="send">Envoyer</string>
|
<string name="send">Envoyer</string>
|
||||||
@@ -155,11 +154,11 @@
|
|||||||
<!--Adding Contacts-->
|
<!--Adding Contacts-->
|
||||||
<string name="add_contact_title">Ajouter un contact à proximité</string>
|
<string name="add_contact_title">Ajouter un contact à proximité</string>
|
||||||
<string name="face_to_face">Vous devez rencontrer la personne que vous voulez ajouter comme contact, afin d’éviter que quelqu’un se fasse passer pour vous et puisse lire vos messages à l’avenir.</string>
|
<string name="face_to_face">Vous devez rencontrer la personne que vous voulez ajouter comme contact, afin d’éviter que quelqu’un se fasse passer pour vous et puisse lire vos messages à l’avenir.</string>
|
||||||
<string name="continue_button">Poursuivre</string>
|
<string name="continue_button">Continuer</string>
|
||||||
<string name="try_again_button">Ressayer</string>
|
<string name="try_again_button">Ressayer</string>
|
||||||
<string name="waiting_for_contact_to_scan">En attente de balayage du code QR par le contact et de sa connexion\u2026</string>
|
<string name="waiting_for_contact_to_scan">En attente de balayage du code QR par le contact et de sa connexion\u2026</string>
|
||||||
<string name="exchanging_contact_details">Échange des renseignements de contact\u2026</string>
|
<string name="exchanging_contact_details">Échange des renseignements de contact\u2026</string>
|
||||||
<string name="contact_added_toast">Contact ajouté : %s</string>
|
<string name="contact_added_toast">Contact ajouté : %s</string>
|
||||||
<string name="contact_already_exists">Le contact %s existe déjà</string>
|
<string name="contact_already_exists">Le contact %s existe déjà</string>
|
||||||
<string name="qr_code_invalid">Le code QR est invalide</string>
|
<string name="qr_code_invalid">Le code QR est invalide</string>
|
||||||
<string name="qr_code_too_old">Le code QR que vous avez balayé provient d’une version plus ancienne de %s.\n\nVeuillez demander à votre contact de passer à la version la plus récente et ressayer.</string>
|
<string name="qr_code_too_old">Le code QR que vous avez balayé provient d’une version plus ancienne de %s.\n\nVeuillez demander à votre contact de passer à la version la plus récente et ressayer.</string>
|
||||||
@@ -174,6 +173,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Ajouter un contact éloigné</string>
|
<string name="add_contact_remotely_title_case">Ajouter un contact éloigné</string>
|
||||||
<string name="add_contact_nearby_title">Ajouter un contact à proximité</string>
|
<string name="add_contact_nearby_title">Ajouter un contact à proximité</string>
|
||||||
<string name="add_contact_remotely_title">Ajouter un contact éloigné</string>
|
<string name="add_contact_remotely_title">Ajouter un contact éloigné</string>
|
||||||
|
<string name="contact_name_hint">Donner un pseudonyme au contact</string>
|
||||||
<string name="contact_link_intro">Saisissez ici le lien de votre contact</string>
|
<string name="contact_link_intro">Saisissez ici le lien de votre contact</string>
|
||||||
<string name="contact_link_hint">Lien de votre contact</string>
|
<string name="contact_link_hint">Lien de votre contact</string>
|
||||||
<string name="paste_button">Coller</string>
|
<string name="paste_button">Coller</string>
|
||||||
@@ -191,6 +191,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Des demandes de contact sont en attente</string>
|
<string name="pending_contact_requests_snackbar">Des demandes de contact sont en attente</string>
|
||||||
<string name="pending_contact_requests">Demandes de contact en attente</string>
|
<string name="pending_contact_requests">Demandes de contact en attente</string>
|
||||||
<string name="no_pending_contacts">Il n’y a aucun contact en attente</string>
|
<string name="no_pending_contacts">Il n’y a aucun contact en attente</string>
|
||||||
|
<string name="add_contact_remote_connecting">Connexion…</string>
|
||||||
<string name="waiting_for_contact_to_come_online">En attente de l’arrivée en ligne du contact…</string>
|
<string name="waiting_for_contact_to_come_online">En attente de l’arrivée en ligne du contact…</string>
|
||||||
<string name="connecting">Connexion…</string>
|
<string name="connecting">Connexion…</string>
|
||||||
<string name="adding_contact">Ajout du contact…</string>
|
<string name="adding_contact">Ajout du contact…</string>
|
||||||
@@ -211,6 +212,9 @@
|
|||||||
<item quantity="one">Un nouveau contact a été ajouté</item>
|
<item quantity="one">Un nouveau contact a été ajouté</item>
|
||||||
<item quantity="other">%d nouveaux contacts ont été ajoutés.</item>
|
<item quantity="other">%d nouveaux contacts ont été ajoutés.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">L’ajout de ce contact prend plus longtemps que d’habitude</string>
|
||||||
|
<string name="adding_contact_slow_title">Impossible de se connecter au contact</string>
|
||||||
|
<string name="adding_contact_slow_text">L’ajout de ce contact prend plus longtemps que d’habitude.\n\nVeuillez vérifier si votre contact a reçu votre lien et vous a ajouté :</string>
|
||||||
<string name="offline_state">Aucune connexion à Internet</string>
|
<string name="offline_state">Aucune connexion à Internet</string>
|
||||||
<string name="duplicate_link_dialog_title">Lien en double</string>
|
<string name="duplicate_link_dialog_title">Lien en double</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Vous avez déjà un contact en attente avec ce lien : %s</string>
|
<string name="duplicate_link_dialog_text_1">Vous avez déjà un contact en attente avec ce lien : %s</string>
|
||||||
@@ -238,9 +242,10 @@
|
|||||||
<string name="introduction_button">Faire les présentations</string>
|
<string name="introduction_button">Faire les présentations</string>
|
||||||
<string name="introduction_sent">Votre présentation a été envoyée.</string>
|
<string name="introduction_sent">Votre présentation a été envoyée.</string>
|
||||||
<string name="introduction_error">Une erreur est survenue lors de la présentation.</string>
|
<string name="introduction_error">Une erreur est survenue lors de la présentation.</string>
|
||||||
|
<string name="introduction_response_error">Erreur de réponse à la présentation</string>
|
||||||
<string name="introduction_request_sent">Vous avez demandé de présenter %1$s à %2$s.</string>
|
<string name="introduction_request_sent">Vous avez demandé de présenter %1$s à %2$s.</string>
|
||||||
<string name="introduction_request_received">%1$s a demandé de vous présenter à %2$s. Souhaitez-vous ajouter %2$s à votre liste de contacts ?</string>
|
<string name="introduction_request_received">%1$s a demandé de vous présenter à %2$s. Souhaitez-vous ajouter %2$s à votre liste de contacts ?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s a demandé de vous présenter à %2$s, mais %2$s est déjà dans votre liste de contacts. Puisque %1$s pourrait ne pas le savoir, vous pouvez tout de même répondre :</string>
|
<string name="introduction_request_exists_received">%1$s a demandé de vous présenter à %2$s, mais %2$s est déjà dans votre liste de contacts. Puisque %1$s pourrait ne pas le savoir, vous pouvez tout de même répondre :</string>
|
||||||
<string name="introduction_request_answered_received">%1$s a demandé de vous présenter à %2$s.</string>
|
<string name="introduction_request_answered_received">%1$s a demandé de vous présenter à %2$s.</string>
|
||||||
<string name="introduction_response_accepted_sent">Vous avez accepté d’être présenté à %1$s.</string>
|
<string name="introduction_response_accepted_sent">Vous avez accepté d’être présenté à %1$s.</string>
|
||||||
<string name="introduction_response_accepted_sent_info">Avant que %1$s ne soit ajouté à vos contacts, ce contact doit aussi accepter la présentation. Cela peut prendre du temps. </string>
|
<string name="introduction_response_accepted_sent_info">Avant que %1$s ne soit ajouté à vos contacts, ce contact doit aussi accepter la présentation. Cela peut prendre du temps. </string>
|
||||||
@@ -262,7 +267,7 @@
|
|||||||
<string name="groups_create_group_title">Créer un groupe privé</string>
|
<string name="groups_create_group_title">Créer un groupe privé</string>
|
||||||
<string name="groups_create_group_button">Créer un groupe</string>
|
<string name="groups_create_group_button">Créer un groupe</string>
|
||||||
<string name="groups_create_group_invitation_button">Envoyer une invitation</string>
|
<string name="groups_create_group_invitation_button">Envoyer une invitation</string>
|
||||||
<string name="groups_create_group_hint">Choisissez un nom pour votre groupe privé</string>
|
<string name="groups_create_group_hint">Choisir un nom pour votre groupe privé</string>
|
||||||
<string name="groups_invitation_sent">L’invitation de groupe a été envoyée</string>
|
<string name="groups_invitation_sent">L’invitation de groupe a été envoyée</string>
|
||||||
<string name="groups_member_list">Liste des participants</string>
|
<string name="groups_member_list">Liste des participants</string>
|
||||||
<string name="groups_invite_members">Inviter des participants</string>
|
<string name="groups_invite_members">Inviter des participants</string>
|
||||||
@@ -305,7 +310,7 @@
|
|||||||
<string name="no_forums">Aucun forum à afficher</string>
|
<string name="no_forums">Aucun forum à afficher</string>
|
||||||
<string name="no_forums_action">Touchez l’icône + pour créer un forum ou pour demander à vos contacts de partager des forums avec vous</string>
|
<string name="no_forums_action">Touchez l’icône + pour créer un forum ou pour demander à vos contacts de partager des forums avec vous</string>
|
||||||
<string name="create_forum_title">Créer un forum</string>
|
<string name="create_forum_title">Créer un forum</string>
|
||||||
<string name="choose_forum_hint">Choisissez un nom pour votre forum </string>
|
<string name="choose_forum_hint">Choisir un nom pour votre forum </string>
|
||||||
<string name="create_forum_button">Créer un forum</string>
|
<string name="create_forum_button">Créer un forum</string>
|
||||||
<string name="forum_created_toast">Le forum a été créé</string>
|
<string name="forum_created_toast">Le forum a été créé</string>
|
||||||
<string name="no_forum_posts">Aucun article à afficher</string>
|
<string name="no_forum_posts">Aucun article à afficher</string>
|
||||||
@@ -327,7 +332,7 @@
|
|||||||
<string name="contacts_selected">Des contacts ont été sélectionnés</string>
|
<string name="contacts_selected">Des contacts ont été sélectionnés</string>
|
||||||
<string name="activity_share_toolbar_header">Choisir des contacts</string>
|
<string name="activity_share_toolbar_header">Choisir des contacts</string>
|
||||||
<string name="no_contacts_selector">Aucun contact à afficher</string>
|
<string name="no_contacts_selector">Aucun contact à afficher</string>
|
||||||
<string name="no_contacts_selector_action">Veuillez revenir ici après avoir ajouté un contact</string>
|
<string name="no_contacts_selector_action">Veuillez revenir ici après avoir ajouter un contact</string>
|
||||||
<string name="forum_shared_snackbar">Le forum a été partagé avec les contacts choisis</string>
|
<string name="forum_shared_snackbar">Le forum a été partagé avec les contacts choisis</string>
|
||||||
<string name="forum_share_message">Ajouter un message (facultatif)</string>
|
<string name="forum_share_message">Ajouter un message (facultatif)</string>
|
||||||
<string name="forum_share_error">Une erreur est survenue lors du partage de ce forum.</string>
|
<string name="forum_share_error">Une erreur est survenue lors du partage de ce forum.</string>
|
||||||
@@ -387,17 +392,17 @@
|
|||||||
<string name="blogs_rss_feeds_import">Importer un fil RSS</string>
|
<string name="blogs_rss_feeds_import">Importer un fil RSS</string>
|
||||||
<string name="blogs_rss_feeds_import_button">Importer</string>
|
<string name="blogs_rss_feeds_import_button">Importer</string>
|
||||||
<string name="blogs_rss_feeds_import_hint">Saisir l’URL du fil RSS</string>
|
<string name="blogs_rss_feeds_import_hint">Saisir l’URL du fil RSS</string>
|
||||||
<string name="blogs_rss_feeds_import_error">Nous sommes désolés ! Une erreur est survenue lors de l’importation de votre fil.</string>
|
<string name="blogs_rss_feeds_import_error">Nous sommes désolé ! Une erreur est survenue lors de l’importation de votre fil.</string>
|
||||||
<string name="blogs_rss_feeds_manage">Gérer les fils RSS</string>
|
<string name="blogs_rss_feeds_manage">Gérer les fils RSS</string>
|
||||||
<string name="blogs_rss_feeds_manage_imported">Importés :</string>
|
<string name="blogs_rss_feeds_manage_imported">Importés :</string>
|
||||||
<string name="blogs_rss_feeds_manage_author">Auteur :</string>
|
<string name="blogs_rss_feeds_manage_author">Auteur :</string>
|
||||||
<string name="blogs_rss_feeds_manage_updated">Dernière mise à jour :</string>
|
<string name="blogs_rss_feeds_manage_updated">Dernière mise à jour :</string>
|
||||||
<string name="blogs_rss_remove_feed">Supprimer le fil</string>
|
<string name="blogs_rss_remove_feed">Supprimer le fil</string>
|
||||||
<string name="blogs_rss_remove_feed_dialog_message">Voulez-vous vraiment supprimer ce fil ?\nLes billets seront supprimés de votre appareil mais pas des appareils d’autrui.\n\nLes contacts avec qui vous avez partagé ce fil pourraient ne plus en recevoir les mises à jour.</string>
|
<string name="blogs_rss_remove_feed_dialog_message">Voulez-vous vraiment supprimer ce fil ?\nLes billets seront supprimés de votre appareil mais pas des appareils d’autrui.\n\nLes contacts avec qui vous avez partagé ce fil pourraient ne plus en recevoir les mises à jour.</string>
|
||||||
<string name="blogs_rss_remove_feed_ok">Supprimer</string>
|
<string name="blogs_rss_remove_feed_ok">Supprimer</string>
|
||||||
<string name="blogs_rss_feeds_manage_delete_error">Impossible de supprimer le fil !</string>
|
<string name="blogs_rss_feeds_manage_delete_error">Impossible de supprimer le fil !</string>
|
||||||
<string name="blogs_rss_feeds_manage_empty_state">Aucun fil RSS à afficher\n\nTouchez l’icône + pour importer un fil</string>
|
<string name="blogs_rss_feeds_manage_empty_state">Aucun fil RSS à afficher\n\nTouchez l’icône + pour importer un fil</string>
|
||||||
<string name="blogs_rss_feeds_manage_error">Un problème est survenu lors du chargement de vos fils. Veuillez ressayer plus tard.</string>
|
<string name="blogs_rss_feeds_manage_error">Un problème est survenu lors du chargement de vos fils. Veuillez ressayer ultérieurement.</string>
|
||||||
<!--Settings Display-->
|
<!--Settings Display-->
|
||||||
<string name="pref_language_title">Langue et région</string>
|
<string name="pref_language_title">Langue et région</string>
|
||||||
<string name="pref_language_changed">Ce paramètre prendra effet une fois que vous aurez redémarré Briar. Veuillez vous déconnecter et redémarrer Briar.</string>
|
<string name="pref_language_changed">Ce paramètre prendra effet une fois que vous aurez redémarré Briar. Veuillez vous déconnecter et redémarrer Briar.</string>
|
||||||
@@ -408,22 +413,21 @@
|
|||||||
<string name="pref_theme_dark">Sombre</string>
|
<string name="pref_theme_dark">Sombre</string>
|
||||||
<string name="pref_theme_auto">Automatique (journée)</string>
|
<string name="pref_theme_auto">Automatique (journée)</string>
|
||||||
<string name="pref_theme_system">Valeur par défaut du système</string>
|
<string name="pref_theme_system">Valeur par défaut du système</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
<string name="network_settings_title">Connexions </string>
|
<string name="network_settings_title">Réseaux</string>
|
||||||
<string name="bluetooth_setting">Se connecter à des contacts par Bluetooth</string>
|
<string name="bluetooth_setting">Se connecter par Bluetooth</string>
|
||||||
<string name="wifi_setting">Se connecter à des contacts sur le même réseau Wi-Fi</string>
|
<string name="bluetooth_setting_enabled">Lorsque des contacts sont à proximité</string>
|
||||||
<string name="tor_enable_title">Se connecter à des contacts par Internet</string>
|
<string name="bluetooth_setting_disabled">Uniquement lors de l’ajout de contacts</string>
|
||||||
<string name="tor_enable_summary">Afin de protéger les données personnelles et la confidentialité, toutes les connexions passent par le réseau Tor</string>
|
<string name="tor_network_setting">Se connecter par Internet (Tor)</string>
|
||||||
<string name="tor_network_setting">Méthode de connexion pour le réseau Tor</string>
|
|
||||||
<string name="tor_network_setting_automatic">Automatique d’après la position</string>
|
<string name="tor_network_setting_automatic">Automatique d’après la position</string>
|
||||||
<string name="tor_network_setting_without_bridges">Utiliser le réseau Tor sans ponts</string>
|
<string name="tor_network_setting_without_bridges">Utiliser Tor sans ponts</string>
|
||||||
<string name="tor_network_setting_with_bridges">Utiliser le réseau Tor avec des ponts</string>
|
<string name="tor_network_setting_with_bridges">Utiliser Tor avec des ponts</string>
|
||||||
<string name="tor_network_setting_never">Ne pas se connecter à Internet</string>
|
<string name="tor_network_setting_never">Ne pas se connecter</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automatique : %1$s (en %2$s)</string>
|
<string name="tor_network_setting_summary">Automatique : %1$s (en %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Utiliser les données mobiles</string>
|
<string name="tor_mobile_data_title">Utiliser les données cellulaires</string>
|
||||||
<string name="tor_only_when_charging_title">Ne se connecter à Internet qu’en charge seulement</string>
|
<string name="tor_only_when_charging_title">Ne se connecter par Internet (Tor) qu’en charge seulement</string>
|
||||||
<string name="tor_only_when_charging_summary">Désactive la connexion Internet quand l’appareil fonctionne sur la pile</string>
|
<string name="tor_only_when_charging_summary">Désactive la connexion Internet quand l’appareil est sur la pile</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Sécurité</string>
|
<string name="security_settings_title">Sécurité</string>
|
||||||
<string name="pref_lock_title">Verrou de l’appli</string>
|
<string name="pref_lock_title">Verrou de l’appli</string>
|
||||||
@@ -451,7 +455,7 @@
|
|||||||
<string name="password_changed">Le mot de passe a été changé.</string>
|
<string name="password_changed">Le mot de passe a été changé.</string>
|
||||||
<string name="panic_setting">Paramètres du bouton d’urgence</string>
|
<string name="panic_setting">Paramètres du bouton d’urgence</string>
|
||||||
<string name="panic_setting_title">Bouton d’urgence</string>
|
<string name="panic_setting_title">Bouton d’urgence</string>
|
||||||
<string name="panic_setting_hint">Configurer la réaction de Briar quand vous utilisez une application de bouton d’urgence</string>
|
<string name="panic_setting_hint">Configurer la réaction de Briar lorsque vous utilisez une application de bouton d’urgence</string>
|
||||||
<string name="panic_app_setting_title">Application de bouton d’urgence</string>
|
<string name="panic_app_setting_title">Application de bouton d’urgence</string>
|
||||||
<string name="unknown_app">une appli inconnue</string>
|
<string name="unknown_app">une appli inconnue</string>
|
||||||
<string name="panic_app_setting_summary">Aucune appli n’a été définie</string>
|
<string name="panic_app_setting_summary">Aucune appli n’a été définie</string>
|
||||||
@@ -462,7 +466,9 @@
|
|||||||
<string name="panic_setting_signout_title">Déconnexion</string>
|
<string name="panic_setting_signout_title">Déconnexion</string>
|
||||||
<string name="panic_setting_signout_summary">Se déconnecter de Briar si l’on appuie sur un bouton d’urgence</string>
|
<string name="panic_setting_signout_summary">Se déconnecter de Briar si l’on appuie sur un bouton d’urgence</string>
|
||||||
<string name="purge_setting_title">Supprimer le compte</string>
|
<string name="purge_setting_title">Supprimer le compte</string>
|
||||||
<string name="purge_setting_summary">Supprimer votre compte Briar si on appuie sur un bouton d’urgence. Attention : cela supprimera définitivement vos identités, contacts et messages</string>
|
<string name="purge_setting_summary">Supprimer votre compte Briar lorsqu’on appuie sur un bouton d’urgence. Attention : cela supprimera définitivement vos identités, contacts et messages</string>
|
||||||
|
<string name="uninstall_setting_title">Désinstaller Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Une confirmation manuelle est exigée en cas d’événement d’urgence</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Notifications</string>
|
<string name="notification_settings_title">Notifications</string>
|
||||||
<string name="notify_sign_in_title">Rappelez-moi de me connecter</string>
|
<string name="notify_sign_in_title">Rappelez-moi de me connecter</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Clave</string>
|
<string name="enter_password">Clave</string>
|
||||||
<string name="try_again">Clave incorrecta, tenteo de novo</string>
|
<string name="try_again">Clave incorrecta, tenteo de novo</string>
|
||||||
<string name="dialog_title_cannot_check_password">Non se comprobou o contrasinal</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar non pode comprobar o contrasinal. Intenta reiniciar o dispositivo para solucionar o problema.</string>
|
|
||||||
<string name="sign_in_button">Iniciar sesión</string>
|
<string name="sign_in_button">Iniciar sesión</string>
|
||||||
<string name="forgotten_password">Esquecín a miña clave</string>
|
<string name="forgotten_password">Esquecín a miña clave</string>
|
||||||
<string name="dialog_title_lost_password">Clave perdida</string>
|
<string name="dialog_title_lost_password">Clave perdida</string>
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<string name="delete">Eliminar</string>
|
<string name="delete">Eliminar</string>
|
||||||
<string name="accept">Aceptar</string>
|
<string name="accept">Aceptar</string>
|
||||||
<string name="decline">Rexeitar</string>
|
<string name="decline">Rexeitar</string>
|
||||||
|
<string name="options">Opcións</string>
|
||||||
<string name="online">Conectado</string>
|
<string name="online">Conectado</string>
|
||||||
<string name="offline">Desconectado</string>
|
<string name="offline">Desconectado</string>
|
||||||
<string name="send">Enviar</string>
|
<string name="send">Enviar</string>
|
||||||
@@ -129,13 +128,6 @@
|
|||||||
<string name="dialog_title_delete_all_messages">Confirmar borrado de mensaxes</string>
|
<string name="dialog_title_delete_all_messages">Confirmar borrado de mensaxes</string>
|
||||||
<string name="dialog_message_delete_all_messages">Seguro que queres borrar todas as mensaxes?</string>
|
<string name="dialog_message_delete_all_messages">Seguro que queres borrar todas as mensaxes?</string>
|
||||||
<string name="dialog_title_not_all_messages_deleted">Non se puideron borrar todas as mensaxes</string>
|
<string name="dialog_title_not_all_messages_deleted">Non se puideron borrar todas as mensaxes</string>
|
||||||
<string name="dialog_message_not_deleted_ongoing_both">As mensaxes relacionadas con convites actuais e presentacións non se poden borrar ata que conclúan.</string>
|
|
||||||
<string name="dialog_message_not_deleted_ongoing_introductions">As mensaxes relacionadas con presentacións en curso non se poden borrar ata que conclúan.</string>
|
|
||||||
<string name="dialog_message_not_deleted_ongoing_invitations">As mensaxes relacionadas con convites en curso non se poden borrar ata que conclúan.</string>
|
|
||||||
<string name="dialog_message_not_deleted_partly_downloaded">As mensaxes parcialmente descargadas non se poden borrar ata que rematen de descargarse.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_both">Para borrar un convite ou presentación, debes seleccionar a solicitude e a resposta.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_introductions">Para borrar unha presentación, debes seleccionar a solicitude e a resposta.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_invitations">Para borrar un convite, debes seleccionar a solicitude e a resposta.</string>
|
|
||||||
<string name="delete_contact">Eliminar contacto</string>
|
<string name="delete_contact">Eliminar contacto</string>
|
||||||
<string name="dialog_title_delete_contact">Confirme a eliminación do contacto</string>
|
<string name="dialog_title_delete_contact">Confirme a eliminación do contacto</string>
|
||||||
<string name="dialog_message_delete_contact">Segura de querer eliminar este contacto e todas as mensaxes que intercambiaron?</string>
|
<string name="dialog_message_delete_contact">Segura de querer eliminar este contacto e todas as mensaxes que intercambiaron?</string>
|
||||||
@@ -174,6 +166,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Engadir contacto a distancia</string>
|
<string name="add_contact_remotely_title_case">Engadir contacto a distancia</string>
|
||||||
<string name="add_contact_nearby_title">Engadir contacto próximo</string>
|
<string name="add_contact_nearby_title">Engadir contacto próximo</string>
|
||||||
<string name="add_contact_remotely_title">Engadir contacto a distancia</string>
|
<string name="add_contact_remotely_title">Engadir contacto a distancia</string>
|
||||||
|
<string name="contact_name_hint">Darlle un alcume ao contacto</string>
|
||||||
<string name="contact_link_intro">Introducir aquí a ligazón do seu contacto</string>
|
<string name="contact_link_intro">Introducir aquí a ligazón do seu contacto</string>
|
||||||
<string name="contact_link_hint">Ligazón do contacto</string>
|
<string name="contact_link_hint">Ligazón do contacto</string>
|
||||||
<string name="paste_button">Pegar</string>
|
<string name="paste_button">Pegar</string>
|
||||||
@@ -191,6 +184,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Existen solicitudes de contactos pendentes</string>
|
<string name="pending_contact_requests_snackbar">Existen solicitudes de contactos pendentes</string>
|
||||||
<string name="pending_contact_requests">Solicitudes Pendentes de Contactos</string>
|
<string name="pending_contact_requests">Solicitudes Pendentes de Contactos</string>
|
||||||
<string name="no_pending_contacts">Sen contactos pendentes</string>
|
<string name="no_pending_contacts">Sen contactos pendentes</string>
|
||||||
|
<string name="add_contact_remote_connecting">Conectando...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Agardando a que o contacto se conecte...</string>
|
<string name="waiting_for_contact_to_come_online">Agardando a que o contacto se conecte...</string>
|
||||||
<string name="connecting">Conectando...</string>
|
<string name="connecting">Conectando...</string>
|
||||||
<string name="adding_contact">Engadindo contacto...</string>
|
<string name="adding_contact">Engadindo contacto...</string>
|
||||||
@@ -211,6 +205,9 @@
|
|||||||
<item quantity="one">Novo contacto engadido.</item>
|
<item quantity="one">Novo contacto engadido.</item>
|
||||||
<item quantity="other">%d novos contactos engadidos.</item>
|
<item quantity="other">%d novos contactos engadidos.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Estanos a costar moito tempo engadir esta usuaria</string>
|
||||||
|
<string name="adding_contact_slow_title">Non puido conectar co Contacto</string>
|
||||||
|
<string name="adding_contact_slow_text">Estanos a costar engadir este contacto.\n\nPor favor, comprobe que o contacto recibeu a súa ligazón e engadeuna a vostede:</string>
|
||||||
<string name="offline_state">Sen conexión a internet</string>
|
<string name="offline_state">Sen conexión a internet</string>
|
||||||
<string name="duplicate_link_dialog_title">Duplicar Ligazón</string>
|
<string name="duplicate_link_dialog_title">Duplicar Ligazón</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Xa ten un contacto pendente con esta ligazón: %s</string>
|
<string name="duplicate_link_dialog_text_1">Xa ten un contacto pendente con esta ligazón: %s</string>
|
||||||
@@ -238,6 +235,7 @@
|
|||||||
<string name="introduction_button">Preséntese</string>
|
<string name="introduction_button">Preséntese</string>
|
||||||
<string name="introduction_sent">Enviouse a súa presentación.</string>
|
<string name="introduction_sent">Enviouse a súa presentación.</string>
|
||||||
<string name="introduction_error">Algo fallou ao enviar a presentación.</string>
|
<string name="introduction_error">Algo fallou ao enviar a presentación.</string>
|
||||||
|
<string name="introduction_response_error">Fallo respondendo á presentación</string>
|
||||||
<string name="introduction_request_sent">Solicitou presentar %1$s a %2$s.</string>
|
<string name="introduction_request_sent">Solicitou presentar %1$s a %2$s.</string>
|
||||||
<string name="introduction_request_received">%1$s solicitou presentala a %2$s. Quere engadir a %2$s ao seu listado de contactos?</string>
|
<string name="introduction_request_received">%1$s solicitou presentala a %2$s. Quere engadir a %2$s ao seu listado de contactos?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s solicitou presentala a %2$s, pero %2$s xa está no seu listado de contactos. Xa que %1$s podería non sabelo, pode responder igualmente:</string>
|
<string name="introduction_request_exists_received">%1$s solicitou presentala a %2$s, pero %2$s xa está no seu listado de contactos. Xa que %1$s podería non sabelo, pode responder igualmente:</string>
|
||||||
@@ -408,11 +406,20 @@
|
|||||||
<string name="pref_theme_dark">Oscuro</string>
|
<string name="pref_theme_dark">Oscuro</string>
|
||||||
<string name="pref_theme_auto">Automático (no día)</string>
|
<string name="pref_theme_auto">Automático (no día)</string>
|
||||||
<string name="pref_theme_system">Por omisión do sistema</string>
|
<string name="pref_theme_system">Por omisión do sistema</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Redes</string>
|
||||||
|
<string name="bluetooth_setting">Conectar vía Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">En claquera momento que un contacto estea preto</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Só ao engadir contactos</string>
|
||||||
|
<string name="tor_network_setting">Conectar vía Internet (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automática baseada na localización</string>
|
<string name="tor_network_setting_automatic">Automática baseada na localización</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Utilizar Tor sen pontes</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Utilizar Tor con pontes</string>
|
||||||
|
<string name="tor_network_setting_never">Non conectar</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automático: %1$s (en %2$s)</string>
|
<string name="tor_network_setting_summary">Automático: %1$s (en %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Utilizar datos móbiles</string>
|
<string name="tor_mobile_data_title">Utilizar datos móbiles</string>
|
||||||
|
<string name="tor_only_when_charging_title">Conectar a internet (Tor) só mentras carga</string>
|
||||||
<string name="tor_only_when_charging_summary">Desactiva a conexión a internet cando o dispositivo utiliza a batería</string>
|
<string name="tor_only_when_charging_summary">Desactiva a conexión a internet cando o dispositivo utiliza a batería</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Seguridade</string>
|
<string name="security_settings_title">Seguridade</string>
|
||||||
@@ -453,6 +460,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Desconecte de Briar si o botón do pánico se preme</string>
|
<string name="panic_setting_signout_summary">Desconecte de Briar si o botón do pánico se preme</string>
|
||||||
<string name="purge_setting_title">Eliminar conta</string>
|
<string name="purge_setting_title">Eliminar conta</string>
|
||||||
<string name="purge_setting_summary">Elimina a súa conta en Briar si se preme o botón do pánico. Coidado: Isto eliminará permanentemente as súas identidades, contactos e mensaxes</string>
|
<string name="purge_setting_summary">Elimina a súa conta en Briar si se preme o botón do pánico. Coidado: Isto eliminará permanentemente as súas identidades, contactos e mensaxes</string>
|
||||||
|
<string name="uninstall_setting_title">Desinstalar Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Esto require confirmación manual no evento do pánico</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Notificacións</string>
|
<string name="notification_settings_title">Notificacións</string>
|
||||||
<string name="notify_sign_in_title">Lembrarme conectar</string>
|
<string name="notify_sign_in_title">Lembrarme conectar</string>
|
||||||
@@ -518,7 +527,7 @@
|
|||||||
<!--App Locking-->
|
<!--App Locking-->
|
||||||
<string name="lock_unlock">Desbloquear Briar</string>
|
<string name="lock_unlock">Desbloquear Briar</string>
|
||||||
<string name="lock_unlock_verbose">Introduza o PIN do dispositivo, patrón ou contrasinal para desbloquear Briar</string>
|
<string name="lock_unlock_verbose">Introduza o PIN do dispositivo, patrón ou contrasinal para desbloquear Briar</string>
|
||||||
<string name="lock_unlock_fingerprint_description">Toca o sensor de impresións dixitais co dedo rexistrado para continuar</string>
|
<string name="lock_unlock_fingerprint_description">Toque o sensor de pegadas co dedo rexistrado para continuar</string>
|
||||||
<string name="lock_unlock_password">Utilizar contrasinal</string>
|
<string name="lock_unlock_password">Utilizar contrasinal</string>
|
||||||
<string name="lock_is_locked">Briar está bloqueada</string>
|
<string name="lock_is_locked">Briar está bloqueada</string>
|
||||||
<string name="lock_tap_to_unlock">Toque para desbloquear</string>
|
<string name="lock_tap_to_unlock">Toque para desbloquear</string>
|
||||||
|
|||||||
@@ -10,9 +10,9 @@
|
|||||||
<string name="setup_doze_intro">כדי לקבל הודעות, Briar צריך להישאר מחובר ברקע.</string>
|
<string name="setup_doze_intro">כדי לקבל הודעות, Briar צריך להישאר מחובר ברקע.</string>
|
||||||
<string name="setup_doze_explanation">כדי לקבל הודעות, Briar צריך להישאר מחובר ברקע. אנא השבת מיטובי סוללה כך ש־Briar יוכל להישאר מחובר.</string>
|
<string name="setup_doze_explanation">כדי לקבל הודעות, Briar צריך להישאר מחובר ברקע. אנא השבת מיטובי סוללה כך ש־Briar יוכל להישאר מחובר.</string>
|
||||||
<string name="setup_doze_button">התר חיבורים</string>
|
<string name="setup_doze_button">התר חיבורים</string>
|
||||||
<string name="choose_nickname">בחר את הכינוי שלך</string>
|
<string name="choose_nickname">בחר את כינויך</string>
|
||||||
<string name="choose_password">בחר סיסמה</string>
|
<string name="choose_password">בחר את סיסמתך</string>
|
||||||
<string name="confirm_password">אשר סיסמה</string>
|
<string name="confirm_password">אשר את סיסמתך</string>
|
||||||
<string name="name_too_long">השם ארוך מדי</string>
|
<string name="name_too_long">השם ארוך מדי</string>
|
||||||
<string name="password_too_weak">הסיסמה חלשה מדי</string>
|
<string name="password_too_weak">הסיסמה חלשה מדי</string>
|
||||||
<string name="passwords_do_not_match">הסיסמאות לא תואמות</string>
|
<string name="passwords_do_not_match">הסיסמאות לא תואמות</string>
|
||||||
@@ -26,17 +26,17 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">סיסמה</string>
|
<string name="enter_password">סיסמה</string>
|
||||||
<string name="try_again">סיסמה שגויה, נסה שוב</string>
|
<string name="try_again">סיסמה שגויה, נסה שוב</string>
|
||||||
<string name="dialog_title_cannot_check_password">לא יכול לבדוק סיסמה</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar לא יכול לבדוק את הסיסמה שלך. אנא נסה לאתחל מחדש את המכשיר שלך כדי לפתור בעיה זאת.</string>
|
|
||||||
<string name="sign_in_button">היכנס</string>
|
<string name="sign_in_button">היכנס</string>
|
||||||
<string name="forgotten_password">שכחתי את הסיסמה שלי</string>
|
<string name="forgotten_password">שכחתי את הסיסמה שלי</string>
|
||||||
<string name="dialog_title_lost_password">סיסמה אבודה</string>
|
<string name="dialog_title_lost_password">סיסמה אבודה</string>
|
||||||
<string name="dialog_message_lost_password">חשבון Briar שלך מאוחסן באופן מוצפן על המכשיר שלך, לא בענן, כך שאנחנו לא יכולים לאפס את הסיסמה שלך. האם תרצה למחוק את החשבון שלך ולהתחיל מחדש?\n\nזהירות: הזהויות, אנשי הקשר וההודעות שלך יאבדו לצמיתות.</string>
|
<string name="dialog_message_lost_password">חשבון הבריאר שלכם שמור ומוצפן על המכשיר, לא בענן, כך שלא נוכל לשחזר את הסיסמה שלכם. למחוק את החשבון שלכם ולהתחיל מחדש?
|
||||||
|
|
||||||
|
זהירות: הזהויות שלכם, אנשי הקשר וההודעות יאבדו לצמיתות.</string>
|
||||||
<string name="startup_failed_notification_title">Briar לא היה ניתן להתחיל</string>
|
<string name="startup_failed_notification_title">Briar לא היה ניתן להתחיל</string>
|
||||||
<string name="startup_failed_notification_text">הקש לעוד מידע.</string>
|
<string name="startup_failed_notification_text">הקש לעוד מידע.</string>
|
||||||
<string name="startup_failed_activity_title">כישלון הזנק Briar</string>
|
<string name="startup_failed_activity_title">כישלון הזנק Briar</string>
|
||||||
<string name="startup_failed_db_error">מסיבה כלשהי, מסד נתונים Briar שלך פגום ללא יכולת תיקון. החשבון שלך, הנתונים שלך וכל אנשי הקשר שלך אבדו. למרבה הצער, אתה צריך להתקין מחדש את Briar או להגדיר חשבון חדש ע״י בחירה באפשרות \'שכחתי את הסיסמה שלי\' בתזכיר הסיסמה.</string>
|
<string name="startup_failed_db_error">מסיבה כלשהי, מסד נתונים Briar שלך פגום ללא יכולת תיקון. החשבון שלך, הנתונים שלך וכל אנשי הקשר שלך אבדו. למרבה הצער, אתה צריך להתקין מחדש את Briar או להגדיר חשבון חדש ע\"י בחירה באפשרות \'שכחתי את הסיסמה שלי\' בתזכיר הסיסמה.</string>
|
||||||
<string name="startup_failed_data_too_old_error">החשבון שלך נוצר עם גרסה ישנה של יישום זה ואינו יכול להיפתח עם גרסה זו. אתה חייב להתקין מחדש את הגרסה הישנה או להגדיר חשבון חדש ע״י בחירה באפשרות \'שכחתי את הסיסמה שלי\' בתזכיר הסיסמה.</string>
|
<string name="startup_failed_data_too_old_error">החשבון שלך נוצר עם גרסה ישנה של יישום זה ואינו יכול להיפתח עם גרסה זו. אתה חייב להתקין מחדש את הגרסה הישנה או להגדיר חשבון חדש ע\"י בחירה באפשרות \'שכחתי את הסיסמה שלי\' בתזכיר הסיסמה.</string>
|
||||||
<string name="startup_failed_data_too_new_error">גרסה זו של היישום ישנה מדי. אנא שדרג אל הגרסה האחרונה ונסה שוב.</string>
|
<string name="startup_failed_data_too_new_error">גרסה זו של היישום ישנה מדי. אנא שדרג אל הגרסה האחרונה ונסה שוב.</string>
|
||||||
<string name="startup_failed_service_error">Briar לא הצליח להתחיל מתקע דרוש. התקנה מחדש של Briar פותרת בדרך כלל בעיה זו. עם זאת, שים לב שתאבד את חשבונך ואת כל הנתונים המשויכים אליו כי Briar אינו משתמש בשרתים מרכזיים כדי לאחסן עליהם את נתוניך.</string>
|
<string name="startup_failed_service_error">Briar לא הצליח להתחיל מתקע דרוש. התקנה מחדש של Briar פותרת בדרך כלל בעיה זו. עם זאת, שים לב שתאבד את חשבונך ואת כל הנתונים המשויכים אליו כי Briar אינו משתמש בשרתים מרכזיים כדי לאחסן עליהם את נתוניך.</string>
|
||||||
<plurals name="expiry_warning">
|
<plurals name="expiry_warning">
|
||||||
@@ -45,13 +45,14 @@
|
|||||||
<item quantity="many">זאת גרסת בחינה של Briar. חשבונך יפוג תוך %d ימים ואינו יכול להתחדש.</item>
|
<item quantity="many">זאת גרסת בחינה של Briar. חשבונך יפוג תוך %d ימים ואינו יכול להתחדש.</item>
|
||||||
<item quantity="other">זאת גרסת בחינה של Briar. חשבונך יפוג תוך %d ימים ואינו יכול להתחדש.</item>
|
<item quantity="other">זאת גרסת בחינה של Briar. חשבונך יפוג תוך %d ימים ואינו יכול להתחדש.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="expiry_date_reached">תוכנה זו פגה.\nתודה על הבדיקה!</string>
|
<string name="expiry_date_reached">פג תוקפה של תוכנה זו.
|
||||||
|
תודה לכם שבדקתם.</string>
|
||||||
<string name="download_briar">כדי להמשיך להשתמש ב־Briar, אנא הורד את השחרור האחרון.</string>
|
<string name="download_briar">כדי להמשיך להשתמש ב־Briar, אנא הורד את השחרור האחרון.</string>
|
||||||
<string name="create_new_account">תיצטרך ליצור חשבון חדש, אבל אתה יכול להשתמש באותו כינוי.</string>
|
<string name="create_new_account">תיצטרך ליצור חשבון חדש, אבל אתה יכול להשתמש באותו כינוי.</string>
|
||||||
<string name="download_briar_button">הורד שחרור אחרון</string>
|
<string name="download_briar_button">הורד שחרור אחרון</string>
|
||||||
<string name="startup_open_database">מפענח מסד נתונים…</string>
|
<string name="startup_open_database">מפענח מסד נתונים...</string>
|
||||||
<string name="startup_migrate_database">משדרג מסד נתונים…</string>
|
<string name="startup_migrate_database">משדרג מסד נתונים...</string>
|
||||||
<string name="startup_compact_database">מצופף מסד נתונים…</string>
|
<string name="startup_compact_database">מכווץ מסד נתונים...</string>
|
||||||
<!--Navigation Drawer-->
|
<!--Navigation Drawer-->
|
||||||
<string name="nav_drawer_open_description">פתח את מגירת הניווט</string>
|
<string name="nav_drawer_open_description">פתח את מגירת הניווט</string>
|
||||||
<string name="nav_drawer_close_description">סגור את מגירת הניווט</string>
|
<string name="nav_drawer_close_description">סגור את מגירת הניווט</string>
|
||||||
@@ -102,19 +103,20 @@
|
|||||||
<string name="now">עכשיו</string>
|
<string name="now">עכשיו</string>
|
||||||
<string name="show">הראה</string>
|
<string name="show">הראה</string>
|
||||||
<string name="hide">הסתר</string>
|
<string name="hide">הסתר</string>
|
||||||
<string name="ok">אשר</string>
|
<string name="ok">אישור</string>
|
||||||
<string name="cancel">בטל</string>
|
<string name="cancel">בטל</string>
|
||||||
<string name="got_it">הבנתי</string>
|
<string name="got_it">הבנתי</string>
|
||||||
<string name="delete">מחק</string>
|
<string name="delete">מחק</string>
|
||||||
<string name="accept">קבל</string>
|
<string name="accept">קבל</string>
|
||||||
<string name="decline">סרב</string>
|
<string name="decline">סרב</string>
|
||||||
|
<string name="options">אפשרויות</string>
|
||||||
<string name="online">מקוון</string>
|
<string name="online">מקוון</string>
|
||||||
<string name="offline">לא מקוון</string>
|
<string name="offline">מנותק</string>
|
||||||
<string name="send">שלח</string>
|
<string name="send">שלח</string>
|
||||||
<string name="allow">התר</string>
|
<string name="allow">התר</string>
|
||||||
<string name="open">פתח</string>
|
<string name="open">פתח</string>
|
||||||
<string name="no_data">אין נתונים</string>
|
<string name="no_data">אין נתונים</string>
|
||||||
<string name="ellipsis">…</string>
|
<string name="ellipsis">...</string>
|
||||||
<string name="text_too_long">הטקסט המוכנס ארוך מדי</string>
|
<string name="text_too_long">הטקסט המוכנס ארוך מדי</string>
|
||||||
<string name="show_onboarding">הראה דו־שיח עזרה</string>
|
<string name="show_onboarding">הראה דו־שיח עזרה</string>
|
||||||
<string name="fix">תקן</string>
|
<string name="fix">תקן</string>
|
||||||
@@ -130,7 +132,7 @@
|
|||||||
<string name="image_caption_hint">הוסף כיתוב (רשותי)</string>
|
<string name="image_caption_hint">הוסף כיתוב (רשותי)</string>
|
||||||
<string name="image_attach">צרף תמונה</string>
|
<string name="image_attach">צרף תמונה</string>
|
||||||
<string name="image_attach_error">לא היה ניתן לצרף תמונה (או תמונות)</string>
|
<string name="image_attach_error">לא היה ניתן לצרף תמונה (או תמונות)</string>
|
||||||
<string name="image_attach_error_too_big">התמונה גדולה מדי. המגבלה היא %d מ״ב.</string>
|
<string name="image_attach_error_too_big">התמונה גדולה מדי. המגבלה היא %d מ\"ב.</string>
|
||||||
<string name="image_attach_error_invalid_mime_type">תסדיר תמונה בלתי נתמך: %s</string>
|
<string name="image_attach_error_invalid_mime_type">תסדיר תמונה בלתי נתמך: %s</string>
|
||||||
<string name="set_contact_alias">שַׁנֵּה שם איש קשר</string>
|
<string name="set_contact_alias">שַׁנֵּה שם איש קשר</string>
|
||||||
<string name="set_contact_alias_hint">שם איש הקשר</string>
|
<string name="set_contact_alias_hint">שם איש הקשר</string>
|
||||||
@@ -164,13 +166,15 @@
|
|||||||
<string name="messaging_too_many_attachments_toast">רק %d התמונות הראשונות יישלחו</string>
|
<string name="messaging_too_many_attachments_toast">רק %d התמונות הראשונות יישלחו</string>
|
||||||
<!--Adding Contacts-->
|
<!--Adding Contacts-->
|
||||||
<string name="add_contact_title">הוסף איש קשר בקרבה</string>
|
<string name="add_contact_title">הוסף איש קשר בקרבה</string>
|
||||||
<string name="face_to_face">אתה חייב להיפגש עם האדם שאותו אתה רוצה להוסיף כאיש קשר.\n\nזה ימנע מכל אחד להתחזות אליך או לקרוא את ההודעות שלך בעתיד.</string>
|
<string name="face_to_face">אתם חייבים להפגש עם האדם שאותו תרצו להוסיף כאיש קשר.
|
||||||
|
|
||||||
|
זאת על מנת למנוע מצב שבו מתחזים אליכם או קוראים הודעות שלכם בעתיד.</string>
|
||||||
<string name="continue_button">המשך</string>
|
<string name="continue_button">המשך</string>
|
||||||
<string name="try_again_button">נסה שוב</string>
|
<string name="try_again_button">נסה שוב</string>
|
||||||
<string name="waiting_for_contact_to_scan">ממתין שאיש הקשר יסרוק ויתחבר\u2026</string>
|
<string name="waiting_for_contact_to_scan">ממתין שאיש הקשר יסרוק ויתחבר\u2026</string>
|
||||||
<string name="exchanging_contact_details">מחליף פרטי איש קשר\u2026</string>
|
<string name="exchanging_contact_details">מחליף פרטים של איש קשר\u2026</string>
|
||||||
<string name="contact_added_toast">איש קשר התווסף: %s</string>
|
<string name="contact_added_toast">איש קשר התווסף: %s</string>
|
||||||
<string name="contact_already_exists">איש הקשר %s קיים כבר</string>
|
<string name="contact_already_exists">איש קשר %s קיים כבר</string>
|
||||||
<string name="qr_code_invalid">קוד ה־QR אינו תקף</string>
|
<string name="qr_code_invalid">קוד ה־QR אינו תקף</string>
|
||||||
<string name="qr_code_too_old">קוד ה־QR שסרקת מגיע מגרסה ישנה יותר של %s.\n\nאנא בקש מאיש הקשר שלך לשדרג את הגרסה האחרונה ואז נסה שוב.</string>
|
<string name="qr_code_too_old">קוד ה־QR שסרקת מגיע מגרסה ישנה יותר של %s.\n\nאנא בקש מאיש הקשר שלך לשדרג את הגרסה האחרונה ואז נסה שוב.</string>
|
||||||
<string name="qr_code_too_new">קוד ה־QR שסרקת מגיע מגרסה חדשה יותר של %s.\n\nאנא שדרג אל הגרסה האחרונה ואז נסה שוב.</string>
|
<string name="qr_code_too_new">קוד ה־QR שסרקת מגיע מגרסה חדשה יותר של %s.\n\nאנא שדרג אל הגרסה האחרונה ואז נסה שוב.</string>
|
||||||
@@ -184,6 +188,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">הוסף איש קשר בקרבה</string>
|
<string name="add_contact_remotely_title_case">הוסף איש קשר בקרבה</string>
|
||||||
<string name="add_contact_nearby_title">הוסף איש קשר בקרבה</string>
|
<string name="add_contact_nearby_title">הוסף איש קשר בקרבה</string>
|
||||||
<string name="add_contact_remotely_title">הוסף איש קשר במרחק</string>
|
<string name="add_contact_remotely_title">הוסף איש קשר במרחק</string>
|
||||||
|
<string name="contact_name_hint">תן כינוי אל איש קשר</string>
|
||||||
<string name="contact_link_intro">הכנס את הקישור מאיש הקשר שלך כאן</string>
|
<string name="contact_link_intro">הכנס את הקישור מאיש הקשר שלך כאן</string>
|
||||||
<string name="contact_link_hint">קישור של איש קשר</string>
|
<string name="contact_link_hint">קישור של איש קשר</string>
|
||||||
<string name="paste_button">הדבק</string>
|
<string name="paste_button">הדבק</string>
|
||||||
@@ -201,9 +206,10 @@
|
|||||||
<string name="pending_contact_requests_snackbar">יש בקשות ממתינות של אנשי קשר</string>
|
<string name="pending_contact_requests_snackbar">יש בקשות ממתינות של אנשי קשר</string>
|
||||||
<string name="pending_contact_requests">בקשות ממתינות של אנשי קשר</string>
|
<string name="pending_contact_requests">בקשות ממתינות של אנשי קשר</string>
|
||||||
<string name="no_pending_contacts">אין בקשות ממתינות של אנשי קשר</string>
|
<string name="no_pending_contacts">אין בקשות ממתינות של אנשי קשר</string>
|
||||||
<string name="waiting_for_contact_to_come_online">ממתין אל איש הקשר שיהיה מקוון…</string>
|
<string name="add_contact_remote_connecting">מתחבר...</string>
|
||||||
<string name="connecting">מתחבר…</string>
|
<string name="waiting_for_contact_to_come_online">ממתין אל איש הקשר שיהיה מקוון...</string>
|
||||||
<string name="adding_contact">מוסיף איש קשר…</string>
|
<string name="connecting">מתחבר...</string>
|
||||||
|
<string name="adding_contact">מוסיף איש קשר...</string>
|
||||||
<string name="adding_contact_failed">הוספת איש קשר נכשלה</string>
|
<string name="adding_contact_failed">הוספת איש קשר נכשלה</string>
|
||||||
<string name="dialog_title_remove_pending_contact">אשר הסרה</string>
|
<string name="dialog_title_remove_pending_contact">אשר הסרה</string>
|
||||||
<string name="dialog_message_remove_pending_contact">איש קשר זה מתווסף. אם תסיר אותו כעת, הוא לא יתווסף.</string>
|
<string name="dialog_message_remove_pending_contact">איש קשר זה מתווסף. אם תסיר אותו כעת, הוא לא יתווסף.</string>
|
||||||
@@ -223,6 +229,9 @@
|
|||||||
<item quantity="many">%dאנשי קשר חדשים התווספו. </item>
|
<item quantity="many">%dאנשי קשר חדשים התווספו. </item>
|
||||||
<item quantity="other">%d אנשי קשר חדשים התווספו.</item>
|
<item quantity="other">%d אנשי קשר חדשים התווספו.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">הוספת איש קשר זה לוקחת מעבר לזמן הרגיל</string>
|
||||||
|
<string name="adding_contact_slow_title">לא ניתן להתחבר אל איש קשר</string>
|
||||||
|
<string name="adding_contact_slow_text">הוספת איש קשר זה לוקחת מעבר לזמן הרגיל.\n\nאנא בדוק שאיש הקשר שלך קיבל את הקישור שלך ושהוא הוסיף אותך:</string>
|
||||||
<string name="offline_state">אין חיבור אינטרנט</string>
|
<string name="offline_state">אין חיבור אינטרנט</string>
|
||||||
<string name="duplicate_link_dialog_title">קישור כפול</string>
|
<string name="duplicate_link_dialog_title">קישור כפול</string>
|
||||||
<string name="duplicate_link_dialog_text_1">יש לך כבר איש קשר ממתין עם קישור זה: %s</string>
|
<string name="duplicate_link_dialog_text_1">יש לך כבר איש קשר ממתין עם קישור זה: %s</string>
|
||||||
@@ -240,26 +249,27 @@
|
|||||||
<string name="duplicate_link_dialog_text_3">%s ו־%s שלחו לך את אותו הקישור.\n\nייתכן שאחד מהם מנסה לגלות מי הם אנשי הקשר שלך.\n\nאל תגיד לו שקיבלת את אותו הקישור ממישהו אחר.</string>
|
<string name="duplicate_link_dialog_text_3">%s ו־%s שלחו לך את אותו הקישור.\n\nייתכן שאחד מהם מנסה לגלות מי הם אנשי הקשר שלך.\n\nאל תגיד לו שקיבלת את אותו הקישור ממישהו אחר.</string>
|
||||||
<string name="pending_contact_updated_toast">איש קשר ממתין עודכן</string>
|
<string name="pending_contact_updated_toast">איש קשר ממתין עודכן</string>
|
||||||
<!--Introductions-->
|
<!--Introductions-->
|
||||||
<string name="introduction_onboarding_title">הכר בין אנשי הקשר שלך</string>
|
<string name="introduction_onboarding_title">הציגו את אנשי קשר שלכם</string>
|
||||||
<string name="introduction_onboarding_text">אתה יכול להכיר בין אנשי הקשר שלך אחד עם השני, כך שהם לא צריכים להיפגש פנים מול פנים כדי להתחבר ב־Briar.</string>
|
<string name="introduction_onboarding_text">אתם יכולים להציג את אנשי הקשר שלכם אחד לשני, כך שהם לא צריכים להפגש פנים-מול-פנים על מנת להתחבר בבריאר.</string>
|
||||||
<string name="introduction_menu_item">בצע היכרות</string>
|
<string name="introduction_menu_item">הציגו איש קשר</string>
|
||||||
<string name="introduction_activity_title">בחר איש קשר</string>
|
<string name="introduction_activity_title">בחר איש קשר</string>
|
||||||
<string name="introduction_not_possible">יש לך כבר היכרות אחת בתהליך עם אנשי קשר אלו. אנא התר לה תחילה לסיים. אם אתה או אנשי הקשר שלך לעיתים נדירות מקוונים, זה עשוי לקחת זמן מה.</string>
|
<string name="introduction_not_possible">יש לך כבר היכרות אחת בתהליך עם אנשי קשר אלו. אנא התר לה תחילה לסיים. אם אתה או אנשי הקשר שלך לעיתים נדירות מקוונים, זה עשוי לקחת זמן מה.</string>
|
||||||
<string name="introduction_message_title">הכר בין אנשי קשר</string>
|
<string name="introduction_message_title">הציגו אנשי קשר</string>
|
||||||
<string name="introduction_message_hint">הוסף הודעה (רשותי)</string>
|
<string name="introduction_message_hint">הוסף הודעה (רשותי)</string>
|
||||||
<string name="introduction_button">בצע היכרות</string>
|
<string name="introduction_button">הציגו איש קשר</string>
|
||||||
<string name="introduction_sent">ההיכרות שלך נשלחה.</string>
|
<string name="introduction_sent">הצגת איש קשר נשלחה.</string>
|
||||||
<string name="introduction_error">הייתה שגיאה בעת ביצוע ההיכרות.</string>
|
<string name="introduction_error">הייתה שגיאה בעת הצגת איש קשר.</string>
|
||||||
<string name="introduction_request_sent">ביקשת להכיר את %1$s בפני %2$s.</string>
|
<string name="introduction_response_error">שגיאה בעת התגובה להצגת איש קשר</string>
|
||||||
<string name="introduction_request_received">%1$s ביקש להכיר אותך בפני %2$s. האם אתה רוצה להוסיף את %2$s אל רשימת אנשי הקשר שלך?</string>
|
<string name="introduction_request_sent">ביקשתם להציג את %1$s ל- %2$s.</string>
|
||||||
<string name="introduction_request_exists_received">%1$s ביקש להכיר אותך בפני %2$s, אבל %2$s כבר ברשימת אנשי הקשר שלך. מאחר ש%1$s כנראה לא יודע זאת, אתה עדיין יכול להגיב:</string>
|
<string name="introduction_request_received">%1$s ביקש להציג אתכם ל- %2$s. האם תרצו להוסיף את %2$s לאנשי הקשר שלכם?</string>
|
||||||
<string name="introduction_request_answered_received">%1$s ביקש להכיר אותך בפני %2$s.</string>
|
<string name="introduction_request_exists_received">%1$s ביקשו להציג אתכם ל- %2$s, אבל %2$s עדיין ברשימת אנשי הקשר שלכם. מכיוון ש- %1$s עשוי לא לדעת זאת, אתם עדיין מוזמנים להגיב:</string>
|
||||||
<string name="introduction_response_accepted_sent">הסכמת אל ההיכרות בפני %1$s.</string>
|
<string name="introduction_request_answered_received">%1$s ביקשו להציג אתכם בפני %2$s.</string>
|
||||||
|
<string name="introduction_response_accepted_sent">הסכמתם להיות מוצגים בפני %1$s.</string>
|
||||||
<string name="introduction_response_accepted_sent_info">בטרם %1$s יוכל להתווסף אל אנשי הקשר שלך, הוא צריך לקבל את ההיכרות בנוסף. זה עשוי לקחת זמן מה.</string>
|
<string name="introduction_response_accepted_sent_info">בטרם %1$s יוכל להתווסף אל אנשי הקשר שלך, הוא צריך לקבל את ההיכרות בנוסף. זה עשוי לקחת זמן מה.</string>
|
||||||
<string name="introduction_response_declined_sent">סירבת אל ההיכרות בפני %1$s.</string>
|
<string name="introduction_response_declined_sent">סירבתם להיות מוצגים בפני %1$s.</string>
|
||||||
<string name="introduction_response_accepted_received">%1$s הסכים אל ההיכרות בפני %2$s.</string>
|
<string name="introduction_response_accepted_received">%1$s הסכימו להיות מוצגים בפני %2$s.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s סירב אל ההיכרות בפני %2$s.</string>
|
<string name="introduction_response_declined_received">%1$s סירבו להיות מוצגים בפני %2$s.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s אומר כי %2$s סירב אל ההיכרות.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s אומרים ש- %2$s סירבו להיות מוצגים בפניהם.</string>
|
||||||
<!--Private Groups-->
|
<!--Private Groups-->
|
||||||
<string name="groups_list_empty">אין קבוצות להראות</string>
|
<string name="groups_list_empty">אין קבוצות להראות</string>
|
||||||
<string name="groups_list_empty_action">הקש על הצלמית + כדי ליצור קבוצה, או בקש מאנשי הקשר שלך לשתף איתך קבוצות</string>
|
<string name="groups_list_empty_action">הקש על הצלמית + כדי ליצור קבוצה, או בקש מאנשי הקשר שלך לשתף איתך קבוצות</string>
|
||||||
@@ -271,12 +281,12 @@
|
|||||||
<item quantity="other">%d הודעות</item>
|
<item quantity="other">%d הודעות</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="groups_group_is_empty">קבוצה זו ריקה</string>
|
<string name="groups_group_is_empty">קבוצה זו ריקה</string>
|
||||||
<string name="groups_group_is_dissolved">קבוצה זו פורקה</string>
|
<string name="groups_group_is_dissolved">קבוצה זו התפזרה</string>
|
||||||
<string name="groups_remove">הסר</string>
|
<string name="groups_remove">הסר</string>
|
||||||
<string name="groups_create_group_title">צור קבוצה פרטית</string>
|
<string name="groups_create_group_title">צור קבוצה פרטית</string>
|
||||||
<string name="groups_create_group_button">צור קבוצה</string>
|
<string name="groups_create_group_button">צור קבוצה</string>
|
||||||
<string name="groups_create_group_invitation_button">שלח הזמנה</string>
|
<string name="groups_create_group_invitation_button">שלח הזמנה</string>
|
||||||
<string name="groups_create_group_hint">בחר שם לקבוצה הפרטית שלך</string>
|
<string name="groups_create_group_hint">בחרו שם לקבוצה הפרטית שלכם</string>
|
||||||
<string name="groups_invitation_sent">הזמנה קבוצתית נשלחה</string>
|
<string name="groups_invitation_sent">הזמנה קבוצתית נשלחה</string>
|
||||||
<string name="groups_member_list">רשימת חברי קבוצה</string>
|
<string name="groups_member_list">רשימת חברי קבוצה</string>
|
||||||
<string name="groups_invite_members">הזמן חברי קבוצה</string>
|
<string name="groups_invite_members">הזמן חברי קבוצה</string>
|
||||||
@@ -287,18 +297,22 @@
|
|||||||
<string name="groups_leave">עזוב קבוצה</string>
|
<string name="groups_leave">עזוב קבוצה</string>
|
||||||
<string name="groups_leave_dialog_title">אשר עזיבת קבוצה</string>
|
<string name="groups_leave_dialog_title">אשר עזיבת קבוצה</string>
|
||||||
<string name="groups_leave_dialog_message">האם אתה בטוח שאתה רוצה לעזוב קבוצה זו?</string>
|
<string name="groups_leave_dialog_message">האם אתה בטוח שאתה רוצה לעזוב קבוצה זו?</string>
|
||||||
<string name="groups_dissolve">פרק קבוצה</string>
|
<string name="groups_dissolve">פזר קבוצה</string>
|
||||||
<string name="groups_dissolve_dialog_title">אשר פירוק קבוצה</string>
|
<string name="groups_dissolve_dialog_title">אשר פיזור קבוצה</string>
|
||||||
<string name="groups_dissolve_dialog_message">האם אתה בטוח שאתה רוצה לפרק את הקבוצה הזאתו?\n\nכל חברי הקבוצה האחרים לא יוכלו להמשיך בשיחתם וכנראה לא יקבלו את ההודעות האחרונות.</string>
|
<string name="groups_dissolve_dialog_message">האם אתם בטוחים שתרצו לפזר את הקבוצה?
|
||||||
<string name="groups_dissolve_button">פרק</string>
|
|
||||||
<string name="groups_dissolved_dialog_title">הקבוצה פורקה</string>
|
כל המשתתפים לא יוכלו להמשיך את השיחה ועלולים לא לקבל את ההודעות האחרונות.</string>
|
||||||
<string name="groups_dissolved_dialog_message">היוצר של הקבוצה הזאת פירק אותה.\n\nאתה לא יכול עוד לכתוב הודעות אל הקבוצה וכנראה שלא תקבל את כל הרשומות שנכתבו.</string>
|
<string name="groups_dissolve_button">פיזור</string>
|
||||||
|
<string name="groups_dissolved_dialog_title">הקבוצה פוזרה</string>
|
||||||
|
<string name="groups_dissolved_dialog_message">יוצר הקבוצה פיזר אותה.
|
||||||
|
|
||||||
|
לא תוכלו יותר לכתוב הודעות לקבוצה ואולי אף לא תקבלו את כל ההודעות שנכתבו.</string>
|
||||||
<!--Private Group Invitations-->
|
<!--Private Group Invitations-->
|
||||||
<string name="groups_invitations_title">הזמנות לקבוצה</string>
|
<string name="groups_invitations_title">הזמנות לקבוצה</string>
|
||||||
<string name="groups_invitations_invitation_sent">הזמנת את %1$s להצטרף אל הקבוצה \"%2$s\".</string>
|
<string name="groups_invitations_invitation_sent">הזמנתם את %1$s להצטרף לקבוצה \"%2$s\".</string>
|
||||||
<string name="groups_invitations_invitation_received">%1$s הזמין אותך להצטרף אל הקבוצה \"%2$s\".</string>
|
<string name="groups_invitations_invitation_received">%1$s הזמינו אתכם להצטרף לקבוצה \"%2$s\".</string>
|
||||||
<string name="groups_invitations_joined">הצטרף אל קבוצה</string>
|
<string name="groups_invitations_joined">הצטרף אל קבוצה</string>
|
||||||
<string name="groups_invitations_declined">הזמנה קבוצתית סורבה</string>
|
<string name="groups_invitations_declined">הזמנה קבוצתית נדחתה</string>
|
||||||
<plurals name="groups_invitations_open">
|
<plurals name="groups_invitations_open">
|
||||||
<item quantity="one">הזמנה קבוצתית פתוחה %d</item>
|
<item quantity="one">הזמנה קבוצתית פתוחה %d</item>
|
||||||
<item quantity="two">%d הזמנות קבוצתיות פתוחות</item>
|
<item quantity="two">%d הזמנות קבוצתיות פתוחות</item>
|
||||||
@@ -309,16 +323,16 @@
|
|||||||
<string name="groups_invitations_response_declined_sent">סירבת אל ההזמנה הקבוצתית מאת %s.</string>
|
<string name="groups_invitations_response_declined_sent">סירבת אל ההזמנה הקבוצתית מאת %s.</string>
|
||||||
<string name="groups_invitations_response_accepted_received">%s הסכים אל ההזמנה הקבוצתית.</string>
|
<string name="groups_invitations_response_accepted_received">%s הסכים אל ההזמנה הקבוצתית.</string>
|
||||||
<string name="groups_invitations_response_declined_received">%s סירב אל ההזמנה הקבוצתית.</string>
|
<string name="groups_invitations_response_declined_received">%s סירב אל ההזמנה הקבוצתית.</string>
|
||||||
<string name="sharing_status_groups">רק היוצר יכול להזמין חברי קבוצה חדשים אל הקבוצה. להלן כל חברי הקבוצה הנוכחיים.</string>
|
<string name="sharing_status_groups">רק היוצר יכול להזמין משתתפים חדשים לקבוצה. להלן כל המשתתפים הנוכחיים של הקבוצה.</string>
|
||||||
<!--Private Groups Revealing Contacts-->
|
<!--Private Groups Revealing Contacts-->
|
||||||
<string name="groups_reveal_contacts">חשוף אנשי קשר</string>
|
<string name="groups_reveal_contacts">חשוף אנשי קשר</string>
|
||||||
<string name="groups_reveal_dialog_message">אתם יכולים לבחור אם לחשוף את אנשי הקשר שלכם למשתתפים הנוכחיים והעתידיים של קבוצה זו.
|
<string name="groups_reveal_dialog_message">אתם יכולים לבחור אם לחשוף את אנשי הקשר שלכם למשתתפים הנוכחיים והעתידיים של קבוצה זו.
|
||||||
|
|
||||||
חשיפת אנשי הקשר תגרום לחיבור עם הקבוצה להיות מהיר ואמין יותר, כי תוכלו לתקשר עם אנשי הקשר שנחשפו גם אם יוצר הקבוצה אינו מחובר.</string>
|
חשיפת אנשי הקשר תגרום לחיבור עם הקבוצה להיות מהיר ואמין יותר, כי תוכלו לתקשר עם אנשי הקשר שנחשפו גם אם יוצר הקבוצה אינו מחובר.</string>
|
||||||
<string name="groups_reveal_visible">יחסים עם אנשי קשר גלויים לקבוצה</string>
|
<string name="groups_reveal_visible">היחסים עם האיש קשר גלויים לקבוצה</string>
|
||||||
<string name="groups_reveal_visible_revealed_by_us">יחסים עם אנשי קשר גלויים לקבוצה (נחשפים על ידך)</string>
|
<string name="groups_reveal_visible_revealed_by_us">היחסים עם האיש קשר גלויים לקבוצה (נחשפו על ידיכם)</string>
|
||||||
<string name="groups_reveal_visible_revealed_by_contact">יחסים עם אנשי קשר גלויים לקבוצה (נחשפים על ידי %s)</string>
|
<string name="groups_reveal_visible_revealed_by_contact">היחסים עם האיש קשר גלויים לקבוצה (נחשפו על %s)</string>
|
||||||
<string name="groups_reveal_invisible">יחסים עם אנשי קשר אינם גלויים לקבוצה</string>
|
<string name="groups_reveal_invisible">היחסים עם האיש קשר אינם גלויים לקבוצה</string>
|
||||||
<!--Forums-->
|
<!--Forums-->
|
||||||
<string name="no_forums">אין פורומים להראות</string>
|
<string name="no_forums">אין פורומים להראות</string>
|
||||||
<string name="no_forums_action">הקש על הצלמית + כדי ליצור פורום, או בקש מאנשי הקשר שלך לשתף איתך פורומים</string>
|
<string name="no_forums_action">הקש על הצלמית + כדי ליצור פורום, או בקש מאנשי הקשר שלך לשתף איתך פורומים</string>
|
||||||
@@ -367,10 +381,10 @@
|
|||||||
<string name="sharing_status_forum">כל חבר פורום יכול לשתף את הפורום עם אנשי הקשר שלו. אתה משתף פורום זה עם אנשי הקשר הבאים. יתכן שיש חברי פורום אחרים שאינך יכול לראות.</string>
|
<string name="sharing_status_forum">כל חבר פורום יכול לשתף את הפורום עם אנשי הקשר שלו. אתה משתף פורום זה עם אנשי הקשר הבאים. יתכן שיש חברי פורום אחרים שאינך יכול לראות.</string>
|
||||||
<string name="shared_with">משותף עם %1$d (%2$d מקוונים)</string>
|
<string name="shared_with">משותף עם %1$d (%2$d מקוונים)</string>
|
||||||
<plurals name="forums_shared">
|
<plurals name="forums_shared">
|
||||||
<item quantity="one">פורום %d משותף ע״י אנשי קשר</item>
|
<item quantity="one">פורום %d משותף ע\"י אנשי קשר</item>
|
||||||
<item quantity="two">%d פורומים משותפים ע״י אנשי קשר</item>
|
<item quantity="two">%d פורומים משותפים ע\"י אנשי קשר</item>
|
||||||
<item quantity="many">%d פורומים משותפים ע״י אנשי קשר</item>
|
<item quantity="many">%d פורומים משותפים ע\"י אנשי קשר</item>
|
||||||
<item quantity="other">%d פורומים משותפים ע״י אנשי קשר</item>
|
<item quantity="other">%d פורומים משותפים ע\"י אנשי קשר</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="nobody">אף אחד</string>
|
<string name="nobody">אף אחד</string>
|
||||||
<!--Blogs-->
|
<!--Blogs-->
|
||||||
@@ -431,12 +445,21 @@
|
|||||||
<string name="pref_theme_light">בהיר</string>
|
<string name="pref_theme_light">בהיר</string>
|
||||||
<string name="pref_theme_dark">כהה</string>
|
<string name="pref_theme_dark">כהה</string>
|
||||||
<string name="pref_theme_auto">אוטומטי (שעות יום)</string>
|
<string name="pref_theme_auto">אוטומטי (שעות יום)</string>
|
||||||
<string name="pref_theme_system">ברירת מחדל</string>
|
<string name="pref_theme_system">ברירת מחדל של מערכת</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">רשתות</string>
|
||||||
|
<string name="bluetooth_setting">התחבר באמצעות שן כחולה</string>
|
||||||
|
<string name="bluetooth_setting_enabled">כאשר אנשי קשר בקרבה</string>
|
||||||
|
<string name="bluetooth_setting_disabled">רק בעת הוספת אנשי קשר</string>
|
||||||
|
<string name="tor_network_setting">התחבר באמצעות אינטרנט (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">אוטומטי על סמך מיקום</string>
|
<string name="tor_network_setting_automatic">אוטומטי על סמך מיקום</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">השתמש ב־Tor בלי גשרים</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">השתמש ב־Tor עם גשרים</string>
|
||||||
|
<string name="tor_network_setting_never">אל תתחבר</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">אוטומטי: %1$s (תוך %2$s)</string>
|
<string name="tor_network_setting_summary">אוטומטי: %1$s (תוך %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">השתמש בנתונים סלולריים</string>
|
<string name="tor_mobile_data_title">השתמש בנתונים סלולריים</string>
|
||||||
|
<string name="tor_only_when_charging_title">התחבר דרך אינטרנט (Tor) רק בעת טעינה</string>
|
||||||
<string name="tor_only_when_charging_summary">משבית חיבור אינטרנט כשהמכשיר עובד על סוללה</string>
|
<string name="tor_only_when_charging_summary">משבית חיבור אינטרנט כשהמכשיר עובד על סוללה</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">אבטחה</string>
|
<string name="security_settings_title">אבטחה</string>
|
||||||
@@ -468,7 +491,7 @@
|
|||||||
<string name="panic_setting_hint">קבע כיצד Briar יגיב כשתשתמש ביישום כפתור בהלה</string>
|
<string name="panic_setting_hint">קבע כיצד Briar יגיב כשתשתמש ביישום כפתור בהלה</string>
|
||||||
<string name="panic_app_setting_title">יישום כפתור בהלה</string>
|
<string name="panic_app_setting_title">יישום כפתור בהלה</string>
|
||||||
<string name="unknown_app">יישום בלתי ידוע</string>
|
<string name="unknown_app">יישום בלתי ידוע</string>
|
||||||
<string name="panic_app_setting_summary">יישום לא הוגדר</string>
|
<string name="panic_app_setting_summary">לא הוגדר יישום</string>
|
||||||
<string name="panic_app_setting_none">כלום</string>
|
<string name="panic_app_setting_none">כלום</string>
|
||||||
<string name="dialog_title_connect_panic_app">אשר יישום בהלה</string>
|
<string name="dialog_title_connect_panic_app">אשר יישום בהלה</string>
|
||||||
<string name="dialog_message_connect_panic_app">האם אתה בטוח שאתה רוצה להתיר אל %1$s לעורר פעולות הרסניות של כפתור בהלה?</string>
|
<string name="dialog_message_connect_panic_app">האם אתה בטוח שאתה רוצה להתיר אל %1$s לעורר פעולות הרסניות של כפתור בהלה?</string>
|
||||||
@@ -477,6 +500,8 @@
|
|||||||
<string name="panic_setting_signout_summary">התנתק מן Briar אם כפתור בהלה נלחץ</string>
|
<string name="panic_setting_signout_summary">התנתק מן Briar אם כפתור בהלה נלחץ</string>
|
||||||
<string name="purge_setting_title">מחק חשבון</string>
|
<string name="purge_setting_title">מחק חשבון</string>
|
||||||
<string name="purge_setting_summary">מחק את חשבון Briar שלך אם כפתור בהלה נלחץ. זהירות: זה ימחק לצמיתות את הזהויות, אנשי הקשר וההודעות שלך</string>
|
<string name="purge_setting_summary">מחק את חשבון Briar שלך אם כפתור בהלה נלחץ. זהירות: זה ימחק לצמיתות את הזהויות, אנשי הקשר וההודעות שלך</string>
|
||||||
|
<string name="uninstall_setting_title">הסר את Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">זה דורש אישור ידני באירוע בהלה</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">התראות</string>
|
<string name="notification_settings_title">התראות</string>
|
||||||
<string name="notify_sign_in_title">הזכר לי להתחבר</string>
|
<string name="notify_sign_in_title">הזכר לי להתחבר</string>
|
||||||
@@ -508,23 +533,23 @@
|
|||||||
<string name="link_warning_text">זה יכול לשמש כדי לזהות אותך. חשוב על האם אתה בוטח באיש ששלח לך קישור זה ושקול לפתוח את הקישור עם דפדפן Tor.</string>
|
<string name="link_warning_text">זה יכול לשמש כדי לזהות אותך. חשוב על האם אתה בוטח באיש ששלח לך קישור זה ושקול לפתוח את הקישור עם דפדפן Tor.</string>
|
||||||
<string name="link_warning_open_link">פתח קישור</string>
|
<string name="link_warning_open_link">פתח קישור</string>
|
||||||
<!--Crash Reporter-->
|
<!--Crash Reporter-->
|
||||||
<string name="crash_report_title">דוח קריסת Briar</string>
|
<string name="crash_report_title">דיווח על קריסת Briar</string>
|
||||||
<string name="briar_crashed">סליחה, Briar קרס.</string>
|
<string name="briar_crashed">סליחה, Briar קרס.</string>
|
||||||
<string name="not_your_fault">זאת לא אשמתך.</string>
|
<string name="not_your_fault">זאת לא אשמתך.</string>
|
||||||
<string name="please_send_report">אנא עזור לנו לבנות Briar טוב יותר ע״י שליחת דוח קריסה אלינו.</string>
|
<string name="please_send_report">אנא עזור לנו לבנות Briar טוב יותר ע\"י שליחת דוח קריסה אלינו.</string>
|
||||||
<string name="report_is_encrypted">אנו מבטיחים שהדוח הזה מוצפן ונשלח באופן מאובטח.</string>
|
<string name="report_is_encrypted">אנו מבטיחים שהדוח הזה מוצפן ונשלח באופן מאובטח.</string>
|
||||||
<string name="feedback_title">משוב</string>
|
<string name="feedback_title">משוב</string>
|
||||||
<string name="describe_crash">תאר מה קרה (רשותי)</string>
|
<string name="describe_crash">תאר מה קרה (רשותי)</string>
|
||||||
<string name="enter_feedback">הכנס את משובך</string>
|
<string name="enter_feedback">הכנס את משובך</string>
|
||||||
<string name="optional_contact_email">כתובת הדוא״ל שלך (רשותי)</string>
|
<string name="optional_contact_email">כתובת הדוא\"ל שלך (רשותי)</string>
|
||||||
<string name="include_debug_report_crash">כלול נתונים אלמוניים לגבי הקריסה</string>
|
<string name="include_debug_report_crash">כלול נתונים אלמוניים לגבי הקריסה</string>
|
||||||
<string name="include_debug_report_feedback">כלול נתונים אלמוניים לגבי מכשיר זה</string>
|
<string name="include_debug_report_feedback">כלול נתונים אלמוניים לגבי מכשיר זה</string>
|
||||||
<string name="could_not_load_report_data">לא היה ניתן לטעון נתוני דוח.</string>
|
<string name="could_not_load_report_data">לא היה ניתן לטעון נתוני דיווח.</string>
|
||||||
<string name="send_report">שלח דוח</string>
|
<string name="send_report">שלח דיווח</string>
|
||||||
<string name="close">סגור</string>
|
<string name="close">סגור</string>
|
||||||
<string name="dev_report_saved">הדוח נשמר. הוא יישלח בפעם הבאה שתתחבר אל Briar.</string>
|
<string name="dev_report_saved">הדוח נשמר. הוא יישלח בפעם הבאה שתתחבר אל Briar.</string>
|
||||||
<!--Sign Out-->
|
<!--Sign Out-->
|
||||||
<string name="progress_title_logout">מתנתק מן Briar…</string>
|
<string name="progress_title_logout">מתנתק מן Briar...</string>
|
||||||
<!--Screen Filters & Tapjacking-->
|
<!--Screen Filters & Tapjacking-->
|
||||||
<string name="screen_filter_title">ציפוי מסך התגלה</string>
|
<string name="screen_filter_title">ציפוי מסך התגלה</string>
|
||||||
<string name="screen_filter_body">יישום אחר מציירת מעל Briar. כדי להגן על אבטחתך, Briar לא יגיב לנגיעות כאשר יישום אחר מצייר מעל.\n\nהיישומים הבאים יכולים לצייר מעל:\n\n%1$s</string>
|
<string name="screen_filter_body">יישום אחר מציירת מעל Briar. כדי להגן על אבטחתך, Briar לא יגיב לנגיעות כאשר יישום אחר מצייר מעל.\n\nהיישומים הבאים יכולים לצייר מעל:\n\n%1$s</string>
|
||||||
|
|||||||
@@ -94,6 +94,7 @@
|
|||||||
<string name="delete">हटाना</string>
|
<string name="delete">हटाना</string>
|
||||||
<string name="accept">स्वीकारें</string>
|
<string name="accept">स्वीकारें</string>
|
||||||
<string name="decline">पतन</string>
|
<string name="decline">पतन</string>
|
||||||
|
<string name="options">विकल्प</string>
|
||||||
<string name="online">ऑनलाइन</string>
|
<string name="online">ऑनलाइन</string>
|
||||||
<string name="offline">ऑफलाइन</string>
|
<string name="offline">ऑफलाइन</string>
|
||||||
<string name="send">भेजना</string>
|
<string name="send">भेजना</string>
|
||||||
@@ -157,6 +158,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">दूरी वाले संपर्क जोड़ें</string>
|
<string name="add_contact_remotely_title_case">दूरी वाले संपर्क जोड़ें</string>
|
||||||
<string name="add_contact_nearby_title">आस-पास वाले संपर्क जोड़ें</string>
|
<string name="add_contact_nearby_title">आस-पास वाले संपर्क जोड़ें</string>
|
||||||
<string name="add_contact_remotely_title">दूरी वाले संपर्क जोड़ें</string>
|
<string name="add_contact_remotely_title">दूरी वाले संपर्क जोड़ें</string>
|
||||||
|
<string name="contact_name_hint">संपर्क को एक उपनाम दें</string>
|
||||||
<string name="contact_link_intro">यहां अपने संपर्क से लिंक दर्ज करें</string>
|
<string name="contact_link_intro">यहां अपने संपर्क से लिंक दर्ज करें</string>
|
||||||
<string name="contact_link_hint">संपर्क का लिंक</string>
|
<string name="contact_link_hint">संपर्क का लिंक</string>
|
||||||
<string name="paste_button">चिपकाएं</string>
|
<string name="paste_button">चिपकाएं</string>
|
||||||
@@ -174,6 +176,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">संपर्क अनुरोध लंबित हैं</string>
|
<string name="pending_contact_requests_snackbar">संपर्क अनुरोध लंबित हैं</string>
|
||||||
<string name="pending_contact_requests">लंबित संपर्क अनुरोध</string>
|
<string name="pending_contact_requests">लंबित संपर्क अनुरोध</string>
|
||||||
<string name="no_pending_contacts">कोई लंबित संपर्क नहीं</string>
|
<string name="no_pending_contacts">कोई लंबित संपर्क नहीं</string>
|
||||||
|
<string name="add_contact_remote_connecting">कनेक्ट हो रहा है ...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">संपर्क की ऑनलाइन आने की प्रतीक्षा की जा रही है...</string>
|
<string name="waiting_for_contact_to_come_online">संपर्क की ऑनलाइन आने की प्रतीक्षा की जा रही है...</string>
|
||||||
<string name="connecting">कनेक्ट हो रहा है ...</string>
|
<string name="connecting">कनेक्ट हो रहा है ...</string>
|
||||||
<string name="adding_contact">संपर्क जोड़ रहा है ...</string>
|
<string name="adding_contact">संपर्क जोड़ रहा है ...</string>
|
||||||
@@ -194,6 +197,9 @@
|
|||||||
<item quantity="one">नया संपर्क जोड़ा गया|</item>
|
<item quantity="one">नया संपर्क जोड़ा गया|</item>
|
||||||
<item quantity="other">%d नए संपर्क जोड़े गए</item>
|
<item quantity="other">%d नए संपर्क जोड़े गए</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">इस संपर्क को जोड़ने में सामान्य से अधिक समय लग रहा है</string>
|
||||||
|
<string name="adding_contact_slow_title">संपर्क से जुड़ नहीं कर सकता</string>
|
||||||
|
<string name="adding_contact_slow_text">इस संपर्क को जोड़ने में सामान्य से अधिक समय लग रहा है। \n\n कृपया जांचें कि आपके संपर्क ने आपका लिंक प्राप्त कर लिया है और आपको जोड़ दिया है:</string>
|
||||||
<string name="offline_state">कोई इंटरनेट कनेक्शन नहीं</string>
|
<string name="offline_state">कोई इंटरनेट कनेक्शन नहीं</string>
|
||||||
<string name="duplicate_link_dialog_title">प्रतिलिपि लिंक</string>
|
<string name="duplicate_link_dialog_title">प्रतिलिपि लिंक</string>
|
||||||
<string name="duplicate_link_dialog_text_1">आपके पास इस लिंक के साथ पहले से ही एक लंबित संपर्क है: %s</string>
|
<string name="duplicate_link_dialog_text_1">आपके पास इस लिंक के साथ पहले से ही एक लंबित संपर्क है: %s</string>
|
||||||
@@ -220,6 +226,7 @@
|
|||||||
<string name="introduction_button">परिचय करें</string>
|
<string name="introduction_button">परिचय करें</string>
|
||||||
<string name="introduction_sent">आपका परिचय भेजा गया है।</string>
|
<string name="introduction_sent">आपका परिचय भेजा गया है।</string>
|
||||||
<string name="introduction_error">परिचय बनाने में एक त्रुटि हुई।</string>
|
<string name="introduction_error">परिचय बनाने में एक त्रुटि हुई।</string>
|
||||||
|
<string name="introduction_response_error">परिचय का जवाब देने में त्रुटि</string>
|
||||||
<string name="introduction_request_sent">आपने%2$s से%1$s का परिचय देने के लिए कहा है</string>
|
<string name="introduction_request_sent">आपने%2$s से%1$s का परिचय देने के लिए कहा है</string>
|
||||||
<string name="introduction_request_received">%1$sने आपको%2$s में पेश करने को कहा है क्या आप अपनी संपर्क सूची में%2$s जोड़ना चाहते हैं?</string>
|
<string name="introduction_request_received">%1$sने आपको%2$s में पेश करने को कहा है क्या आप अपनी संपर्क सूची में%2$s जोड़ना चाहते हैं?</string>
|
||||||
<string name="introduction_request_exists_received">%1$sने आपको%2$s में लाने के लिए कहा है, लेकिन%2$s आपकी संपर्क सूची में पहले से मौजूद है। चूंकि%1$s शायद यह नहीं जान पाए, आप फिर भी जवाब दे सकते हैं:</string>
|
<string name="introduction_request_exists_received">%1$sने आपको%2$s में लाने के लिए कहा है, लेकिन%2$s आपकी संपर्क सूची में पहले से मौजूद है। चूंकि%1$s शायद यह नहीं जान पाए, आप फिर भी जवाब दे सकते हैं:</string>
|
||||||
@@ -390,11 +397,20 @@
|
|||||||
<string name="pref_theme_dark">अंधेरा</string>
|
<string name="pref_theme_dark">अंधेरा</string>
|
||||||
<string name="pref_theme_auto">स्वचालित (दिन का समय)</string>
|
<string name="pref_theme_auto">स्वचालित (दिन का समय)</string>
|
||||||
<string name="pref_theme_system">प्रणालीगत चूक</string>
|
<string name="pref_theme_system">प्रणालीगत चूक</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">नेटवर्क</string>
|
||||||
|
<string name="bluetooth_setting">ब्लूटूथ के माध्यम से कनेक्ट करें</string>
|
||||||
|
<string name="bluetooth_setting_enabled">जब भी संपर्क आस-पास हो</string>
|
||||||
|
<string name="bluetooth_setting_disabled">केवल जब संपर्क जोड़ते हैं</string>
|
||||||
|
<string name="tor_network_setting">इंटरनेट (टोर) के माध्यम से कनेक्ट करें</string>
|
||||||
<string name="tor_network_setting_automatic">स्वचालित स्थान पर आधारित</string>
|
<string name="tor_network_setting_automatic">स्वचालित स्थान पर आधारित</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">पुलों के बिना टोर का प्रयोग करें</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">पुलों के साथ टोर का प्रयोग करें</string>
|
||||||
|
<string name="tor_network_setting_never">कनेक्ट मत करो</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">स्वचालित:%1$s (में %2$s)</string>
|
<string name="tor_network_setting_summary">स्वचालित:%1$s (में %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">मोबाइल डेटा का प्रयोग करें</string>
|
<string name="tor_mobile_data_title">मोबाइल डेटा का प्रयोग करें</string>
|
||||||
|
<string name="tor_only_when_charging_title">चार्ज होने पर ही इंटरनेट (टोर) से कनेक्ट करें</string>
|
||||||
<string name="tor_only_when_charging_summary">जब यंत्र बैटरी पर चल रहा हो तो इंटरनेट संबंध को निष्क्रिय कर देता है</string>
|
<string name="tor_only_when_charging_summary">जब यंत्र बैटरी पर चल रहा हो तो इंटरनेट संबंध को निष्क्रिय कर देता है</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">सुरक्षा</string>
|
<string name="security_settings_title">सुरक्षा</string>
|
||||||
@@ -435,6 +451,8 @@
|
|||||||
<string name="panic_setting_signout_summary">यदि कोई आतंक बटन दबाया जाता है तो Briar से साइन आउट करें</string>
|
<string name="panic_setting_signout_summary">यदि कोई आतंक बटन दबाया जाता है तो Briar से साइन आउट करें</string>
|
||||||
<string name="purge_setting_title">खाता हटा दो</string>
|
<string name="purge_setting_title">खाता हटा दो</string>
|
||||||
<string name="purge_setting_summary">यदि आपका आतंक बटन दबाया गया हो तो अपने Briar खाते को हटा दें। सावधानी: यह आपकी पहचान, संपर्क और संदेश को स्थायी रूप से हटा देगा</string>
|
<string name="purge_setting_summary">यदि आपका आतंक बटन दबाया गया हो तो अपने Briar खाते को हटा दें। सावधानी: यह आपकी पहचान, संपर्क और संदेश को स्थायी रूप से हटा देगा</string>
|
||||||
|
<string name="uninstall_setting_title">Briar की स्थापना रद्द करें</string>
|
||||||
|
<string name="uninstall_setting_summary">इसके लिए एक आतंक घटना में मैन्युअल पुष्टिकरण की आवश्यकता है</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">सूचनाएं</string>
|
<string name="notification_settings_title">सूचनाएं</string>
|
||||||
<string name="notify_sign_in_title">मुझे साइन इन करने के लिए याद दिलाएं</string>
|
<string name="notify_sign_in_title">मुझे साइन इन करने के लिए याद दिलाएं</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Jelszó</string>
|
<string name="enter_password">Jelszó</string>
|
||||||
<string name="try_again">Hibás jelszó, próbáld újra</string>
|
<string name="try_again">Hibás jelszó, próbáld újra</string>
|
||||||
<string name="dialog_title_cannot_check_password">A jelszót nem sikerült ellenőrizni</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">A Briar nem tudta ellenőrizni jelszavát. Kérjük indítja újra az eszközét a probléma megoldásához.</string>
|
|
||||||
<string name="sign_in_button">Bejelentkezés</string>
|
<string name="sign_in_button">Bejelentkezés</string>
|
||||||
<string name="forgotten_password">Elfelejtettem a jelszavam</string>
|
<string name="forgotten_password">Elfelejtettem a jelszavam</string>
|
||||||
<string name="dialog_title_lost_password">Elveszett jelszó</string>
|
<string name="dialog_title_lost_password">Elveszett jelszó</string>
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<string name="delete">Töröl</string>
|
<string name="delete">Töröl</string>
|
||||||
<string name="accept">Elfogad</string>
|
<string name="accept">Elfogad</string>
|
||||||
<string name="decline">Megtagad</string>
|
<string name="decline">Megtagad</string>
|
||||||
|
<string name="options">Opciók</string>
|
||||||
<string name="online">Csatlakozva</string>
|
<string name="online">Csatlakozva</string>
|
||||||
<string name="offline">Offline</string>
|
<string name="offline">Offline</string>
|
||||||
<string name="send">Küldés</string>
|
<string name="send">Küldés</string>
|
||||||
@@ -129,13 +128,6 @@
|
|||||||
<string name="dialog_title_delete_all_messages">Üzenet törlés megerősítése</string>
|
<string name="dialog_title_delete_all_messages">Üzenet törlés megerősítése</string>
|
||||||
<string name="dialog_message_delete_all_messages">Biztos, hogy szeretné törölni összes üzenetét?</string>
|
<string name="dialog_message_delete_all_messages">Biztos, hogy szeretné törölni összes üzenetét?</string>
|
||||||
<string name="dialog_title_not_all_messages_deleted">Nem törölhető minden üzenet</string>
|
<string name="dialog_title_not_all_messages_deleted">Nem törölhető minden üzenet</string>
|
||||||
<string name="dialog_message_not_deleted_ongoing_both">A folyamatban lévő meghívásokkal és bemutatkozásokkal kapcsolatos üzenetek nem törölhetők, amíg nem teljesülnek.</string>
|
|
||||||
<string name="dialog_message_not_deleted_ongoing_introductions">A folyamatban lévő bemutatkozásokkal kapcsolatos üzenetek nem törölhetők, amíg nem teljesülnek.</string>
|
|
||||||
<string name="dialog_message_not_deleted_ongoing_invitations">A folyamatban lévő meghívásokkal kapcsolatos üzenetek nem törölhetők, amíg nem teljesülnek.</string>
|
|
||||||
<string name="dialog_message_not_deleted_partly_downloaded">A részben letöltött üzenetek nem törölhetők, amíg nem töltődnek le teljesen.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_both">Egy meghívás vagy bemutatkozás törléséhez ki kell jelölnie a kérelmet és a választ.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_introductions">Egy bemutatkozás törléséhez ki kell jelölnie a kérelmet és a választ.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_invitations">Egy meghívás törléséhez ki kell jelölnie a kérelmet és a választ.</string>
|
|
||||||
<string name="delete_contact">Kapcsolat törlése</string>
|
<string name="delete_contact">Kapcsolat törlése</string>
|
||||||
<string name="dialog_title_delete_contact">Kapcsolat törlésének megerősítése</string>
|
<string name="dialog_title_delete_contact">Kapcsolat törlésének megerősítése</string>
|
||||||
<string name="dialog_message_delete_contact">Biztosan eltávolítja ezt a kapcsolatot és minden vele történt üzenetváltását?</string>
|
<string name="dialog_message_delete_contact">Biztosan eltávolítja ezt a kapcsolatot és minden vele történt üzenetváltását?</string>
|
||||||
@@ -176,6 +168,7 @@ Biztosan szeretné menteni?</string>
|
|||||||
<string name="add_contact_remotely_title_case">Távoli kapcsolat hozzá adása</string>
|
<string name="add_contact_remotely_title_case">Távoli kapcsolat hozzá adása</string>
|
||||||
<string name="add_contact_nearby_title">Közeli kapcsolat hozzáadása</string>
|
<string name="add_contact_nearby_title">Közeli kapcsolat hozzáadása</string>
|
||||||
<string name="add_contact_remotely_title">Távoli kapcsolat hozzá adása</string>
|
<string name="add_contact_remotely_title">Távoli kapcsolat hozzá adása</string>
|
||||||
|
<string name="contact_name_hint">Adjon a kapcsolatnak becenevet</string>
|
||||||
<string name="contact_link_intro">Írj a be a linket a kapcsolatától ide</string>
|
<string name="contact_link_intro">Írj a be a linket a kapcsolatától ide</string>
|
||||||
<string name="contact_link_hint">Kapcsolat linkje</string>
|
<string name="contact_link_hint">Kapcsolat linkje</string>
|
||||||
<string name="paste_button">Beilleszt</string>
|
<string name="paste_button">Beilleszt</string>
|
||||||
@@ -193,6 +186,7 @@ Biztosan szeretné menteni?</string>
|
|||||||
<string name="pending_contact_requests_snackbar">Vannak még folyamatban lévő kérelmek</string>
|
<string name="pending_contact_requests_snackbar">Vannak még folyamatban lévő kérelmek</string>
|
||||||
<string name="pending_contact_requests">Folyamatban lévő kapcsolati kérelmek</string>
|
<string name="pending_contact_requests">Folyamatban lévő kapcsolati kérelmek</string>
|
||||||
<string name="no_pending_contacts">Nincs várakozó kapcsolat</string>
|
<string name="no_pending_contacts">Nincs várakozó kapcsolat</string>
|
||||||
|
<string name="add_contact_remote_connecting">Csatlakozás...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Várakozás a kapcsolatra, hogy online legyen...</string>
|
<string name="waiting_for_contact_to_come_online">Várakozás a kapcsolatra, hogy online legyen...</string>
|
||||||
<string name="connecting">Csatlakozás...</string>
|
<string name="connecting">Csatlakozás...</string>
|
||||||
<string name="adding_contact">Kapcsolat hozzáadása...</string>
|
<string name="adding_contact">Kapcsolat hozzáadása...</string>
|
||||||
@@ -214,6 +208,9 @@ Kérjük frissítsen a legutolsó verzióra és próbálja újra.</string>
|
|||||||
<item quantity="one">Új kapcsolat hozzáadva.</item>
|
<item quantity="one">Új kapcsolat hozzáadva.</item>
|
||||||
<item quantity="other">%d új kapcsolat hozzáadva</item>
|
<item quantity="other">%d új kapcsolat hozzáadva</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Ennek a kapcsolatnak a hozzáadása a szokásosnál tovább tart</string>
|
||||||
|
<string name="adding_contact_slow_title">Sikertelen csatlakozás a kapcsolathoz</string>
|
||||||
|
<string name="adding_contact_slow_text">Ennek a kapcsolatnak a hozzáadása tovább tart, mint általában.\n\nKérjük ellenőrizze, hogy a kapcsolata megkapta-e a linket és hozzáadta-e Önt:</string>
|
||||||
<string name="offline_state">Nincs internet kapcsolat</string>
|
<string name="offline_state">Nincs internet kapcsolat</string>
|
||||||
<string name="duplicate_link_dialog_title">Duplikált link</string>
|
<string name="duplicate_link_dialog_title">Duplikált link</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Önnek már van várakozó kapcsolata ezzel a linkkel: %s</string>
|
<string name="duplicate_link_dialog_text_1">Önnek már van várakozó kapcsolata ezzel a linkkel: %s</string>
|
||||||
@@ -241,6 +238,7 @@ Kérjük frissítsen a legutolsó verzióra és próbálja újra.</string>
|
|||||||
<string name="introduction_button">Bemutatkozás készítése</string>
|
<string name="introduction_button">Bemutatkozás készítése</string>
|
||||||
<string name="introduction_sent">A bemutatkozása elküldésre került.</string>
|
<string name="introduction_sent">A bemutatkozása elküldésre került.</string>
|
||||||
<string name="introduction_error">Hiba történt a bemutatkozás létrehozásakor.</string>
|
<string name="introduction_error">Hiba történt a bemutatkozás létrehozásakor.</string>
|
||||||
|
<string name="introduction_response_error">Hiba történt a bemutatkozásra válaszkor</string>
|
||||||
<string name="introduction_request_sent">Megkértek, hogy mutasd be egymásnak %1$s és %2$s személyeket.</string>
|
<string name="introduction_request_sent">Megkértek, hogy mutasd be egymásnak %1$s és %2$s személyeket.</string>
|
||||||
<string name="introduction_request_received">%1$s szeretne bemutatni %2$s személynek. Szeretné hozzáadni %2$s személyt a kapcsolataihoz?</string>
|
<string name="introduction_request_received">%1$s szeretne bemutatni %2$s személynek. Szeretné hozzáadni %2$s személyt a kapcsolataihoz?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s megkérve lett, hogy mutassa be Önt személynek, de %2$s már a kapcsolatai között található. Mivel %1$s erről nem tudhat, továbbra is válaszolhatja a következőket:</string>
|
<string name="introduction_request_exists_received">%1$s megkérve lett, hogy mutassa be Önt személynek, de %2$s már a kapcsolatai között található. Mivel %1$s erről nem tudhat, továbbra is válaszolhatja a következőket:</string>
|
||||||
@@ -416,12 +414,20 @@ Kapcsolatai, akivel megosztotta ezt a blogot, lehet nem kapnak többé frissít
|
|||||||
<string name="pref_theme_dark">Sötét</string>
|
<string name="pref_theme_dark">Sötét</string>
|
||||||
<string name="pref_theme_auto">Automatikus (napszaknak megfelelő)</string>
|
<string name="pref_theme_auto">Automatikus (napszaknak megfelelő)</string>
|
||||||
<string name="pref_theme_system">Rendszer alapértelmezett</string>
|
<string name="pref_theme_system">Rendszer alapértelmezett</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
<string name="network_settings_title">Kapcsolatok</string>
|
<string name="network_settings_title">Hálózatok</string>
|
||||||
|
<string name="bluetooth_setting">Csatlakozás bluetooth-on keresztül</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Amikor kapcsolatok vannak a közelben</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Amikor kapcsolatokat adok hozzá</string>
|
||||||
|
<string name="tor_network_setting">Csatlakozás interneten (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automatikusan hely alapján</string>
|
<string name="tor_network_setting_automatic">Automatikusan hely alapján</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Tor használata hidak nélkül</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Tor használata hidakkal</string>
|
||||||
|
<string name="tor_network_setting_never">Ne csatlakozzon</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automatikus: %1$s ( %2$s)</string>
|
<string name="tor_network_setting_summary">Automatikus: %1$s ( %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Mobil adat használata</string>
|
<string name="tor_mobile_data_title">Mobil adat használata</string>
|
||||||
|
<string name="tor_only_when_charging_title">Csatlakozás az internethez Tor-ral, töltés alatt</string>
|
||||||
<string name="tor_only_when_charging_summary">Letiltja az internet kapcsolatot, amikor elemről fut az eszköz</string>
|
<string name="tor_only_when_charging_summary">Letiltja az internet kapcsolatot, amikor elemről fut az eszköz</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Biztonság</string>
|
<string name="security_settings_title">Biztonság</string>
|
||||||
@@ -463,6 +469,8 @@ Kapcsolatai, akivel megosztotta ezt a blogot, lehet nem kapnak többé frissít
|
|||||||
<string name="purge_setting_title">Fiók törlése</string>
|
<string name="purge_setting_title">Fiók törlése</string>
|
||||||
<string name="purge_setting_summary">A Briar fiók törlése a pánik gomb megnyomásakor.
|
<string name="purge_setting_summary">A Briar fiók törlése a pánik gomb megnyomásakor.
|
||||||
Vigyázat: Ez végleg törli az identitásait, kapcsolatait és üzeneteit</string>
|
Vigyázat: Ez végleg törli az identitásait, kapcsolatait és üzeneteit</string>
|
||||||
|
<string name="uninstall_setting_title">Briar eltávolítása</string>
|
||||||
|
<string name="uninstall_setting_summary">Ez kézi jóváhagyását igényli a pánik eseménynek</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Értesítések</string>
|
<string name="notification_settings_title">Értesítések</string>
|
||||||
<string name="notify_sign_in_title">Emlékeztessen a bejlentkezésre</string>
|
<string name="notify_sign_in_title">Emlékeztessen a bejlentkezésre</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Lykilorð</string>
|
<string name="enter_password">Lykilorð</string>
|
||||||
<string name="try_again">Rangt lykilorð, reyndu aftur</string>
|
<string name="try_again">Rangt lykilorð, reyndu aftur</string>
|
||||||
<string name="dialog_title_cannot_check_password">Get ekki yfirfarið lykilorð</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar getur ekki yfirfarið lykilorðið þitt. Prófaðu að endurræsa tækið þitt til að reyna að leysa þetta vandamál.</string>
|
|
||||||
<string name="sign_in_button">Skrá inn</string>
|
<string name="sign_in_button">Skrá inn</string>
|
||||||
<string name="forgotten_password">Ég hef gleymt lykilorðinu mínu</string>
|
<string name="forgotten_password">Ég hef gleymt lykilorðinu mínu</string>
|
||||||
<string name="dialog_title_lost_password">Týnt lykilorð</string>
|
<string name="dialog_title_lost_password">Týnt lykilorð</string>
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<string name="delete">Eyða</string>
|
<string name="delete">Eyða</string>
|
||||||
<string name="accept">Samþykkja</string>
|
<string name="accept">Samþykkja</string>
|
||||||
<string name="decline">Hafna</string>
|
<string name="decline">Hafna</string>
|
||||||
|
<string name="options">Valkostir</string>
|
||||||
<string name="online">Nettengt</string>
|
<string name="online">Nettengt</string>
|
||||||
<string name="offline">Ónettengt</string>
|
<string name="offline">Ónettengt</string>
|
||||||
<string name="send">Senda</string>
|
<string name="send">Senda</string>
|
||||||
@@ -174,6 +173,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Bæta við fjarlægum tengilið</string>
|
<string name="add_contact_remotely_title_case">Bæta við fjarlægum tengilið</string>
|
||||||
<string name="add_contact_nearby_title">Bæta við nálægum tengilið</string>
|
<string name="add_contact_nearby_title">Bæta við nálægum tengilið</string>
|
||||||
<string name="add_contact_remotely_title">Bæta við fjarlægum tengilið</string>
|
<string name="add_contact_remotely_title">Bæta við fjarlægum tengilið</string>
|
||||||
|
<string name="contact_name_hint">Gefðu tengiliðnum stuttnefni</string>
|
||||||
<string name="contact_link_intro">Settu hér inn tengilinn frá tengiliðnum þínum</string>
|
<string name="contact_link_intro">Settu hér inn tengilinn frá tengiliðnum þínum</string>
|
||||||
<string name="contact_link_hint">Tengill á tengilið</string>
|
<string name="contact_link_hint">Tengill á tengilið</string>
|
||||||
<string name="paste_button">Líma</string>
|
<string name="paste_button">Líma</string>
|
||||||
@@ -191,6 +191,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Það eru nokkrar tengiliðabeiðnir sem bíða</string>
|
<string name="pending_contact_requests_snackbar">Það eru nokkrar tengiliðabeiðnir sem bíða</string>
|
||||||
<string name="pending_contact_requests">Tengiliðabeiðnir sem bíða</string>
|
<string name="pending_contact_requests">Tengiliðabeiðnir sem bíða</string>
|
||||||
<string name="no_pending_contacts">Engar tengiliðabeiðnir bíða</string>
|
<string name="no_pending_contacts">Engar tengiliðabeiðnir bíða</string>
|
||||||
|
<string name="add_contact_remote_connecting">Tengist…</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Bíð eftir að tengiliður tengist netinu…</string>
|
<string name="waiting_for_contact_to_come_online">Bíð eftir að tengiliður tengist netinu…</string>
|
||||||
<string name="connecting">Tengist…</string>
|
<string name="connecting">Tengist…</string>
|
||||||
<string name="adding_contact">Bæti við tengilið…</string>
|
<string name="adding_contact">Bæti við tengilið…</string>
|
||||||
@@ -211,6 +212,9 @@
|
|||||||
<item quantity="one">Nýjum tengilið bætt við.</item>
|
<item quantity="one">Nýjum tengilið bætt við.</item>
|
||||||
<item quantity="other">%d nýjum tengiliðum bætt við.</item>
|
<item quantity="other">%d nýjum tengiliðum bætt við.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Það að bæta við þessum tengilið tekur lengri tíma en venjulega</string>
|
||||||
|
<string name="adding_contact_slow_title">Tekst ekki að tengjast tengiliðnum</string>
|
||||||
|
<string name="adding_contact_slow_text">Það að bæta við þessum tengilið tekur lengri tíma en venjulega\n\nGakktu úr skugga um að tengiliðurinn þinn hafi fengið tengilinn frá þér og bætt þér við hjá sér:</string>
|
||||||
<string name="offline_state">Engin internettenging</string>
|
<string name="offline_state">Engin internettenging</string>
|
||||||
<string name="duplicate_link_dialog_title">Endurtekinn tengill</string>
|
<string name="duplicate_link_dialog_title">Endurtekinn tengill</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Þú ert þegar með tengilið í bið sem er með þessum tengli: %s</string>
|
<string name="duplicate_link_dialog_text_1">Þú ert þegar með tengilið í bið sem er með þessum tengli: %s</string>
|
||||||
@@ -238,6 +242,7 @@
|
|||||||
<string name="introduction_button">Útbúa kynningu</string>
|
<string name="introduction_button">Útbúa kynningu</string>
|
||||||
<string name="introduction_sent">Kynningin þín hefur verið send.</string>
|
<string name="introduction_sent">Kynningin þín hefur verið send.</string>
|
||||||
<string name="introduction_error">Villa kom upp við kynninguna.</string>
|
<string name="introduction_error">Villa kom upp við kynninguna.</string>
|
||||||
|
<string name="introduction_response_error">Villa kom upp við að svara kynningunni.</string>
|
||||||
<string name="introduction_request_sent">Þú hefur verið beðin/n um að kynna %1$s fyrir %2$s.</string>
|
<string name="introduction_request_sent">Þú hefur verið beðin/n um að kynna %1$s fyrir %2$s.</string>
|
||||||
<string name="introduction_request_received">%1$s hefur beðið um að fá að kynna þig fyrir %2$s. Viltu bæta %2$s við tengiliðalistann þinn?</string>
|
<string name="introduction_request_received">%1$s hefur beðið um að fá að kynna þig fyrir %2$s. Viltu bæta %2$s við tengiliðalistann þinn?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s hefur beðið um að fá að kynna þig fyrir %2$s, en %2$s er þegar í tengiliðalistanum þínum. Þar sem ekki er víst að %1$s viti það, þá geturðu samt svarað:</string>
|
<string name="introduction_request_exists_received">%1$s hefur beðið um að fá að kynna þig fyrir %2$s, en %2$s er þegar í tengiliðalistanum þínum. Þar sem ekki er víst að %1$s viti það, þá geturðu samt svarað:</string>
|
||||||
@@ -408,11 +413,20 @@
|
|||||||
<string name="pref_theme_dark">Dökkt</string>
|
<string name="pref_theme_dark">Dökkt</string>
|
||||||
<string name="pref_theme_auto">Sjálfvirkt (eftir tíma dags)</string>
|
<string name="pref_theme_auto">Sjálfvirkt (eftir tíma dags)</string>
|
||||||
<string name="pref_theme_system">Sjálfgefið í kerfinu</string>
|
<string name="pref_theme_system">Sjálfgefið í kerfinu</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Netkerfi</string>
|
||||||
|
<string name="bluetooth_setting">Tengjast í gegnum Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Alltaf þegar tengiliðir eru nálægt</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Aðeins þegar tengiliðum er bætt við</string>
|
||||||
|
<string name="tor_network_setting">Tengjast í gegnum internetið (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Sjálfvirkt byggt á staðsetningu</string>
|
<string name="tor_network_setting_automatic">Sjálfvirkt byggt á staðsetningu</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Nota Tor án brúa</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Nota Tor með brúm</string>
|
||||||
|
<string name="tor_network_setting_never">Ekki tengjast</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Sjálfvirkt: %1$s (eftir %2$s)</string>
|
<string name="tor_network_setting_summary">Sjálfvirkt: %1$s (eftir %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Nota farsímagagnasamband</string>
|
<string name="tor_mobile_data_title">Nota farsímagagnasamband</string>
|
||||||
|
<string name="tor_only_when_charging_title">Tengjast í gegnum internetið (Tor) aðeins þegar verið er í hleðslu</string>
|
||||||
<string name="tor_only_when_charging_summary">Gerir internettengingu óvirka þegar tækið keyrir á rafhlöðu</string>
|
<string name="tor_only_when_charging_summary">Gerir internettengingu óvirka þegar tækið keyrir á rafhlöðu</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Öryggi</string>
|
<string name="security_settings_title">Öryggi</string>
|
||||||
@@ -453,6 +467,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Skrá út úr Briar ef ýtt er á neyðarhnapp</string>
|
<string name="panic_setting_signout_summary">Skrá út úr Briar ef ýtt er á neyðarhnapp</string>
|
||||||
<string name="purge_setting_title">Eyða notandaaðgangi</string>
|
<string name="purge_setting_title">Eyða notandaaðgangi</string>
|
||||||
<string name="purge_setting_summary">Eyða Briar-aðgangnum þínum ef ýtt er á neyðarhnapp. Varúð: Þetta mun eyða endanlega auðkennunum þínum, tengiliðum og skilaboðum</string>
|
<string name="purge_setting_summary">Eyða Briar-aðgangnum þínum ef ýtt er á neyðarhnapp. Varúð: Þetta mun eyða endanlega auðkennunum þínum, tengiliðum og skilaboðum</string>
|
||||||
|
<string name="uninstall_setting_title">Fjarlægja Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Þetta krefst handvirkrar staðfestingar komi upp neyðarástand</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Tilkynningar</string>
|
<string name="notification_settings_title">Tilkynningar</string>
|
||||||
<string name="notify_sign_in_title">Minna mig á að skrá inn</string>
|
<string name="notify_sign_in_title">Minna mig á að skrá inn</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Password</string>
|
<string name="enter_password">Password</string>
|
||||||
<string name="try_again">Password sbagliata, riprova</string>
|
<string name="try_again">Password sbagliata, riprova</string>
|
||||||
<string name="dialog_title_cannot_check_password">Impossibile controllare la password</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar non riesce a controllare la tua password. Prova a riavviare il dispositivo per risolvere il problema.</string>
|
|
||||||
<string name="sign_in_button">Entra</string>
|
<string name="sign_in_button">Entra</string>
|
||||||
<string name="forgotten_password">Ho dimenticato la password</string>
|
<string name="forgotten_password">Ho dimenticato la password</string>
|
||||||
<string name="dialog_title_lost_password">Password persa</string>
|
<string name="dialog_title_lost_password">Password persa</string>
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<string name="delete">Cancella</string>
|
<string name="delete">Cancella</string>
|
||||||
<string name="accept">Accetta</string>
|
<string name="accept">Accetta</string>
|
||||||
<string name="decline">Declina</string>
|
<string name="decline">Declina</string>
|
||||||
|
<string name="options">Opzioni</string>
|
||||||
<string name="online">Connesso</string>
|
<string name="online">Connesso</string>
|
||||||
<string name="offline">Disconnesso</string>
|
<string name="offline">Disconnesso</string>
|
||||||
<string name="send">Invia</string>
|
<string name="send">Invia</string>
|
||||||
@@ -174,6 +173,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Aggiungi contatto distante</string>
|
<string name="add_contact_remotely_title_case">Aggiungi contatto distante</string>
|
||||||
<string name="add_contact_nearby_title">Aggiungi contatto vicino</string>
|
<string name="add_contact_nearby_title">Aggiungi contatto vicino</string>
|
||||||
<string name="add_contact_remotely_title">Aggiungi contatto distante</string>
|
<string name="add_contact_remotely_title">Aggiungi contatto distante</string>
|
||||||
|
<string name="contact_name_hint">Dai un nickname al contatto</string>
|
||||||
<string name="contact_link_intro">Inserisci qui il link dal tuo contatto</string>
|
<string name="contact_link_intro">Inserisci qui il link dal tuo contatto</string>
|
||||||
<string name="contact_link_hint">Link del contatto</string>
|
<string name="contact_link_hint">Link del contatto</string>
|
||||||
<string name="paste_button">Incolla</string>
|
<string name="paste_button">Incolla</string>
|
||||||
@@ -191,6 +191,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Ci sono richieste di contatto in attesa</string>
|
<string name="pending_contact_requests_snackbar">Ci sono richieste di contatto in attesa</string>
|
||||||
<string name="pending_contact_requests">Richieste di contatto in attesa</string>
|
<string name="pending_contact_requests">Richieste di contatto in attesa</string>
|
||||||
<string name="no_pending_contacts">Nessun contatto in attesa</string>
|
<string name="no_pending_contacts">Nessun contatto in attesa</string>
|
||||||
|
<string name="add_contact_remote_connecting">Connessione in corso...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">In attesa che il contatto sia in linea...</string>
|
<string name="waiting_for_contact_to_come_online">In attesa che il contatto sia in linea...</string>
|
||||||
<string name="connecting">Connessione in corso...</string>
|
<string name="connecting">Connessione in corso...</string>
|
||||||
<string name="adding_contact">Aggiunta contatto…</string>
|
<string name="adding_contact">Aggiunta contatto…</string>
|
||||||
@@ -211,6 +212,9 @@
|
|||||||
<item quantity="one">Nuovo contatto aggiunto.</item>
|
<item quantity="one">Nuovo contatto aggiunto.</item>
|
||||||
<item quantity="other">%d nuovi contatti aggiunti.</item>
|
<item quantity="other">%d nuovi contatti aggiunti.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">L\'aggiunta di questo contatto sta impiegando più tempo del solito</string>
|
||||||
|
<string name="adding_contact_slow_title">Impossibile connettersi al contatto</string>
|
||||||
|
<string name="adding_contact_slow_text">L\'aggiunta di questo contatto sta impiegando più tempo del solito.\n\nControlla che il tuo contatto abbia ricevuto il tuo link e ti abbia aggiunto:</string>
|
||||||
<string name="offline_state">Nessuna connessione internet</string>
|
<string name="offline_state">Nessuna connessione internet</string>
|
||||||
<string name="duplicate_link_dialog_title">Duplica il link</string>
|
<string name="duplicate_link_dialog_title">Duplica il link</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Hai già un contatto in attesa con questo link: %s</string>
|
<string name="duplicate_link_dialog_text_1">Hai già un contatto in attesa con questo link: %s</string>
|
||||||
@@ -238,6 +242,7 @@
|
|||||||
<string name="introduction_button">Crea l\'introduzione</string>
|
<string name="introduction_button">Crea l\'introduzione</string>
|
||||||
<string name="introduction_sent">La tua introduzione è stata inviata.</string>
|
<string name="introduction_sent">La tua introduzione è stata inviata.</string>
|
||||||
<string name="introduction_error">C\'è stato un errore nella creazione dell\'introduzione</string>
|
<string name="introduction_error">C\'è stato un errore nella creazione dell\'introduzione</string>
|
||||||
|
<string name="introduction_response_error">Errore durante la risposta all\' introduzione</string>
|
||||||
<string name="introduction_request_sent">Hai richiesto di introdurre %1$s a %2$s.</string>
|
<string name="introduction_request_sent">Hai richiesto di introdurre %1$s a %2$s.</string>
|
||||||
<string name="introduction_request_received">%1$s ha chiesto di introdurti in %2$s. Vuoi aggiungere %2$s alla tua lista contatti?</string>
|
<string name="introduction_request_received">%1$s ha chiesto di introdurti in %2$s. Vuoi aggiungere %2$s alla tua lista contatti?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s ha chiesto di introdurti in %2$s, ma %2$s è già nella tua lista contatti. Dato che %1$s può non saperlo, puoi comunque rispondere:</string>
|
<string name="introduction_request_exists_received">%1$s ha chiesto di introdurti in %2$s, ma %2$s è già nella tua lista contatti. Dato che %1$s può non saperlo, puoi comunque rispondere:</string>
|
||||||
@@ -408,12 +413,20 @@
|
|||||||
<string name="pref_theme_dark">Scuro</string>
|
<string name="pref_theme_dark">Scuro</string>
|
||||||
<string name="pref_theme_auto">Automatico ( Dì )</string>
|
<string name="pref_theme_auto">Automatico ( Dì )</string>
|
||||||
<string name="pref_theme_system">Predefinito di sistema</string>
|
<string name="pref_theme_system">Predefinito di sistema</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
<string name="network_settings_title">Connessioni</string>
|
<string name="network_settings_title">Reti</string>
|
||||||
|
<string name="bluetooth_setting">Connessione attraverso Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Quando i contatti sono vicini</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Solo quando viene aggiunto un contatto</string>
|
||||||
|
<string name="tor_network_setting">Connetti via internet (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automatico basato sulla posizione</string>
|
<string name="tor_network_setting_automatic">Automatico basato sulla posizione</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Usa Tor senza bridge</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Usa Tor con bridge</string>
|
||||||
|
<string name="tor_network_setting_never">Non connettere</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automatico: %1$s (in %2$s)</string>
|
<string name="tor_network_setting_summary">Automatico: %1$s (in %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Usa dati mobili</string>
|
<string name="tor_mobile_data_title">Usa dati mobili</string>
|
||||||
|
<string name="tor_only_when_charging_title">Connetti via internet (Tor) solo durante la ricarica</string>
|
||||||
<string name="tor_only_when_charging_summary">Disattiva la connessione internet quando il dispositivo funziona a batteria</string>
|
<string name="tor_only_when_charging_summary">Disattiva la connessione internet quando il dispositivo funziona a batteria</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Sicurezza</string>
|
<string name="security_settings_title">Sicurezza</string>
|
||||||
@@ -454,6 +467,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Uscire da Briar se viene premuto un pulsante di panico</string>
|
<string name="panic_setting_signout_summary">Uscire da Briar se viene premuto un pulsante di panico</string>
|
||||||
<string name="purge_setting_title">Elimina Account</string>
|
<string name="purge_setting_title">Elimina Account</string>
|
||||||
<string name="purge_setting_summary">Cancella il tuo account Briar se un panic button è premuto. Attenzione: ciò cancellerà permanentemente le tue identità, contatti e messaggi</string>
|
<string name="purge_setting_summary">Cancella il tuo account Briar se un panic button è premuto. Attenzione: ciò cancellerà permanentemente le tue identità, contatti e messaggi</string>
|
||||||
|
<string name="uninstall_setting_title">Disinstalla Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Questo richiede una conferma manuale in un evento panico</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Notifiche</string>
|
<string name="notification_settings_title">Notifiche</string>
|
||||||
<string name="notify_sign_in_title">Ricordami di accedere</string>
|
<string name="notify_sign_in_title">Ricordami di accedere</string>
|
||||||
|
|||||||
@@ -89,6 +89,7 @@
|
|||||||
<string name="delete">削除</string>
|
<string name="delete">削除</string>
|
||||||
<string name="accept">承認</string>
|
<string name="accept">承認</string>
|
||||||
<string name="decline">却下</string>
|
<string name="decline">却下</string>
|
||||||
|
<string name="options">オプション</string>
|
||||||
<string name="online">オンライン</string>
|
<string name="online">オンライン</string>
|
||||||
<string name="offline">オフライン</string>
|
<string name="offline">オフライン</string>
|
||||||
<string name="send">送信</string>
|
<string name="send">送信</string>
|
||||||
@@ -152,6 +153,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">離れた場所にいる相手を連絡先に追加</string>
|
<string name="add_contact_remotely_title_case">離れた場所にいる相手を連絡先に追加</string>
|
||||||
<string name="add_contact_nearby_title">近くにいる相手を連絡先に追加</string>
|
<string name="add_contact_nearby_title">近くにいる相手を連絡先に追加</string>
|
||||||
<string name="add_contact_remotely_title">離れた場所にいる相手を連絡先に追加</string>
|
<string name="add_contact_remotely_title">離れた場所にいる相手を連絡先に追加</string>
|
||||||
|
<string name="contact_name_hint">連絡先にニックネームを付ける</string>
|
||||||
<string name="contact_link_intro">連絡相手のリンクをここに入力してください</string>
|
<string name="contact_link_intro">連絡相手のリンクをここに入力してください</string>
|
||||||
<string name="contact_link_hint">連絡相手のリンク</string>
|
<string name="contact_link_hint">連絡相手のリンク</string>
|
||||||
<string name="paste_button">貼り付け</string>
|
<string name="paste_button">貼り付け</string>
|
||||||
@@ -169,6 +171,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">保留中の連絡先への追加リクエストがあります</string>
|
<string name="pending_contact_requests_snackbar">保留中の連絡先への追加リクエストがあります</string>
|
||||||
<string name="pending_contact_requests">連絡先追加リクエスト</string>
|
<string name="pending_contact_requests">連絡先追加リクエスト</string>
|
||||||
<string name="no_pending_contacts">保留中の連絡先追加リクエストはありません</string>
|
<string name="no_pending_contacts">保留中の連絡先追加リクエストはありません</string>
|
||||||
|
<string name="add_contact_remote_connecting">接続中…</string>
|
||||||
<string name="waiting_for_contact_to_come_online">連絡相手がオンラインになるのを待っています…</string>
|
<string name="waiting_for_contact_to_come_online">連絡相手がオンラインになるのを待っています…</string>
|
||||||
<string name="connecting">接続中…</string>
|
<string name="connecting">接続中…</string>
|
||||||
<string name="adding_contact">連絡先を追加しています…</string>
|
<string name="adding_contact">連絡先を追加しています…</string>
|
||||||
@@ -188,6 +191,9 @@
|
|||||||
<plurals name="contact_added_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="other">%d 新しい連絡先が追加されました。</item>
|
<item quantity="other">%d 新しい連絡先が追加されました。</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">この連絡先の追加には通常より時間がかかります</string>
|
||||||
|
<string name="adding_contact_slow_title">連絡先に接続できません</string>
|
||||||
|
<string name="adding_contact_slow_text">この連絡先の追加には通常より時間がかかります。\n \n連絡先がリンクを受信して追加したことを確認してください:</string>
|
||||||
<string name="offline_state">インターネットに接続されていません</string>
|
<string name="offline_state">インターネットに接続されていません</string>
|
||||||
<string name="duplicate_link_dialog_title">重複リンク</string>
|
<string name="duplicate_link_dialog_title">重複リンク</string>
|
||||||
<string name="duplicate_link_dialog_text_1">既に保留中の連絡先があります。リンク:%s</string>
|
<string name="duplicate_link_dialog_text_1">既に保留中の連絡先があります。リンク:%s</string>
|
||||||
@@ -214,6 +220,7 @@
|
|||||||
<string name="introduction_button">はじめに</string>
|
<string name="introduction_button">はじめに</string>
|
||||||
<string name="introduction_sent">こちらの構成情報を送信しました。</string>
|
<string name="introduction_sent">こちらの構成情報を送信しました。</string>
|
||||||
<string name="introduction_error">構成情報の作成中にエラーが発生しました。</string>
|
<string name="introduction_error">構成情報の作成中にエラーが発生しました。</string>
|
||||||
|
<string name="introduction_response_error">連絡相手からの構成情報に返信する際のエラー</string>
|
||||||
<string name="introduction_request_sent">%1$sを%2$sに追加するように要求しました。</string>
|
<string name="introduction_request_sent">%1$sを%2$sに追加するように要求しました。</string>
|
||||||
<string name="introduction_request_received">%1$sから%2$sへの紹介を求められました。 連絡先リストに%2$sを追加しますか?</string>
|
<string name="introduction_request_received">%1$sから%2$sへの紹介を求められました。 連絡先リストに%2$sを追加しますか?</string>
|
||||||
<string name="introduction_request_exists_received">%1$sから%2$sの紹介を求められましたが、%2$sは既に連絡先リストにあります。%1$sはそれを知らない可能性があるため、引き続き応じれます:</string>
|
<string name="introduction_request_exists_received">%1$sから%2$sの紹介を求められましたが、%2$sは既に連絡先リストにあります。%1$sはそれを知らない可能性があるため、引き続き応じれます:</string>
|
||||||
@@ -380,12 +387,20 @@
|
|||||||
<string name="pref_theme_dark">ダーク</string>
|
<string name="pref_theme_dark">ダーク</string>
|
||||||
<string name="pref_theme_auto">自動(昼間)</string>
|
<string name="pref_theme_auto">自動(昼間)</string>
|
||||||
<string name="pref_theme_system">システムデフォルト</string>
|
<string name="pref_theme_system">システムデフォルト</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
<string name="network_settings_title">接続</string>
|
<string name="network_settings_title">ネットワーク</string>
|
||||||
|
<string name="bluetooth_setting">Bluetooth経由で接続する</string>
|
||||||
|
<string name="bluetooth_setting_enabled">連絡先に登録している人が近くにいるときはいつでも接続する</string>
|
||||||
|
<string name="bluetooth_setting_disabled">その人を追加した場合のみ</string>
|
||||||
|
<string name="tor_network_setting">インターネット経由で接続する(Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">場所に基づいて自動的に接続する</string>
|
<string name="tor_network_setting_automatic">場所に基づいて自動的に接続する</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">ブリッジなしでTorを使用する</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">ブリッジを通してTorを使用する</string>
|
||||||
|
<string name="tor_network_setting_never">接続しない</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">自動:%1$s(%2$sのうち)</string>
|
<string name="tor_network_setting_summary">自動:%1$s(%2$sのうち)</string>
|
||||||
<string name="tor_mobile_data_title">モバイルデータを使用する</string>
|
<string name="tor_mobile_data_title">モバイルデータを使用する</string>
|
||||||
|
<string name="tor_only_when_charging_title">充電時にのみインターネット(Tor)経由で接続する</string>
|
||||||
<string name="tor_only_when_charging_summary">デバイスがバッテリー使用している場合、インターネット接続を無効にする</string>
|
<string name="tor_only_when_charging_summary">デバイスがバッテリー使用している場合、インターネット接続を無効にする</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">セキュリティ</string>
|
<string name="security_settings_title">セキュリティ</string>
|
||||||
@@ -426,6 +441,8 @@
|
|||||||
<string name="panic_setting_signout_summary">パニックボタンが押された場合、Briarからログアウトする</string>
|
<string name="panic_setting_signout_summary">パニックボタンが押された場合、Briarからログアウトする</string>
|
||||||
<string name="purge_setting_title">アカウントを削除</string>
|
<string name="purge_setting_title">アカウントを削除</string>
|
||||||
<string name="purge_setting_summary">パニックボタンが押された場合は、Briarアカウントを削除します。 注意:これにより、ID、連絡先、メッセージが完全に削除されます</string>
|
<string name="purge_setting_summary">パニックボタンが押された場合は、Briarアカウントを削除します。 注意:これにより、ID、連絡先、メッセージが完全に削除されます</string>
|
||||||
|
<string name="uninstall_setting_title">Briarをアンインストールする</string>
|
||||||
|
<string name="uninstall_setting_summary">これには、パニックイベントの手動の確認が必要です</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">通知</string>
|
<string name="notification_settings_title">通知</string>
|
||||||
<string name="notify_sign_in_title">サインインするように通知する</string>
|
<string name="notify_sign_in_title">サインインするように通知する</string>
|
||||||
|
|||||||
@@ -89,6 +89,7 @@
|
|||||||
<string name="delete">삭제</string>
|
<string name="delete">삭제</string>
|
||||||
<string name="accept">받아들이기</string>
|
<string name="accept">받아들이기</string>
|
||||||
<string name="decline">거절하기</string>
|
<string name="decline">거절하기</string>
|
||||||
|
<string name="options">옵션</string>
|
||||||
<string name="online">온라인</string>
|
<string name="online">온라인</string>
|
||||||
<string name="offline">오프라인</string>
|
<string name="offline">오프라인</string>
|
||||||
<string name="send">보내기</string>
|
<string name="send">보내기</string>
|
||||||
@@ -152,6 +153,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">멀리서 지인 추가하기</string>
|
<string name="add_contact_remotely_title_case">멀리서 지인 추가하기</string>
|
||||||
<string name="add_contact_nearby_title">주위의 지인 추가하기</string>
|
<string name="add_contact_nearby_title">주위의 지인 추가하기</string>
|
||||||
<string name="add_contact_remotely_title">멀리서 지인 추가하기</string>
|
<string name="add_contact_remotely_title">멀리서 지인 추가하기</string>
|
||||||
|
<string name="contact_name_hint">연락처에 별명을 붙이세요</string>
|
||||||
<string name="contact_link_intro">지인 분에게서 받은 링크를 여기에 입력하세요</string>
|
<string name="contact_link_intro">지인 분에게서 받은 링크를 여기에 입력하세요</string>
|
||||||
<string name="contact_link_hint">지인 분의 링크</string>
|
<string name="contact_link_hint">지인 분의 링크</string>
|
||||||
<string name="paste_button">붙여 넣기</string>
|
<string name="paste_button">붙여 넣기</string>
|
||||||
@@ -169,6 +171,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">기다리고 있는 연락 요청이 있습니다</string>
|
<string name="pending_contact_requests_snackbar">기다리고 있는 연락 요청이 있습니다</string>
|
||||||
<string name="pending_contact_requests">연락 요청이 받아들여지길 기다리고 있습니다</string>
|
<string name="pending_contact_requests">연락 요청이 받아들여지길 기다리고 있습니다</string>
|
||||||
<string name="no_pending_contacts">남은 연락 요청이 없습니다</string>
|
<string name="no_pending_contacts">남은 연락 요청이 없습니다</string>
|
||||||
|
<string name="add_contact_remote_connecting">접속중...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">지인 분이 온라인에 접속하길 기다리고 있습니다...</string>
|
<string name="waiting_for_contact_to_come_online">지인 분이 온라인에 접속하길 기다리고 있습니다...</string>
|
||||||
<string name="connecting">접속중...</string>
|
<string name="connecting">접속중...</string>
|
||||||
<string name="adding_contact">연락처 추가하는 중입니다...</string>
|
<string name="adding_contact">연락처 추가하는 중입니다...</string>
|
||||||
@@ -188,6 +191,9 @@
|
|||||||
<plurals name="contact_added_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="other">새로운 연락처 %d개를 추가했습니다.</item>
|
<item quantity="other">새로운 연락처 %d개를 추가했습니다.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">평소보다 이 연락처를 추가하는데 오래 걸리고 있습니다</string>
|
||||||
|
<string name="adding_contact_slow_title">연락처에 연결되지 않습니다</string>
|
||||||
|
<string name="adding_contact_slow_text">평소보다 이 연락처를 추가하는데 오래 걸리고 있습니다.\n\n 지인 분이 링크를 받아서 추가했는지 확인해 주세요:</string>
|
||||||
<string name="offline_state">인터넷에 연결되지 않음</string>
|
<string name="offline_state">인터넷에 연결되지 않음</string>
|
||||||
<string name="duplicate_link_dialog_title">중복되는 링크입니다</string>
|
<string name="duplicate_link_dialog_title">중복되는 링크입니다</string>
|
||||||
<string name="duplicate_link_dialog_text_1">%s: 이미 이 링크를 통한 연락 요청이 있습니다.</string>
|
<string name="duplicate_link_dialog_text_1">%s: 이미 이 링크를 통한 연락 요청이 있습니다.</string>
|
||||||
@@ -214,6 +220,7 @@
|
|||||||
<string name="introduction_button">소개시키기</string>
|
<string name="introduction_button">소개시키기</string>
|
||||||
<string name="introduction_sent">소개시켰습니다.</string>
|
<string name="introduction_sent">소개시켰습니다.</string>
|
||||||
<string name="introduction_error">소개시키는 과정에서 문제가 있었습니다.</string>
|
<string name="introduction_error">소개시키는 과정에서 문제가 있었습니다.</string>
|
||||||
|
<string name="introduction_response_error">소개에 응하는 과정에서 문제가 있었습니다.</string>
|
||||||
<string name="introduction_request_sent">%2$s에게 %1$s을(를) 소개하고 싶다고 전했습니다.</string>
|
<string name="introduction_request_sent">%2$s에게 %1$s을(를) 소개하고 싶다고 전했습니다.</string>
|
||||||
<string name="introduction_request_received">%1$s이(가) %2$s에게 소개하고 싶다고 합니다. %2$s을(를) 연락처 목록에 추가하고 싶으십니까?</string>
|
<string name="introduction_request_received">%1$s이(가) %2$s에게 소개하고 싶다고 합니다. %2$s을(를) 연락처 목록에 추가하고 싶으십니까?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s이(가) %2$s에게 소개하고 싶다고 물었지만, %2$s은(는) 이미 연락처 목록에 있습니다. %1$s이(가) 아직 이 부분을 모르고 있을 수 있으니, 아직 응할 수 있습니다:</string>
|
<string name="introduction_request_exists_received">%1$s이(가) %2$s에게 소개하고 싶다고 물었지만, %2$s은(는) 이미 연락처 목록에 있습니다. %1$s이(가) 아직 이 부분을 모르고 있을 수 있으니, 아직 응할 수 있습니다:</string>
|
||||||
@@ -380,11 +387,20 @@
|
|||||||
<string name="pref_theme_dark">어둠</string>
|
<string name="pref_theme_dark">어둠</string>
|
||||||
<string name="pref_theme_auto">자동(시간에 따라)</string>
|
<string name="pref_theme_auto">자동(시간에 따라)</string>
|
||||||
<string name="pref_theme_system">기본 설정</string>
|
<string name="pref_theme_system">기본 설정</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">네트워크</string>
|
||||||
|
<string name="bluetooth_setting">블루투스로 연결하기</string>
|
||||||
|
<string name="bluetooth_setting_enabled">연락처가 가까이 있을 때마다</string>
|
||||||
|
<string name="bluetooth_setting_disabled">연락처를 추가할 때만</string>
|
||||||
|
<string name="tor_network_setting">인터넷(Tor)을 통해 연결하기</string>
|
||||||
<string name="tor_network_setting_automatic">장소에 따라 자동으로</string>
|
<string name="tor_network_setting_automatic">장소에 따라 자동으로</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Tor를 브리지 없이 사용하기</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Tor를 브리지를 통해 사용하기</string>
|
||||||
|
<string name="tor_network_setting_never">연결하지 말기</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">자동: %1$s(%2$s에서)</string>
|
<string name="tor_network_setting_summary">자동: %1$s(%2$s에서)</string>
|
||||||
<string name="tor_mobile_data_title">모바일 데이터 사용하기</string>
|
<string name="tor_mobile_data_title">모바일 데이터 사용하기</string>
|
||||||
|
<string name="tor_only_when_charging_title">충전할 때만 인터넷(Tor)을 통해 연결하기</string>
|
||||||
<string name="tor_only_when_charging_summary">충전 중이지 않을 때에는 인터넷 연결을 비활성화</string>
|
<string name="tor_only_when_charging_summary">충전 중이지 않을 때에는 인터넷 연결을 비활성화</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title"> 보안</string>
|
<string name="security_settings_title"> 보안</string>
|
||||||
@@ -425,6 +441,8 @@
|
|||||||
<string name="panic_setting_signout_summary">패닉 버튼이 눌리면 Briar에서 로그아웃하기</string>
|
<string name="panic_setting_signout_summary">패닉 버튼이 눌리면 Briar에서 로그아웃하기</string>
|
||||||
<string name="purge_setting_title">계정 삭제하기</string>
|
<string name="purge_setting_title">계정 삭제하기</string>
|
||||||
<string name="purge_setting_summary">패닉 버튼이 눌리면 Briar 계정을 삭제하기 (주의: 계정, 연락처와 메시지가 영구적으로 지워집니다)</string>
|
<string name="purge_setting_summary">패닉 버튼이 눌리면 Briar 계정을 삭제하기 (주의: 계정, 연락처와 메시지가 영구적으로 지워집니다)</string>
|
||||||
|
<string name="uninstall_setting_title">Briar 삭제하기</string>
|
||||||
|
<string name="uninstall_setting_summary">패닉 상황에서 수동으로 확인해야 합니다</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">알림</string>
|
<string name="notification_settings_title">알림</string>
|
||||||
<string name="notify_sign_in_title">로그인 알려주기</string>
|
<string name="notify_sign_in_title">로그인 알려주기</string>
|
||||||
|
|||||||
@@ -106,6 +106,7 @@
|
|||||||
<string name="delete">Ištrinti</string>
|
<string name="delete">Ištrinti</string>
|
||||||
<string name="accept">Priimti</string>
|
<string name="accept">Priimti</string>
|
||||||
<string name="decline">Atmesti</string>
|
<string name="decline">Atmesti</string>
|
||||||
|
<string name="options">Parametrai</string>
|
||||||
<string name="online">Pasiekiama(-s)</string>
|
<string name="online">Pasiekiama(-s)</string>
|
||||||
<string name="offline">Nepasiekiama(-s)</string>
|
<string name="offline">Nepasiekiama(-s)</string>
|
||||||
<string name="send">Siųsti</string>
|
<string name="send">Siųsti</string>
|
||||||
@@ -182,6 +183,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Pridėti adresatą per atstumą</string>
|
<string name="add_contact_remotely_title_case">Pridėti adresatą per atstumą</string>
|
||||||
<string name="add_contact_nearby_title">Pridėti šalia esantį adresatą</string>
|
<string name="add_contact_nearby_title">Pridėti šalia esantį adresatą</string>
|
||||||
<string name="add_contact_remotely_title">Pridėti adresatą per atstumą</string>
|
<string name="add_contact_remotely_title">Pridėti adresatą per atstumą</string>
|
||||||
|
<string name="contact_name_hint">Suteikite adresatui slapyvardį</string>
|
||||||
<string name="contact_link_intro">Čia įveskite iš adresato gautą nuorodą</string>
|
<string name="contact_link_intro">Čia įveskite iš adresato gautą nuorodą</string>
|
||||||
<string name="contact_link_hint">Adresato nuoroda</string>
|
<string name="contact_link_hint">Adresato nuoroda</string>
|
||||||
<string name="paste_button">Įdėti</string>
|
<string name="paste_button">Įdėti</string>
|
||||||
@@ -199,6 +201,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Yra laukiančių adresato užklausų</string>
|
<string name="pending_contact_requests_snackbar">Yra laukiančių adresato užklausų</string>
|
||||||
<string name="pending_contact_requests">Laukiančios adresatų užklausos</string>
|
<string name="pending_contact_requests">Laukiančios adresatų užklausos</string>
|
||||||
<string name="no_pending_contacts">Laukiančių adresatų nėra</string>
|
<string name="no_pending_contacts">Laukiančių adresatų nėra</string>
|
||||||
|
<string name="add_contact_remote_connecting">Jungiamasi…</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Laukiama, kol adresatas prisijungs prie tinko…</string>
|
<string name="waiting_for_contact_to_come_online">Laukiama, kol adresatas prisijungs prie tinko…</string>
|
||||||
<string name="connecting">Jungiamasi…</string>
|
<string name="connecting">Jungiamasi…</string>
|
||||||
<string name="adding_contact">Pridedamas adresatas…</string>
|
<string name="adding_contact">Pridedamas adresatas…</string>
|
||||||
@@ -221,6 +224,9 @@
|
|||||||
<item quantity="many">Pridėta %d naujų adresatų.</item>
|
<item quantity="many">Pridėta %d naujų adresatų.</item>
|
||||||
<item quantity="other">Pridėtas %d naujas adresatas.</item>
|
<item quantity="other">Pridėtas %d naujas adresatas.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Adresato pridėjimas užtrunka ilgiau nei įprasta</string>
|
||||||
|
<string name="adding_contact_slow_title">Nepavyksta prisijungti prie adresato</string>
|
||||||
|
<string name="adding_contact_slow_text">Šio adresato pridėjimas užtrunka ilgiau nei įprasta.\n\nPatikrinkite ar šis adresatas gavo jūsų nuorodą ir pridėjo jus:</string>
|
||||||
<string name="offline_state">Nėra interneto ryšio</string>
|
<string name="offline_state">Nėra interneto ryšio</string>
|
||||||
<string name="duplicate_link_dialog_title">Identiška nuoroda</string>
|
<string name="duplicate_link_dialog_title">Identiška nuoroda</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Jūs jau turite laukiančią adresato užklausą su šia nuoroda: %s</string>
|
<string name="duplicate_link_dialog_text_1">Jūs jau turite laukiančią adresato užklausą su šia nuoroda: %s</string>
|
||||||
@@ -248,6 +254,7 @@
|
|||||||
<string name="introduction_button">Supažindinti</string>
|
<string name="introduction_button">Supažindinti</string>
|
||||||
<string name="introduction_sent">Jūsų supažindinimas išsiųstas.</string>
|
<string name="introduction_sent">Jūsų supažindinimas išsiųstas.</string>
|
||||||
<string name="introduction_error">Supažindinant, įvyko klaida.</string>
|
<string name="introduction_error">Supažindinant, įvyko klaida.</string>
|
||||||
|
<string name="introduction_response_error">Klaida, atsakant į supažindinimą</string>
|
||||||
<string name="introduction_request_sent">Jūs paprašėte, kad naudotojas %1$s būtų supažindintas su %2$s.</string>
|
<string name="introduction_request_sent">Jūs paprašėte, kad naudotojas %1$s būtų supažindintas su %2$s.</string>
|
||||||
<string name="introduction_request_received">%1$s paprašė supažindinti jus su %2$s. Ar norite pridėti naudotoją %2$s į savo adresatų sąrašą?</string>
|
<string name="introduction_request_received">%1$s paprašė supažindinti jus su %2$s. Ar norite pridėti naudotoją %2$s į savo adresatų sąrašą?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s paprašė supažindinti jus su %2$s, tačiau %2$s jau yra jūsų adresatų sąraše. Kadangi %1$s gali to ir nežinoti, vis tiek galite atsakyti:</string>
|
<string name="introduction_request_exists_received">%1$s paprašė supažindinti jus su %2$s, tačiau %2$s jau yra jūsų adresatų sąraše. Kadangi %1$s gali to ir nežinoti, vis tiek galite atsakyti:</string>
|
||||||
@@ -426,11 +433,20 @@
|
|||||||
<string name="pref_theme_dark">Tamsus</string>
|
<string name="pref_theme_dark">Tamsus</string>
|
||||||
<string name="pref_theme_auto">Automatinis (Dienos metas)</string>
|
<string name="pref_theme_auto">Automatinis (Dienos metas)</string>
|
||||||
<string name="pref_theme_system">Sistemos numatytasis</string>
|
<string name="pref_theme_system">Sistemos numatytasis</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Tinklai</string>
|
||||||
|
<string name="bluetooth_setting">Prisijungti per Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Kai adresatai yra šalia</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Tik pridedant adresatus</string>
|
||||||
|
<string name="tor_network_setting">Prisijungti per internetą (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automatiškai pagal buvimo vietą</string>
|
<string name="tor_network_setting_automatic">Automatiškai pagal buvimo vietą</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Naudoti Tor be tinklų tiltų</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Naudoti Tor su tinklų tiltais</string>
|
||||||
|
<string name="tor_network_setting_never">Neprisijungti</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automatiškai: %1$s (šalyje %2$s)</string>
|
<string name="tor_network_setting_summary">Automatiškai: %1$s (šalyje %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Naudoti mobiliuosius duomenis</string>
|
<string name="tor_mobile_data_title">Naudoti mobiliuosius duomenis</string>
|
||||||
|
<string name="tor_only_when_charging_title">Prisijungti per internetą (Tor) tik įkraunant įrenginį</string>
|
||||||
<string name="tor_only_when_charging_summary">Išjungia interneto ryšį, kai įrenginys veikia naudodamas akumuliatorių</string>
|
<string name="tor_only_when_charging_summary">Išjungia interneto ryšį, kai įrenginys veikia naudodamas akumuliatorių</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Saugumas</string>
|
<string name="security_settings_title">Saugumas</string>
|
||||||
@@ -471,6 +487,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Atsijungti iš Briar, jei yra paspaudžiamas panikos mygtukas</string>
|
<string name="panic_setting_signout_summary">Atsijungti iš Briar, jei yra paspaudžiamas panikos mygtukas</string>
|
||||||
<string name="purge_setting_title">Ištrinti paskyrą</string>
|
<string name="purge_setting_title">Ištrinti paskyrą</string>
|
||||||
<string name="purge_setting_summary">Ištrinti jūsų Briar paskyrą, jei yra paspaudžiamas panikos mygtukas. Dėmesio: Tai visiems laikams ištrins jūsų tapatybes, adresatus ir žinutes</string>
|
<string name="purge_setting_summary">Ištrinti jūsų Briar paskyrą, jei yra paspaudžiamas panikos mygtukas. Dėmesio: Tai visiems laikams ištrins jūsų tapatybes, adresatus ir žinutes</string>
|
||||||
|
<string name="uninstall_setting_title">Pašalinti Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Panikos atveju, tai reikalauja rankinio patvirtinimo</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Pranešimai</string>
|
<string name="notification_settings_title">Pranešimai</string>
|
||||||
<string name="notify_sign_in_title">Priminti man prisijungti</string>
|
<string name="notify_sign_in_title">Priminti man prisijungti</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Лозинка</string>
|
<string name="enter_password">Лозинка</string>
|
||||||
<string name="try_again">Погрешна лозинка</string>
|
<string name="try_again">Погрешна лозинка</string>
|
||||||
<string name="dialog_title_cannot_check_password">Не може да се провери лозинката</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar не може да ја провери вашата лозинка. Ве молиме обидетете се со рестартирање на вашиот уред за да го решите овој проблем.</string>
|
|
||||||
<string name="sign_in_button">Најави се</string>
|
<string name="sign_in_button">Најави се</string>
|
||||||
<string name="forgotten_password">Ја заборавив лозинката</string>
|
<string name="forgotten_password">Ја заборавив лозинката</string>
|
||||||
<string name="dialog_title_lost_password">Изгубена лозинка</string>
|
<string name="dialog_title_lost_password">Изгубена лозинка</string>
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<string name="delete">Избриши</string>
|
<string name="delete">Избриши</string>
|
||||||
<string name="accept">Прифаќам</string>
|
<string name="accept">Прифаќам</string>
|
||||||
<string name="decline">Одбивам</string>
|
<string name="decline">Одбивам</string>
|
||||||
|
<string name="options">Опции</string>
|
||||||
<string name="online">Онлајн/Вклучен</string>
|
<string name="online">Онлајн/Вклучен</string>
|
||||||
<string name="offline">Офлајн/Исклучен</string>
|
<string name="offline">Офлајн/Исклучен</string>
|
||||||
<string name="send">Испрати</string>
|
<string name="send">Испрати</string>
|
||||||
@@ -174,6 +173,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Додај контакт НА РАСТОЈАНИЕ</string>
|
<string name="add_contact_remotely_title_case">Додај контакт НА РАСТОЈАНИЕ</string>
|
||||||
<string name="add_contact_nearby_title">Додај контакт во близина</string>
|
<string name="add_contact_nearby_title">Додај контакт во близина</string>
|
||||||
<string name="add_contact_remotely_title">Додај контакт на растојание</string>
|
<string name="add_contact_remotely_title">Додај контакт на растојание</string>
|
||||||
|
<string name="contact_name_hint">Додели му прекар на контактот</string>
|
||||||
<string name="contact_link_intro">Внеси го линкот од твојот контакт овде</string>
|
<string name="contact_link_intro">Внеси го линкот од твојот контакт овде</string>
|
||||||
<string name="contact_link_hint">Линк на контактот</string>
|
<string name="contact_link_hint">Линк на контактот</string>
|
||||||
<string name="paste_button">Залепи</string>
|
<string name="paste_button">Залепи</string>
|
||||||
@@ -191,6 +191,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Има барања за контакт на чекање</string>
|
<string name="pending_contact_requests_snackbar">Има барања за контакт на чекање</string>
|
||||||
<string name="pending_contact_requests">Барања за контакт на чекање</string>
|
<string name="pending_contact_requests">Барања за контакт на чекање</string>
|
||||||
<string name="no_pending_contacts">Нема контакти на чекање</string>
|
<string name="no_pending_contacts">Нема контакти на чекање</string>
|
||||||
|
<string name="add_contact_remote_connecting">Се поврзува...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Чекање на контакт да се вклучи...</string>
|
<string name="waiting_for_contact_to_come_online">Чекање на контакт да се вклучи...</string>
|
||||||
<string name="connecting">Се поврзува...</string>
|
<string name="connecting">Се поврзува...</string>
|
||||||
<string name="adding_contact">Додавање контакт...</string>
|
<string name="adding_contact">Додавање контакт...</string>
|
||||||
@@ -211,6 +212,9 @@
|
|||||||
<item quantity="one">Нов контакт е додаден.</item>
|
<item quantity="one">Нов контакт е додаден.</item>
|
||||||
<item quantity="other">%dнови контакти се додадени.</item>
|
<item quantity="other">%dнови контакти се додадени.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Додавањето на овој контакт е подолго од вообичаено</string>
|
||||||
|
<string name="adding_contact_slow_title">Не може да се поврзе со контакт</string>
|
||||||
|
<string name="adding_contact_slow_text">Додавањето на овој контакт е подолго од вообичаеното.\n\nВе молиме проверете дека вашиот контакт го добил вашиот линк и дека ве додал: </string>
|
||||||
<string name="offline_state">Нема Интернет врска</string>
|
<string name="offline_state">Нема Интернет врска</string>
|
||||||
<string name="duplicate_link_dialog_title">Дуплицирање на линк</string>
|
<string name="duplicate_link_dialog_title">Дуплицирање на линк</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Веќе имате контакт на чекање со овој линк: %s</string>
|
<string name="duplicate_link_dialog_text_1">Веќе имате контакт на чекање со овој линк: %s</string>
|
||||||
@@ -238,6 +242,7 @@
|
|||||||
<string name="introduction_button">Направи запознавање</string>
|
<string name="introduction_button">Направи запознавање</string>
|
||||||
<string name="introduction_sent">Вашето запознавање беше испратено.</string>
|
<string name="introduction_sent">Вашето запознавање беше испратено.</string>
|
||||||
<string name="introduction_error">Се појави грешка за време на запознавањето.</string>
|
<string name="introduction_error">Се појави грешка за време на запознавањето.</string>
|
||||||
|
<string name="introduction_response_error">Грешка при одговор на запознавањето</string>
|
||||||
<string name="introduction_request_sent">Побаравте да се запознаат %1$s и %2$s.</string>
|
<string name="introduction_request_sent">Побаравте да се запознаат %1$s и %2$s.</string>
|
||||||
<string name="introduction_request_received">%1$s побара да ве запознае со %2$s. Дали сакате да го додадете %2$s на вашата контакт листа?</string>
|
<string name="introduction_request_received">%1$s побара да ве запознае со %2$s. Дали сакате да го додадете %2$s на вашата контакт листа?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s побара да ве запознае со %2$s, но %2$s е веќе во вашата контакт листа. Додека %1$s можеби не го знае тоа, вие сеуште можете да одговорите:</string>
|
<string name="introduction_request_exists_received">%1$s побара да ве запознае со %2$s, но %2$s е веќе во вашата контакт листа. Додека %1$s можеби не го знае тоа, вие сеуште можете да одговорите:</string>
|
||||||
@@ -408,11 +413,20 @@
|
|||||||
<string name="pref_theme_dark">Темно</string>
|
<string name="pref_theme_dark">Темно</string>
|
||||||
<string name="pref_theme_auto">Автоматски (Дневно)</string>
|
<string name="pref_theme_auto">Автоматски (Дневно)</string>
|
||||||
<string name="pref_theme_system">Систем стандардно поставен</string>
|
<string name="pref_theme_system">Систем стандардно поставен</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Мрежи</string>
|
||||||
|
<string name="bluetooth_setting">Поврзи се преку Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Секогаш кога контактите се во близина</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Само кога се додаваат контакти</string>
|
||||||
|
<string name="tor_network_setting">Поврзи се преку Интернет (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Автоматски базирано на локација</string>
|
<string name="tor_network_setting_automatic">Автоматски базирано на локација</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Користи Tor без мостови</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Користи Tor со мостови</string>
|
||||||
|
<string name="tor_network_setting_never">Не се поврзувај</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Автоматски: %1$s (во %2$s)</string>
|
<string name="tor_network_setting_summary">Автоматски: %1$s (во %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Користи мобилни податоци</string>
|
<string name="tor_mobile_data_title">Користи мобилни податоци</string>
|
||||||
|
<string name="tor_only_when_charging_title">Поврзи преку Интернет (Tor) само за време на полнење</string>
|
||||||
<string name="tor_only_when_charging_summary">Оневозможи го Интернет поврзувањето кога уредот не е приклучен на полнач</string>
|
<string name="tor_only_when_charging_summary">Оневозможи го Интернет поврзувањето кога уредот не е приклучен на полнач</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Безбедност</string>
|
<string name="security_settings_title">Безбедност</string>
|
||||||
@@ -453,6 +467,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Одјави се од Briar ако копчето паника е притиснато</string>
|
<string name="panic_setting_signout_summary">Одјави се од Briar ако копчето паника е притиснато</string>
|
||||||
<string name="purge_setting_title">Избриши сметка</string>
|
<string name="purge_setting_title">Избриши сметка</string>
|
||||||
<string name="purge_setting_summary">Избриши ја твојата Briar сметка ако е притиснато копчето паника. Внимание: Ова трајно ќе ги избрише твоите идентитети, контакти и пораки</string>
|
<string name="purge_setting_summary">Избриши ја твојата Briar сметка ако е притиснато копчето паника. Внимание: Ова трајно ќе ги избрише твоите идентитети, контакти и пораки</string>
|
||||||
|
<string name="uninstall_setting_title">Отстрани го Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Ова бара рачно потврдување во случај на паника</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Известувања</string>
|
<string name="notification_settings_title">Известувања</string>
|
||||||
<string name="notify_sign_in_title">Потсети ме да се најавам</string>
|
<string name="notify_sign_in_title">Потсети ме да се најавам</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Wachtwoord</string>
|
<string name="enter_password">Wachtwoord</string>
|
||||||
<string name="try_again">Verkeerd wachtwoord, probeer het nog een keer</string>
|
<string name="try_again">Verkeerd wachtwoord, probeer het nog een keer</string>
|
||||||
<string name="dialog_title_cannot_check_password">Kan wachtwoord niet controleren</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar kan je wachtwoord niet controleren. Start je apparaat opnieuw op en probeer het nog eens.</string>
|
|
||||||
<string name="sign_in_button">Log in</string>
|
<string name="sign_in_button">Log in</string>
|
||||||
<string name="forgotten_password">Ik ben mijn wachtwoord vergeten</string>
|
<string name="forgotten_password">Ik ben mijn wachtwoord vergeten</string>
|
||||||
<string name="dialog_title_lost_password">Wachtwoord vergeten</string>
|
<string name="dialog_title_lost_password">Wachtwoord vergeten</string>
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<string name="delete">Verwijder</string>
|
<string name="delete">Verwijder</string>
|
||||||
<string name="accept">Accepteer</string>
|
<string name="accept">Accepteer</string>
|
||||||
<string name="decline">Wijs af</string>
|
<string name="decline">Wijs af</string>
|
||||||
|
<string name="options">Opties</string>
|
||||||
<string name="online">Online</string>
|
<string name="online">Online</string>
|
||||||
<string name="offline">Offline</string>
|
<string name="offline">Offline</string>
|
||||||
<string name="send">Verstuur</string>
|
<string name="send">Verstuur</string>
|
||||||
@@ -110,7 +109,7 @@
|
|||||||
<string name="fix">Oplossen</string>
|
<string name="fix">Oplossen</string>
|
||||||
<string name="help">Help</string>
|
<string name="help">Help</string>
|
||||||
<string name="sorry">Excuses</string>
|
<string name="sorry">Excuses</string>
|
||||||
<string name="error_start_activity">Onbeschikbaar op jouw systeem</string>
|
<string name="error_start_activity">Beschikbaar op jouw systeem</string>
|
||||||
<!--Contacts and Private Conversations-->
|
<!--Contacts and Private Conversations-->
|
||||||
<string name="no_contacts">Er zijn geen contacten om te tonen</string>
|
<string name="no_contacts">Er zijn geen contacten om te tonen</string>
|
||||||
<string name="no_contacts_action">Tik op het +-icoon om een contact toe te voegen</string>
|
<string name="no_contacts_action">Tik op het +-icoon om een contact toe te voegen</string>
|
||||||
@@ -174,6 +173,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Voeg een contact ver weg toe</string>
|
<string name="add_contact_remotely_title_case">Voeg een contact ver weg toe</string>
|
||||||
<string name="add_contact_nearby_title">Voeg contact dat in de buurt is toe</string>
|
<string name="add_contact_nearby_title">Voeg contact dat in de buurt is toe</string>
|
||||||
<string name="add_contact_remotely_title">Voeg een contact dat niet in de buurt is toe</string>
|
<string name="add_contact_remotely_title">Voeg een contact dat niet in de buurt is toe</string>
|
||||||
|
<string name="contact_name_hint">Geef contact een bijnaam</string>
|
||||||
<string name="contact_link_intro">Voer de link van je contact hier in</string>
|
<string name="contact_link_intro">Voer de link van je contact hier in</string>
|
||||||
<string name="contact_link_hint">Link van contact</string>
|
<string name="contact_link_hint">Link van contact</string>
|
||||||
<string name="paste_button">Plakken</string>
|
<string name="paste_button">Plakken</string>
|
||||||
@@ -191,6 +191,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Er zijn geen wachtende contactverzoeken</string>
|
<string name="pending_contact_requests_snackbar">Er zijn geen wachtende contactverzoeken</string>
|
||||||
<string name="pending_contact_requests">Wachtende contactverzoeken</string>
|
<string name="pending_contact_requests">Wachtende contactverzoeken</string>
|
||||||
<string name="no_pending_contacts">Geen wachtende contactverzoeken</string>
|
<string name="no_pending_contacts">Geen wachtende contactverzoeken</string>
|
||||||
|
<string name="add_contact_remote_connecting">Bezig met verbinden...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Aan het wachten tot contact online komt...</string>
|
<string name="waiting_for_contact_to_come_online">Aan het wachten tot contact online komt...</string>
|
||||||
<string name="connecting">Bezig met verbinden...</string>
|
<string name="connecting">Bezig met verbinden...</string>
|
||||||
<string name="adding_contact">Contact aan het toevoegen...</string>
|
<string name="adding_contact">Contact aan het toevoegen...</string>
|
||||||
@@ -211,6 +212,9 @@
|
|||||||
<item quantity="one">Nieuw contact toegevoegd</item>
|
<item quantity="one">Nieuw contact toegevoegd</item>
|
||||||
<item quantity="other">%d nieuwe contacten zijn toegevoegd.</item>
|
<item quantity="other">%d nieuwe contacten zijn toegevoegd.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Toevoegen van dit contact duurt langer dan gebruikelijk</string>
|
||||||
|
<string name="adding_contact_slow_title">Kan niet verbinden met contact</string>
|
||||||
|
<string name="adding_contact_slow_text">Het toeveogen van dit contact duurt langer dan gebruikelijk.\n\nGa alsjeblieft na of je contact jouw link heeft ontvangen en je heeft toegevoegd.</string>
|
||||||
<string name="offline_state">Geen internetverbinding</string>
|
<string name="offline_state">Geen internetverbinding</string>
|
||||||
<string name="duplicate_link_dialog_title">Duplicate link</string>
|
<string name="duplicate_link_dialog_title">Duplicate link</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Je hebt al en wachtend contact met deze link: %s</string>
|
<string name="duplicate_link_dialog_text_1">Je hebt al en wachtend contact met deze link: %s</string>
|
||||||
@@ -238,6 +242,7 @@
|
|||||||
<string name="introduction_button">Introduceer</string>
|
<string name="introduction_button">Introduceer</string>
|
||||||
<string name="introduction_sent">Je introductie is verzonden</string>
|
<string name="introduction_sent">Je introductie is verzonden</string>
|
||||||
<string name="introduction_error">Er trad een fout op tijdens het aanmaken van de introductie.</string>
|
<string name="introduction_error">Er trad een fout op tijdens het aanmaken van de introductie.</string>
|
||||||
|
<string name="introduction_response_error">Fout tijdens reageren op een introductie</string>
|
||||||
<string name="introduction_request_sent">Je hebt gevraagd om %1$s te introduceren aan %2$s.</string>
|
<string name="introduction_request_sent">Je hebt gevraagd om %1$s te introduceren aan %2$s.</string>
|
||||||
<string name="introduction_request_received">%1$s heeft voorgesteld om je te introduceren aan %2$s. Wil je %2$s toevoegen aan je contactenlijst?</string>
|
<string name="introduction_request_received">%1$s heeft voorgesteld om je te introduceren aan %2$s. Wil je %2$s toevoegen aan je contactenlijst?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s heeft gevraagd om je te introduceren aan %2$s, maar %2$s staat al in je contactenlijst. Omdat %1$s dit niet per se weet kun je nog steeds antwoorden:</string>
|
<string name="introduction_request_exists_received">%1$s heeft gevraagd om je te introduceren aan %2$s, maar %2$s staat al in je contactenlijst. Omdat %1$s dit niet per se weet kun je nog steeds antwoorden:</string>
|
||||||
@@ -408,12 +413,20 @@
|
|||||||
<string name="pref_theme_dark">Donker</string>
|
<string name="pref_theme_dark">Donker</string>
|
||||||
<string name="pref_theme_auto">Automatisch (overdag)</string>
|
<string name="pref_theme_auto">Automatisch (overdag)</string>
|
||||||
<string name="pref_theme_system">Systeemstandaard</string>
|
<string name="pref_theme_system">Systeemstandaard</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
<string name="network_settings_title">Verbindingen</string>
|
<string name="network_settings_title">Netwerken</string>
|
||||||
|
<string name="bluetooth_setting">Verbind via Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Alleen als contacten dichtbij zijn</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Alleen tijdens toevoegen van contacten</string>
|
||||||
|
<string name="tor_network_setting">Maak verbinding via internet (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automatisch gebaseerd op locatie</string>
|
<string name="tor_network_setting_automatic">Automatisch gebaseerd op locatie</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Gebruik Tor zonder bridges</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Gebruik Tor met bridges</string>
|
||||||
|
<string name="tor_network_setting_never">Maak geen verbinding</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automatisch: %1$s (in %2$s)</string>
|
<string name="tor_network_setting_summary">Automatisch: %1$s (in %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Gebruik mobiele data</string>
|
<string name="tor_mobile_data_title">Gebruik mobiele data</string>
|
||||||
|
<string name="tor_only_when_charging_title">Verbind met internet (Tor) alleen tijdens opladen</string>
|
||||||
<string name="tor_only_when_charging_summary">Schakel internetverbinding uit als apparaat op batterij loopt</string>
|
<string name="tor_only_when_charging_summary">Schakel internetverbinding uit als apparaat op batterij loopt</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Beveiliging</string>
|
<string name="security_settings_title">Beveiliging</string>
|
||||||
@@ -454,6 +467,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Log uit op Briar als de paniekknop wordt ingedrukt.</string>
|
<string name="panic_setting_signout_summary">Log uit op Briar als de paniekknop wordt ingedrukt.</string>
|
||||||
<string name="purge_setting_title">Verwijder account</string>
|
<string name="purge_setting_title">Verwijder account</string>
|
||||||
<string name="purge_setting_summary">Verwijder je Briar-account als een paniekknop wordt ingedrukt. Let op: dit zal permanent je identiteit, contacten en berichten verwijderen.</string>
|
<string name="purge_setting_summary">Verwijder je Briar-account als een paniekknop wordt ingedrukt. Let op: dit zal permanent je identiteit, contacten en berichten verwijderen.</string>
|
||||||
|
<string name="uninstall_setting_title">Deïnstalleer Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Dit vereist een handmatige bevestiging op een paniekmoment</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Meldingen</string>
|
<string name="notification_settings_title">Meldingen</string>
|
||||||
<string name="notify_sign_in_title">Herinner me om in te loggen</string>
|
<string name="notify_sign_in_title">Herinner me om in te loggen</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Senhal</string>
|
<string name="enter_password">Senhal</string>
|
||||||
<string name="try_again">Senhal incorècte, tornatz ensajar</string>
|
<string name="try_again">Senhal incorècte, tornatz ensajar</string>
|
||||||
<string name="dialog_title_cannot_check_password">Verificacion del senhal impossibla</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar pòt pas verificar vòstre senhal. Mercés de reaviar l’aparelh per resòlver aqueste problèma.</string>
|
|
||||||
<string name="sign_in_button">Se connectar</string>
|
<string name="sign_in_button">Se connectar</string>
|
||||||
<string name="forgotten_password">Senhal oblidat</string>
|
<string name="forgotten_password">Senhal oblidat</string>
|
||||||
<string name="dialog_title_lost_password">Senhal oblidat</string>
|
<string name="dialog_title_lost_password">Senhal oblidat</string>
|
||||||
@@ -100,6 +98,7 @@ Volètz suprimir vòstre compte e ne crear un nòu ?\n
|
|||||||
<string name="delete">Suprimir</string>
|
<string name="delete">Suprimir</string>
|
||||||
<string name="accept">Acceptar</string>
|
<string name="accept">Acceptar</string>
|
||||||
<string name="decline">Refusar</string>
|
<string name="decline">Refusar</string>
|
||||||
|
<string name="options">Opcions</string>
|
||||||
<string name="online">En linha</string>
|
<string name="online">En linha</string>
|
||||||
<string name="offline">Fòra linha</string>
|
<string name="offline">Fòra linha</string>
|
||||||
<string name="send">Mandar</string>
|
<string name="send">Mandar</string>
|
||||||
@@ -131,10 +130,6 @@ Volètz suprimir vòstre compte e ne crear un nòu ?\n
|
|||||||
<string name="dialog_title_delete_all_messages">Confirmatz la supression dels messatges</string>
|
<string name="dialog_title_delete_all_messages">Confirmatz la supression dels messatges</string>
|
||||||
<string name="dialog_message_delete_all_messages">Volètz vertadièrament suprimir totes los messatges ?</string>
|
<string name="dialog_message_delete_all_messages">Volètz vertadièrament suprimir totes los messatges ?</string>
|
||||||
<string name="dialog_title_not_all_messages_deleted">Supression de totes los messatges impossibla</string>
|
<string name="dialog_title_not_all_messages_deleted">Supression de totes los messatges impossibla</string>
|
||||||
<string name="dialog_message_not_deleted_partly_downloaded">Los messatges pas complètament telecargats pòdon pas èsser suprimits fins que lo telecargament siá acabat.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_both">Per suprimir una invitacion o una presentacion, vos cal seleccionar la demanda e la responsa.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_introductions">Per suprimir una presentacion, vos cal seleccionar la demanda e la responsa.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_invitations">Per suprimir una invitacion, vos cal seleccionar la demanda e la responsa.</string>
|
|
||||||
<string name="delete_contact">Suprimir lo contacte</string>
|
<string name="delete_contact">Suprimir lo contacte</string>
|
||||||
<string name="dialog_title_delete_contact">Confirmatz la supression del contacte</string>
|
<string name="dialog_title_delete_contact">Confirmatz la supression del contacte</string>
|
||||||
<string name="dialog_message_delete_contact">Sètz segur de voler suprimir lo contacte e los messatges ligats a el ?</string>
|
<string name="dialog_message_delete_contact">Sètz segur de voler suprimir lo contacte e los messatges ligats a el ?</string>
|
||||||
@@ -173,6 +168,7 @@ Volètz suprimir vòstre compte e ne crear un nòu ?\n
|
|||||||
<string name="add_contact_remotely_title_case">Ajustar un contacte a distància</string>
|
<string name="add_contact_remotely_title_case">Ajustar un contacte a distància</string>
|
||||||
<string name="add_contact_nearby_title">Ajustatz un contacte a proximitat</string>
|
<string name="add_contact_nearby_title">Ajustatz un contacte a proximitat</string>
|
||||||
<string name="add_contact_remotely_title">Ajustatz un contacte a distància</string>
|
<string name="add_contact_remotely_title">Ajustatz un contacte a distància</string>
|
||||||
|
<string name="contact_name_hint">Donar un escais-nom a un contacte</string>
|
||||||
<string name="contact_link_intro">Picatz lo ligam del contacte aquí</string>
|
<string name="contact_link_intro">Picatz lo ligam del contacte aquí</string>
|
||||||
<string name="contact_link_hint">Ligam del contacte</string>
|
<string name="contact_link_hint">Ligam del contacte</string>
|
||||||
<string name="paste_button">Pegar</string>
|
<string name="paste_button">Pegar</string>
|
||||||
@@ -190,6 +186,7 @@ Volètz suprimir vòstre compte e ne crear un nòu ?\n
|
|||||||
<string name="pending_contact_requests_snackbar">I a de demandas d’apondon en espèra</string>
|
<string name="pending_contact_requests_snackbar">I a de demandas d’apondon en espèra</string>
|
||||||
<string name="pending_contact_requests">Demandas d’apondon en espèra</string>
|
<string name="pending_contact_requests">Demandas d’apondon en espèra</string>
|
||||||
<string name="no_pending_contacts">Cap de demanda en espèra</string>
|
<string name="no_pending_contacts">Cap de demanda en espèra</string>
|
||||||
|
<string name="add_contact_remote_connecting">Connexion…</string>
|
||||||
<string name="waiting_for_contact_to_come_online">En espèra que lo contacte passe en linha…</string>
|
<string name="waiting_for_contact_to_come_online">En espèra que lo contacte passe en linha…</string>
|
||||||
<string name="connecting">Connexion…</string>
|
<string name="connecting">Connexion…</string>
|
||||||
<string name="adding_contact">Apondon del contacte…</string>
|
<string name="adding_contact">Apondon del contacte…</string>
|
||||||
@@ -210,6 +207,9 @@ Volètz suprimir vòstre compte e ne crear un nòu ?\n
|
|||||||
<item quantity="one">Nòu contacte ajustat.</item>
|
<item quantity="one">Nòu contacte ajustat.</item>
|
||||||
<item quantity="other">%d nòus contactes ajustats.</item>
|
<item quantity="other">%d nòus contactes ajustats.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">L’apondon del contacte tarda mai que de costuma</string>
|
||||||
|
<string name="adding_contact_slow_title">Connexion impossibla al contacte</string>
|
||||||
|
<string name="adding_contact_slow_text">.L’apondon del contacte tarda mai que de costuma\n\nVerificatz que vòstre contacte aja ben recebut vòstre ligam e vos aja ajustat :</string>
|
||||||
<string name="offline_state">Cap de connexion Internet</string>
|
<string name="offline_state">Cap de connexion Internet</string>
|
||||||
<string name="duplicate_link_dialog_title">Duplicar lo ligam</string>
|
<string name="duplicate_link_dialog_title">Duplicar lo ligam</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Avètz ja una demanda en espèra amb aqueste ligam : %s</string>
|
<string name="duplicate_link_dialog_text_1">Avètz ja una demanda en espèra amb aqueste ligam : %s</string>
|
||||||
@@ -237,6 +237,7 @@ Volètz suprimir vòstre compte e ne crear un nòu ?\n
|
|||||||
<string name="introduction_button">Escafar l’introduccion</string>
|
<string name="introduction_button">Escafar l’introduccion</string>
|
||||||
<string name="introduction_sent">Vòstra admission es enviada.</string>
|
<string name="introduction_sent">Vòstra admission es enviada.</string>
|
||||||
<string name="introduction_error">Una error s’es produsida pendent l’admission</string>
|
<string name="introduction_error">Una error s’es produsida pendent l’admission</string>
|
||||||
|
<string name="introduction_response_error">Error pendent la responsa d’admission.</string>
|
||||||
<string name="introduction_request_sent">Avètz demandat a %2$s d’apondre %1$s</string>
|
<string name="introduction_request_sent">Avètz demandat a %2$s d’apondre %1$s</string>
|
||||||
<string name="introduction_request_received">%1$s vos prepausa d’apondre %2$s. Volètz apondre %2$s a vòstres contactes ?</string>
|
<string name="introduction_request_received">%1$s vos prepausa d’apondre %2$s. Volètz apondre %2$s a vòstres contactes ?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s vos demandèt d’apondre %2$s mas %2$s es ja dins vòstra tièra de contactes. Del moment que %1$s o sap pas, podètz çaquelà respondre :</string>
|
<string name="introduction_request_exists_received">%1$s vos demandèt d’apondre %2$s mas %2$s es ja dins vòstra tièra de contactes. Del moment que %1$s o sap pas, podètz çaquelà respondre :</string>
|
||||||
@@ -410,11 +411,20 @@ contactes qu’avètz partejat aqueste flux quitaràn benlèu de recebre las mes
|
|||||||
<string name="pref_theme_dark">Escur</string>
|
<string name="pref_theme_dark">Escur</string>
|
||||||
<string name="pref_theme_auto">Automatic (Segon l’ora)</string>
|
<string name="pref_theme_auto">Automatic (Segon l’ora)</string>
|
||||||
<string name="pref_theme_system">Per defaut sistèma</string>
|
<string name="pref_theme_system">Per defaut sistèma</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Ret</string>
|
||||||
|
<string name="bluetooth_setting">Se connectar per Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Quand de contactes son prèp</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Solament en apondre de contctes</string>
|
||||||
|
<string name="tor_network_setting">Se connectar via Internet (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automaticament basat sus l’emplaçament</string>
|
<string name="tor_network_setting_automatic">Automaticament basat sus l’emplaçament</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Utilizar Tor sens ponts</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Utilizar Tor amb ponts</string>
|
||||||
|
<string name="tor_network_setting_never">Se connectar pas</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automatic : %1$s (en %2$s)</string>
|
<string name="tor_network_setting_summary">Automatic : %1$s (en %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Utilizar la connexion del mobil</string>
|
<string name="tor_mobile_data_title">Utilizar la connexion del mobil</string>
|
||||||
|
<string name="tor_only_when_charging_title">Se connectar via Internet (Tor) pas qu’en cargament bateriá</string>
|
||||||
<string name="tor_only_when_charging_summary">Desactiva la connexion Internet quand l’aparelh manca de bateriá</string>
|
<string name="tor_only_when_charging_summary">Desactiva la connexion Internet quand l’aparelh manca de bateriá</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Seguretat</string>
|
<string name="security_settings_title">Seguretat</string>
|
||||||
@@ -455,6 +465,8 @@ contactes qu’avètz partejat aqueste flux quitaràn benlèu de recebre las mes
|
|||||||
<string name="panic_setting_signout_summary">Se desconnectar de Briar en apiejant lo boton Urgéncia ?</string>
|
<string name="panic_setting_signout_summary">Se desconnectar de Briar en apiejant lo boton Urgéncia ?</string>
|
||||||
<string name="purge_setting_title">Suprimir lo compte</string>
|
<string name="purge_setting_title">Suprimir lo compte</string>
|
||||||
<string name="purge_setting_summary">Suprimir vòstre compte en apiejant lo boton Urgéncia. Mèfi, aquò escafarà per totjorn vòstra identitat, vòstres contactes e messatges.</string>
|
<string name="purge_setting_summary">Suprimir vòstre compte en apiejant lo boton Urgéncia. Mèfi, aquò escafarà per totjorn vòstra identitat, vòstres contactes e messatges.</string>
|
||||||
|
<string name="uninstall_setting_title">Desinstallar Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Aquò demanda una confirmacion manuala.</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Notificacions</string>
|
<string name="notification_settings_title">Notificacions</string>
|
||||||
<string name="notify_sign_in_title">Me rapelar de me connectar</string>
|
<string name="notify_sign_in_title">Me rapelar de me connectar</string>
|
||||||
|
|||||||
@@ -104,6 +104,7 @@
|
|||||||
<string name="delete">Usuń</string>
|
<string name="delete">Usuń</string>
|
||||||
<string name="accept">Akceptuj</string>
|
<string name="accept">Akceptuj</string>
|
||||||
<string name="decline">Odrzuć</string>
|
<string name="decline">Odrzuć</string>
|
||||||
|
<string name="options">Opcje</string>
|
||||||
<string name="online">Online</string>
|
<string name="online">Online</string>
|
||||||
<string name="offline">Offline</string>
|
<string name="offline">Offline</string>
|
||||||
<string name="send">Wyślij</string>
|
<string name="send">Wyślij</string>
|
||||||
@@ -168,6 +169,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Dodaj Kontakt na odległość</string>
|
<string name="add_contact_remotely_title_case">Dodaj Kontakt na odległość</string>
|
||||||
<string name="add_contact_nearby_title">Dodaj kontakt w pobliżu</string>
|
<string name="add_contact_nearby_title">Dodaj kontakt w pobliżu</string>
|
||||||
<string name="add_contact_remotely_title">Dodaj kontakt na odległość</string>
|
<string name="add_contact_remotely_title">Dodaj kontakt na odległość</string>
|
||||||
|
<string name="contact_name_hint">Nadaj pseudonim kontaktowi</string>
|
||||||
<string name="contact_link_intro">Wprowadź tutaj link od swojego kontaktu</string>
|
<string name="contact_link_intro">Wprowadź tutaj link od swojego kontaktu</string>
|
||||||
<string name="contact_link_hint">Link kontaktu</string>
|
<string name="contact_link_hint">Link kontaktu</string>
|
||||||
<string name="paste_button">Wklej</string>
|
<string name="paste_button">Wklej</string>
|
||||||
@@ -185,6 +187,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Są prośby o dodanie do kontaktów</string>
|
<string name="pending_contact_requests_snackbar">Są prośby o dodanie do kontaktów</string>
|
||||||
<string name="pending_contact_requests">Prośby o dodanie do kontaktów</string>
|
<string name="pending_contact_requests">Prośby o dodanie do kontaktów</string>
|
||||||
<string name="no_pending_contacts">Brak próśb o dodanie do kontaktów</string>
|
<string name="no_pending_contacts">Brak próśb o dodanie do kontaktów</string>
|
||||||
|
<string name="add_contact_remote_connecting">Trwa łączenie...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Czekam, aż kontakt pojawi się online…</string>
|
<string name="waiting_for_contact_to_come_online">Czekam, aż kontakt pojawi się online…</string>
|
||||||
<string name="connecting">Trwa łączenie...</string>
|
<string name="connecting">Trwa łączenie...</string>
|
||||||
<string name="adding_contact">Dodawanie kontaktu…</string>
|
<string name="adding_contact">Dodawanie kontaktu…</string>
|
||||||
@@ -207,6 +210,9 @@
|
|||||||
<item quantity="many">Nowe kontakty dodane.</item>
|
<item quantity="many">Nowe kontakty dodane.</item>
|
||||||
<item quantity="other">Dodano %d nowych kontaktów.</item>
|
<item quantity="other">Dodano %d nowych kontaktów.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Dodawanie tego kontaktu zajmuje więcej czasu niż zwykle</string>
|
||||||
|
<string name="adding_contact_slow_title">Nie można połączyć się z Kontaktem</string>
|
||||||
|
<string name="adding_contact_slow_text">Dodawanie tego kontaktu zajmuje więcej czasu niż zwykle.\n\nProsze sprawdź czy twój kontakt otrzymał twój link i ciebie dodał:</string>
|
||||||
<string name="offline_state">Brak połączenia z Internetem</string>
|
<string name="offline_state">Brak połączenia z Internetem</string>
|
||||||
<string name="duplicate_link_dialog_title">Duplikat Linku</string>
|
<string name="duplicate_link_dialog_title">Duplikat Linku</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Masz już oczekujący kontakt z tym linkiem: %s</string>
|
<string name="duplicate_link_dialog_text_1">Masz już oczekujący kontakt z tym linkiem: %s</string>
|
||||||
@@ -233,6 +239,7 @@
|
|||||||
<string name="introduction_button">Wykonaj przedstawienie</string>
|
<string name="introduction_button">Wykonaj przedstawienie</string>
|
||||||
<string name="introduction_sent">Twoje przedstawienie zostało wysłane.</string>
|
<string name="introduction_sent">Twoje przedstawienie zostało wysłane.</string>
|
||||||
<string name="introduction_error">Wystąpił błąd podczas wykonywania przedstawienia.</string>
|
<string name="introduction_error">Wystąpił błąd podczas wykonywania przedstawienia.</string>
|
||||||
|
<string name="introduction_response_error">Wystąpił błąd podczas odpowiedzi na przedstawienie</string>
|
||||||
<string name="introduction_request_sent">Poprosiłeś o przedstawienie %1$s kontaktowi %2$s.</string>
|
<string name="introduction_request_sent">Poprosiłeś o przedstawienie %1$s kontaktowi %2$s.</string>
|
||||||
<string name="introduction_request_received">%1$s poprosił o możliwość przedstawienia Ciebie kontaktowi %2$s. Czy chcesz dodać %2$s do listy kontaktów?</string>
|
<string name="introduction_request_received">%1$s poprosił o możliwość przedstawienia Ciebie kontaktowi %2$s. Czy chcesz dodać %2$s do listy kontaktów?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s poprosił o możliwość przedstawienia Ciebie kontaktowi %2$s, ale %2$s jest już na liście Twoich kontaktów. Skoro %1$s może o tym nie wiedzieć, możesz nadal odpowiedzieć:</string>
|
<string name="introduction_request_exists_received">%1$s poprosił o możliwość przedstawienia Ciebie kontaktowi %2$s, ale %2$s jest już na liście Twoich kontaktów. Skoro %1$s może o tym nie wiedzieć, możesz nadal odpowiedzieć:</string>
|
||||||
@@ -411,12 +418,20 @@
|
|||||||
<string name="pref_theme_dark">Ciemny</string>
|
<string name="pref_theme_dark">Ciemny</string>
|
||||||
<string name="pref_theme_auto">Automatycznie (w czasie dnia)</string>
|
<string name="pref_theme_auto">Automatycznie (w czasie dnia)</string>
|
||||||
<string name="pref_theme_system">Domyślny Systemu</string>
|
<string name="pref_theme_system">Domyślny Systemu</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
<string name="network_settings_title">Połączenia</string>
|
<string name="network_settings_title">Sieci</string>
|
||||||
|
<string name="bluetooth_setting">Połącz przez Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Zawsze wtedy gdy kontakty są w pobliżu</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Tylko przy dodawaniu kontaktów</string>
|
||||||
|
<string name="tor_network_setting">Połącz przez Internet (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automatycznie bazując na lokalizacji</string>
|
<string name="tor_network_setting_automatic">Automatycznie bazując na lokalizacji</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Używaj Tor bez mostów</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Używaj Tor z mostami</string>
|
||||||
|
<string name="tor_network_setting_never">Nie łącz</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automatycznie: %1$s (za %2$s)</string>
|
<string name="tor_network_setting_summary">Automatycznie: %1$s (za %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Używaj danych komórkowych</string>
|
<string name="tor_mobile_data_title">Używaj danych komórkowych</string>
|
||||||
|
<string name="tor_only_when_charging_title">Łącz przez Internet (Tor) tylko podczas ładowania</string>
|
||||||
<string name="tor_only_when_charging_summary">Wyłącza połączenie Internetowe, gdy urządzenie pracuje na baterii</string>
|
<string name="tor_only_when_charging_summary">Wyłącza połączenie Internetowe, gdy urządzenie pracuje na baterii</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Bezpieczeństwo</string>
|
<string name="security_settings_title">Bezpieczeństwo</string>
|
||||||
@@ -457,6 +472,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Wyloguj się z Briar jeśli przycisk awaryjny zostanie wciśnięty</string>
|
<string name="panic_setting_signout_summary">Wyloguj się z Briar jeśli przycisk awaryjny zostanie wciśnięty</string>
|
||||||
<string name="purge_setting_title">Skasuj Konto</string>
|
<string name="purge_setting_title">Skasuj Konto</string>
|
||||||
<string name="purge_setting_summary">Skasuj Twoje konto Briar jeśli przycisk wyjścia awaryjnego zostanie wciśnięty. Ostrzeżenie: Ta akcja usunie permanentnie Twoje konto, kontakty i wiadomości</string>
|
<string name="purge_setting_summary">Skasuj Twoje konto Briar jeśli przycisk wyjścia awaryjnego zostanie wciśnięty. Ostrzeżenie: Ta akcja usunie permanentnie Twoje konto, kontakty i wiadomości</string>
|
||||||
|
<string name="uninstall_setting_title">Odinstaluj Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">To wymaga manualnego potwierdzenia w przypadku aktywowania procedury awaryjnej</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Powiadomienia</string>
|
<string name="notification_settings_title">Powiadomienia</string>
|
||||||
<string name="notify_sign_in_title">Przypomnij mi by się zalogować</string>
|
<string name="notify_sign_in_title">Przypomnij mi by się zalogować</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Senha</string>
|
<string name="enter_password">Senha</string>
|
||||||
<string name="try_again">Senha Incorreta, tente novamente</string>
|
<string name="try_again">Senha Incorreta, tente novamente</string>
|
||||||
<string name="dialog_title_cannot_check_password">Não foi possível verificar sua senha</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">O Briar não conseguiu verificar sua senha. Por favor, tente reiniciar o aparelho para resolver o problema.</string>
|
|
||||||
<string name="sign_in_button">Entrar</string>
|
<string name="sign_in_button">Entrar</string>
|
||||||
<string name="forgotten_password">Esqueci minha senha</string>
|
<string name="forgotten_password">Esqueci minha senha</string>
|
||||||
<string name="dialog_title_lost_password">Perdeu a senha</string>
|
<string name="dialog_title_lost_password">Perdeu a senha</string>
|
||||||
@@ -44,9 +42,7 @@
|
|||||||
<item quantity="other">Esta é uma versão de teste do Briar. Sua conta irá expirar em %d dias e não poderá ser renovada.</item>
|
<item quantity="other">Esta é uma versão de teste do Briar. Sua conta irá expirar em %d dias e não poderá ser renovada.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="expiry_date_reached">Este software expirou.\nObrigado por testar!</string>
|
<string name="expiry_date_reached">Este software expirou.\nObrigado por testar!</string>
|
||||||
<string name="download_briar">Para continuar usando o Briar, por favor baixe a versão mais recente.</string>
|
|
||||||
<string name="create_new_account">Você precisará criar uma nova conta, mas poderá usar o mesmo nome de usuária.</string>
|
<string name="create_new_account">Você precisará criar uma nova conta, mas poderá usar o mesmo nome de usuária.</string>
|
||||||
<string name="download_briar_button">Baixar a versão mais recente</string>
|
|
||||||
<string name="startup_open_database">Descriptografando Banco de Dados...</string>
|
<string name="startup_open_database">Descriptografando Banco de Dados...</string>
|
||||||
<string name="startup_migrate_database">Atualizando Banco de Dados...</string>
|
<string name="startup_migrate_database">Atualizando Banco de Dados...</string>
|
||||||
<string name="startup_compact_database">Compactando Banco de Dados...</string>
|
<string name="startup_compact_database">Compactando Banco de Dados...</string>
|
||||||
@@ -68,7 +64,7 @@
|
|||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
<string name="reminder_notification_title">Saiu do Briar</string>
|
<string name="reminder_notification_title">Saiu do Briar</string>
|
||||||
<string name="reminder_notification_text">Toque para fazer login novamente.</string>
|
<string name="reminder_notification_text">Toque para fazer login novamente.</string>
|
||||||
<string name="reminder_notification_channel_title">Lembrete de Login do Briar</string>
|
<string name="reminder_notification_channel_title">Lembrete do Login do Briar</string>
|
||||||
<string name="reminder_notification_dismiss">Dispensar</string>
|
<string name="reminder_notification_dismiss">Dispensar</string>
|
||||||
<string name="ongoing_notification_title">Conectado ao Briar</string>
|
<string name="ongoing_notification_title">Conectado ao Briar</string>
|
||||||
<string name="ongoing_notification_text">Toque para abrir o Briar</string>
|
<string name="ongoing_notification_text">Toque para abrir o Briar</string>
|
||||||
@@ -98,6 +94,7 @@
|
|||||||
<string name="delete">Deletar</string>
|
<string name="delete">Deletar</string>
|
||||||
<string name="accept">Aceitar</string>
|
<string name="accept">Aceitar</string>
|
||||||
<string name="decline">Recusar</string>
|
<string name="decline">Recusar</string>
|
||||||
|
<string name="options">Opções</string>
|
||||||
<string name="online">Online</string>
|
<string name="online">Online</string>
|
||||||
<string name="offline">Offline</string>
|
<string name="offline">Offline</string>
|
||||||
<string name="send">Enviar</string>
|
<string name="send">Enviar</string>
|
||||||
@@ -110,7 +107,6 @@
|
|||||||
<string name="fix">Consertar</string>
|
<string name="fix">Consertar</string>
|
||||||
<string name="help">Ajuda</string>
|
<string name="help">Ajuda</string>
|
||||||
<string name="sorry">Sentimos muito</string>
|
<string name="sorry">Sentimos muito</string>
|
||||||
<string name="error_start_activity">Indisponível no seu sistema</string>
|
|
||||||
<!--Contacts and Private Conversations-->
|
<!--Contacts and Private Conversations-->
|
||||||
<string name="no_contacts">Sem contatos para exibir</string>
|
<string name="no_contacts">Sem contatos para exibir</string>
|
||||||
<string name="no_contacts_action">Toque no ícone + para adicionar um contato</string>
|
<string name="no_contacts_action">Toque no ícone + para adicionar um contato</string>
|
||||||
@@ -125,17 +121,7 @@
|
|||||||
<string name="set_contact_alias">Alterar nome do contato</string>
|
<string name="set_contact_alias">Alterar nome do contato</string>
|
||||||
<string name="set_contact_alias_hint">Nome de contato</string>
|
<string name="set_contact_alias_hint">Nome de contato</string>
|
||||||
<string name="set_alias_button">Trocar</string>
|
<string name="set_alias_button">Trocar</string>
|
||||||
<string name="delete_all_messages">Deletar todas as mensagens</string>
|
|
||||||
<string name="dialog_title_delete_all_messages">Confirmar exclusão de mensagem</string>
|
|
||||||
<string name="dialog_message_delete_all_messages">Você tem certeza que deseja excluir todas as mensagens?</string>
|
|
||||||
<string name="dialog_title_not_all_messages_deleted">Não foi possível apagar todas as mensagens</string>
|
<string name="dialog_title_not_all_messages_deleted">Não foi possível apagar todas as mensagens</string>
|
||||||
<string name="dialog_message_not_deleted_ongoing_both">Mensagens relacionadas a convites e apresentações em andamento não podem ser deletadas até que o convite ou apresentação seja concluído. </string>
|
|
||||||
<string name="dialog_message_not_deleted_ongoing_introductions">Mensagens relacionadas a apresentações em andamento não podem ser deletadas até que a apresentação seja concluída.</string>
|
|
||||||
<string name="dialog_message_not_deleted_ongoing_invitations">Mensagens relacionadas a apresentações em andamento não podem ser deletadas até que a apresentação seja concluída.</string>
|
|
||||||
<string name="dialog_message_not_deleted_partly_downloaded">Mensagens baixadas parcialmente não podem ser deletas até que o download seja concluído.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_both">Para deletar um convite ou apresentação, você precisa selecionar a solicitação e a resposta.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_introductions">Para deletar uma apresentação, você precisa selecionar a solicitação e a resposta.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_invitations">Para deletar um convite, você precisa selecionar a solicitação e a resposta.</string>
|
|
||||||
<string name="delete_contact">Apagar contato</string>
|
<string name="delete_contact">Apagar contato</string>
|
||||||
<string name="dialog_title_delete_contact">Confirmar remoção do contato</string>
|
<string name="dialog_title_delete_contact">Confirmar remoção do contato</string>
|
||||||
<string name="dialog_message_delete_contact">Você tem certeza que quer remover este contato e todas mensagens trocadas com ele?</string>
|
<string name="dialog_message_delete_contact">Você tem certeza que quer remover este contato e todas mensagens trocadas com ele?</string>
|
||||||
@@ -144,14 +130,13 @@
|
|||||||
<string name="you">Você</string>
|
<string name="you">Você</string>
|
||||||
<string name="save_image">Salvar imagem</string>
|
<string name="save_image">Salvar imagem</string>
|
||||||
<string name="dialog_title_save_image">Salvar imagem?</string>
|
<string name="dialog_title_save_image">Salvar imagem?</string>
|
||||||
<string name="dialog_message_save_image">Salvando essa imagem você irá permitir que outros aplicativos a acessem.\n\nTem certeza que quer salvar? </string>
|
<string name="dialog_message_save_image">Salvando essa imagem irá permitir que outros aplicativos a acessem.\n\nVocê tem certeza que quer salvar? </string>
|
||||||
<string name="save_image_success">Imagem salva</string>
|
<string name="save_image_success">Imagem salva</string>
|
||||||
<string name="save_image_error">Não foi possível salvar imagem</string>
|
<string name="save_image_error">Não foi possível salvar imagem</string>
|
||||||
<string name="dialog_title_no_image_support">Imagens indisponíveis</string>
|
<string name="dialog_title_no_image_support">Imagens indisponíveis</string>
|
||||||
<string name="dialog_message_no_image_support">Seu contato do Briar ainda não suporta anexo de imagens. Quando ele atualizar o aplicativo, você verá um ícone diferente.</string>
|
<string name="dialog_message_no_image_support">Seu contato do Briar ainda não suporta anexo de imagens. Quando ele atualizar um você verá ícone diferente.</string>
|
||||||
<string name="dialog_title_image_support">Você agora pode enviar imagens para esse contato</string>
|
<string name="dialog_title_image_support">Você agora pode enviar imagens para esse contato</string>
|
||||||
<string name="dialog_message_image_support">Toque nesse ícone para anexar imagens.</string>
|
<string name="dialog_message_image_support">Toque nesse ícone para anexar imagens.</string>
|
||||||
<string name="messaging_too_many_attachments_toast">Apenas as primeiras %d imagens serão enviadas</string>
|
|
||||||
<!--Adding Contacts-->
|
<!--Adding Contacts-->
|
||||||
<string name="add_contact_title">Adicionar contato que está próximo</string>
|
<string name="add_contact_title">Adicionar contato que está próximo</string>
|
||||||
<string name="face_to_face">Você deve estar frente-a-frente com a pessoa que deseja adicionar como contato.\n\nIsso evita que alguém se passe por você ou leia suas mensagens no futuro.</string>
|
<string name="face_to_face">Você deve estar frente-a-frente com a pessoa que deseja adicionar como contato.\n\nIsso evita que alguém se passe por você ou leia suas mensagens no futuro.</string>
|
||||||
@@ -168,12 +153,13 @@
|
|||||||
<string name="connecting_to_device">Conectando a device\u2026</string>
|
<string name="connecting_to_device">Conectando a device\u2026</string>
|
||||||
<string name="authenticating_with_device">Autenticando com o dispositivo\u2026</string>
|
<string name="authenticating_with_device">Autenticando com o dispositivo\u2026</string>
|
||||||
<string name="connection_error_title">Não foi possível conectar-se ao seu contato</string>
|
<string name="connection_error_title">Não foi possível conectar-se ao seu contato</string>
|
||||||
<string name="connection_error_explanation">Por favor, certifique se ambos estão conectados na mesma rede Wi-Fi.</string>
|
<string name="connection_error_explanation">Por favor. certifique se ambos estão conectados na mesma rede Wi-Fi.</string>
|
||||||
<string name="connection_error_feedback">Se o problema persistir, por favor <a href="feedback">envie um feedback</a> para nos ajudar a melhorar o app.</string>
|
<string name="connection_error_feedback">Se o problema persistir, for favor <a href="feedback">enviar feedback</a> para nós ajudar a melhor o app.</string>
|
||||||
<!--Adding Contacts Remotely-->
|
<!--Adding Contacts Remotely-->
|
||||||
<string name="add_contact_remotely_title_case">Adicionar contato à distância</string>
|
<string name="add_contact_remotely_title_case">Adicionar contato à distância</string>
|
||||||
<string name="add_contact_nearby_title">Adicionar contato que está próximo</string>
|
<string name="add_contact_nearby_title">Adicionar contato que está próximo</string>
|
||||||
<string name="add_contact_remotely_title">Adicionar contato à distância</string>
|
<string name="add_contact_remotely_title">Adicionar contato à distância</string>
|
||||||
|
<string name="contact_name_hint">De um apelido ao contato</string>
|
||||||
<string name="contact_link_intro">Insira o link do seu contato aqui</string>
|
<string name="contact_link_intro">Insira o link do seu contato aqui</string>
|
||||||
<string name="contact_link_hint">Link do contato</string>
|
<string name="contact_link_hint">Link do contato</string>
|
||||||
<string name="paste_button">Colar</string>
|
<string name="paste_button">Colar</string>
|
||||||
@@ -183,7 +169,7 @@
|
|||||||
<string name="send_link_title">Passem os links</string>
|
<string name="send_link_title">Passem os links</string>
|
||||||
<string name="add_contact_choose_nickname">Escolha um apelido</string>
|
<string name="add_contact_choose_nickname">Escolha um apelido</string>
|
||||||
<string name="add_contact_choose_a_nickname">Insira um apelido</string>
|
<string name="add_contact_choose_a_nickname">Insira um apelido</string>
|
||||||
<string name="nickname_intro">Dê um apelido ao contato. Somente você pode ver esse apelido. </string>
|
<string name="nickname_intro">De um apelido ao contato. Somente você pode vê-lo. </string>
|
||||||
<string name="your_link">Passe esse link para o contato que você quer adicionar</string>
|
<string name="your_link">Passe esse link para o contato que você quer adicionar</string>
|
||||||
<string name="link_clip_label">Link Briar</string>
|
<string name="link_clip_label">Link Briar</string>
|
||||||
<string name="link_copied_toast">Link copiado</string>
|
<string name="link_copied_toast">Link copiado</string>
|
||||||
@@ -191,16 +177,17 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Existem solicitações de contato pendentes</string>
|
<string name="pending_contact_requests_snackbar">Existem solicitações de contato pendentes</string>
|
||||||
<string name="pending_contact_requests">Solicitações de contatos pendentes</string>
|
<string name="pending_contact_requests">Solicitações de contatos pendentes</string>
|
||||||
<string name="no_pending_contacts">Sem contatos pendentes</string>
|
<string name="no_pending_contacts">Sem contatos pendentes</string>
|
||||||
|
<string name="add_contact_remote_connecting">Conectando...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Esperando pelo usuário estar online ...</string>
|
<string name="waiting_for_contact_to_come_online">Esperando pelo usuário estar online ...</string>
|
||||||
<string name="connecting">Conectando...</string>
|
<string name="connecting">Conectando...</string>
|
||||||
<string name="adding_contact">Adicionando contato ...</string>
|
<string name="adding_contact">Adicionando contato ...</string>
|
||||||
<string name="adding_contact_failed">Adicionar o contato falhou</string>
|
<string name="adding_contact_failed">Adicionar o contato falhou</string>
|
||||||
<string name="dialog_title_remove_pending_contact">Confirme a remoção </string>
|
<string name="dialog_title_remove_pending_contact">Confirme a remoção </string>
|
||||||
<string name="dialog_message_remove_pending_contact">Esse contato ainda está sendo adicionado. Se você removê-lo agora, o mesmo não será adicionado</string>
|
<string name="dialog_message_remove_pending_contact">Esse contato ainda está sendo adicionado. Se você removê-lo agora, o mesmo não será adicionado</string>
|
||||||
<string name="own_link_error">Insira o link do seu contato, não o seu próprio </string>
|
<string name="own_link_error">Insira o link do seu contato, não seu próprio </string>
|
||||||
<string name="nickname_missing">Por favor insira um apelido</string>
|
<string name="nickname_missing">Por favor insira um apelido</string>
|
||||||
<string name="invalid_link">Link invalido</string>
|
<string name="invalid_link">Link invalido</string>
|
||||||
<string name="unsupported_link">Esse link veio de uma versão mais recente do Briar. Por favor atualize para a versão mais recente e tente novamente </string>
|
<string name="unsupported_link">Esse link veio de uma versão mais recente do Briar. Por favor atualize para versão mais recente e tente novamente </string>
|
||||||
<string name="intent_own_link">Você abriu seu próprio link. Utilize o link do contato que quer adicionar!</string>
|
<string name="intent_own_link">Você abriu seu próprio link. Utilize o link do contato que quer adicionar!</string>
|
||||||
<string name="missing_link">Por favor insira um link</string>
|
<string name="missing_link">Por favor insira um link</string>
|
||||||
<!--This is a numeral indicating the first step in a series of screens-->
|
<!--This is a numeral indicating the first step in a series of screens-->
|
||||||
@@ -211,10 +198,12 @@
|
|||||||
<item quantity="one">Novo contato adicionado.</item>
|
<item quantity="one">Novo contato adicionado.</item>
|
||||||
<item quantity="other">%dnovos contados adicionados.</item>
|
<item quantity="other">%dnovos contados adicionados.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Adicionar este contato está demorando mais que o normal</string>
|
||||||
|
<string name="adding_contact_slow_title">Não foi possível conectar ao contato </string>
|
||||||
|
<string name="adding_contact_slow_text">Adicionar este contato está demorando mais que o normal.\n\nPor favor se certifique que o seu contato recebeu seu link e adicionou você: </string>
|
||||||
<string name="offline_state">Sem conexão à Internet</string>
|
<string name="offline_state">Sem conexão à Internet</string>
|
||||||
<string name="duplicate_link_dialog_title">Link duplicado</string>
|
<string name="duplicate_link_dialog_title">Link duplicado</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Você já tem um contato pendente com esse link: %s </string>
|
<string name="duplicate_link_dialog_text_1">Você já tem um contato pendente com esse link: %s </string>
|
||||||
<string name="duplicate_link_dialog_text_1_contact">Você já possui um contato com esse link: %s</string>
|
|
||||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||||
<string name="duplicate_link_dialog_text_2">%s e %s são a mesma pessoa?</string>
|
<string name="duplicate_link_dialog_text_2">%s e %s são a mesma pessoa?</string>
|
||||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||||
@@ -232,12 +221,13 @@
|
|||||||
<string name="introduction_onboarding_text">Você pode apresentar seus contatos entre si, assim eles não precisam se encontrar pessoalmente para se comunicar no Briar.</string>
|
<string name="introduction_onboarding_text">Você pode apresentar seus contatos entre si, assim eles não precisam se encontrar pessoalmente para se comunicar no Briar.</string>
|
||||||
<string name="introduction_menu_item">Fazer apresentação</string>
|
<string name="introduction_menu_item">Fazer apresentação</string>
|
||||||
<string name="introduction_activity_title">Selecionar contato</string>
|
<string name="introduction_activity_title">Selecionar contato</string>
|
||||||
<string name="introduction_not_possible">Você já tem uma apresentação em andamento com esses contatos. Por favor, permita que isso termine primeiro. Se você ou seus contatos raramente ficam on-line, isso pode levar algum tempo.</string>
|
<string name="introduction_not_possible">Você já tem uma introdução em andamento com esses contatos. Por favor, permita que isso termine primeiro. Se você ou seus contatos raramente estiverem on-line, isso pode levar algum tempo.</string>
|
||||||
<string name="introduction_message_title">Apresentar contatos</string>
|
<string name="introduction_message_title">Apresentar contatos</string>
|
||||||
<string name="introduction_message_hint">Adicione uma mensagem (opcional)</string>
|
<string name="introduction_message_hint">Adicione uma mensagem (opcional)</string>
|
||||||
<string name="introduction_button">Fazer apresentação</string>
|
<string name="introduction_button">Fazer apresentação</string>
|
||||||
<string name="introduction_sent">Sua apresentação foi enviada.</string>
|
<string name="introduction_sent">Sua apresentação foi enviada.</string>
|
||||||
<string name="introduction_error">Houve um erro ao fazer a apresentação</string>
|
<string name="introduction_error">Houve um erro ao fazer a apresentação</string>
|
||||||
|
<string name="introduction_response_error">Erro ao responder à apresentação</string>
|
||||||
<string name="introduction_request_sent">Você recebeu um pedido para apresentar %1$s a %2$s.</string>
|
<string name="introduction_request_sent">Você recebeu um pedido para apresentar %1$s a %2$s.</string>
|
||||||
<string name="introduction_request_received">%1$s pediu para apresentar você a %2$s. Você quer adicionar %2$s a sua lista de contatos?</string>
|
<string name="introduction_request_received">%1$s pediu para apresentar você a %2$s. Você quer adicionar %2$s a sua lista de contatos?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s pediu para apresentar você a %2$s, mas %2$s já está na sua lista de contatos. Já que %1$s não sabe disso, você ainda pode responder:</string>
|
<string name="introduction_request_exists_received">%1$s pediu para apresentar você a %2$s, mas %2$s já está na sua lista de contatos. Já que %1$s não sabe disso, você ainda pode responder:</string>
|
||||||
@@ -250,7 +240,7 @@
|
|||||||
<string name="introduction_response_declined_received_by_introducee">%1$s disse que %2$s recusou a apresentação.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s disse que %2$s recusou a apresentação.</string>
|
||||||
<!--Private Groups-->
|
<!--Private Groups-->
|
||||||
<string name="groups_list_empty">Sem grupos para exibir</string>
|
<string name="groups_list_empty">Sem grupos para exibir</string>
|
||||||
<string name="groups_list_empty_action">Toque no ícone + para criar um grupo, ou peça a seus contatos para compartilhar grupos com você</string>
|
<string name="groups_list_empty_action">Toque no ícone + para criar um grupo, ou peça seus contatos compartilhar os grupos com você</string>
|
||||||
<string name="groups_created_by">Criado por %s.</string>
|
<string name="groups_created_by">Criado por %s.</string>
|
||||||
<plurals name="messages">
|
<plurals name="messages">
|
||||||
<item quantity="one">%d mensagem</item>
|
<item quantity="one">%d mensagem</item>
|
||||||
@@ -319,7 +309,7 @@
|
|||||||
<string name="btn_reply">Responder</string>
|
<string name="btn_reply">Responder</string>
|
||||||
<string name="forum_leave">Sair do fórum</string>
|
<string name="forum_leave">Sair do fórum</string>
|
||||||
<string name="dialog_title_leave_forum">Confirmar saída do fórum</string>
|
<string name="dialog_title_leave_forum">Confirmar saída do fórum</string>
|
||||||
<string name="dialog_message_leave_forum">Você tem certeza que quer sair deste fórum?\n\nQuaisquer contatos com quem você tenha compartilhado este fórum podem parar de receber atualizações dele.</string>
|
<string name="dialog_message_leave_forum">Você tem certeza que quer sair deste fórum?\n\nContatos com quem você tenha compartilhado este fórum podem parar de receber atualizações dele.</string>
|
||||||
<string name="dialog_button_leave">Sair</string>
|
<string name="dialog_button_leave">Sair</string>
|
||||||
<string name="forum_left_toast">Sair do fórum</string>
|
<string name="forum_left_toast">Sair do fórum</string>
|
||||||
<!--Forum Sharing-->
|
<!--Forum Sharing-->
|
||||||
@@ -334,7 +324,7 @@
|
|||||||
<string name="forum_invitation_received">%1$s compartilhou o fórum \"%2$s\" com você.</string>
|
<string name="forum_invitation_received">%1$s compartilhou o fórum \"%2$s\" com você.</string>
|
||||||
<string name="forum_invitation_sent">Você compartilhou o fórum \"%1$s\" com %2$s.</string>
|
<string name="forum_invitation_sent">Você compartilhou o fórum \"%1$s\" com %2$s.</string>
|
||||||
<string name="forum_invitations_title">Convites para Foruns</string>
|
<string name="forum_invitations_title">Convites para Foruns</string>
|
||||||
<string name="forum_invitation_exists">Você já aceitou um convite para este fórum.\n\nPorém, aceitar mais convites fará com que sua conexão ao fórum fique mais rápida e mais confiável.</string>
|
<string name="forum_invitation_exists">Você já aceitou um convite para este fórum.\n\nAceitar mais convites fará com que sua conexão ao fórum fique mais rápida e mais confiável.</string>
|
||||||
<string name="forum_joined_toast">Entrou no fórum</string>
|
<string name="forum_joined_toast">Entrou no fórum</string>
|
||||||
<string name="forum_declined_toast">Convite recusado</string>
|
<string name="forum_declined_toast">Convite recusado</string>
|
||||||
<string name="shared_by_format">Compartilhado por %s</string>
|
<string name="shared_by_format">Compartilhado por %s</string>
|
||||||
@@ -363,7 +353,7 @@
|
|||||||
<string name="blogs_feed_empty_state">Nenhum post para ser exibido</string>
|
<string name="blogs_feed_empty_state">Nenhum post para ser exibido</string>
|
||||||
<string name="blogs_feed_empty_state_action">Posts de seus contatos e blogs que você está inscrito vão aparecer aqui\n\n Toque no ícone da caneta para escrever um post </string>
|
<string name="blogs_feed_empty_state_action">Posts de seus contatos e blogs que você está inscrito vão aparecer aqui\n\n Toque no ícone da caneta para escrever um post </string>
|
||||||
<string name="blogs_remove_blog">Remover Blog</string>
|
<string name="blogs_remove_blog">Remover Blog</string>
|
||||||
<string name="blogs_remove_blog_dialog_message">Você tem certeza que quer remover este blog?\n\nOs posts serão removidos do seu dispositivo mas não dos dispositivos das outras pessoas.\n\nContatos com quem você tenha compartilhado este blog vão parar de receber atualizações dele.</string>
|
<string name="blogs_remove_blog_dialog_message">Você tem certeza que quer remover este blog?\n\nOs posts serão removidos do seu dispositivo mas não dos dispositivos das outras pessoas.\n\nContatos com quem você tenha compartilhado este blog devem parar de receber atualizações dele.</string>
|
||||||
<string name="blogs_remove_blog_ok">Remover</string>
|
<string name="blogs_remove_blog_ok">Remover</string>
|
||||||
<string name="blogs_blog_removed">Blog removido</string>
|
<string name="blogs_blog_removed">Blog removido</string>
|
||||||
<string name="blogs_reblog_comment_hint">Adicionar um comentário (opcional)</string>
|
<string name="blogs_reblog_comment_hint">Adicionar um comentário (opcional)</string>
|
||||||
@@ -393,7 +383,7 @@
|
|||||||
<string name="blogs_rss_feeds_manage_author">Autor:</string>
|
<string name="blogs_rss_feeds_manage_author">Autor:</string>
|
||||||
<string name="blogs_rss_feeds_manage_updated">Última Atualização:</string>
|
<string name="blogs_rss_feeds_manage_updated">Última Atualização:</string>
|
||||||
<string name="blogs_rss_remove_feed">Remover Feed</string>
|
<string name="blogs_rss_remove_feed">Remover Feed</string>
|
||||||
<string name="blogs_rss_remove_feed_dialog_message">Você tem certeza que deseja remover este feed?\n\nOs posts serão removidos do seus dispositivo mas não dos dispositivos de outras pessoas.\n\nContatos com quem você tenha compartilhado este feed vão parar de receber atualizações dele.</string>
|
<string name="blogs_rss_remove_feed_dialog_message">Você tem certeza que deseja remover este feed?\n\nOs posts serão removidos do seus dispositivo mas não dos dispositivos de outras pessoas.\n\nContatos com quem você tenha compartilhado este feed devem parar de receber atualizações dele.</string>
|
||||||
<string name="blogs_rss_remove_feed_ok">Remover</string>
|
<string name="blogs_rss_remove_feed_ok">Remover</string>
|
||||||
<string name="blogs_rss_feeds_manage_delete_error">O Feed não pode ser deletado!</string>
|
<string name="blogs_rss_feeds_manage_delete_error">O Feed não pode ser deletado!</string>
|
||||||
<string name="blogs_rss_feeds_manage_empty_state">Nenhum feed RSS para ser exibido\n\nPressione o ícone + para importar um feed</string>
|
<string name="blogs_rss_feeds_manage_empty_state">Nenhum feed RSS para ser exibido\n\nPressione o ícone + para importar um feed</string>
|
||||||
@@ -408,12 +398,20 @@
|
|||||||
<string name="pref_theme_dark">Escuro</string>
|
<string name="pref_theme_dark">Escuro</string>
|
||||||
<string name="pref_theme_auto">Automático (dia)</string>
|
<string name="pref_theme_auto">Automático (dia)</string>
|
||||||
<string name="pref_theme_system">Padrão do Sistema</string>
|
<string name="pref_theme_system">Padrão do Sistema</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
<string name="network_settings_title">Conexões</string>
|
<string name="network_settings_title">Redes</string>
|
||||||
|
<string name="bluetooth_setting">Conectar via Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Sempre que estiver perto de contatos</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Somente quando adicionando contatos</string>
|
||||||
|
<string name="tor_network_setting">Conectar via Internet (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automático baseado na localização </string>
|
<string name="tor_network_setting_automatic">Automático baseado na localização </string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Usar o Tor sem pontes</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Usar tor com pontes</string>
|
||||||
|
<string name="tor_network_setting_never">Não conectar</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automático: %1$s (em %2$s) </string>
|
<string name="tor_network_setting_summary">Automático: %1$s (em %2$s) </string>
|
||||||
<string name="tor_mobile_data_title">Usar dados moveis</string>
|
<string name="tor_mobile_data_title">Usar dados moveis</string>
|
||||||
|
<string name="tor_only_when_charging_title">Conectar via Internet (Tor) apenas enquanto carregando</string>
|
||||||
<string name="tor_only_when_charging_summary">Desabilita conexão à Internet quando seu dispositivo estiver somente na bateria</string>
|
<string name="tor_only_when_charging_summary">Desabilita conexão à Internet quando seu dispositivo estiver somente na bateria</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Segurança</string>
|
<string name="security_settings_title">Segurança</string>
|
||||||
@@ -422,7 +420,7 @@
|
|||||||
<string name="pref_lock_disabled_summary">Para usar esse recurso, configure um bloqueio de tela para seu dispositivo</string>
|
<string name="pref_lock_disabled_summary">Para usar esse recurso, configure um bloqueio de tela para seu dispositivo</string>
|
||||||
<string name="pref_lock_timeout_title">Bloqueio de app por tempo de inatividade</string>
|
<string name="pref_lock_timeout_title">Bloqueio de app por tempo de inatividade</string>
|
||||||
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
|
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
|
||||||
<string name="pref_lock_timeout_summary">Quando o Briar não estiver sendo usando, bloquear automaticamente após %s</string>
|
<string name="pref_lock_timeout_summary">Quando o briar não estiver sendo usando, bloquear automaticamente após %s</string>
|
||||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||||
<string name="pref_lock_timeout_1">1 minuto</string>
|
<string name="pref_lock_timeout_1">1 minuto</string>
|
||||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||||
@@ -454,10 +452,12 @@
|
|||||||
<string name="panic_setting_signout_summary">Desconectar do Briar se o botão de pânico for apertado</string>
|
<string name="panic_setting_signout_summary">Desconectar do Briar se o botão de pânico for apertado</string>
|
||||||
<string name="purge_setting_title">Apagar conta</string>
|
<string name="purge_setting_title">Apagar conta</string>
|
||||||
<string name="purge_setting_summary">Apagar sua conta do Briar se o botão de pânico for apertado. Atenção: isso irá apagar permanentemente suas identidades, contatos e mensagens</string>
|
<string name="purge_setting_summary">Apagar sua conta do Briar se o botão de pânico for apertado. Atenção: isso irá apagar permanentemente suas identidades, contatos e mensagens</string>
|
||||||
|
<string name="uninstall_setting_title">Desinstalar o Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Isso requer configuração manual em um evento de pânico</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Notificações</string>
|
<string name="notification_settings_title">Notificações</string>
|
||||||
<string name="notify_sign_in_title">Lembre-me de fazer login</string>
|
<string name="notify_sign_in_title">Lembre-me de fazer login</string>
|
||||||
<string name="notify_sign_in_summary">Mostrar um lembrete quando o telefone é iniciado ou o aplicativo for atualizado</string>
|
<string name="notify_sign_in_summary">Mostrar um lembrete quando o telefone é iniciado ou o aplicativo foi atualizado</string>
|
||||||
<string name="notify_private_messages_setting_title">Mensagens privadas</string>
|
<string name="notify_private_messages_setting_title">Mensagens privadas</string>
|
||||||
<string name="notify_private_messages_setting_summary">Mostrar alertas para mensagens privadas</string>
|
<string name="notify_private_messages_setting_summary">Mostrar alertas para mensagens privadas</string>
|
||||||
<string name="notify_private_messages_setting_summary_26">Configurar alertas para mensagens privadas</string>
|
<string name="notify_private_messages_setting_summary_26">Configurar alertas para mensagens privadas</string>
|
||||||
@@ -482,7 +482,7 @@
|
|||||||
<!--Link Warning-->
|
<!--Link Warning-->
|
||||||
<string name="link_warning_title">Aviso sobre Link</string>
|
<string name="link_warning_title">Aviso sobre Link</string>
|
||||||
<string name="link_warning_intro">Você está prestes a abrir esse link em um Aplicativo Externo.</string>
|
<string name="link_warning_intro">Você está prestes a abrir esse link em um Aplicativo Externo.</string>
|
||||||
<string name="link_warning_text">Isso pode ser usado para identificar você. Pense sobre se quer ou não confiar na pessoa que te enviou esse link e considere abri-lo no Tor Browser.</string>
|
<string name="link_warning_text">Isso pode ser usado para identificar você. Pense sobre se quer ou não confiar na pessoa que te enviou esse link e considere abrindo o no Tor Browser</string>
|
||||||
<string name="link_warning_open_link">Abrir Link</string>
|
<string name="link_warning_open_link">Abrir Link</string>
|
||||||
<!--Crash Reporter-->
|
<!--Crash Reporter-->
|
||||||
<string name="crash_report_title">Relatório de falhas do Briar</string>
|
<string name="crash_report_title">Relatório de falhas do Briar</string>
|
||||||
@@ -510,9 +510,9 @@
|
|||||||
<string name="permission_camera_title">Permissão da câmera</string>
|
<string name="permission_camera_title">Permissão da câmera</string>
|
||||||
<string name="permission_camera_request_body">O Briar precisa acessar a câmera para pode escanear o código QR.</string>
|
<string name="permission_camera_request_body">O Briar precisa acessar a câmera para pode escanear o código QR.</string>
|
||||||
<string name="permission_location_title">Permissão para localização</string>
|
<string name="permission_location_title">Permissão para localização</string>
|
||||||
<string name="permission_location_request_body">Para encontrar dispositivos Bluetooth, o Briar precisa de permissão para acessar sua localização.\n\nO Briar não armazena sua localização ou a compartilha com qualquer pessoa.</string>
|
<string name="permission_location_request_body">Para encontrar dispositivos Bluetooth, Briar precisa de permissão para acessar sua localização.\n\nBriar não armazena sua localização ou a compartilha com qualquer pessoa.</string>
|
||||||
<string name="permission_camera_location_title">Câmera e localização</string>
|
<string name="permission_camera_location_title">Câmera e localização</string>
|
||||||
<string name="permission_camera_location_request_body">Para escanear o código QR, O Briar precisa de acesso à câmera.\n\nPara encontrar dispositivos Bluetooth, O Briar precisa de permissão para acessar a localização.\n\nO Briar não armazena seu localização ou a compartilhar com qualquer pessoa.</string>
|
<string name="permission_camera_location_request_body">Para escanear o código QR, Briar precisa de acesso a câmera.\n\nPara encontrar dispositivos Bluetooth, Briar precisa de permissão para acessar a localização.\n\nBriar não armazena seu localização ou a compartilhar com qualquer pessoa.</string>
|
||||||
<string name="permission_camera_denied_body">Você negou acesso à câmera, mas para adicionar contatos você precisa da câmera.\n\nPor favor, pense em liberar o acesso a ela.</string>
|
<string name="permission_camera_denied_body">Você negou acesso à câmera, mas para adicionar contatos você precisa da câmera.\n\nPor favor, pense em liberar o acesso a ela.</string>
|
||||||
<string name="qr_code">Código QR</string>
|
<string name="qr_code">Código QR</string>
|
||||||
<string name="show_qr_code_fullscreen">Mostrar o código QR na tela cheia</string>
|
<string name="show_qr_code_fullscreen">Mostrar o código QR na tela cheia</string>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<!--Setup-->
|
<!--Setup-->
|
||||||
<string name="setup_title">Bine ați venit la Briar</string>
|
<string name="setup_title">Bine ai venit la Briar</string>
|
||||||
<string name="setup_name_explanation">Numele dumneavoastră va fi afișat lângă orice conținut trimiteți. Nu îl veți putea schimba după crearea contului.</string>
|
<string name="setup_name_explanation">Numele dumneavoastră va fi afișat lângă orice conținut trimiteți. Nu îl veți putea schimba după crearea contului.</string>
|
||||||
<string name="setup_next">Următorul</string>
|
<string name="setup_next">Următorul</string>
|
||||||
<string name="setup_password_intro">Alegeți o parolă</string>
|
<string name="setup_password_intro">Alegeți o parolă</string>
|
||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Parola</string>
|
<string name="enter_password">Parola</string>
|
||||||
<string name="try_again">Parolă greșită, reîncercați</string>
|
<string name="try_again">Parolă greșită, reîncercați</string>
|
||||||
<string name="dialog_title_cannot_check_password">Nu se poate verifica parola</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar nu poate verifica parola. Încercați să reporniți dispozitivul pentru a rezolva această problemă.</string>
|
|
||||||
<string name="sign_in_button">Autentificare</string>
|
<string name="sign_in_button">Autentificare</string>
|
||||||
<string name="forgotten_password">Am uitat parola</string>
|
<string name="forgotten_password">Am uitat parola</string>
|
||||||
<string name="dialog_title_lost_password">Parolă uitată</string>
|
<string name="dialog_title_lost_password">Parolă uitată</string>
|
||||||
@@ -103,6 +101,7 @@
|
|||||||
<string name="delete">Șterge</string>
|
<string name="delete">Șterge</string>
|
||||||
<string name="accept">Acceptă</string>
|
<string name="accept">Acceptă</string>
|
||||||
<string name="decline">Refuză</string>
|
<string name="decline">Refuză</string>
|
||||||
|
<string name="options">Opțiuni</string>
|
||||||
<string name="online">Conectat</string>
|
<string name="online">Conectat</string>
|
||||||
<string name="offline">Deconectat</string>
|
<string name="offline">Deconectat</string>
|
||||||
<string name="send">Trimite</string>
|
<string name="send">Trimite</string>
|
||||||
@@ -179,6 +178,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Adaugă un contact la distanță</string>
|
<string name="add_contact_remotely_title_case">Adaugă un contact la distanță</string>
|
||||||
<string name="add_contact_nearby_title">Adaugă un contact din apropiere</string>
|
<string name="add_contact_nearby_title">Adaugă un contact din apropiere</string>
|
||||||
<string name="add_contact_remotely_title">Adaugă un contact la distanță</string>
|
<string name="add_contact_remotely_title">Adaugă un contact la distanță</string>
|
||||||
|
<string name="contact_name_hint">Introduceți un nume pentru contact</string>
|
||||||
<string name="contact_link_intro">Introduceți adresa contactului dumneavoastră aici</string>
|
<string name="contact_link_intro">Introduceți adresa contactului dumneavoastră aici</string>
|
||||||
<string name="contact_link_hint">Adresa contactului</string>
|
<string name="contact_link_hint">Adresa contactului</string>
|
||||||
<string name="paste_button">Lipește</string>
|
<string name="paste_button">Lipește</string>
|
||||||
@@ -196,6 +196,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Există solicitări de contact în așteptare</string>
|
<string name="pending_contact_requests_snackbar">Există solicitări de contact în așteptare</string>
|
||||||
<string name="pending_contact_requests">Solicitări de contact în așteptare</string>
|
<string name="pending_contact_requests">Solicitări de contact în așteptare</string>
|
||||||
<string name="no_pending_contacts">Nici un contact în așteptare</string>
|
<string name="no_pending_contacts">Nici un contact în așteptare</string>
|
||||||
|
<string name="add_contact_remote_connecting">Se conectează...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Așteptăm contactul să se conecteze…</string>
|
<string name="waiting_for_contact_to_come_online">Așteptăm contactul să se conecteze…</string>
|
||||||
<string name="connecting">Se conectează...</string>
|
<string name="connecting">Se conectează...</string>
|
||||||
<string name="adding_contact">Se adaugă contactul…</string>
|
<string name="adding_contact">Se adaugă contactul…</string>
|
||||||
@@ -217,6 +218,9 @@
|
|||||||
<item quantity="few">%d contacte noi adăugate.</item>
|
<item quantity="few">%d contacte noi adăugate.</item>
|
||||||
<item quantity="other">%d de contacte noi adăugate.</item>
|
<item quantity="other">%d de contacte noi adăugate.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Se pare că durează mai mult să se adauge acest contact</string>
|
||||||
|
<string name="adding_contact_slow_title">Nu s-a putut face conectarea contactului</string>
|
||||||
|
<string name="adding_contact_slow_text">Se pare că durează mai mult să se adauge acest contact.\n\nVă rugăm să verificați dacă și contactul a primit adresa dumneavoastră și va adăugat:</string>
|
||||||
<string name="offline_state">Nu este disponibilă o conexiune la internet</string>
|
<string name="offline_state">Nu este disponibilă o conexiune la internet</string>
|
||||||
<string name="duplicate_link_dialog_title">Adresă duplicat</string>
|
<string name="duplicate_link_dialog_title">Adresă duplicat</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Deja aveți un contact în așteptare cu această adresă: %s</string>
|
<string name="duplicate_link_dialog_text_1">Deja aveți un contact în așteptare cu această adresă: %s</string>
|
||||||
@@ -244,6 +248,7 @@
|
|||||||
<string name="introduction_button">Fă o recomandare</string>
|
<string name="introduction_button">Fă o recomandare</string>
|
||||||
<string name="introduction_sent">Recomandarea dumneavoastră a fost trimisă.</string>
|
<string name="introduction_sent">Recomandarea dumneavoastră a fost trimisă.</string>
|
||||||
<string name="introduction_error">A apărut o eroare în procesul de recomandare.</string>
|
<string name="introduction_error">A apărut o eroare în procesul de recomandare.</string>
|
||||||
|
<string name="introduction_response_error">Eroare atunci când s-a răspuns la recomandare</string>
|
||||||
<string name="introduction_request_sent">Ați cerut recomandarea %1$s către %2$s.</string>
|
<string name="introduction_request_sent">Ați cerut recomandarea %1$s către %2$s.</string>
|
||||||
<string name="introduction_request_received">%1$s a cerut să vă recomande către %2$s. Doriți să adăugați pe %2$s la lista dumneavoastră de contacte?</string>
|
<string name="introduction_request_received">%1$s a cerut să vă recomande către %2$s. Doriți să adăugați pe %2$s la lista dumneavoastră de contacte?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s a cerut să vă recomande către %2$s, dar %2$s este deja în lista dumneavoastră de contacte. Cum %1$s s-ar putea să nu știe asta, puteți totuși răspunde:</string>
|
<string name="introduction_request_exists_received">%1$s a cerut să vă recomande către %2$s, dar %2$s este deja în lista dumneavoastră de contacte. Cum %1$s s-ar putea să nu știe asta, puteți totuși răspunde:</string>
|
||||||
@@ -418,21 +423,20 @@
|
|||||||
<string name="pref_theme_dark">Închisă</string>
|
<string name="pref_theme_dark">Închisă</string>
|
||||||
<string name="pref_theme_auto">Automat (Zi lumina)</string>
|
<string name="pref_theme_auto">Automat (Zi lumina)</string>
|
||||||
<string name="pref_theme_system">Implicit sistem</string>
|
<string name="pref_theme_system">Implicit sistem</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
<string name="network_settings_title">Conexiuni</string>
|
<string name="network_settings_title">Rețele</string>
|
||||||
<string name="bluetooth_setting">Conectare la contacte prin Bluetooth</string>
|
<string name="bluetooth_setting">Conectare prin Bluetooth</string>
|
||||||
<string name="wifi_setting">Conectare la contacte prin rețeaua Wi-Fi comună</string>
|
<string name="bluetooth_setting_enabled">Atunci când contactele vă sunt în apropiere</string>
|
||||||
<string name="tor_enable_title">Conectare la contacte prin Internet</string>
|
<string name="bluetooth_setting_disabled">Doar la adăugarea contactelor</string>
|
||||||
<string name="tor_enable_summary">Toate conexiunile se fac prin rețeaua Tor pentru protejarea confidențialității</string>
|
<string name="tor_network_setting">Conectare prin Internet (rețeaua Tor)</string>
|
||||||
<string name="tor_network_setting">Metoda de conectare la rețeaua Tor</string>
|
|
||||||
<string name="tor_network_setting_automatic">Automat în funcție de locație</string>
|
<string name="tor_network_setting_automatic">Automat în funcție de locație</string>
|
||||||
<string name="tor_network_setting_without_bridges">Folosire rețea Tor fără conexiuni punte</string>
|
<string name="tor_network_setting_without_bridges">Folosește rețeaua Tor fără conexiuni bridge</string>
|
||||||
<string name="tor_network_setting_with_bridges">Folosire rețea Tor cu conexiuni punte</string>
|
<string name="tor_network_setting_with_bridges">Folosește rețeaua Tor cu conexiuni bridge</string>
|
||||||
<string name="tor_network_setting_never">Fără conexiune la Internet</string>
|
<string name="tor_network_setting_never">Nu conecta</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automat: %1$s (în %2$s)</string>
|
<string name="tor_network_setting_summary">Automat: %1$s (în %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Utilizează date mobile</string>
|
<string name="tor_mobile_data_title">Utilizează date mobile</string>
|
||||||
<string name="tor_only_when_charging_title">Conectare la Internet doar atunci când dispozitivul se încarcă</string>
|
<string name="tor_only_when_charging_title">Conectare prin Internet (rețeaua Tor) doar atunci când dispozitivul se încarcă</string>
|
||||||
<string name="tor_only_when_charging_summary">Se dezactivează conexiunea la Internet atunci când dispozitivul funcționează pe baterie</string>
|
<string name="tor_only_when_charging_summary">Se dezactivează conexiunea la Internet atunci când dispozitivul funcționează pe baterie</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Securitate</string>
|
<string name="security_settings_title">Securitate</string>
|
||||||
@@ -473,6 +477,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Ieși din Briar dacă un buton de panică este apăsat</string>
|
<string name="panic_setting_signout_summary">Ieși din Briar dacă un buton de panică este apăsat</string>
|
||||||
<string name="purge_setting_title">Șterge cont</string>
|
<string name="purge_setting_title">Șterge cont</string>
|
||||||
<string name="purge_setting_summary">Ștergeți contul Briar dacă este apăsat un buton de panică. Atenție: aceasta va șterge definitiv identitatea, contactele și mesajele dvs.</string>
|
<string name="purge_setting_summary">Ștergeți contul Briar dacă este apăsat un buton de panică. Atenție: aceasta va șterge definitiv identitatea, contactele și mesajele dvs.</string>
|
||||||
|
<string name="uninstall_setting_title">Dezinstalare Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Aceasta necesită o confirmare manuală în timpul unui eveniment de panică</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Notificări</string>
|
<string name="notification_settings_title">Notificări</string>
|
||||||
<string name="notify_sign_in_title">Reamintește-mi să mă conectez</string>
|
<string name="notify_sign_in_title">Reamintește-mi să mă conectez</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Пароль</string>
|
<string name="enter_password">Пароль</string>
|
||||||
<string name="try_again">Неверный пароль, повторите попытку</string>
|
<string name="try_again">Неверный пароль, повторите попытку</string>
|
||||||
<string name="dialog_title_cannot_check_password">Не удается проверить пароль</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar не может проверить ваш пароль. Пожалуйста, попробуйте перезагрузить устройство, чтобы решить эту проблему.</string>
|
|
||||||
<string name="sign_in_button">Войти</string>
|
<string name="sign_in_button">Войти</string>
|
||||||
<string name="forgotten_password">Я забыл свой пароль</string>
|
<string name="forgotten_password">Я забыл свой пароль</string>
|
||||||
<string name="dialog_title_lost_password">Пароль утерян</string>
|
<string name="dialog_title_lost_password">Пароль утерян</string>
|
||||||
@@ -110,6 +108,7 @@
|
|||||||
<string name="delete">Удалить</string>
|
<string name="delete">Удалить</string>
|
||||||
<string name="accept">Принять</string>
|
<string name="accept">Принять</string>
|
||||||
<string name="decline">Отклонить</string>
|
<string name="decline">Отклонить</string>
|
||||||
|
<string name="options">Опции</string>
|
||||||
<string name="online">В сети</string>
|
<string name="online">В сети</string>
|
||||||
<string name="offline">Не в сети</string>
|
<string name="offline">Не в сети</string>
|
||||||
<string name="send">Отправить</string>
|
<string name="send">Отправить</string>
|
||||||
@@ -186,6 +185,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Добавление контакта на расстоянии</string>
|
<string name="add_contact_remotely_title_case">Добавление контакта на расстоянии</string>
|
||||||
<string name="add_contact_nearby_title">Добавить контакт поблизости</string>
|
<string name="add_contact_nearby_title">Добавить контакт поблизости</string>
|
||||||
<string name="add_contact_remotely_title">Добавить контакт на расстоянии</string>
|
<string name="add_contact_remotely_title">Добавить контакт на расстоянии</string>
|
||||||
|
<string name="contact_name_hint">Дать контакту ник</string>
|
||||||
<string name="contact_link_intro">Введите ссылку от вашего контакта здесь</string>
|
<string name="contact_link_intro">Введите ссылку от вашего контакта здесь</string>
|
||||||
<string name="contact_link_hint">Ссылка контакта</string>
|
<string name="contact_link_hint">Ссылка контакта</string>
|
||||||
<string name="paste_button">Вставить</string>
|
<string name="paste_button">Вставить</string>
|
||||||
@@ -203,6 +203,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Есть ожидающие запросы на контакт</string>
|
<string name="pending_contact_requests_snackbar">Есть ожидающие запросы на контакт</string>
|
||||||
<string name="pending_contact_requests">Ожидающие запросы на контакт</string>
|
<string name="pending_contact_requests">Ожидающие запросы на контакт</string>
|
||||||
<string name="no_pending_contacts">Нет запросов на контакт</string>
|
<string name="no_pending_contacts">Нет запросов на контакт</string>
|
||||||
|
<string name="add_contact_remote_connecting">Подключение...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Ожидание появления контакта онлайн...</string>
|
<string name="waiting_for_contact_to_come_online">Ожидание появления контакта онлайн...</string>
|
||||||
<string name="connecting">Подключение...</string>
|
<string name="connecting">Подключение...</string>
|
||||||
<string name="adding_contact">Добавление контакта…</string>
|
<string name="adding_contact">Добавление контакта…</string>
|
||||||
@@ -225,6 +226,9 @@
|
|||||||
<item quantity="many">Добавлено %d новых контактов.</item>
|
<item quantity="many">Добавлено %d новых контактов.</item>
|
||||||
<item quantity="other">Добавлено %d новых контактов.</item>
|
<item quantity="other">Добавлено %d новых контактов.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Добавление этого контакта занимает больше времени, чем обычно</string>
|
||||||
|
<string name="adding_contact_slow_title">Не удается подключиться к контакту</string>
|
||||||
|
<string name="adding_contact_slow_text">Добавление этого контакта занимает больше времени, чем обычно.\n\nПожалуйста, проверьте, что ваш контакт получил вашу ссылку и добавил вас:</string>
|
||||||
<string name="offline_state">Подключение к интернету отсутствует</string>
|
<string name="offline_state">Подключение к интернету отсутствует</string>
|
||||||
<string name="duplicate_link_dialog_title">Дублировать ссылку</string>
|
<string name="duplicate_link_dialog_title">Дублировать ссылку</string>
|
||||||
<string name="duplicate_link_dialog_text_1">У вас уже есть ожидающий контакт с этой ссылкой: %s</string>
|
<string name="duplicate_link_dialog_text_1">У вас уже есть ожидающий контакт с этой ссылкой: %s</string>
|
||||||
@@ -252,6 +256,7 @@
|
|||||||
<string name="introduction_button">Сделать представление</string>
|
<string name="introduction_button">Сделать представление</string>
|
||||||
<string name="introduction_sent">Ваше представление было отправлено.</string>
|
<string name="introduction_sent">Ваше представление было отправлено.</string>
|
||||||
<string name="introduction_error">Произошла ошибка во время представления.</string>
|
<string name="introduction_error">Произошла ошибка во время представления.</string>
|
||||||
|
<string name="introduction_response_error">Ошибка при ответе на представление</string>
|
||||||
<string name="introduction_request_sent">Вы сделали представление %1$s %2$s.</string>
|
<string name="introduction_request_sent">Вы сделали представление %1$s %2$s.</string>
|
||||||
<string name="introduction_request_received">%1$s попросил(-а) вас представить %2$s. Вы хотите добавить %2$s в ваш список контактов?</string>
|
<string name="introduction_request_received">%1$s попросил(-а) вас представить %2$s. Вы хотите добавить %2$s в ваш список контактов?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s попросил(-а) вас представить %2$s, но %2$s уже находится в вашем списке контактов. Поскольку %1$s может не знать об этом, вы все равно можете ответить:</string>
|
<string name="introduction_request_exists_received">%1$s попросил(-а) вас представить %2$s, но %2$s уже находится в вашем списке контактов. Поскольку %1$s может не знать об этом, вы все равно можете ответить:</string>
|
||||||
@@ -430,11 +435,20 @@
|
|||||||
<string name="pref_theme_dark">Темная</string>
|
<string name="pref_theme_dark">Темная</string>
|
||||||
<string name="pref_theme_auto">Авто (День)</string>
|
<string name="pref_theme_auto">Авто (День)</string>
|
||||||
<string name="pref_theme_system">Системные настройки</string>
|
<string name="pref_theme_system">Системные настройки</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Сети</string>
|
||||||
|
<string name="bluetooth_setting">Подключение через Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Когда контакты находятся поблизости</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Только при добавлении контактов</string>
|
||||||
|
<string name="tor_network_setting">Подключение через интернет (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Автоматически на основе местоположения</string>
|
<string name="tor_network_setting_automatic">Автоматически на основе местоположения</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Использовать Tor без мостов</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Использовать Tor с мостами</string>
|
||||||
|
<string name="tor_network_setting_never">Не подключать</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Автоматически: %1$s (%2$s)</string>
|
<string name="tor_network_setting_summary">Автоматически: %1$s (%2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Использовать мобильные данные</string>
|
<string name="tor_mobile_data_title">Использовать мобильные данные</string>
|
||||||
|
<string name="tor_only_when_charging_title">Подключаться через интернет (Tor) только при зарядке</string>
|
||||||
<string name="tor_only_when_charging_summary">Отключение интернет-соединения, при работе устройства от батареи</string>
|
<string name="tor_only_when_charging_summary">Отключение интернет-соединения, при работе устройства от батареи</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Безопасность</string>
|
<string name="security_settings_title">Безопасность</string>
|
||||||
@@ -475,6 +489,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Выйти из Briar, если нажата тревожная кнопка</string>
|
<string name="panic_setting_signout_summary">Выйти из Briar, если нажата тревожная кнопка</string>
|
||||||
<string name="purge_setting_title">Удалить аккаунт</string>
|
<string name="purge_setting_title">Удалить аккаунт</string>
|
||||||
<string name="purge_setting_summary">Удалить вашу учетную запись Briar при нажатии тревожной кнопки. Внимание: это необратимо удалит ваши идентификаторы, контакты и сообщения</string>
|
<string name="purge_setting_summary">Удалить вашу учетную запись Briar при нажатии тревожной кнопки. Внимание: это необратимо удалит ваши идентификаторы, контакты и сообщения</string>
|
||||||
|
<string name="uninstall_setting_title">Удалить Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Это потребует вашего подтверждения</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Уведомления</string>
|
<string name="notification_settings_title">Уведомления</string>
|
||||||
<string name="notify_sign_in_title">Напомнить мне войти</string>
|
<string name="notify_sign_in_title">Напомнить мне войти</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Fjalëkalim</string>
|
<string name="enter_password">Fjalëkalim</string>
|
||||||
<string name="try_again">Fjalëkalim i gabuar, riprovoni</string>
|
<string name="try_again">Fjalëkalim i gabuar, riprovoni</string>
|
||||||
<string name="dialog_title_cannot_check_password">S\’kontrollohet Dot Fjalëkalimi</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar-i s’e kontrollon dot fjalëkalimin tuaj. Ju lutemi, që të zgjidhet ky problem, provoni të rinisni pajisjen tuaj.</string>
|
|
||||||
<string name="sign_in_button">Hyni</string>
|
<string name="sign_in_button">Hyni</string>
|
||||||
<string name="forgotten_password">Kam harruar fjalëkalimin tim</string>
|
<string name="forgotten_password">Kam harruar fjalëkalimin tim</string>
|
||||||
<string name="dialog_title_lost_password">U humb Fjalëkalimi</string>
|
<string name="dialog_title_lost_password">U humb Fjalëkalimi</string>
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<string name="delete">Fshije</string>
|
<string name="delete">Fshije</string>
|
||||||
<string name="accept">Pranoje</string>
|
<string name="accept">Pranoje</string>
|
||||||
<string name="decline">Hidhe poshtë</string>
|
<string name="decline">Hidhe poshtë</string>
|
||||||
|
<string name="options">Mundësi</string>
|
||||||
<string name="online">Në linjë</string>
|
<string name="online">Në linjë</string>
|
||||||
<string name="offline">Jo në linjë</string>
|
<string name="offline">Jo në linjë</string>
|
||||||
<string name="send">Dërgoje</string>
|
<string name="send">Dërgoje</string>
|
||||||
@@ -117,7 +116,7 @@
|
|||||||
<string name="date_no_private_messages">S\’ka mesazhe.</string>
|
<string name="date_no_private_messages">S\’ka mesazhe.</string>
|
||||||
<string name="no_private_messages">S’ka mesazhe për shfaqje</string>
|
<string name="no_private_messages">S’ka mesazhe për shfaqje</string>
|
||||||
<string name="message_hint">Shtypni mesazhin</string>
|
<string name="message_hint">Shtypni mesazhin</string>
|
||||||
<string name="image_caption_hint">Shtoni një titull (në daçi)</string>
|
<string name="image_caption_hint">Shtoni një titull (na daçi)</string>
|
||||||
<string name="image_attach">Bashkëngjitni figurë</string>
|
<string name="image_attach">Bashkëngjitni figurë</string>
|
||||||
<string name="image_attach_error">S\’u bashkëngjit dot figurë(a)</string>
|
<string name="image_attach_error">S\’u bashkëngjit dot figurë(a)</string>
|
||||||
<string name="image_attach_error_too_big">Figurë shumë e madhe. Kufiri është %d MB.</string>
|
<string name="image_attach_error_too_big">Figurë shumë e madhe. Kufiri është %d MB.</string>
|
||||||
@@ -174,6 +173,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Shtoni Kontakt në Largësi</string>
|
<string name="add_contact_remotely_title_case">Shtoni Kontakt në Largësi</string>
|
||||||
<string name="add_contact_nearby_title">Shtoni kontakt atypari </string>
|
<string name="add_contact_nearby_title">Shtoni kontakt atypari </string>
|
||||||
<string name="add_contact_remotely_title">Shtoni kontakt në largësi</string>
|
<string name="add_contact_remotely_title">Shtoni kontakt në largësi</string>
|
||||||
|
<string name="contact_name_hint">Jepini një nofkë kontaktit</string>
|
||||||
<string name="contact_link_intro">Jepni këtu lidhjen prej kontaktit tuaj</string>
|
<string name="contact_link_intro">Jepni këtu lidhjen prej kontaktit tuaj</string>
|
||||||
<string name="contact_link_hint">Lidhje e kontaktit</string>
|
<string name="contact_link_hint">Lidhje e kontaktit</string>
|
||||||
<string name="paste_button">Ngjiteni</string>
|
<string name="paste_button">Ngjiteni</string>
|
||||||
@@ -191,6 +191,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Ka kërkesa kontakti pezull</string>
|
<string name="pending_contact_requests_snackbar">Ka kërkesa kontakti pezull</string>
|
||||||
<string name="pending_contact_requests">Kërkesa Kontakti Pezull</string>
|
<string name="pending_contact_requests">Kërkesa Kontakti Pezull</string>
|
||||||
<string name="no_pending_contacts">S\’ka kontakte pezull</string>
|
<string name="no_pending_contacts">S\’ka kontakte pezull</string>
|
||||||
|
<string name="add_contact_remote_connecting">Duke u kyqur...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Po pritet që kontakti të jetë në linjë…</string>
|
<string name="waiting_for_contact_to_come_online">Po pritet që kontakti të jetë në linjë…</string>
|
||||||
<string name="connecting">Duke u kyqur...</string>
|
<string name="connecting">Duke u kyqur...</string>
|
||||||
<string name="adding_contact">Po shtohet kontakti…</string>
|
<string name="adding_contact">Po shtohet kontakti…</string>
|
||||||
@@ -211,6 +212,9 @@
|
|||||||
<item quantity="one">U shtua kontakt i ri.</item>
|
<item quantity="one">U shtua kontakt i ri.</item>
|
||||||
<item quantity="other">U shtuan %d kontakte të reja.</item>
|
<item quantity="other">U shtuan %d kontakte të reja.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Shtimi i këtij kontakti po zgjat më shumë se zakonisht</string>
|
||||||
|
<string name="adding_contact_slow_title">S\’lidhet Dot Me Kontaktin</string>
|
||||||
|
<string name="adding_contact_slow_text">Shtimi i këtij kontakti po zgjat më shumë se zakonisht.\n\nJu lutemi, kontrolloni nëse kontakti juaj e ka marrë lidhjen tuaj dhe ju ka shtuar:</string>
|
||||||
<string name="offline_state">S\’ka lidhje internet</string>
|
<string name="offline_state">S\’ka lidhje internet</string>
|
||||||
<string name="duplicate_link_dialog_title">Lidhje e Përsëdytur</string>
|
<string name="duplicate_link_dialog_title">Lidhje e Përsëdytur</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Keni tashmë një kontakt pezull me këtë lidhje: %s</string>
|
<string name="duplicate_link_dialog_text_1">Keni tashmë një kontakt pezull me këtë lidhje: %s</string>
|
||||||
@@ -238,6 +242,7 @@
|
|||||||
<string name="introduction_button">Bëje prezantimin</string>
|
<string name="introduction_button">Bëje prezantimin</string>
|
||||||
<string name="introduction_sent">Prezantimi juaj u dërgua.</string>
|
<string name="introduction_sent">Prezantimi juaj u dërgua.</string>
|
||||||
<string name="introduction_error">Pati një gabim me bërjen e prezantimit.</string>
|
<string name="introduction_error">Pati një gabim me bërjen e prezantimit.</string>
|
||||||
|
<string name="introduction_response_error">Gabim në përgjigjen ndaj prezantimit</string>
|
||||||
<string name="introduction_request_sent">Keni kërkuar të prezantoni %1$s te %2$s.</string>
|
<string name="introduction_request_sent">Keni kërkuar të prezantoni %1$s te %2$s.</string>
|
||||||
<string name="introduction_request_received">%1$s ka kërkuar t\’ju prezantojë te %2$s. Doni të shtohet %2$s te lista juaj e kontakteve?</string>
|
<string name="introduction_request_received">%1$s ka kërkuar t\’ju prezantojë te %2$s. Doni të shtohet %2$s te lista juaj e kontakteve?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s ka kërkuar t\’ju prezantojë te %2$s, por %2$s gjendet tashmë te lista juaj e kontakteve. Meqë %1$s mund të mos ta dijë këtë gjë, mundeni prapëseprapë t\’i përgjigjeni:</string>
|
<string name="introduction_request_exists_received">%1$s ka kërkuar t\’ju prezantojë te %2$s, por %2$s gjendet tashmë te lista juaj e kontakteve. Meqë %1$s mund të mos ta dijë këtë gjë, mundeni prapëseprapë t\’i përgjigjeni:</string>
|
||||||
@@ -408,21 +413,20 @@
|
|||||||
<string name="pref_theme_dark">E errët</string>
|
<string name="pref_theme_dark">E errët</string>
|
||||||
<string name="pref_theme_auto">Automatike (Daytime)</string>
|
<string name="pref_theme_auto">Automatike (Daytime)</string>
|
||||||
<string name="pref_theme_system">Parazgjedhje Sistemi</string>
|
<string name="pref_theme_system">Parazgjedhje Sistemi</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
<string name="network_settings_title">Lidhje</string>
|
<string name="network_settings_title">Rrjete</string>
|
||||||
<string name="bluetooth_setting">Lidhuni me kontaktet përmes Bluetooth-i</string>
|
<string name="bluetooth_setting">Lidhu përmes Bluetooth-i</string>
|
||||||
<string name="wifi_setting">Lidhuni me kontakte në të njëjtin rrjet Wi-Fi</string>
|
<string name="bluetooth_setting_enabled">Kurdo që kontaktet janë këtej pari</string>
|
||||||
<string name="tor_enable_title">Lidhuni me kontakte përmes Internet-i</string>
|
<string name="bluetooth_setting_disabled">Vetëm kur shtohen kontakte</string>
|
||||||
<string name="tor_enable_summary">Për privatësi, krejt lidhjet kryhen përmes rrjetit Tor</string>
|
<string name="tor_network_setting">Lidhu nëpërmjet Internetit (Tor)</string>
|
||||||
<string name="tor_network_setting">Metodë lidhjeje për rrjetin Tor</string>
|
|
||||||
<string name="tor_network_setting_automatic">Automatike, bazuar në vendndodhjen</string>
|
<string name="tor_network_setting_automatic">Automatike, bazuar në vendndodhjen</string>
|
||||||
<string name="tor_network_setting_without_bridges">Përdor rrjet Tor pa ura</string>
|
<string name="tor_network_setting_without_bridges">Përdore Tor-in pa ura</string>
|
||||||
<string name="tor_network_setting_with_bridges">Përdor rrjet Tor me ura</string>
|
<string name="tor_network_setting_with_bridges">Përdore Tor-in me ura</string>
|
||||||
<string name="tor_network_setting_never">Mos u lidh në Internet</string>
|
<string name="tor_network_setting_never">Mos u lidh</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automatike: %1$s (në %2$s)</string>
|
<string name="tor_network_setting_summary">Automatike: %1$s (në %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Përdor të dhëna celulare</string>
|
<string name="tor_mobile_data_title">Përdor të dhëna celulare</string>
|
||||||
<string name="tor_only_when_charging_title">Lidhu në Internet vetëm kur ngarkohet bateria</string>
|
<string name="tor_only_when_charging_title">Lidhu përmes Internetit (Tor) vetëm kur bëhet ngarkim</string>
|
||||||
<string name="tor_only_when_charging_summary">Çaktivizon lidhjen në Internet, kur pajisja ushqehet nga bateria</string>
|
<string name="tor_only_when_charging_summary">Çaktivizon lidhjen në Internet, kur pajisja ushqehet nga bateria</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Siguri</string>
|
<string name="security_settings_title">Siguri</string>
|
||||||
@@ -463,6 +467,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Dil nga Briar-i nëse shtypet një buton paniku</string>
|
<string name="panic_setting_signout_summary">Dil nga Briar-i nëse shtypet një buton paniku</string>
|
||||||
<string name="purge_setting_title">Fshi Llogarinë</string>
|
<string name="purge_setting_title">Fshi Llogarinë</string>
|
||||||
<string name="purge_setting_summary">Fshijeni llogarinë tuaj Briar, nëse shtypet një buton paniku. Kujdes: Kjo do të shkaktojë fshirjen e identiteteve, kontakteve dhe mesazheve tuaj</string>
|
<string name="purge_setting_summary">Fshijeni llogarinë tuaj Briar, nëse shtypet një buton paniku. Kujdes: Kjo do të shkaktojë fshirjen e identiteteve, kontakteve dhe mesazheve tuaj</string>
|
||||||
|
<string name="uninstall_setting_title">Çinstalo Briar-in</string>
|
||||||
|
<string name="uninstall_setting_summary">Kjo lyp ripohim dorazi, në rast akti paniku</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Njoftime</string>
|
<string name="notification_settings_title">Njoftime</string>
|
||||||
<string name="notify_sign_in_title">Rikujtomë të bëj hyrjen</string>
|
<string name="notify_sign_in_title">Rikujtomë të bëj hyrjen</string>
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ Izaberite dugačku lozinku koju je teško pogoditi, kao četiri nasumične rije
|
|||||||
<string name="delete">Briši</string>
|
<string name="delete">Briši</string>
|
||||||
<string name="accept">Prihvati</string>
|
<string name="accept">Prihvati</string>
|
||||||
<string name="decline">Odbij</string>
|
<string name="decline">Odbij</string>
|
||||||
|
<string name="options">Opcije</string>
|
||||||
<string name="online">Na vezi</string>
|
<string name="online">Na vezi</string>
|
||||||
<string name="offline">Iskljucen</string>
|
<string name="offline">Iskljucen</string>
|
||||||
<string name="send">Šalji</string>
|
<string name="send">Šalji</string>
|
||||||
@@ -176,6 +177,7 @@ Jeste li sigurno da zelite da je sacuvate?</string>
|
|||||||
<string name="introduction_button">Izvršite upoznavanje</string>
|
<string name="introduction_button">Izvršite upoznavanje</string>
|
||||||
<string name="introduction_sent">Vaše poziv na upoznavanje je poslat</string>
|
<string name="introduction_sent">Vaše poziv na upoznavanje je poslat</string>
|
||||||
<string name="introduction_error">Došlo je do greške pri izvršenju upoznavanja.</string>
|
<string name="introduction_error">Došlo je do greške pri izvršenju upoznavanja.</string>
|
||||||
|
<string name="introduction_response_error">Greška pri odgovoru na upoznavanje</string>
|
||||||
<string name="introduction_request_sent">Tražili ste da se %1$s i %2$s upoznaju.</string>
|
<string name="introduction_request_sent">Tražili ste da se %1$s i %2$s upoznaju.</string>
|
||||||
<string name="introduction_request_received">%1$s je tražio da vas upozna sa %2$s. Da li želite da dodate %2$s u vašu listu kontakata?</string>
|
<string name="introduction_request_received">%1$s je tražio da vas upozna sa %2$s. Da li želite da dodate %2$s u vašu listu kontakata?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s je tražio da vas upozna sa %2$s, ali %2$s je već u vašoj listi kontakata. Pošto %1$s to možda nezna, vi i dalje možete da odgovorite: </string>
|
<string name="introduction_request_exists_received">%1$s je tražio da vas upozna sa %2$s, ali %2$s je već u vašoj listi kontakata. Pošto %1$s to možda nezna, vi i dalje možete da odgovorite: </string>
|
||||||
@@ -366,9 +368,17 @@ Dotaknite + ikonu da uvezete kanal</string>
|
|||||||
<string name="pref_theme_dark">Tamna</string>
|
<string name="pref_theme_dark">Tamna</string>
|
||||||
<string name="pref_theme_auto">Automatski (Dnevno)</string>
|
<string name="pref_theme_auto">Automatski (Dnevno)</string>
|
||||||
<string name="pref_theme_system">Default sistema</string>
|
<string name="pref_theme_system">Default sistema</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Mreže</string>
|
||||||
|
<string name="bluetooth_setting">Povežite se preko Bluetooth-a</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Kad god su kontakti blizu</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Samo pri dodavanju kontakata</string>
|
||||||
|
<string name="tor_network_setting">Konektuj se preko Interneta (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automatski prema na lokaciji</string>
|
<string name="tor_network_setting_automatic">Automatski prema na lokaciji</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Koristi Tor bez mostova</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Koristi Tor sa mostovima</string>
|
||||||
|
<string name="tor_network_setting_never">Ne konektuj se</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automatski: %1$s (za %2$s)</string>
|
<string name="tor_network_setting_summary">Automatski: %1$s (za %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Koristi mobilinu mrežu</string>
|
<string name="tor_mobile_data_title">Koristi mobilinu mrežu</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
@@ -409,6 +419,8 @@ Dotaknite + ikonu da uvezete kanal</string>
|
|||||||
<string name="panic_setting_signout_summary">Izloguj se iz Briar-a ako je pritisnuto panik dugme</string>
|
<string name="panic_setting_signout_summary">Izloguj se iz Briar-a ako je pritisnuto panik dugme</string>
|
||||||
<string name="purge_setting_title">Izbriši račun</string>
|
<string name="purge_setting_title">Izbriši račun</string>
|
||||||
<string name="purge_setting_summary">Izbriši Briar račun ako je panik dugme pritisnuto. Pažnja: Ovo će permanentno izbrisati vaše identitete, kontakte i poruke</string>
|
<string name="purge_setting_summary">Izbriši Briar račun ako je panik dugme pritisnuto. Pažnja: Ovo će permanentno izbrisati vaše identitete, kontakte i poruke</string>
|
||||||
|
<string name="uninstall_setting_title">Deinstaliraj Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Ovo zahtijeva ručnu potvrdu u slučaju panike</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Obavještenja</string>
|
<string name="notification_settings_title">Obavještenja</string>
|
||||||
<string name="notify_sign_in_title">Podsjeti me da se prijavim</string>
|
<string name="notify_sign_in_title">Podsjeti me da se prijavim</string>
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Lösenord</string>
|
<string name="enter_password">Lösenord</string>
|
||||||
<string name="try_again">Felaktigt lösenord, försök igen </string>
|
<string name="try_again">Felaktigt lösenord, försök igen </string>
|
||||||
<string name="dialog_title_cannot_check_password">Kan ej kontrollera lösenordet</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar kan inte kontrollera ditt lösenord. Prova att starta om din enhet och försök igen.</string>
|
|
||||||
<string name="sign_in_button">Logga in</string>
|
<string name="sign_in_button">Logga in</string>
|
||||||
<string name="forgotten_password">Jag har glömt mitt lösenord </string>
|
<string name="forgotten_password">Jag har glömt mitt lösenord </string>
|
||||||
<string name="dialog_title_lost_password">Glömt lösenord?</string>
|
<string name="dialog_title_lost_password">Glömt lösenord?</string>
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<string name="delete">Radera</string>
|
<string name="delete">Radera</string>
|
||||||
<string name="accept">Acceptera</string>
|
<string name="accept">Acceptera</string>
|
||||||
<string name="decline">Neka</string>
|
<string name="decline">Neka</string>
|
||||||
|
<string name="options">Alternativ</string>
|
||||||
<string name="online">Uppkopplad</string>
|
<string name="online">Uppkopplad</string>
|
||||||
<string name="offline">Nedkopplad</string>
|
<string name="offline">Nedkopplad</string>
|
||||||
<string name="send">Skicka</string>
|
<string name="send">Skicka</string>
|
||||||
@@ -174,6 +173,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Lägg till en kontakt på avstånd</string>
|
<string name="add_contact_remotely_title_case">Lägg till en kontakt på avstånd</string>
|
||||||
<string name="add_contact_nearby_title">Lägg till en närvarande kontakt</string>
|
<string name="add_contact_nearby_title">Lägg till en närvarande kontakt</string>
|
||||||
<string name="add_contact_remotely_title">Lägg till en kontakt på avstånd</string>
|
<string name="add_contact_remotely_title">Lägg till en kontakt på avstånd</string>
|
||||||
|
<string name="contact_name_hint">Ge kontakten ett smeknamn</string>
|
||||||
<string name="contact_link_intro">Skriv in länken från din kontakt här</string>
|
<string name="contact_link_intro">Skriv in länken från din kontakt här</string>
|
||||||
<string name="contact_link_hint">Kontaktens länk</string>
|
<string name="contact_link_hint">Kontaktens länk</string>
|
||||||
<string name="paste_button">Klistra in</string>
|
<string name="paste_button">Klistra in</string>
|
||||||
@@ -191,6 +191,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Det finns väntande kontaktförfrågningar</string>
|
<string name="pending_contact_requests_snackbar">Det finns väntande kontaktförfrågningar</string>
|
||||||
<string name="pending_contact_requests">Väntande kontaktförfrågningar</string>
|
<string name="pending_contact_requests">Väntande kontaktförfrågningar</string>
|
||||||
<string name="no_pending_contacts">Inga väntande kontakter</string>
|
<string name="no_pending_contacts">Inga väntande kontakter</string>
|
||||||
|
<string name="add_contact_remote_connecting">Ansluter...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Väntar på att kontakten ska koppla upp sig...</string>
|
<string name="waiting_for_contact_to_come_online">Väntar på att kontakten ska koppla upp sig...</string>
|
||||||
<string name="connecting">Ansluter...</string>
|
<string name="connecting">Ansluter...</string>
|
||||||
<string name="adding_contact">Lägger till kontakt...</string>
|
<string name="adding_contact">Lägger till kontakt...</string>
|
||||||
@@ -211,6 +212,9 @@
|
|||||||
<item quantity="one">%d nya kontakter lades till.</item>
|
<item quantity="one">%d nya kontakter lades till.</item>
|
||||||
<item quantity="other">%d nya kontakter lades till.</item>
|
<item quantity="other">%d nya kontakter lades till.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Det tar längre tid än vanligt att lägga till den här kontakten.</string>
|
||||||
|
<string name="adding_contact_slow_title">Kan ej ansluta till kontakten</string>
|
||||||
|
<string name="adding_contact_slow_text">Det tar längre tid än vanligt att lägga till den här kontakten.\n\nVänligen kontrollera att din kontakt har tagit emot din länk och lagt till dig:</string>
|
||||||
<string name="offline_state">Ingen Internetanslutning</string>
|
<string name="offline_state">Ingen Internetanslutning</string>
|
||||||
<string name="duplicate_link_dialog_title">Kopiera länk</string>
|
<string name="duplicate_link_dialog_title">Kopiera länk</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Du har redan en väntande kontakt med den här länken: %s</string>
|
<string name="duplicate_link_dialog_text_1">Du har redan en väntande kontakt med den här länken: %s</string>
|
||||||
@@ -238,6 +242,7 @@
|
|||||||
<string name="introduction_button">Presentera kontakt</string>
|
<string name="introduction_button">Presentera kontakt</string>
|
||||||
<string name="introduction_sent">Din presentation har skickats</string>
|
<string name="introduction_sent">Din presentation har skickats</string>
|
||||||
<string name="introduction_error">Något gick fel när presentationen skulle genomföras.</string>
|
<string name="introduction_error">Något gick fel när presentationen skulle genomföras.</string>
|
||||||
|
<string name="introduction_response_error">Presentationen kunde ej besvaras.</string>
|
||||||
<string name="introduction_request_sent">Du har begärt presentation av %2$s för %1$s.</string>
|
<string name="introduction_request_sent">Du har begärt presentation av %2$s för %1$s.</string>
|
||||||
<string name="introduction_request_received">%1$s presenterar %2$s för dig. Vill du lägga till %2$s till dina kontakter?</string>
|
<string name="introduction_request_received">%1$s presenterar %2$s för dig. Vill du lägga till %2$s till dina kontakter?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s presenterar %2$s för dig, men %2$s finns redan bland dina kontakter. Du kan ändå svara %1$s, som kanske inte vet detta:</string>
|
<string name="introduction_request_exists_received">%1$s presenterar %2$s för dig, men %2$s finns redan bland dina kontakter. Du kan ändå svara %1$s, som kanske inte vet detta:</string>
|
||||||
@@ -408,11 +413,20 @@
|
|||||||
<string name="pref_theme_dark">Mörk</string>
|
<string name="pref_theme_dark">Mörk</string>
|
||||||
<string name="pref_theme_auto">Automatisk (dagtid)</string>
|
<string name="pref_theme_auto">Automatisk (dagtid)</string>
|
||||||
<string name="pref_theme_system">Systemets förval</string>
|
<string name="pref_theme_system">Systemets förval</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Nätverk</string>
|
||||||
|
<string name="bluetooth_setting">Anslut via Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">När kontakter finns i närheten</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Bara när kontakter läggs till</string>
|
||||||
|
<string name="tor_network_setting">Anslut över Internet (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">Automatisk, baserad på position</string>
|
<string name="tor_network_setting_automatic">Automatisk, baserad på position</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Använd Tor utan bryggor</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Använd Tor med bryggor</string>
|
||||||
|
<string name="tor_network_setting_never">Anslut ej</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Automatisk: %1$s (i %2$s)</string>
|
<string name="tor_network_setting_summary">Automatisk: %1$s (i %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Använd mobildata</string>
|
<string name="tor_mobile_data_title">Använd mobildata</string>
|
||||||
|
<string name="tor_only_when_charging_title">Ansluta bara via Internet (Tor) när enheten laddas</string>
|
||||||
<string name="tor_only_when_charging_summary">Avaktiverar anslutning över Internet när enheten går på batteri</string>
|
<string name="tor_only_when_charging_summary">Avaktiverar anslutning över Internet när enheten går på batteri</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Säkerhet</string>
|
<string name="security_settings_title">Säkerhet</string>
|
||||||
@@ -453,6 +467,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Logga ut från Briar om panikknappen tryckts</string>
|
<string name="panic_setting_signout_summary">Logga ut från Briar om panikknappen tryckts</string>
|
||||||
<string name="purge_setting_title">Radera kontot</string>
|
<string name="purge_setting_title">Radera kontot</string>
|
||||||
<string name="purge_setting_summary">Radera ditt Briar-konto om panik-knappen trycks. Varning: detta raderar oåterkalleligt dina indentiteter, kontakter och meddelanden</string>
|
<string name="purge_setting_summary">Radera ditt Briar-konto om panik-knappen trycks. Varning: detta raderar oåterkalleligt dina indentiteter, kontakter och meddelanden</string>
|
||||||
|
<string name="uninstall_setting_title">Avinstallera Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Detta kräver manuell bekräftelse i en paniksituation</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Aviseringar</string>
|
<string name="notification_settings_title">Aviseringar</string>
|
||||||
<string name="notify_sign_in_title">Påminn mig om att logga in</string>
|
<string name="notify_sign_in_title">Påminn mig om att logga in</string>
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ umepoteza nenosiri</string>
|
|||||||
<string name="delete">futa</string>
|
<string name="delete">futa</string>
|
||||||
<string name="accept">kukubali</string>
|
<string name="accept">kukubali</string>
|
||||||
<string name="decline">kukata</string>
|
<string name="decline">kukata</string>
|
||||||
|
<string name="options">chaguo</string>
|
||||||
<string name="online">mkondoni</string>
|
<string name="online">mkondoni</string>
|
||||||
<string name="offline">nje ya mkondo</string>
|
<string name="offline">nje ya mkondo</string>
|
||||||
<string name="send">tuma</string>
|
<string name="send">tuma</string>
|
||||||
@@ -144,6 +145,7 @@ umepoteza nenosiri</string>
|
|||||||
<string name="add_contact_remotely_title_case">Ongeza mawasiliano kwambali </string>
|
<string name="add_contact_remotely_title_case">Ongeza mawasiliano kwambali </string>
|
||||||
<string name="add_contact_nearby_title">ongeza mawasiliano kwa karibu </string>
|
<string name="add_contact_nearby_title">ongeza mawasiliano kwa karibu </string>
|
||||||
<string name="add_contact_remotely_title">Ongeza Mawasilina kwa wambali </string>
|
<string name="add_contact_remotely_title">Ongeza Mawasilina kwa wambali </string>
|
||||||
|
<string name="contact_name_hint">Ipe lakabu wasilinao hili </string>
|
||||||
<string name="contact_link_intro">Ingiza kiungo cha mawasiliano hapa. </string>
|
<string name="contact_link_intro">Ingiza kiungo cha mawasiliano hapa. </string>
|
||||||
<string name="contact_link_hint">unganisha mawasiliano </string>
|
<string name="contact_link_hint">unganisha mawasiliano </string>
|
||||||
<string name="paste_button">bandika </string>
|
<string name="paste_button">bandika </string>
|
||||||
@@ -161,6 +163,7 @@ umepoteza nenosiri</string>
|
|||||||
<string name="pending_contact_requests_snackbar">Maombi ya mawasiliano yalio subirishwa </string>
|
<string name="pending_contact_requests_snackbar">Maombi ya mawasiliano yalio subirishwa </string>
|
||||||
<string name="pending_contact_requests">Maombi yalio subirishwa </string>
|
<string name="pending_contact_requests">Maombi yalio subirishwa </string>
|
||||||
<string name="no_pending_contacts">Hakuna maombi yalio subirishwa </string>
|
<string name="no_pending_contacts">Hakuna maombi yalio subirishwa </string>
|
||||||
|
<string name="add_contact_remote_connecting">kuunganishwa...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Subiri kwaulie wasiliana nae aje Mkondoni .</string>
|
<string name="waiting_for_contact_to_come_online">Subiri kwaulie wasiliana nae aje Mkondoni .</string>
|
||||||
<string name="connecting">kuunganishwa...</string>
|
<string name="connecting">kuunganishwa...</string>
|
||||||
<string name="adding_contact">Ongeza Mawasiliano....</string>
|
<string name="adding_contact">Ongeza Mawasiliano....</string>
|
||||||
@@ -181,6 +184,9 @@ umepoteza nenosiri</string>
|
|||||||
<item quantity="one">mawasiliano mapya yameongezeka </item>
|
<item quantity="one">mawasiliano mapya yameongezeka </item>
|
||||||
<item quantity="other">%dmawawasiliano mapya yameongezeka</item>
|
<item quantity="other">%dmawawasiliano mapya yameongezeka</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">kuongeza mawawasiliano haya yatachukua muda kuliko</string>
|
||||||
|
<string name="adding_contact_slow_title">inashidikana kuungana na mawasiliano </string>
|
||||||
|
<string name="adding_contact_slow_text">kuongeza mawasiliano haya yatachukua muda kuliko.\n\nTafathali angalia Kama unaye wasiliana nae kakuunganisha na wewe.</string>
|
||||||
<string name="offline_state">Hakuna mtandao</string>
|
<string name="offline_state">Hakuna mtandao</string>
|
||||||
<string name="duplicate_link_dialog_title">Kiunga cha kurudia.</string>
|
<string name="duplicate_link_dialog_title">Kiunga cha kurudia.</string>
|
||||||
<string name="duplicate_link_dialog_text_1">Tayari unayo mawasiliano yenye kiunga hiki:%s</string>
|
<string name="duplicate_link_dialog_text_1">Tayari unayo mawasiliano yenye kiunga hiki:%s</string>
|
||||||
@@ -207,6 +213,7 @@ umepoteza nenosiri</string>
|
|||||||
<string name="introduction_button">Anza Utambulisho </string>
|
<string name="introduction_button">Anza Utambulisho </string>
|
||||||
<string name="introduction_sent">Utambulisho wako Umetumwa.</string>
|
<string name="introduction_sent">Utambulisho wako Umetumwa.</string>
|
||||||
<string name="introduction_error">Kulikuwa na hitilafu wakati wa utambulisho .</string>
|
<string name="introduction_error">Kulikuwa na hitilafu wakati wa utambulisho .</string>
|
||||||
|
<string name="introduction_response_error">Hitilafu wakati wa kujibu Utambulisho.</string>
|
||||||
<string name="introduction_request_sent">Umeombwa umtambulishe %1$skwa%2$s.</string>
|
<string name="introduction_request_sent">Umeombwa umtambulishe %1$skwa%2$s.</string>
|
||||||
<string name="introduction_request_received">%1$sameombwa akutambulishe Wewe kwa %2$s. Unataka kumuongeza %2$skwenye orodha ya mawasiliano ? </string>
|
<string name="introduction_request_received">%1$sameombwa akutambulishe Wewe kwa %2$s. Unataka kumuongeza %2$skwenye orodha ya mawasiliano ? </string>
|
||||||
<string name="introduction_request_exists_received">%1$sAmeombwa akutambulishe wewe kwa %2$s,ila%2$sYupo tayari kwenye orodha ya mawasiliano yako . Tangu%1$shafahamu hilo, unaweza ukamjibu tu .</string>
|
<string name="introduction_request_exists_received">%1$sAmeombwa akutambulishe wewe kwa %2$s,ila%2$sYupo tayari kwenye orodha ya mawasiliano yako . Tangu%1$shafahamu hilo, unaweza ukamjibu tu .</string>
|
||||||
@@ -359,11 +366,20 @@ umepoteza nenosiri</string>
|
|||||||
<string name="pref_theme_dark">Giza</string>
|
<string name="pref_theme_dark">Giza</string>
|
||||||
<string name="pref_theme_auto">kiotomatiki (Mchana)</string>
|
<string name="pref_theme_auto">kiotomatiki (Mchana)</string>
|
||||||
<string name="pref_theme_system">Mfumo Msingi </string>
|
<string name="pref_theme_system">Mfumo Msingi </string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Mtandao</string>
|
||||||
|
<string name="bluetooth_setting">Unganisha kwa Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">wakati wowote mawasiliano yakiwa karibu </string>
|
||||||
|
<string name="bluetooth_setting_disabled">Wakati waku ongeza mawasiliano tu.</string>
|
||||||
|
<string name="tor_network_setting">Unganisha kwa Mtandao (Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">kiotomatiki inatengemeana na mahali </string>
|
<string name="tor_network_setting_automatic">kiotomatiki inatengemeana na mahali </string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">tumia Tor bila madaraja </string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Tumia Tor na madaraja </string>
|
||||||
|
<string name="tor_network_setting_never">usi unganishe </string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">kiotomatiki:%1$s (ndani%2$s)</string>
|
<string name="tor_network_setting_summary">kiotomatiki:%1$s (ndani%2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Tumia Data ya simu</string>
|
<string name="tor_mobile_data_title">Tumia Data ya simu</string>
|
||||||
|
<string name="tor_only_when_charging_title">Unganishwa kwenye mkongo (Tor) kwenye wakati wa kucharge tu</string>
|
||||||
<string name="tor_only_when_charging_summary">Zima mtandao wakati betri ipo chini </string>
|
<string name="tor_only_when_charging_summary">Zima mtandao wakati betri ipo chini </string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Ulizi</string>
|
<string name="security_settings_title">Ulizi</string>
|
||||||
@@ -404,6 +420,8 @@ umepoteza nenosiri</string>
|
|||||||
<string name="panic_setting_signout_summary">Toka kwenye Briar endapo kitufe cha Hofu kitabo nyezwa </string>
|
<string name="panic_setting_signout_summary">Toka kwenye Briar endapo kitufe cha Hofu kitabo nyezwa </string>
|
||||||
<string name="purge_setting_title">futa akaunti</string>
|
<string name="purge_setting_title">futa akaunti</string>
|
||||||
<string name="purge_setting_summary">Futa Briar akaunti endapo kitufe cha Hofu kitakuwa kimebonyezwa kwa mstuko . Hii itafuta kabisa mawasiliano na ujumbe wako </string>
|
<string name="purge_setting_summary">Futa Briar akaunti endapo kitufe cha Hofu kitakuwa kimebonyezwa kwa mstuko . Hii itafuta kabisa mawasiliano na ujumbe wako </string>
|
||||||
|
<string name="uninstall_setting_title">ondoa Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Hii itaitaji mwongozo wa tukio la hofu </string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Arifu</string>
|
<string name="notification_settings_title">Arifu</string>
|
||||||
<string name="notify_sign_in_title">Nikumbushe ku ingia</string>
|
<string name="notify_sign_in_title">Nikumbushe ku ingia</string>
|
||||||
|
|||||||
@@ -2,13 +2,9 @@
|
|||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<!--Setup-->
|
<!--Setup-->
|
||||||
<string name="setup_title">Briar\'a Hoşgeldiniz</string>
|
<string name="setup_title">Briar\'a Hoşgeldiniz</string>
|
||||||
<string name="setup_name_explanation">Takma adınız, gönderdiğiniz herhangi bir içeriğin yanında gösterilecek. Hesabınızı oluşturduktan sonra onu değiştiremezsiniz.</string>
|
|
||||||
<string name="setup_next">Sonraki</string>
|
<string name="setup_next">Sonraki</string>
|
||||||
<string name="setup_password_intro">Bir Parola Seçin</string>
|
<string name="setup_password_intro">Bir Parola Seçin</string>
|
||||||
<string name="setup_password_explanation">Briar hesabınız bulutta değil aygıtınızda şifreli olarak saklanır. Parolanızı unutursanız veya Briar\'ı kaldırırsanız hesabınızı kurtarmanın bir yolu yoktur. Tahmin edilmesi zor rastgele dört sözcük, on harf, sayı ve simgeden oluşan uzun bir parola \n\n\Seçin</string>
|
<string name="setup_doze_title">Arkaplan Bağlantıları</string>
|
||||||
<string name="setup_doze_title">Arka plan Bağlantıları</string>
|
|
||||||
<string name="setup_doze_intro">İletileri almak için Briar\'ın arkaplanda bağlı kalması gerekir.</string>
|
|
||||||
<string name="setup_doze_explanation">İletileri almak için Briar\'ın arkaplanda bağlı olması gerekir. Briar\'ın bağlı kalabilmesi için lütfen pil eniyilemesini devre dışı bırakın.</string>
|
|
||||||
<string name="setup_doze_button">Bağlantılara İzin Ver</string>
|
<string name="setup_doze_button">Bağlantılara İzin Ver</string>
|
||||||
<string name="choose_nickname">Kullanıcı adınızı belirleyin</string>
|
<string name="choose_nickname">Kullanıcı adınızı belirleyin</string>
|
||||||
<string name="choose_password">Parolanızı belirleyin</string>
|
<string name="choose_password">Parolanızı belirleyin</string>
|
||||||
@@ -26,8 +22,6 @@
|
|||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">Parola</string>
|
<string name="enter_password">Parola</string>
|
||||||
<string name="try_again">Parola yanlış, tekrar deneyin</string>
|
<string name="try_again">Parola yanlış, tekrar deneyin</string>
|
||||||
<string name="dialog_title_cannot_check_password">Parola Denetlenemiyor</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar parolanızı denetleyemiyor. Sorunu çözmek için lütfen aygıtınızı yeniden başlatın.</string>
|
|
||||||
<string name="sign_in_button">Oturum Aç</string>
|
<string name="sign_in_button">Oturum Aç</string>
|
||||||
<string name="forgotten_password">Parolamı unuttum</string>
|
<string name="forgotten_password">Parolamı unuttum</string>
|
||||||
<string name="dialog_title_lost_password">Kayıp Parola</string>
|
<string name="dialog_title_lost_password">Kayıp Parola</string>
|
||||||
@@ -35,21 +29,13 @@
|
|||||||
<string name="startup_failed_notification_title">Briar başlayamadı</string>
|
<string name="startup_failed_notification_title">Briar başlayamadı</string>
|
||||||
<string name="startup_failed_notification_text">Daha fazla bilgi için dokunun.</string>
|
<string name="startup_failed_notification_text">Daha fazla bilgi için dokunun.</string>
|
||||||
<string name="startup_failed_activity_title">Briar Başlangıç Hatası</string>
|
<string name="startup_failed_activity_title">Briar Başlangıç Hatası</string>
|
||||||
<string name="startup_failed_db_error">Bir nedenden dolayı Briar veritabanı onarılamayacak kadar bozulmuş. Hesabınız, verileriniz ve bütün kişileriniz kayboldu. Maalesef Briar\'ı tekrar kurmanız ve parola sorulduğunda \"Parolamı unuttum\" seçeneğini kullanarak yeni bir hesap oluşturmanız gerekiyor.</string>
|
|
||||||
<string name="startup_failed_data_too_old_error">Hesabınız bu uygulamanın eski bir sürümüyle oluşturulmuş ve bu sürümle açılamaz. Eski sürümü yeniden kurmanız veya parola sorulduğunda \"Parolamı unuttum\" seçeneğini seçerek yeni bir hesap oluşturmanız gerekiyor.</string>
|
|
||||||
<string name="startup_failed_data_too_new_error">Uygulamanın bu sürümü çok eski. Lütfen son sürüme yükseltin ve yeniden deneyin.</string>
|
|
||||||
<string name="startup_failed_service_error">Briar gerekli bir eklentiyi başlatamadı. Briar\'ı yeniden yüklemek genellikle bu sorunu çözer. Bununla birlikte, lütfen Briar\'ın verilerinizi depolamak için merkezi sunucuları kullanmadığından hesabınızı ve onunla ilişkili tüm verileri kaybedeceğinizi unutmayın.</string>
|
<string name="startup_failed_service_error">Briar gerekli bir eklentiyi başlatamadı. Briar\'ı yeniden yüklemek genellikle bu sorunu çözer. Bununla birlikte, lütfen Briar\'ın verilerinizi depolamak için merkezi sunucuları kullanmadığından hesabınızı ve onunla ilişkili tüm verileri kaybedeceğinizi unutmayın.</string>
|
||||||
<plurals name="expiry_warning">
|
<string name="download_briar">Briar\'ı kullanmaya devam etmek için lütfen en son dağıtımı indirin.</string>
|
||||||
<item quantity="one">Bu Briar\'ın deneme sürümüdür. Hesabınız %d gün içinde sona erecek ve yenilenemez.</item>
|
|
||||||
<item quantity="other">Bu Briar\'ın deneme sürümüdür. Hesabınız %d gün içinde geçersiz olacak ve yenilenmeyecektir.</item>
|
|
||||||
</plurals>
|
|
||||||
<string name="expiry_date_reached">Bu yazılımın süresi doldu.\nDenediğiniz için teşekkürler!</string>
|
|
||||||
<string name="download_briar">Briar\'ı kullanmaya devam etmek için lütfen en son sürümü indirin.</string>
|
|
||||||
<string name="create_new_account">Yeni bir hesap oluşturmanız gerekecek, fakat aynı takma adı kullanabilirsiniz.</string>
|
<string name="create_new_account">Yeni bir hesap oluşturmanız gerekecek, fakat aynı takma adı kullanabilirsiniz.</string>
|
||||||
<string name="download_briar_button">En Son Sürümü İndir</string>
|
<string name="download_briar_button">En Son Sürümü İndir</string>
|
||||||
<string name="startup_open_database">Veritabanı Şifresi Çözülüyor...</string>
|
<string name="startup_open_database">Veritabanı Şifresi Çözülüyor...</string>
|
||||||
<string name="startup_migrate_database">Veritabanı Yükseltiliyor...</string>
|
<string name="startup_migrate_database">Veritabanı Yükseltiliyor...</string>
|
||||||
<string name="startup_compact_database">Veritabanı Sıkıştırılıyor...</string>
|
<string name="startup_compact_database">Veritabanı Derli Toplu Hale Getiriliyor...</string>
|
||||||
<!--Navigation Drawer-->
|
<!--Navigation Drawer-->
|
||||||
<string name="nav_drawer_open_description">Gezinme çekmecesini aç</string>
|
<string name="nav_drawer_open_description">Gezinme çekmecesini aç</string>
|
||||||
<string name="nav_drawer_close_description">Gezinme çekmecesini kapat</string>
|
<string name="nav_drawer_close_description">Gezinme çekmecesini kapat</string>
|
||||||
@@ -66,7 +52,7 @@
|
|||||||
<string name="transport_bt">Bluetooth</string>
|
<string name="transport_bt">Bluetooth</string>
|
||||||
<string name="transport_lan">Wi-Fi</string>
|
<string name="transport_lan">Wi-Fi</string>
|
||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
<string name="reminder_notification_title">Briar oturumu kapatıldı</string>
|
<string name="reminder_notification_title">Briar oturumunu kapatma</string>
|
||||||
<string name="reminder_notification_text">Tekrar oturum açmak için dokunun</string>
|
<string name="reminder_notification_text">Tekrar oturum açmak için dokunun</string>
|
||||||
<string name="reminder_notification_channel_title">Briar Oturum Açma Anımsatıcı</string>
|
<string name="reminder_notification_channel_title">Briar Oturum Açma Anımsatıcı</string>
|
||||||
<string name="reminder_notification_dismiss">Vazgeç</string>
|
<string name="reminder_notification_dismiss">Vazgeç</string>
|
||||||
@@ -74,19 +60,19 @@
|
|||||||
<string name="ongoing_notification_text">Briar\'ı açmak için dokunun</string>
|
<string name="ongoing_notification_text">Briar\'ı açmak için dokunun</string>
|
||||||
<plurals name="private_message_notification_text">
|
<plurals name="private_message_notification_text">
|
||||||
<item quantity="one">Yeni özel mesaj.</item>
|
<item quantity="one">Yeni özel mesaj.</item>
|
||||||
<item quantity="other">%d yeni özel ileti.</item>
|
<item quantity="other">%d yeni özel mesaj.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<plurals name="group_message_notification_text">
|
<plurals name="group_message_notification_text">
|
||||||
<item quantity="one">Yeni grup mesajı.</item>
|
<item quantity="one">Yeni grup mesajı.</item>
|
||||||
<item quantity="other">%d yeni grup iletisi.</item>
|
<item quantity="other">%d yeni grup mesajı.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<plurals name="forum_post_notification_text">
|
<plurals name="forum_post_notification_text">
|
||||||
<item quantity="one">Yeni forum iletisi.</item>
|
<item quantity="one">Yeni forum iletisi.</item>
|
||||||
<item quantity="other">%d yeni forum gönderisi.</item>
|
<item quantity="other">%d yeni forum iletisi.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<plurals name="blog_post_notification_text">
|
<plurals name="blog_post_notification_text">
|
||||||
<item quantity="one">Yeni blog iletisi.</item>
|
<item quantity="one">Yeni blog iletisi.</item>
|
||||||
<item quantity="other">%d yeni blog gönderisi.</item>
|
<item quantity="other">%d yeni blog iletisi.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<!--Misc-->
|
<!--Misc-->
|
||||||
<string name="now">şimdi</string>
|
<string name="now">şimdi</string>
|
||||||
@@ -98,6 +84,7 @@
|
|||||||
<string name="delete">Sil</string>
|
<string name="delete">Sil</string>
|
||||||
<string name="accept">Onayla</string>
|
<string name="accept">Onayla</string>
|
||||||
<string name="decline">Reddet</string>
|
<string name="decline">Reddet</string>
|
||||||
|
<string name="options">Seçenekler</string>
|
||||||
<string name="online">Çevrimiçi</string>
|
<string name="online">Çevrimiçi</string>
|
||||||
<string name="offline">Çevrimdışı</string>
|
<string name="offline">Çevrimdışı</string>
|
||||||
<string name="send">Gönder</string>
|
<string name="send">Gönder</string>
|
||||||
@@ -107,35 +94,27 @@
|
|||||||
<string name="ellipsis">…</string>
|
<string name="ellipsis">…</string>
|
||||||
<string name="text_too_long">Girilen metin çok uzun</string>
|
<string name="text_too_long">Girilen metin çok uzun</string>
|
||||||
<string name="show_onboarding">Yardım Penceresini Göster</string>
|
<string name="show_onboarding">Yardım Penceresini Göster</string>
|
||||||
<string name="fix">Düzelt</string>
|
<string name="fix">Düzeltme</string>
|
||||||
<string name="help">Yardım</string>
|
<string name="help">Yardım</string>
|
||||||
<string name="sorry">Üzgünüm</string>
|
<string name="sorry">Üzgünüm</string>
|
||||||
<string name="error_start_activity">Sisteminizde mevcut değil</string>
|
<string name="error_start_activity">Sisteminizde mevcut değil</string>
|
||||||
<!--Contacts and Private Conversations-->
|
<!--Contacts and Private Conversations-->
|
||||||
<string name="no_contacts">Gösterilecek kişi yok</string>
|
<string name="no_contacts">Gösterilecek kişi yok</string>
|
||||||
<string name="no_contacts_action">kişi eklemek için + simgesine dokunun</string>
|
<string name="no_contacts_action">kişi eklemek için + simgesine dokunun</string>
|
||||||
<string name="date_no_private_messages">Hiç ileti yok.</string>
|
<string name="date_no_private_messages">Hiç mesaj yok.</string>
|
||||||
<string name="no_private_messages">Gösterilecek ileti yok</string>
|
<string name="no_private_messages">Gösterilecek ileti yok</string>
|
||||||
<string name="message_hint">İleti yazın</string>
|
<string name="message_hint">Mesaj yazın</string>
|
||||||
<string name="image_caption_hint">Başlık ekle (isteğe bağlı)</string>
|
|
||||||
<string name="image_attach">Resim ekle</string>
|
<string name="image_attach">Resim ekle</string>
|
||||||
<string name="image_attach_error">Resim(ler) eklenemedi</string>
|
<string name="image_attach_error">Resim(ler) eklenemedi</string>
|
||||||
<string name="image_attach_error_too_big">Resim çok büyük. Sınır %d MB.</string>
|
<string name="image_attach_error_too_big">Resim çok büyük. Sınır %d MB.</string>
|
||||||
<string name="image_attach_error_invalid_mime_type">Resim biçimi desteklenmiyor: %s</string>
|
<string name="image_attach_error_invalid_mime_type">Resim biçimi desteklenmedi: %s</string>
|
||||||
<string name="set_contact_alias">Kişi adını değiştir</string>
|
<string name="set_contact_alias">Kişi adını değiştir</string>
|
||||||
<string name="set_contact_alias_hint">Ad</string>
|
<string name="set_contact_alias_hint">Ad</string>
|
||||||
<string name="set_alias_button">Değiştir</string>
|
<string name="set_alias_button">Değiştirme</string>
|
||||||
<string name="delete_all_messages">Tüm iletileri sil</string>
|
<string name="delete_all_messages">Tüm iletileri sil</string>
|
||||||
<string name="dialog_title_delete_all_messages">İleti Silmeyi Onayla</string>
|
<string name="dialog_title_delete_all_messages">İleti Silmeyi Onayla</string>
|
||||||
<string name="dialog_message_delete_all_messages">Tüm iletileri silmek istediğinizden emin misiniz?</string>
|
<string name="dialog_message_delete_all_messages">Tüm iletileri silmek istediğinizden emin misiniz?</string>
|
||||||
<string name="dialog_title_not_all_messages_deleted">Tüm iletiler silinemedi</string>
|
<string name="dialog_title_not_all_messages_deleted">Tüm iletiler silinemedi</string>
|
||||||
<string name="dialog_message_not_deleted_ongoing_both">Devam eden davetler ve tanıştırmalarla ilgili iletiler, sonuçlandırılana kadar silinemez.</string>
|
|
||||||
<string name="dialog_message_not_deleted_ongoing_introductions">Devam eden tanıştırmalarla ilgili iletiler, sonuçlandırılana kadar silinemez.</string>
|
|
||||||
<string name="dialog_message_not_deleted_ongoing_invitations">Devam eden davetlerle ilgili iletiler, sonuçlandırılana kadar silinemez.</string>
|
|
||||||
<string name="dialog_message_not_deleted_partly_downloaded">Kısmen indirilen iletiler indirme bitirilene kadar silinemez.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_both">Bir daveti veya tanıştırmayı silmek için isteği ve yanıtı seçmeniz gerekir.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_introductions">Bir tanıştırmayı silmek için isteği ve yanıtı seçmeniz gerekir.</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_invitations">Bir daveti silmek için isteği ve yanıtı seçmeniz gerekir.</string>
|
|
||||||
<string name="delete_contact">Kişiyi sil</string>
|
<string name="delete_contact">Kişiyi sil</string>
|
||||||
<string name="dialog_title_delete_contact">Kişi Silmeyi Onayla</string>
|
<string name="dialog_title_delete_contact">Kişi Silmeyi Onayla</string>
|
||||||
<string name="dialog_message_delete_contact">Bu kişiyi ve bu kişiyle ilgili tüm iletileri kaldırmak istediğinize emin misiniz?</string>
|
<string name="dialog_message_delete_contact">Bu kişiyi ve bu kişiyle ilgili tüm iletileri kaldırmak istediğinize emin misiniz?</string>
|
||||||
@@ -144,53 +123,47 @@
|
|||||||
<string name="you">Siz</string>
|
<string name="you">Siz</string>
|
||||||
<string name="save_image">Resmi Kaydet</string>
|
<string name="save_image">Resmi Kaydet</string>
|
||||||
<string name="dialog_title_save_image">Resim Kaydedilsin mi?</string>
|
<string name="dialog_title_save_image">Resim Kaydedilsin mi?</string>
|
||||||
<string name="dialog_message_save_image">Bu görüntüyü kaydetme diğer uygulamaların ona erişimine izin verecektir. Kaydetmek istediğinizden emin misiniz?</string>
|
|
||||||
<string name="save_image_success">Resim kaydedildi</string>
|
<string name="save_image_success">Resim kaydedildi</string>
|
||||||
<string name="save_image_error">Resim kaydedilemedi</string>
|
<string name="save_image_error">Resim kaydedilemedi</string>
|
||||||
<string name="dialog_title_no_image_support">Resimler mevcut değil</string>
|
<string name="dialog_title_no_image_support">Resimler mevcut değil</string>
|
||||||
<string name="dialog_message_no_image_support">Kişinizin Briar\'ı henüz görsel eklentileri desteklemiyor. Yükselttikten sonra farklı bir simge görürsünüz.</string>
|
|
||||||
<string name="dialog_title_image_support">Artık bu kişiye resim gönderebilirsiniz</string>
|
<string name="dialog_title_image_support">Artık bu kişiye resim gönderebilirsiniz</string>
|
||||||
<string name="dialog_message_image_support">Resim eklemek için bu simgeye dokunun.</string>
|
<string name="dialog_message_image_support">Resim eklemek için bu simgeye dokunun.</string>
|
||||||
<string name="messaging_too_many_attachments_toast">Yalnızca ilk %d resim gönderilecek</string>
|
<string name="messaging_too_many_attachments_toast">Yalnızca ilk %d resim gönderilecek</string>
|
||||||
<!--Adding Contacts-->
|
<!--Adding Contacts-->
|
||||||
<string name="add_contact_title">Yakındaki Kişiyi Ekle</string>
|
<string name="add_contact_title">Yakındaki Kişiyi Ekle</string>
|
||||||
<string name="face_to_face">Kişi olarak eklemek istediğiniz kişiyle buluşmanız gerekir.\n\nBu, gelecekte başkalarının sizin kimliğinize bürünmesini veya iletilerinizi okumasını engelleyecektir.</string>
|
<string name="face_to_face">Kişi olarak eklemek istediğiniz kişiyle buluşmanız gerekir.\n\nBu, gelecekte başkalarının sizin kimliğinize bürünmesini veya mesajlarınızı okumasını engelleyecektir.</string>
|
||||||
<string name="continue_button">Devam et</string>
|
<string name="continue_button">Devam et</string>
|
||||||
<string name="try_again_button">Tekrar deneyin</string>
|
<string name="try_again_button">Tekrar deneyin</string>
|
||||||
<string name="waiting_for_contact_to_scan">Kişinin kodu taraması ve bağlantı kurması bekleniyor\u2026</string>
|
<string name="waiting_for_contact_to_scan">Kişinin QR kodu taraması ve bağlantı kurması bekleniyor\u2026</string>
|
||||||
<string name="exchanging_contact_details">Kişi ayrıntıları karşılıklı paylaşılıyor\u2026</string>
|
<string name="exchanging_contact_details">Kişi ayrıntıları karşılıklı paylaşılıyor\u2026</string>
|
||||||
<string name="contact_added_toast">Kişi eklendi: %s</string>
|
<string name="contact_added_toast">Kişi eklendi: %s</string>
|
||||||
<string name="contact_already_exists"> %s kişisi zaten var</string>
|
<string name="contact_already_exists"> %s kişisi zaten var</string>
|
||||||
<string name="qr_code_invalid">QR kodu hatalı</string>
|
<string name="qr_code_invalid">QR kod hatalı</string>
|
||||||
<string name="qr_code_too_old">Taradığınız QR kodu eski bir%s sürümünden geliyor. Lütfen kişinize en son sürüme yükseltmesini ve tekrar denemesini söyleyin.</string>
|
|
||||||
<string name="qr_code_too_new">Taradığınız QR kodu daha yeni bir %s sürümünden geliyor. Lütfen en son sürüme yükseltin ve yeniden deneyin.</string>
|
|
||||||
<string name="camera_error">Kamera hatası</string>
|
<string name="camera_error">Kamera hatası</string>
|
||||||
<string name="connecting_to_device">Aygıta bağlanıyor\u2026</string>
|
<string name="connecting_to_device">Cihaza bağlanıyor\u2026</string>
|
||||||
<string name="authenticating_with_device">Aygıtla kimlik doğrulama\u2026</string>
|
<string name="authenticating_with_device">Cihazla kimlik doğrulama\u2026</string>
|
||||||
<string name="connection_error_title">Kişinizle bağlantı kurulamadı</string>
|
|
||||||
<string name="connection_error_explanation">Lütfen her ikinizin de aynı Wi-Fi ağına bağlı olup olmadığınızı kontrol edin.</string>
|
|
||||||
<string name="connection_error_feedback">Sorun devam ederse, uygulamayı geliştirmemize yardımcı olmak için <a href="feedback">geri bildirim gönderin</a>.</string>
|
|
||||||
<!--Adding Contacts Remotely-->
|
<!--Adding Contacts Remotely-->
|
||||||
<string name="add_contact_remotely_title_case">Uzaktaki Kişiyi Ekle</string>
|
|
||||||
<string name="add_contact_nearby_title">Yakındaki kişiyi ekle</string>
|
<string name="add_contact_nearby_title">Yakındaki kişiyi ekle</string>
|
||||||
<string name="add_contact_remotely_title">Uzaktaki kişiyi ekle</string>
|
<string name="add_contact_remotely_title">Uzaktaki kişiyi ekle</string>
|
||||||
<string name="contact_link_intro">Kişinizden gelen bağlantıyı buraya girin</string>
|
<string name="contact_name_hint">Kişiye bir takma ad verin</string>
|
||||||
|
<string name="contact_link_intro">Buraya kişinizden bağlantı girin</string>
|
||||||
<string name="contact_link_hint">Kişinin bağlantısı</string>
|
<string name="contact_link_hint">Kişinin bağlantısı</string>
|
||||||
<string name="paste_button">Yapıştır</string>
|
<string name="paste_button">Yapıştır</string>
|
||||||
<string name="add_contact_button">Kişi ekle</string>
|
<string name="add_contact_button">Kişi ekle</string>
|
||||||
<string name="copy_button">Kopyala</string>
|
<string name="copy_button">Kopyala</string>
|
||||||
<string name="share_button">Paylaş</string>
|
<string name="share_button">Paylaş</string>
|
||||||
<string name="send_link_title">Bağlantı değişimi</string>
|
<string name="send_link_title">Değiş tokuş bağlantıları</string>
|
||||||
<string name="add_contact_choose_nickname">Takma Ad Seçin</string>
|
<string name="add_contact_choose_nickname">Takma Ad Seçin</string>
|
||||||
<string name="add_contact_choose_a_nickname">Bir takma ad girin</string>
|
<string name="add_contact_choose_a_nickname">Bir takma ad girin</string>
|
||||||
<string name="nickname_intro">Kişinize bir takma ad verin. Bunu sadece siz görebilirsiniz.</string>
|
<string name="nickname_intro">Kişinize bir takma ad verin. Onu sadece siz görebilirsiniz.</string>
|
||||||
<string name="your_link">Bu bağlantıyı eklemek istediğiniz kişiye verin</string>
|
<string name="your_link">Bu bağlantıyı eklemek istediğiniz kişiye verin</string>
|
||||||
<string name="link_clip_label">Briar bağlantısı</string>
|
<string name="link_clip_label">Briar bağlantısı</string>
|
||||||
<string name="link_copied_toast">Bağlantı kopyalandı</string>
|
<string name="link_copied_toast">Bağlantı kopyalandı</string>
|
||||||
<string name="adding_contact_error">Kişi eklenirken bir hata oluştu.</string>
|
<string name="adding_contact_error">Kişi eklenirken bir hata oluştu.</string>
|
||||||
<string name="pending_contact_requests_snackbar">Bekleyen kişi istekleri var</string>
|
<string name="pending_contact_requests_snackbar">Bekleyen iletişim istekleri var</string>
|
||||||
<string name="pending_contact_requests">Bekleyen Kişi İstekleri</string>
|
<string name="pending_contact_requests">Bekleyen İletişim İstekleri</string>
|
||||||
<string name="no_pending_contacts">Bekleyen kişi yok</string>
|
<string name="no_pending_contacts">Bekleyen kişi yok</string>
|
||||||
|
<string name="add_contact_remote_connecting">Bağlantı kuruluyor…</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Kişinin çevrimiçi olması bekleniyor...</string>
|
<string name="waiting_for_contact_to_come_online">Kişinin çevrimiçi olması bekleniyor...</string>
|
||||||
<string name="connecting">Bağlantı kuruluyor…</string>
|
<string name="connecting">Bağlantı kuruluyor…</string>
|
||||||
<string name="adding_contact">Kişi Ekleniyor...</string>
|
<string name="adding_contact">Kişi Ekleniyor...</string>
|
||||||
@@ -198,10 +171,8 @@
|
|||||||
<string name="dialog_title_remove_pending_contact">Kaldırmayı Onayla</string>
|
<string name="dialog_title_remove_pending_contact">Kaldırmayı Onayla</string>
|
||||||
<string name="dialog_message_remove_pending_contact">Bu kişi hala ekleniyor. Şimdi kaldırırsanız eklenmez.</string>
|
<string name="dialog_message_remove_pending_contact">Bu kişi hala ekleniyor. Şimdi kaldırırsanız eklenmez.</string>
|
||||||
<string name="own_link_error">Kişinizin bağlantısını girin, kendi bağlantınızı değil</string>
|
<string name="own_link_error">Kişinizin bağlantısını girin, kendi bağlantınızı değil</string>
|
||||||
<string name="nickname_missing">Lütfen bir takma ad girin</string>
|
<string name="nickname_missing">Lütfen bir takma ad girin.</string>
|
||||||
<string name="invalid_link">Geçersiz bağlantı</string>
|
<string name="invalid_link">Geçersiz bağlantı</string>
|
||||||
<string name="unsupported_link">Bu bağlantı Briar\'ın daha yeni bir sürümünden geliyor. Lütfen en son sürüme yükseltin ve tekrar deneyin.</string>
|
|
||||||
<string name="intent_own_link">Kendi bağlantınızı açtınız. Eklemek istediğiniz kişilerden birini kullanın!</string>
|
|
||||||
<string name="missing_link">Lütfen bir bağlantı girin</string>
|
<string name="missing_link">Lütfen bir bağlantı girin</string>
|
||||||
<!--This is a numeral indicating the first step in a series of screens-->
|
<!--This is a numeral indicating the first step in a series of screens-->
|
||||||
<string name="step_1">1</string>
|
<string name="step_1">1</string>
|
||||||
@@ -212,9 +183,6 @@
|
|||||||
<item quantity="other">%d yeni kişi eklendi.</item>
|
<item quantity="other">%d yeni kişi eklendi.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="offline_state">İnternet bağlantısı yok</string>
|
<string name="offline_state">İnternet bağlantısı yok</string>
|
||||||
<string name="duplicate_link_dialog_title">Yinelenen Bağlantı</string>
|
|
||||||
<string name="duplicate_link_dialog_text_1">Bu bağlantı ile zaten bekleyen bir kişi var: %s</string>
|
|
||||||
<string name="duplicate_link_dialog_text_1_contact">Bu bağlantı ile zaten bir kişi var: %s</string>
|
|
||||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||||
<string name="duplicate_link_dialog_text_2">%s ve %s aynı kişi mi?</string>
|
<string name="duplicate_link_dialog_text_2">%s ve %s aynı kişi mi?</string>
|
||||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||||
@@ -225,45 +193,41 @@
|
|||||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||||
<string name="different_person_button">Farklı Kişi</string>
|
<string name="different_person_button">Farklı Kişi</string>
|
||||||
<string name="duplicate_link_dialog_text_3">%sve%s size aynı bağlantıyı gönderdi.\n\nİkisinden biri kişilerinizin kim olduğunu tespit etmeye çalışıyor olabilir.\n\nHiçbirine başkasından da aynı bağlantıyı aldığınızı söylemeyin.</string>
|
|
||||||
<string name="pending_contact_updated_toast">Bekleyen kişi güncellendi</string>
|
|
||||||
<!--Introductions-->
|
<!--Introductions-->
|
||||||
<string name="introduction_onboarding_title">Kişilerinizi tanıştırın</string>
|
<string name="introduction_onboarding_title">Kişilerinizi tanıştırın</string>
|
||||||
<string name="introduction_onboarding_text">Kişilerinizi birbirlerine tanıtabilirsiniz, bu nedenle Briar\'a bağlanmak için şahsen bir araya gelmeniz gerekmez.</string>
|
<string name="introduction_onboarding_text">Kişilerinizi birbirinize tanıtabilirsiniz, bu nedenle Briar\'a bağlanmak için şahsen bir araya gelmeniz gerekmez.</string>
|
||||||
<string name="introduction_menu_item">Tanıştır</string>
|
<string name="introduction_menu_item">Tanıştır</string>
|
||||||
<string name="introduction_activity_title">Kişi seç</string>
|
<string name="introduction_activity_title">Kişi seç</string>
|
||||||
<string name="introduction_not_possible">Bu kişilerle hala devam eden tanıştırma süreciniz var. Lütfen bu sürecin tamamlanmasını bekleyin. Eğer kişileriniz nadiren çevrimiçi oluyorsa, bu biraz zaman alabilir. </string>
|
|
||||||
<string name="introduction_message_title">Kişileri Tanıştırın</string>
|
<string name="introduction_message_title">Kişileri Tanıştırın</string>
|
||||||
<string name="introduction_message_hint">Bir ileti ekle (isteğe bağlı)</string>
|
<string name="introduction_message_hint">Bir ileti ekle (isteğe bağlı)</string>
|
||||||
<string name="introduction_button">Tanıştır</string>
|
<string name="introduction_button">Tanıştır</string>
|
||||||
<string name="introduction_sent">Tanıştırma isteğiniz gönderildi.</string>
|
<string name="introduction_sent">Tanıştırma isteğiniz gönderildi.</string>
|
||||||
<string name="introduction_error">Tanıştırma isteği yaparken bir hata oluştu.</string>
|
<string name="introduction_error">Tanıştırma isteği yaparken bir hata oluştu.</string>
|
||||||
|
<string name="introduction_response_error">Tanışma isteğine yanıt verirken hata oluştu</string>
|
||||||
<string name="introduction_request_sent">%1$s ile %2$s kişilerini tanıştırmak istediniz.</string>
|
<string name="introduction_request_sent">%1$s ile %2$s kişilerini tanıştırmak istediniz.</string>
|
||||||
<string name="introduction_request_received"> %1$s sizi %2$s ile tanıştırmak istedi. Kişi listesine %2$s kişisini eklemek ister misiniz?</string>
|
<string name="introduction_request_received"> %1$s sizi %2$s ile tanıştırmak istedi. Kişi listesine %2$s kişisini eklemek ister misiniz?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s sizi %2$s ile tanıştırmak istiyor, ancak %2$s zaten kişi listenizde ekli. %1$s, bunu bilmediğinden, siz yine de yanıt verebilirsiniz:</string>
|
<string name="introduction_request_exists_received">%1$s sizi %2$s ile tanıştırmak istiyor, ancak %2$s zaten kişi listenizde ekli. %1$s, bunu bilmediğinden, siz yine de yanıt verebilirsiniz:</string>
|
||||||
<string name="introduction_request_answered_received">%1$s sizi %2$s ile tanıştırmak istedi.</string>
|
<string name="introduction_request_answered_received">%1$s sizi %2$s ile tanıştırmak istedi.</string>
|
||||||
<string name="introduction_response_accepted_sent">%1$s kişisinin tanıştırma isteğini kabul ettiniz.</string>
|
<string name="introduction_response_accepted_sent">%1$s kişisinin tanıştırma isteğini kabul ettiniz.</string>
|
||||||
<string name="introduction_response_accepted_sent_info">%1$s kişilerinize eklenmeden önce, tanıştırmayı kabul etmeleri de gerekiyor. Bu biraz zaman alabilir.</string>
|
|
||||||
<string name="introduction_response_declined_sent">%1$s kişisinin tanıştırma isteğini reddettiniz.</string>
|
<string name="introduction_response_declined_sent">%1$s kişisinin tanıştırma isteğini reddettiniz.</string>
|
||||||
<string name="introduction_response_accepted_received">%1$s, %2$s ile tanışmayı kabul etti.</string>
|
<string name="introduction_response_accepted_received">%1$s, %2$s ile tanışmayı kabul etti.</string>
|
||||||
<string name="introduction_response_declined_received">%1$s, %2$s ile tanışmayı reddetti.</string>
|
<string name="introduction_response_declined_received">%1$s, %2$s ile tanışmayı reddetti.</string>
|
||||||
<string name="introduction_response_declined_received_by_introducee">%1$s, %2$s kişisinin tanışmayı reddettiğini söyledi.</string>
|
<string name="introduction_response_declined_received_by_introducee">%1$s, %2$s kişisinin tanışmayı reddettiğini söyledi.</string>
|
||||||
<!--Private Groups-->
|
<!--Private Groups-->
|
||||||
<string name="groups_list_empty">Gösterilecek grup yok</string>
|
<string name="groups_list_empty">Gösterilecek grup yok</string>
|
||||||
<string name="groups_list_empty_action">Bir grup oluşturmak için + simgesine dokunun veya kişilerinizden grupları sizinle paylaşmasını isteyin</string>
|
|
||||||
<string name="groups_created_by">%s tarafından oluşturuldu</string>
|
<string name="groups_created_by">%s tarafından oluşturuldu</string>
|
||||||
<plurals name="messages">
|
<plurals name="messages">
|
||||||
<item quantity="one">%d mesaj</item>
|
<item quantity="one">%d mesaj</item>
|
||||||
<item quantity="other">%d ileti</item>
|
<item quantity="other">%d mesaj</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="groups_group_is_empty">Bu grup boş</string>
|
<string name="groups_group_is_empty">Bu grup boş</string>
|
||||||
<string name="groups_group_is_dissolved">Bu grup dağıldı</string>
|
<string name="groups_group_is_dissolved">Bu grup dağıldı</string>
|
||||||
<string name="groups_remove">Sil</string>
|
<string name="groups_remove">Sil</string>
|
||||||
<string name="groups_create_group_title">Özel Grup Oluştur</string>
|
<string name="groups_create_group_title">Özel Grup Oluştur</string>
|
||||||
<string name="groups_create_group_button">Grup Oluştur</string>
|
<string name="groups_create_group_button">Grup Oluştur</string>
|
||||||
<string name="groups_create_group_invitation_button">Davet Gönder</string>
|
<string name="groups_create_group_invitation_button">Davetiye Gönder</string>
|
||||||
<string name="groups_create_group_hint">Özel grubunuz için bir ad belirleyin</string>
|
<string name="groups_create_group_hint">Özel grubunuz için bir ad belirleyin</string>
|
||||||
<string name="groups_invitation_sent">Grup daveti gönderildi</string>
|
<string name="groups_invitation_sent">Grup davetiyesi gönderildi</string>
|
||||||
<string name="groups_member_list">Üye Listesi</string>
|
<string name="groups_member_list">Üye Listesi</string>
|
||||||
<string name="groups_invite_members">Üyeleri Davet Edin</string>
|
<string name="groups_invite_members">Üyeleri Davet Edin</string>
|
||||||
<string name="groups_member_created_you">Grubu siz oluşturdunuz</string>
|
<string name="groups_member_created_you">Grubu siz oluşturdunuz</string>
|
||||||
@@ -275,19 +239,19 @@
|
|||||||
<string name="groups_leave_dialog_message">Bu gruptan ayrılmak istediğinizden emin misiniz?</string>
|
<string name="groups_leave_dialog_message">Bu gruptan ayrılmak istediğinizden emin misiniz?</string>
|
||||||
<string name="groups_dissolve">Grubu Dağıt</string>
|
<string name="groups_dissolve">Grubu Dağıt</string>
|
||||||
<string name="groups_dissolve_dialog_title">Grubu Dağıtmayı Onayla</string>
|
<string name="groups_dissolve_dialog_title">Grubu Dağıtmayı Onayla</string>
|
||||||
<string name="groups_dissolve_dialog_message">Bu grubu dağıtmak istediğinizden emin misiniz?\n\nDiğer tüm üyeler sohbetlerine devam edemeyecek ve en son iletileri alamayacak.</string>
|
<string name="groups_dissolve_dialog_message">Bu grubu dağıtmak istediğinizden emin misiniz?\n\nDiğer tüm üyeler sohbetlerine devam edemeyecek ve en yeni mesajları alamayacak.</string>
|
||||||
<string name="groups_dissolve_button">Dağıt</string>
|
<string name="groups_dissolve_button">Dağıt</string>
|
||||||
<string name="groups_dissolved_dialog_title">Grup Dağıtıldı</string>
|
<string name="groups_dissolved_dialog_title">Grup Dağıtıldı</string>
|
||||||
<string name="groups_dissolved_dialog_message">Bu grubu oluşturan kişi grubu dağıttı.\n\nArtık gruba ileti yazamazsınız ve yazılmış olan tüm gönderileri alamayabilirsiniz.</string>
|
<string name="groups_dissolved_dialog_message">Bu grubun kurucusu, grubu dağıttı.\n\nArtık gruba mesaj yazamazsınız ve yazılmış olan mesajları alamayabilirsiniz.</string>
|
||||||
<!--Private Group Invitations-->
|
<!--Private Group Invitations-->
|
||||||
<string name="groups_invitations_title">Grup Davetleri</string>
|
<string name="groups_invitations_title">Grup Davetleri</string>
|
||||||
<string name="groups_invitations_invitation_sent">%1$s kişisini \"%2$s\" grubuna davet ettiniz.</string>
|
<string name="groups_invitations_invitation_sent">%1$s kişisini \"%2$s\" grubuna davet ettiniz.</string>
|
||||||
<string name="groups_invitations_invitation_received">%1$s sizi \"%2$s\" grubuna davet etti.</string>
|
<string name="groups_invitations_invitation_received">%1$s sizi \"%2$s\" grubuna davet etti.</string>
|
||||||
<string name="groups_invitations_joined">Gruba katıldı</string>
|
<string name="groups_invitations_joined">Gruba katıldı</string>
|
||||||
<string name="groups_invitations_declined">Grup daveti reddedildi</string>
|
<string name="groups_invitations_declined">Grup davetiyesi reddedildi</string>
|
||||||
<plurals name="groups_invitations_open">
|
<plurals name="groups_invitations_open">
|
||||||
<item quantity="one">%d açık grup davetiyesi</item>
|
<item quantity="one">%d açık grup davetiyesi</item>
|
||||||
<item quantity="other">%d açık grup daveti</item>
|
<item quantity="other">%d açık grup davetiyesi</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="groups_invitations_response_accepted_sent">%s kişisinden gelen grup davetini kabul ettiniz.</string>
|
<string name="groups_invitations_response_accepted_sent">%s kişisinden gelen grup davetini kabul ettiniz.</string>
|
||||||
<string name="groups_invitations_response_declined_sent">%s kişisinden gelen grup davetini reddettiniz.</string>
|
<string name="groups_invitations_response_declined_sent">%s kişisinden gelen grup davetini reddettiniz.</string>
|
||||||
@@ -296,47 +260,44 @@
|
|||||||
<string name="sharing_status_groups">Sadece grubu oluşturan kişi gruba yeni üyeler davet edebilir. Aşağıda, grubun şimdiki üyeleri bulunmaktadır.</string>
|
<string name="sharing_status_groups">Sadece grubu oluşturan kişi gruba yeni üyeler davet edebilir. Aşağıda, grubun şimdiki üyeleri bulunmaktadır.</string>
|
||||||
<!--Private Groups Revealing Contacts-->
|
<!--Private Groups Revealing Contacts-->
|
||||||
<string name="groups_reveal_contacts">Kişileri Göster</string>
|
<string name="groups_reveal_contacts">Kişileri Göster</string>
|
||||||
<string name="groups_reveal_dialog_message">Kişileri bu grubun şimdiki ve gelecekteki üyelerinin tümüne gösterip göstermeyeceğinizi seçebilirsiniz.\n\nKişileri görünür yapmak, grupla olan bağlantınızı daha hızlı ve güvenilir hale getirir, çünkü grubu oluşturan çevrimdışı olduğunda bile görünen kişilerle iletişim kurabilirsiniz.</string>
|
<string name="groups_reveal_dialog_message">Kişileri bu grubun şimdiki ve gelecekteki üyelerinin tümüne gösterip göstermeyeceğinizi seçebilirsiniz.\n\nKişileri görünür yapmak , grupla olan bağlantınızı daha hızlı ve güvenilir hale getirir, çünkü grubun oluşturucusu çevrimdışı olduğunda bile görünen kişilerle iletişim kurabilirsiniz.</string>
|
||||||
<string name="groups_reveal_visible">Kişi ilişkisi grup tarafından görülebilir</string>
|
<string name="groups_reveal_visible">Kişi ilişkisi grup tarafından görülebilir</string>
|
||||||
<string name="groups_reveal_visible_revealed_by_us">Kişi ilişkisi grup tarafından görülebilir (siz görünür yaptınız)</string>
|
<string name="groups_reveal_visible_revealed_by_us">Kişi ilişkisi grup tarafından görülebilir (siz bildirdiniz)</string>
|
||||||
<string name="groups_reveal_visible_revealed_by_contact">Kişi ilişkileri grup tarafından görülebilir (%s görünür yaptı)</string>
|
<string name="groups_reveal_visible_revealed_by_contact">Kişi ilişkileri grup tarafından görülebilir (%s görünür yaptı)</string>
|
||||||
<string name="groups_reveal_invisible">Kişi ilişkisi grup tarafından görülemez</string>
|
<string name="groups_reveal_invisible">Kişi ilişkisi grup tarafından görülemez</string>
|
||||||
<!--Forums-->
|
<!--Forums-->
|
||||||
<string name="no_forums">Gösterilecek forum yok</string>
|
<string name="no_forums">Gösterilecek forum yok</string>
|
||||||
<string name="no_forums_action">Bir forum oluşturmak için + simgesine dokunun veya kişilerinizden forumları sizinle paylaşmasını isteyin</string>
|
<string name="create_forum_title">Forumu Ouştur</string>
|
||||||
<string name="create_forum_title">Forum Oluştur</string>
|
|
||||||
<string name="choose_forum_hint">Forumunuz için bir ad belirleyin</string>
|
<string name="choose_forum_hint">Forumunuz için bir ad belirleyin</string>
|
||||||
<string name="create_forum_button">Forum Oluştur</string>
|
<string name="create_forum_button">Forumu Ouştur</string>
|
||||||
<string name="forum_created_toast">Forum Oluşturuldu</string>
|
<string name="forum_created_toast">Forum Oluşturuldu</string>
|
||||||
<string name="no_forum_posts">Gösterilecek gönderi yok</string>
|
<string name="no_forum_posts">Gösterilecek posta yok</string>
|
||||||
<string name="no_posts">Gönderi yok</string>
|
<string name="no_posts">Gönderi yok</string>
|
||||||
<plurals name="posts">
|
<plurals name="posts">
|
||||||
<item quantity="one">%d gönderi</item>
|
<item quantity="one">%d gönderi</item>
|
||||||
<item quantity="other">%d gönderi</item>
|
<item quantity="other">%d gönderi</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="forum_new_message_hint">Yeni Gönderi</string>
|
<string name="forum_new_message_hint">Yeni Posta</string>
|
||||||
<string name="forum_message_reply_hint">Yeni Yanıt</string>
|
<string name="forum_message_reply_hint">Yeni Cevap</string>
|
||||||
<string name="btn_reply">Yanıtla</string>
|
<string name="btn_reply">Cevapla</string>
|
||||||
<string name="forum_leave">Forumdan Ayrıl</string>
|
<string name="forum_leave">Forumdan Ayrıl</string>
|
||||||
<string name="dialog_title_leave_forum">Forumdan Ayrılmayı Onayla</string>
|
<string name="dialog_title_leave_forum">Forumdan Ayrılmayı Onayla</string>
|
||||||
<string name="dialog_message_leave_forum">Bu forumdan ayrılmak istediğinize emin misiniz?\n\Bu forumu paylaştığınız kişilerin güncelleme alması durabilir.</string>
|
<string name="dialog_message_leave_forum">Bu forumdan ayrılmak istediğinize emin misiniz?\n\Bu forumu paylaştığınız kişiler güncelleme almayı durdurabilir.</string>
|
||||||
<string name="dialog_button_leave">Ayrıl</string>
|
<string name="dialog_button_leave">Ayrıl</string>
|
||||||
<string name="forum_left_toast">Forumdan çıkıldı</string>
|
|
||||||
<!--Forum Sharing-->
|
<!--Forum Sharing-->
|
||||||
<string name="forum_share_button">Forumu Paylaş</string>
|
<string name="forum_share_button">Forumu Paylaş</string>
|
||||||
<string name="contacts_selected">Kişiler seçildi</string>
|
<string name="contacts_selected">Kişiler Seçildi</string>
|
||||||
<string name="activity_share_toolbar_header">Kişi Seç</string>
|
<string name="activity_share_toolbar_header">Kişi Seç</string>
|
||||||
<string name="no_contacts_selector">Gösterilecek kişi yok</string>
|
<string name="no_contacts_selector">Gösterilecek kişi yok</string>
|
||||||
<string name="no_contacts_selector_action">Kişi ekledikten sonra lütfen buraya geri dönün</string>
|
<string name="no_contacts_selector_action">Kişi ekledikten sonra lütfen buraya geri dönün</string>
|
||||||
<string name="forum_shared_snackbar">Forum, seçilen kişiler ile paylaşıldı</string>
|
<string name="forum_shared_snackbar">Forum, seçilen kişiler ile paylaşıldı</string>
|
||||||
<string name="forum_share_message">Bir ileti ekle (isteğe bağlı)</string>
|
<string name="forum_share_message">Bir ileti ekle (isteğe bağlı)</string>
|
||||||
<string name="forum_share_error">Forumu paylaşırken bir hata oluştu.</string>
|
<string name="forum_share_error">Forumu paylaşırken bir hata meydana geldi.</string>
|
||||||
<string name="forum_invitation_received">%1$s sizinle \"%2$s\" forumunu paylaştı.</string>
|
<string name="forum_invitation_received">%1$s sizinle \"%2$s\" forumunu paylaştı.</string>
|
||||||
<string name="forum_invitation_sent">\"%1$s\" forumunu %2$s ile paylaştınız.</string>
|
<string name="forum_invitation_sent">\"%1$s\" forumunu %2$s ile paylaştınız.</string>
|
||||||
<string name="forum_invitations_title">Forum Davetleri</string>
|
<string name="forum_invitations_title">Forum Davetleri</string>
|
||||||
<string name="forum_invitation_exists">Bu forum için bir daveti zaten kabul ettiniz.\n\nDaha fazla daveti kabul etmeniz, foruma bağlantınızı daha hızlı ve güvenilir yapar.</string>
|
|
||||||
<string name="forum_joined_toast">Foruma katıldı</string>
|
<string name="forum_joined_toast">Foruma katıldı</string>
|
||||||
<string name="forum_declined_toast">Davet reddedildi</string>
|
<string name="forum_declined_toast">Davetiye reddedildi</string>
|
||||||
<string name="shared_by_format">%s tarafından paylaşıldı</string>
|
<string name="shared_by_format">%s tarafından paylaşıldı</string>
|
||||||
<string name="forum_invitation_already_sharing">Zaten paylaşılıyor</string>
|
<string name="forum_invitation_already_sharing">Zaten paylaşılıyor</string>
|
||||||
<string name="forum_invitation_response_accepted_sent">%s tarafından yapılan forum davetini kabul ettiniz.</string>
|
<string name="forum_invitation_response_accepted_sent">%s tarafından yapılan forum davetini kabul ettiniz.</string>
|
||||||
@@ -352,25 +313,23 @@
|
|||||||
</plurals>
|
</plurals>
|
||||||
<string name="nobody">Hiç kimse</string>
|
<string name="nobody">Hiç kimse</string>
|
||||||
<!--Blogs-->
|
<!--Blogs-->
|
||||||
<string name="blogs_other_blog_empty_state">Gösterilecek gönderi yok</string>
|
<string name="blogs_other_blog_empty_state">Gösterilecek posta yok</string>
|
||||||
<string name="read_more">daha fazlasını oku</string>
|
<string name="read_more">daha fazlasını oku</string>
|
||||||
<string name="blogs_write_blog_post">Blog Gönderisi Yaz</string>
|
<string name="blogs_write_blog_post">Blog Gönderisi Yaz</string>
|
||||||
<string name="blogs_write_blog_post_body_hint">Blog gönderinizi yazın</string>
|
<string name="blogs_write_blog_post_body_hint">Blog gönderinizi yazın</string>
|
||||||
<string name="blogs_publish_blog_post">Yayınla</string>
|
<string name="blogs_publish_blog_post">Yayınla</string>
|
||||||
<string name="blogs_blog_post_created">Blog Gönderisi Oluşturuldu</string>
|
<string name="blogs_blog_post_created">Blog Gönderisi Oluşturuldu</string>
|
||||||
<string name="blogs_blog_post_received">Yeni Blog Gönderisi Alındı</string>
|
<string name="blogs_blog_post_received">Yeni Blog Gönderisi Alındı</string>
|
||||||
<string name="blogs_blog_post_scroll_to">Kaydır</string>
|
<string name="blogs_blog_post_scroll_to">Kaydırma</string>
|
||||||
<string name="blogs_feed_empty_state">Gösterilecek gönderi yok</string>
|
<string name="blogs_feed_empty_state">Gösterilecek posta yok</string>
|
||||||
<string name="blogs_feed_empty_state_action">Kişilerinizden veya abone olduğunuz bloglardan gelen gönderiler burada görünecek. Bir gönderi yazmak için kalem simgesine dokunun</string>
|
<string name="blogs_remove_blog">Blog\'u sil</string>
|
||||||
<string name="blogs_remove_blog">Blog\'u kaldır</string>
|
<string name="blogs_remove_blog_ok">Tuşu Sil</string>
|
||||||
<string name="blogs_remove_blog_dialog_message">Bu blogu kaldırmak istediğinizden emin misiniz?\n\nGönderiler sizin aygıtınızdan değil, diğer insanların aygıtlarından kaldırılacaktır.\n\nBu blogu paylaştığınız kişilerin güncellemeleri alması durabilir.</string>
|
|
||||||
<string name="blogs_remove_blog_ok">Kaldır</string>
|
|
||||||
<string name="blogs_blog_removed">Blog kaldırıldı</string>
|
<string name="blogs_blog_removed">Blog kaldırıldı</string>
|
||||||
<string name="blogs_reblog_comment_hint">Bir yorum ekle (isteğe bağlı)</string>
|
<string name="blogs_reblog_comment_hint">Bir yorum ekle (isteğe bağlı)</string>
|
||||||
<string name="blogs_reblog_button">Blogu yeniden yayınla</string>
|
<string name="blogs_reblog_button">Yeniden blogda yayınla</string>
|
||||||
<!--Blog Sharing-->
|
<!--Blog Sharing-->
|
||||||
<string name="blogs_sharing_share">Blog\'u Paylaş</string>
|
<string name="blogs_sharing_share">Blog\'u Paylaş</string>
|
||||||
<string name="blogs_sharing_error">Blog\'u paylaşırken bir hata oluştu.</string>
|
<string name="blogs_sharing_error">Blog\'u paylaşırken bir hata meydana geldi.</string>
|
||||||
<string name="blogs_sharing_button">Blog\'u Paylaş</string>
|
<string name="blogs_sharing_button">Blog\'u Paylaş</string>
|
||||||
<string name="blogs_sharing_snackbar">Blog seçilen kişilerle paylaşıldı</string>
|
<string name="blogs_sharing_snackbar">Blog seçilen kişilerle paylaşıldı</string>
|
||||||
<string name="blogs_sharing_response_accepted_sent">%s kişisinden gelen blog davetini kabul ettiniz.</string>
|
<string name="blogs_sharing_response_accepted_sent">%s kişisinden gelen blog davetini kabul ettiniz.</string>
|
||||||
@@ -381,57 +340,49 @@
|
|||||||
<string name="blogs_sharing_invitation_sent">%1$s blogunu %2$s ile paylaştınız.</string>
|
<string name="blogs_sharing_invitation_sent">%1$s blogunu %2$s ile paylaştınız.</string>
|
||||||
<string name="blogs_sharing_invitations_title">Blog Davetleri</string>
|
<string name="blogs_sharing_invitations_title">Blog Davetleri</string>
|
||||||
<string name="blogs_sharing_joined_toast">Bloga abone olundu</string>
|
<string name="blogs_sharing_joined_toast">Bloga abone olundu</string>
|
||||||
<string name="blogs_sharing_declined_toast">Davet reddedildi</string>
|
<string name="blogs_sharing_declined_toast">Davetiye reddedildi</string>
|
||||||
<string name="sharing_status_blog">Bir blog\'a abone olan herkes, blog\'u kişileriyle paylaşabilir. Bu blog\'u şu kişilerle paylaşıyorsunuz. Göremediğiniz diğer aboneler de olabilir.</string>
|
<string name="sharing_status_blog">Bir blog\'a abone olan herkes, blog\'u kişileriyle paylaşabilir. Bu blog\'u şu kişilerle paylaşıyorsunuz. Göremediğiniz diğer aboneler de olabilir.</string>
|
||||||
<!--RSS Feeds-->
|
<!--RSS Feeds-->
|
||||||
<string name="blogs_rss_feeds_import">RSS beslemelerini içe aktar</string>
|
<string name="blogs_rss_feeds_import">RSS kaynaklarını içeri aktar</string>
|
||||||
<string name="blogs_rss_feeds_import_button">İçe Aktar</string>
|
<string name="blogs_rss_feeds_import_button">İçeri Aktar</string>
|
||||||
<string name="blogs_rss_feeds_import_hint">RSS beslemesi URL\'sini girin</string>
|
<string name="blogs_rss_feeds_import_hint">URL ya da RSS kaynağı girin</string>
|
||||||
<string name="blogs_rss_feeds_import_error">Üzgünüz! RSS beslemeniz içe aktarılırken bir hata oluştu.</string>
|
<string name="blogs_rss_feeds_import_error">Üzgünüz! RSS beslemenizi içe aktarırken bir hata oluştu.</string>
|
||||||
<string name="blogs_rss_feeds_manage">RSS Beslemelerini Yönet</string>
|
<string name="blogs_rss_feeds_manage">RSS\'leri Yönet</string>
|
||||||
<string name="blogs_rss_feeds_manage_imported">İçe Aktarıldı:</string>
|
<string name="blogs_rss_feeds_manage_imported">İçeri Aktarıldı:</string>
|
||||||
<string name="blogs_rss_feeds_manage_author">Yazar:</string>
|
<string name="blogs_rss_feeds_manage_author">Yazar:</string>
|
||||||
<string name="blogs_rss_feeds_manage_updated">Son Güncelleme:</string>
|
<string name="blogs_rss_feeds_manage_updated">Son Güncelleme:</string>
|
||||||
<string name="blogs_rss_remove_feed">Beslemeyi Kaldır</string>
|
<string name="blogs_rss_remove_feed">Kaynağı Sil</string>
|
||||||
<string name="blogs_rss_remove_feed_dialog_message">Bu beslemeyi kaldırmak istediğinizden emin misiniz?\n\nGönderiler sizin aygıtınızdan değil, diğer insanların aygıtlarından kaldırılacaktır.\n\nBu beslemeyi paylaştığınız kişiler güncellemeleri alması durabilir.</string>
|
<string name="blogs_rss_remove_feed_ok">Tuşu Sil</string>
|
||||||
<string name="blogs_rss_remove_feed_ok">Kaldır</string>
|
|
||||||
<string name="blogs_rss_feeds_manage_delete_error">Besleme silinemedi!</string>
|
<string name="blogs_rss_feeds_manage_delete_error">Besleme silinemedi!</string>
|
||||||
<string name="blogs_rss_feeds_manage_empty_state">Gösterilecek RSS beslemesi yok\n\nBir beslemeyi içe aktarmak için + simgesine dokunun</string>
|
<string name="blogs_rss_feeds_manage_error">Beslemeleriniz yüklenirken bir hata meydana geldi. Lütfen daha sonra tekrar deneyin.</string>
|
||||||
<string name="blogs_rss_feeds_manage_error">Beslemeleriniz yüklenirken bir hata oluştu. Lütfen daha sonra tekrar deneyin.</string>
|
|
||||||
<!--Settings Display-->
|
<!--Settings Display-->
|
||||||
<string name="pref_language_title">Dil ve Bölge</string>
|
<string name="pref_language_changed">Briar\'ı yeniden başlattığınızda bu ayar geçerli olacaktır. Lütfen çıkın ve Briar\'ı yeniden başlatın.</string>
|
||||||
<string name="pref_language_changed">Briar\'ı yeniden başlattığınızda bu ayar geçerli olacaktır. Lütfen çıkış yapın ve Briar\'ı yeniden başlatın.</string>
|
<string name="pref_language_default">Sistem öntanımlısı</string>
|
||||||
<string name="pref_language_default">Sistemde öntanımlı olan</string>
|
|
||||||
<string name="display_settings_title">Görüntüle</string>
|
<string name="display_settings_title">Görüntüle</string>
|
||||||
<string name="pref_theme_title">Tema</string>
|
<string name="pref_theme_title">Tema</string>
|
||||||
<string name="pref_theme_light">Açık</string>
|
<string name="pref_theme_light">Açık</string>
|
||||||
<string name="pref_theme_dark">Koyu</string>
|
<string name="pref_theme_dark">Koyu</string>
|
||||||
<string name="pref_theme_auto">Otomatik (Gündüz)</string>
|
<string name="pref_theme_auto">Otomatik (Gündüz)</string>
|
||||||
<string name="pref_theme_system">Sistemde öntanımlı olan</string>
|
<string name="pref_theme_system">Sistem öntanımlısı</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
<string name="network_settings_title">Bağlantılar</string>
|
<string name="network_settings_title">Ağlar</string>
|
||||||
<string name="bluetooth_setting">Kişilere Bluetooth ile Bağlan</string>
|
<string name="bluetooth_setting">Bluetooth ile Bağlan</string>
|
||||||
<string name="wifi_setting">Aynı kablosuz ağ üzerindeki kişilere bağlan</string>
|
<string name="bluetooth_setting_enabled">Yakınlardaki her kişi</string>
|
||||||
<string name="tor_enable_title">Kişilere İnternet aracılığıyla bağlan</string>
|
<string name="bluetooth_setting_disabled">Yalnızca kişi eklerken</string>
|
||||||
<string name="tor_enable_summary">Bütün bağlantılar gizlilik için Tor Ağı üzerinden gerçekleşir</string>
|
<string name="tor_network_setting">İnternet üzerinden Bağlan (Tor)</string>
|
||||||
<string name="tor_network_setting">Tor ağına bağlanma yöntemi</string>
|
|
||||||
<string name="tor_network_setting_automatic">Konuma göre otomatik</string>
|
<string name="tor_network_setting_automatic">Konuma göre otomatik</string>
|
||||||
<string name="tor_network_setting_without_bridges">Tor ağını köprü olmadan kullan</string>
|
<string name="tor_network_setting_without_bridges">Tor\'u köprüsüz kullanın</string>
|
||||||
<string name="tor_network_setting_with_bridges">Tor ağını köprülerle kullan</string>
|
<string name="tor_network_setting_with_bridges">Tor\'u köprü ile kullanın</string>
|
||||||
<string name="tor_network_setting_never">İnternete bağlanma</string>
|
<string name="tor_network_setting_never">Bağlanma!</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Otomatik: %1$s (%2$siçinde)</string>
|
<string name="tor_network_setting_summary">Otomatik: %1$s (%2$siçinde)</string>
|
||||||
<string name="tor_mobile_data_title">Mobil veri kullan</string>
|
<string name="tor_mobile_data_title">Mobil veri kullan</string>
|
||||||
<string name="tor_only_when_charging_title">İnternete sadece şarj sırasında bağlan</string>
|
<string name="tor_only_when_charging_title">Sadece şarj ederken internet (Tor) üzerinden bağlan</string>
|
||||||
<string name="tor_only_when_charging_summary">Aygıt pilde çalışırken İnternet bağlantısını devre dışı bırakır</string>
|
<string name="tor_only_when_charging_summary">Aygıt pilde çalışırken internet bağlantısını devre dışı bırak</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Güvenlik</string>
|
<string name="security_settings_title">Güvenlik</string>
|
||||||
<string name="pref_lock_title">Uygulama kilidi</string>
|
<string name="pref_lock_title">Uygulama kilidi</string>
|
||||||
<string name="pref_lock_summary">Oturum açmışken Briar\'ı korumak için aygıtın ekran kilidini kullanın</string>
|
|
||||||
<string name="pref_lock_disabled_summary">Bu özelliği kullanmak için aygıtınıza bir ekran kilidi ayarlayın</string>
|
|
||||||
<string name="pref_lock_timeout_title">Uygulama kilidi etkisizlik süresi</string>
|
|
||||||
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
|
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
|
||||||
<string name="pref_lock_timeout_summary">Briar\'ı kullanmadığınızda %s sonra otomatik olarak kilitleyin</string>
|
|
||||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||||
<string name="pref_lock_timeout_1">1 dakika</string>
|
<string name="pref_lock_timeout_1">1 dakika</string>
|
||||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||||
@@ -451,7 +402,7 @@
|
|||||||
<string name="password_changed">Parolanız başarıyla değişti.</string>
|
<string name="password_changed">Parolanız başarıyla değişti.</string>
|
||||||
<string name="panic_setting">Panik buton ayarları</string>
|
<string name="panic_setting">Panik buton ayarları</string>
|
||||||
<string name="panic_setting_title">Panik butonu</string>
|
<string name="panic_setting_title">Panik butonu</string>
|
||||||
<string name="panic_setting_hint">Panik düğmesi uygulamasını kullandığınızda Briar\'ın nasıl tepki vereceğini yapılandırma</string>
|
<string name="panic_setting_hint">Panik düğmesi uygulaması kullandığınızda Briar\'ın nasıl tepki vereceğini yapılandırma</string>
|
||||||
<string name="panic_app_setting_title">Panik Butonu Uygulaması</string>
|
<string name="panic_app_setting_title">Panik Butonu Uygulaması</string>
|
||||||
<string name="unknown_app">bilinmeyen bir uygulama</string>
|
<string name="unknown_app">bilinmeyen bir uygulama</string>
|
||||||
<string name="panic_app_setting_summary">Kurulmuş bir uygulama yok</string>
|
<string name="panic_app_setting_summary">Kurulmuş bir uygulama yok</string>
|
||||||
@@ -463,15 +414,15 @@
|
|||||||
<string name="panic_setting_signout_summary">Panik Butonuna basıldığında Briar\'dan çıkış yap</string>
|
<string name="panic_setting_signout_summary">Panik Butonuna basıldığında Briar\'dan çıkış yap</string>
|
||||||
<string name="purge_setting_title">Hesabı Sil</string>
|
<string name="purge_setting_title">Hesabı Sil</string>
|
||||||
<string name="purge_setting_summary">Bir panik düğmesine basıldığında Briar hesabınızı silin. Dikkat: Bu, kimliklerinizi, kayıtlarınızı ve iletilerinizi kalıcı olarak silecektir.</string>
|
<string name="purge_setting_summary">Bir panik düğmesine basıldığında Briar hesabınızı silin. Dikkat: Bu, kimliklerinizi, kayıtlarınızı ve iletilerinizi kalıcı olarak silecektir.</string>
|
||||||
|
<string name="uninstall_setting_title">Briar\'ı Kaldır</string>
|
||||||
|
<string name="uninstall_setting_summary">Bu, bir panik olayında manuel onay gerektirir</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Bildirimler</string>
|
<string name="notification_settings_title">Bildirimler</string>
|
||||||
<string name="notify_sign_in_title">Oturum açmayı anımsat</string>
|
|
||||||
<string name="notify_sign_in_summary">Telefon açıldığında veya uygulama güncellendiğinde bir anımsatıcı göster</string>
|
|
||||||
<string name="notify_private_messages_setting_title">Özel İletiler</string>
|
<string name="notify_private_messages_setting_title">Özel İletiler</string>
|
||||||
<string name="notify_private_messages_setting_summary">Özel iletiler için uyarıları göster</string>
|
<string name="notify_private_messages_setting_summary">Özel iletiler için uyarıları göster</string>
|
||||||
<string name="notify_private_messages_setting_summary_26">Özel iletiler için uyarıları yapılandır</string>
|
<string name="notify_private_messages_setting_summary_26">Özel iletiler için uyarıları yapılandır</string>
|
||||||
<string name="notify_group_messages_setting_title">Grup iletileri</string>
|
<string name="notify_group_messages_setting_title">Grup iletileri</string>
|
||||||
<string name="notify_group_messages_setting_summary">Grup iletileri için uyarıları göster</string>
|
<string name="notify_group_messages_setting_summary">Grup mesajları için uyarıları göster</string>
|
||||||
<string name="notify_group_messages_setting_summary_26">Grup iletileri için uyarıları yapılandır</string>
|
<string name="notify_group_messages_setting_summary_26">Grup iletileri için uyarıları yapılandır</string>
|
||||||
<string name="notify_forum_posts_setting_title">Forum gönderileri</string>
|
<string name="notify_forum_posts_setting_title">Forum gönderileri</string>
|
||||||
<string name="notify_forum_posts_setting_summary">Forum gönderileri için uyarıları göster</string>
|
<string name="notify_forum_posts_setting_summary">Forum gönderileri için uyarıları göster</string>
|
||||||
@@ -479,7 +430,7 @@
|
|||||||
<string name="notify_blog_posts_setting_title">Blog gönderileri</string>
|
<string name="notify_blog_posts_setting_title">Blog gönderileri</string>
|
||||||
<string name="notify_blog_posts_setting_summary">Blog gönderileri için uyarıları göster</string>
|
<string name="notify_blog_posts_setting_summary">Blog gönderileri için uyarıları göster</string>
|
||||||
<string name="notify_blog_posts_setting_summary_26">Blog gönderileri için uyarıları yapılandır</string>
|
<string name="notify_blog_posts_setting_summary_26">Blog gönderileri için uyarıları yapılandır</string>
|
||||||
<string name="notify_vibration_setting">Titreşim</string>
|
<string name="notify_vibration_setting">Titretişim</string>
|
||||||
<string name="notify_sound_setting">Ses</string>
|
<string name="notify_sound_setting">Ses</string>
|
||||||
<string name="notify_sound_setting_default">Varsayılan zil sesi</string>
|
<string name="notify_sound_setting_default">Varsayılan zil sesi</string>
|
||||||
<string name="notify_sound_setting_disabled">Yok</string>
|
<string name="notify_sound_setting_disabled">Yok</string>
|
||||||
@@ -492,7 +443,7 @@
|
|||||||
<string name="link_warning_title">Uyarı Bağlantısı</string>
|
<string name="link_warning_title">Uyarı Bağlantısı</string>
|
||||||
<string name="link_warning_intro">Aşağıdaki bağlantıyı harici bir uygulamayla açmak üzeresiniz.</string>
|
<string name="link_warning_intro">Aşağıdaki bağlantıyı harici bir uygulamayla açmak üzeresiniz.</string>
|
||||||
<string name="link_warning_text">Bu sizi tanımlamak için kullanılabilir. Size bu bağlantıyı gönderen kişiye güvenip güvenmediğinizi düşünün ve Tor Tarayıcı ile açın.</string>
|
<string name="link_warning_text">Bu sizi tanımlamak için kullanılabilir. Size bu bağlantıyı gönderen kişiye güvenip güvenmediğinizi düşünün ve Tor Tarayıcı ile açın.</string>
|
||||||
<string name="link_warning_open_link">Bağlantıyı Aç</string>
|
<string name="link_warning_open_link">Bağlantı Aç</string>
|
||||||
<!--Crash Reporter-->
|
<!--Crash Reporter-->
|
||||||
<string name="crash_report_title">Briar Çökme Raporu</string>
|
<string name="crash_report_title">Briar Çökme Raporu</string>
|
||||||
<string name="briar_crashed">Üzgünüz, Briar çöktü.</string>
|
<string name="briar_crashed">Üzgünüz, Briar çöktü.</string>
|
||||||
@@ -503,8 +454,8 @@
|
|||||||
<string name="describe_crash">Ne olduğunu bize anlatın (isteğe bağlı)</string>
|
<string name="describe_crash">Ne olduğunu bize anlatın (isteğe bağlı)</string>
|
||||||
<string name="enter_feedback">Geri bildiriminizi girin</string>
|
<string name="enter_feedback">Geri bildiriminizi girin</string>
|
||||||
<string name="optional_contact_email">E-posta adresiniz (isteğe bağlı)</string>
|
<string name="optional_contact_email">E-posta adresiniz (isteğe bağlı)</string>
|
||||||
<string name="include_debug_report_crash">Çökme ile ilgili anonim verileri ekle</string>
|
<string name="include_debug_report_crash">Çökme ile ilgili anonim verileri içerir</string>
|
||||||
<string name="include_debug_report_feedback">Bu aygıtla ilgili anonim verileri ekle</string>
|
<string name="include_debug_report_feedback">Bu cihazla ilgili anonim verileri içerir</string>
|
||||||
<string name="could_not_load_report_data">Rapor verileri yüklenemedi.</string>
|
<string name="could_not_load_report_data">Rapor verileri yüklenemedi.</string>
|
||||||
<string name="send_report">Raporu gönder</string>
|
<string name="send_report">Raporu gönder</string>
|
||||||
<string name="close">Kapat</string>
|
<string name="close">Kapat</string>
|
||||||
@@ -513,25 +464,21 @@
|
|||||||
<string name="progress_title_logout">Briar\'dan çıkılıyor...</string>
|
<string name="progress_title_logout">Briar\'dan çıkılıyor...</string>
|
||||||
<!--Screen Filters & Tapjacking-->
|
<!--Screen Filters & Tapjacking-->
|
||||||
<string name="screen_filter_title">Ekran bindirme algılandı</string>
|
<string name="screen_filter_title">Ekran bindirme algılandı</string>
|
||||||
<string name="screen_filter_body">Başka bir uygulama Briar\'ın üstünde görüntüleniyor. Bir başka uygulama Briar üstünde görüntülendiğinde, güvenliğinizi korumak için Briar dokunmalara tepki vermeyecektir.\n\nÜstte görüntülenen aşağıdaki uygulamalar olabilir:\n\n%1$s </string>
|
<string name="screen_filter_allow">Bu uygulamaların üstte çizim yapmasına izin ver</string>
|
||||||
<string name="screen_filter_allow">Bu uygulamaların üstte görüntülenmesine izin ver</string>
|
|
||||||
<!--Permission Requests-->
|
<!--Permission Requests-->
|
||||||
<string name="permission_camera_title">Kamera izinleri</string>
|
<string name="permission_camera_title">Kamera izinleri</string>
|
||||||
<string name="permission_camera_request_body">QR kodunu taramak için Briar\'ın kameraya erişmesi gerekiyor.</string>
|
<string name="permission_camera_request_body">QR kodunu taramak için Briar\'ın kameraya erişmesi gerekiyor.</string>
|
||||||
<string name="permission_location_title">Konum izinleri</string>
|
<string name="permission_location_title">Konum izinleri</string>
|
||||||
<string name="permission_location_request_body">Bluetooth aygıtlarını keşfetmek için, Briar\'ın konumunuza erişme iznine ihtiyaç duyar.\n\nBriar konum bilginizi kaydetmez ve kimseyle paylaşmaz.</string>
|
|
||||||
<string name="permission_camera_location_title">Kamera ve konum</string>
|
<string name="permission_camera_location_title">Kamera ve konum</string>
|
||||||
<string name="permission_camera_location_request_body">QR kodunu taramak için, Briar\'ın kameranıza erişmesi gerekiyor.\n\nBluetooth aygıtlarını keşfetmek için Briar\'ın konumunuza erişmesi gerekiyor.\n\nBriar konumunuzu saklamaz ve hiç kimseyle paylaşmaz.</string>
|
|
||||||
<string name="permission_camera_denied_body">Kameraya erişimi engellediniz, ancak kişi eklemek için kamerayı kullanmanız gerekiyor.\n\nLütfen erişim izni vermeyi düşünün.</string>
|
|
||||||
<string name="qr_code">QR kodu</string>
|
<string name="qr_code">QR kodu</string>
|
||||||
<string name="show_qr_code_fullscreen">QR kodunu tam ekran göster</string>
|
<string name="show_qr_code_fullscreen">QR kodu tam ekran göster</string>
|
||||||
<!--App Locking-->
|
<!--App Locking-->
|
||||||
<string name="lock_unlock">Briar\'ın Kilidini Aç</string>
|
<string name="lock_unlock">Briar\'ın Kilidini Aç</string>
|
||||||
<string name="lock_unlock_verbose">Briar\'ın kilidini açmak için aygıtınızın PİN kodunu, parolasını veya desenini girin</string>
|
<string name="lock_unlock_verbose">Briar\'ın kilidini açmak için aygıtınızın PİN kodunu, parolasını veya desenini girin</string>
|
||||||
<string name="lock_unlock_fingerprint_description">Devam etmek için, parmak izi algılayıcısına kayıtlı parmağınızla dokunun</string>
|
<string name="lock_unlock_fingerprint_description">Devam etmek için, parmak izi algılayıcısına kayıtlı parmağınızla dokunun</string>
|
||||||
<string name="lock_unlock_password">Parola Kullanın</string>
|
<string name="lock_unlock_password">Parola Kullanın</string>
|
||||||
<string name="lock_is_locked">Briar kilitli</string>
|
<string name="lock_is_locked">Briar kilitli</string>
|
||||||
<string name="lock_tap_to_unlock">Kilidi açmak için dokunun</string>
|
<string name="lock_tap_to_unlock">Kilitlemek için dokunun</string>
|
||||||
<!--Screenshots-->
|
<!--Screenshots-->
|
||||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||||
<string name="screenshot_alice">Alice</string>
|
<string name="screenshot_alice">Alice</string>
|
||||||
|
|||||||
@@ -104,6 +104,7 @@
|
|||||||
<string name="delete">Видалити</string>
|
<string name="delete">Видалити</string>
|
||||||
<string name="accept">Прийняти</string>
|
<string name="accept">Прийняти</string>
|
||||||
<string name="decline">Відхилити</string>
|
<string name="decline">Відхилити</string>
|
||||||
|
<string name="options">Параметри</string>
|
||||||
<string name="online">У мережі</string>
|
<string name="online">У мережі</string>
|
||||||
<string name="offline">Поза мережею</string>
|
<string name="offline">Поза мережею</string>
|
||||||
<string name="send">Відправити</string>
|
<string name="send">Відправити</string>
|
||||||
@@ -168,6 +169,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">Додати контакт віддалено</string>
|
<string name="add_contact_remotely_title_case">Додати контакт віддалено</string>
|
||||||
<string name="add_contact_nearby_title">Додати контакт поблизу</string>
|
<string name="add_contact_nearby_title">Додати контакт поблизу</string>
|
||||||
<string name="add_contact_remotely_title">Додати контакт віддалено</string>
|
<string name="add_contact_remotely_title">Додати контакт віддалено</string>
|
||||||
|
<string name="contact_name_hint">Дайте прізвисько контакту</string>
|
||||||
<string name="contact_link_intro">Введіть посилання від вашого контакту тут</string>
|
<string name="contact_link_intro">Введіть посилання від вашого контакту тут</string>
|
||||||
<string name="contact_link_hint">Посилання контакту</string>
|
<string name="contact_link_hint">Посилання контакту</string>
|
||||||
<string name="paste_button">Вставити</string>
|
<string name="paste_button">Вставити</string>
|
||||||
@@ -185,6 +187,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">Наявні нерозглянуті запити на контакт</string>
|
<string name="pending_contact_requests_snackbar">Наявні нерозглянуті запити на контакт</string>
|
||||||
<string name="pending_contact_requests">Нерозглянуті запити на контакт</string>
|
<string name="pending_contact_requests">Нерозглянуті запити на контакт</string>
|
||||||
<string name="no_pending_contacts">Відсутні нерозглянуті запити на контакт</string>
|
<string name="no_pending_contacts">Відсутні нерозглянуті запити на контакт</string>
|
||||||
|
<string name="add_contact_remote_connecting">Під\'єднання...</string>
|
||||||
<string name="waiting_for_contact_to_come_online">Очікування появи контакту в мережі...</string>
|
<string name="waiting_for_contact_to_come_online">Очікування появи контакту в мережі...</string>
|
||||||
<string name="connecting">Під\'єднання...</string>
|
<string name="connecting">Під\'єднання...</string>
|
||||||
<string name="adding_contact">Додавання контакту...</string>
|
<string name="adding_contact">Додавання контакту...</string>
|
||||||
@@ -207,6 +210,9 @@
|
|||||||
<item quantity="many">%d нових контактів додано.</item>
|
<item quantity="many">%d нових контактів додано.</item>
|
||||||
<item quantity="other">%d нового контакту додано.</item>
|
<item quantity="other">%d нового контакту додано.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">Додавання цього контакту триває довше, ніж зазвичай.</string>
|
||||||
|
<string name="adding_contact_slow_title">Не можна з\'єднатися з контактом</string>
|
||||||
|
<string name="adding_contact_slow_text">Додавання цього контакту триває довше, ніж зазвичай.\n\nБудь ласка, перевірте, чи ваш контакт отримав посилання і додав вас:</string>
|
||||||
<string name="offline_state">Відсутнє з\'єднання з інтернетом</string>
|
<string name="offline_state">Відсутнє з\'єднання з інтернетом</string>
|
||||||
<string name="duplicate_link_dialog_title">Дублювати посилання</string>
|
<string name="duplicate_link_dialog_title">Дублювати посилання</string>
|
||||||
<string name="duplicate_link_dialog_text_1">У вас наявний нерозглянутий запит на контакт з цим посиланням: %s</string>
|
<string name="duplicate_link_dialog_text_1">У вас наявний нерозглянутий запит на контакт з цим посиланням: %s</string>
|
||||||
@@ -233,6 +239,7 @@
|
|||||||
<string name="introduction_button">Познайомити з контактом</string>
|
<string name="introduction_button">Познайомити з контактом</string>
|
||||||
<string name="introduction_sent">Ваше представлення було надіслано.</string>
|
<string name="introduction_sent">Ваше представлення було надіслано.</string>
|
||||||
<string name="introduction_error">Виникла помилка під час представлення.</string>
|
<string name="introduction_error">Виникла помилка під час представлення.</string>
|
||||||
|
<string name="introduction_response_error">Сталася помилка під час відповіді на представлення</string>
|
||||||
<string name="introduction_request_sent">Ви попросили представити %1$s%2$s.</string>
|
<string name="introduction_request_sent">Ви попросили представити %1$s%2$s.</string>
|
||||||
<string name="introduction_request_received">%1$sпопросили представити вас %2$s. Чи бажаєте ви додати %2$s до свого списку контактів?</string>
|
<string name="introduction_request_received">%1$sпопросили представити вас %2$s. Чи бажаєте ви додати %2$s до свого списку контактів?</string>
|
||||||
<string name="introduction_request_exists_received">%1$sпопросив вас представити %2$s, однак %2$sвже є у вашому списку контактів. Оскільки %1$sпро це може бути невідомо, ви все ще можете відповісти:</string>
|
<string name="introduction_request_exists_received">%1$sпопросив вас представити %2$s, однак %2$sвже є у вашому списку контактів. Оскільки %1$sпро це може бути невідомо, ви все ще можете відповісти:</string>
|
||||||
@@ -411,11 +418,20 @@
|
|||||||
<string name="pref_theme_dark">Темна</string>
|
<string name="pref_theme_dark">Темна</string>
|
||||||
<string name="pref_theme_auto">Автоматично (Денна)</string>
|
<string name="pref_theme_auto">Автоматично (Денна)</string>
|
||||||
<string name="pref_theme_system">Усталені в системі</string>
|
<string name="pref_theme_system">Усталені в системі</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">Мережі</string>
|
||||||
|
<string name="bluetooth_setting">З\'єднатися через Bluetooth</string>
|
||||||
|
<string name="bluetooth_setting_enabled">Щоразу, коли контакти знаходяться поруч</string>
|
||||||
|
<string name="bluetooth_setting_disabled">Лише, коли ви додаєте контакти</string>
|
||||||
|
<string name="tor_network_setting">З\'єднатися через Інтернет (Tor) </string>
|
||||||
<string name="tor_network_setting_automatic">Розпізнавати автоматично на основі місцезнаходження</string>
|
<string name="tor_network_setting_automatic">Розпізнавати автоматично на основі місцезнаходження</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">Використовувати Tor без мостів</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">Використовувати Tor з мостами</string>
|
||||||
|
<string name="tor_network_setting_never">Не з\'єднувати</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">Автоматично: %1$s (через %2$s)</string>
|
<string name="tor_network_setting_summary">Автоматично: %1$s (через %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">Використовувати мобільну мережу</string>
|
<string name="tor_mobile_data_title">Використовувати мобільну мережу</string>
|
||||||
|
<string name="tor_only_when_charging_title">З’єднуватись через інтернет (Tor) тільки під час заряджання</string>
|
||||||
<string name="tor_only_when_charging_summary">Вимикає з’єднання з інтернетом коли пристрій працює від батареї</string>
|
<string name="tor_only_when_charging_summary">Вимикає з’єднання з інтернетом коли пристрій працює від батареї</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">Безпека</string>
|
<string name="security_settings_title">Безпека</string>
|
||||||
@@ -456,6 +472,8 @@
|
|||||||
<string name="panic_setting_signout_summary">Вийти з Briar, якщо натиснуто тривожну кнопку</string>
|
<string name="panic_setting_signout_summary">Вийти з Briar, якщо натиснуто тривожну кнопку</string>
|
||||||
<string name="purge_setting_title">Видалити обліковий запис</string>
|
<string name="purge_setting_title">Видалити обліковий запис</string>
|
||||||
<string name="purge_setting_summary">Видалити ваш обліковий запис Briar, якщо натиснуто тривожну кнопку. Попередження: це назавжди видалить ваші особисті дані, контакти та повідомлення</string>
|
<string name="purge_setting_summary">Видалити ваш обліковий запис Briar, якщо натиснуто тривожну кнопку. Попередження: це назавжди видалить ваші особисті дані, контакти та повідомлення</string>
|
||||||
|
<string name="uninstall_setting_title">Видалити Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">Ця дія потребує ручного підтвердження у випадку тривоги</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">Сповіщення</string>
|
<string name="notification_settings_title">Сповіщення</string>
|
||||||
<string name="notify_sign_in_title">Нагадайте мені увійти</string>
|
<string name="notify_sign_in_title">Нагадайте мені увійти</string>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<!--Setup-->
|
<!--Setup-->
|
||||||
<string name="setup_title">欢迎来到 Briar</string>
|
<string name="setup_title">欢迎来到 Briar</string>
|
||||||
<string name="setup_name_explanation">您的昵称将被显示在您发布的任何内容旁边。昵称在创建帐户后无法更改。</string>
|
<string name="setup_name_explanation">您的昵称将显示在您发布的任何内容旁。昵称在创建帐户后无法更改。</string>
|
||||||
<string name="setup_next">下一步</string>
|
<string name="setup_next">下一步</string>
|
||||||
<string name="setup_password_intro">设置一个密码</string>
|
<string name="setup_password_intro">设置一个密码</string>
|
||||||
<string name="setup_password_explanation">您的 Briar 帐户将被加密储存在您的设备上,而非云端。卸载 Briar 或忘记密码,将导致帐户无法恢复。请设置一个不易被猜出的长密码,比如四个随机英文单词,或是由随机字母、数字和符号组成的十位字符。</string>
|
<string name="setup_password_explanation">您的 Briar 帐户将被加密储存在您的设备上,而非云端。卸载 Briar 或忘记密码,将导致帐户无法恢复。请设置一个不易被猜出的长密码,比如四个随机英文单词,或是由随机字母、数字和符号组成的十位字符。</string>
|
||||||
@@ -15,22 +15,20 @@
|
|||||||
<string name="confirm_password">确认密码</string>
|
<string name="confirm_password">确认密码</string>
|
||||||
<string name="name_too_long">昵称过长</string>
|
<string name="name_too_long">昵称过长</string>
|
||||||
<string name="password_too_weak">密码强度不够</string>
|
<string name="password_too_weak">密码强度不够</string>
|
||||||
<string name="passwords_do_not_match">两次输入的密码不一致</string>
|
<string name="passwords_do_not_match">两次密码不匹配</string>
|
||||||
<string name="create_account_button">创建帐户</string>
|
<string name="create_account_button">创建帐户</string>
|
||||||
<string name="more_info">更多信息</string>
|
<string name="more_info">更多信息</string>
|
||||||
<string name="don_t_ask_again">不再询问</string>
|
<string name="don_t_ask_again">不再询问</string>
|
||||||
<string name="setup_huawei_text">轻按下方的按钮将 Briar 加入“受保护的应用”列表。</string>
|
<string name="setup_huawei_text">轻按下方的按钮将 Briar 加入“受保护的应用”列表。</string>
|
||||||
<string name="setup_huawei_button">保护 Briar</string>
|
<string name="setup_huawei_button">保护 Briar</string>
|
||||||
<string name="setup_huawei_help">如果 Briar 未被加入受保护应用列表,它将无法在后台运行。</string>
|
<string name="setup_huawei_help">如果 Briar 未被加入受保护应用列表,它将无法在后台运行。</string>
|
||||||
<string name="warning_dozed">%s 无法在后台运行</string>
|
<string name="warning_dozed">%s 无法在后台运行。</string>
|
||||||
<!--Login-->
|
<!--Login-->
|
||||||
<string name="enter_password">密码</string>
|
<string name="enter_password">密码</string>
|
||||||
<string name="try_again">密码错误,请重试</string>
|
<string name="try_again">密码错误,请重试</string>
|
||||||
<string name="dialog_title_cannot_check_password">无法检查密码</string>
|
|
||||||
<string name="dialog_message_cannot_check_password">Briar无法检查您的密码。请尝试重新启动您的设备以解决此问题。</string>
|
|
||||||
<string name="sign_in_button">登录</string>
|
<string name="sign_in_button">登录</string>
|
||||||
<string name="forgotten_password">我忘记了密码</string>
|
<string name="forgotten_password">我忘记了密码</string>
|
||||||
<string name="dialog_title_lost_password">密码遗失</string>
|
<string name="dialog_title_lost_password">忘记密码</string>
|
||||||
<string name="dialog_message_lost_password">您的 Briar 帐户被加密储存在您的设备上,而非云端,因此我们无法重置您的密码。您是否希望删除帐户,重新开始?\n\n注意:删除帐户将导致您的身份信息、联系人和消息永久丢失。</string>
|
<string name="dialog_message_lost_password">您的 Briar 帐户被加密储存在您的设备上,而非云端,因此我们无法重置您的密码。您是否希望删除帐户,重新开始?\n\n注意:删除帐户将导致您的身份信息、联系人和消息永久丢失。</string>
|
||||||
<string name="startup_failed_notification_title">Briar 无法启动</string>
|
<string name="startup_failed_notification_title">Briar 无法启动</string>
|
||||||
<string name="startup_failed_notification_text">轻按查看更多信息。</string>
|
<string name="startup_failed_notification_text">轻按查看更多信息。</string>
|
||||||
@@ -43,9 +41,7 @@
|
|||||||
<item quantity="other">这是 Briar 的一个测试版本。您的帐户将在 %d 天后到期,且无法延期。</item>
|
<item quantity="other">这是 Briar 的一个测试版本。您的帐户将在 %d 天后到期,且无法延期。</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="expiry_date_reached">本软件已过期。\n感谢您的测试!</string>
|
<string name="expiry_date_reached">本软件已过期。\n感谢您的测试!</string>
|
||||||
<string name="download_briar">请下载最新版本以继续使用 Briar</string>
|
|
||||||
<string name="create_new_account">您将需要创建一个新帐户,但可以使用相同的昵称。</string>
|
<string name="create_new_account">您将需要创建一个新帐户,但可以使用相同的昵称。</string>
|
||||||
<string name="download_briar_button">下载最新版本</string>
|
|
||||||
<string name="startup_open_database">正在解密数据库……</string>
|
<string name="startup_open_database">正在解密数据库……</string>
|
||||||
<string name="startup_migrate_database">正在更新数据库……</string>
|
<string name="startup_migrate_database">正在更新数据库……</string>
|
||||||
<string name="startup_compact_database">正在压缩数据库……</string>
|
<string name="startup_compact_database">正在压缩数据库……</string>
|
||||||
@@ -93,6 +89,7 @@
|
|||||||
<string name="delete">删除</string>
|
<string name="delete">删除</string>
|
||||||
<string name="accept">接受</string>
|
<string name="accept">接受</string>
|
||||||
<string name="decline">谢绝</string>
|
<string name="decline">谢绝</string>
|
||||||
|
<string name="options">选项</string>
|
||||||
<string name="online">在线</string>
|
<string name="online">在线</string>
|
||||||
<string name="offline">离线</string>
|
<string name="offline">离线</string>
|
||||||
<string name="send">发送</string>
|
<string name="send">发送</string>
|
||||||
@@ -105,7 +102,6 @@
|
|||||||
<string name="fix">修复</string>
|
<string name="fix">修复</string>
|
||||||
<string name="help">帮助</string>
|
<string name="help">帮助</string>
|
||||||
<string name="sorry">抱歉</string>
|
<string name="sorry">抱歉</string>
|
||||||
<string name="error_start_activity">在您的系统上不可用</string>
|
|
||||||
<!--Contacts and Private Conversations-->
|
<!--Contacts and Private Conversations-->
|
||||||
<string name="no_contacts">尚无联系人可供显示</string>
|
<string name="no_contacts">尚无联系人可供显示</string>
|
||||||
<string name="no_contacts_action">轻按 + 号即可添加联系人</string>
|
<string name="no_contacts_action">轻按 + 号即可添加联系人</string>
|
||||||
@@ -120,17 +116,6 @@
|
|||||||
<string name="set_contact_alias">更改联系人姓名</string>
|
<string name="set_contact_alias">更改联系人姓名</string>
|
||||||
<string name="set_contact_alias_hint">联系人姓名</string>
|
<string name="set_contact_alias_hint">联系人姓名</string>
|
||||||
<string name="set_alias_button">更改</string>
|
<string name="set_alias_button">更改</string>
|
||||||
<string name="delete_all_messages">删除全部消息</string>
|
|
||||||
<string name="dialog_title_delete_all_messages">确认删除消息</string>
|
|
||||||
<string name="dialog_message_delete_all_messages">您确定要删除所有消息吗?</string>
|
|
||||||
<string name="dialog_title_not_all_messages_deleted">无法删除所有消息</string>
|
|
||||||
<string name="dialog_message_not_deleted_ongoing_both">与正在进行的邀请和介绍有关的消息在结束之前无法被删除。</string>
|
|
||||||
<string name="dialog_message_not_deleted_ongoing_introductions">与正在进行的介绍有关的消息在结束之前无法被删除。</string>
|
|
||||||
<string name="dialog_message_not_deleted_ongoing_invitations">与正在进行的邀请有关的消息在结束之前无法被删除。</string>
|
|
||||||
<string name="dialog_message_not_deleted_partly_downloaded">部分下载的消息只有在完成下载后才能被删除。</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_both">如要删除邀请或介绍,您需要选择该请求和回应。</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_introductions">如要删除介绍,您需要选择该请求和回应。</string>
|
|
||||||
<string name="dialog_message_not_deleted_not_all_selected_invitations">如要删除邀请,您需要选择该请求和回应。</string>
|
|
||||||
<string name="delete_contact">删除联系人</string>
|
<string name="delete_contact">删除联系人</string>
|
||||||
<string name="dialog_title_delete_contact">确认删除联系人</string>
|
<string name="dialog_title_delete_contact">确认删除联系人</string>
|
||||||
<string name="dialog_message_delete_contact">确认要删除该联系人和与之交流的所有消息吗?</string>
|
<string name="dialog_message_delete_contact">确认要删除该联系人和与之交流的所有消息吗?</string>
|
||||||
@@ -146,7 +131,6 @@
|
|||||||
<string name="dialog_message_no_image_support">你的联系人的 Briar 尚未支持图片附件。一旦他们升级你就会看到一个不同的图标。</string>
|
<string name="dialog_message_no_image_support">你的联系人的 Briar 尚未支持图片附件。一旦他们升级你就会看到一个不同的图标。</string>
|
||||||
<string name="dialog_title_image_support">你现在可以向此联系人发送图片</string>
|
<string name="dialog_title_image_support">你现在可以向此联系人发送图片</string>
|
||||||
<string name="dialog_message_image_support">轻按此图标即可附加图片。</string>
|
<string name="dialog_message_image_support">轻按此图标即可附加图片。</string>
|
||||||
<string name="messaging_too_many_attachments_toast">只有前 %d 个图片将被发送</string>
|
|
||||||
<!--Adding Contacts-->
|
<!--Adding Contacts-->
|
||||||
<string name="add_contact_title">添加附近的联系人</string>
|
<string name="add_contact_title">添加附近的联系人</string>
|
||||||
<string name="face_to_face">您必须面对面添加联系人。\n\n这样将防止未来他人冒充您的身份并查看您的信息。</string>
|
<string name="face_to_face">您必须面对面添加联系人。\n\n这样将防止未来他人冒充您的身份并查看您的信息。</string>
|
||||||
@@ -169,6 +153,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">添加远处的联系人</string>
|
<string name="add_contact_remotely_title_case">添加远处的联系人</string>
|
||||||
<string name="add_contact_nearby_title">添加附近的联系人</string>
|
<string name="add_contact_nearby_title">添加附近的联系人</string>
|
||||||
<string name="add_contact_remotely_title">添加远处的联系人</string>
|
<string name="add_contact_remotely_title">添加远处的联系人</string>
|
||||||
|
<string name="contact_name_hint">添加联系人昵称</string>
|
||||||
<string name="contact_link_intro">在此输入您联系人的链接</string>
|
<string name="contact_link_intro">在此输入您联系人的链接</string>
|
||||||
<string name="contact_link_hint">联系人的链接</string>
|
<string name="contact_link_hint">联系人的链接</string>
|
||||||
<string name="paste_button">粘贴</string>
|
<string name="paste_button">粘贴</string>
|
||||||
@@ -186,6 +171,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">有待处理的联系人请求</string>
|
<string name="pending_contact_requests_snackbar">有待处理的联系人请求</string>
|
||||||
<string name="pending_contact_requests">待处理的联系人请求</string>
|
<string name="pending_contact_requests">待处理的联系人请求</string>
|
||||||
<string name="no_pending_contacts">没有待处理的联系人</string>
|
<string name="no_pending_contacts">没有待处理的联系人</string>
|
||||||
|
<string name="add_contact_remote_connecting">连接中……</string>
|
||||||
<string name="waiting_for_contact_to_come_online">正在等待联系人上线……</string>
|
<string name="waiting_for_contact_to_come_online">正在等待联系人上线……</string>
|
||||||
<string name="connecting">连接中……</string>
|
<string name="connecting">连接中……</string>
|
||||||
<string name="adding_contact">正在添加联系人……</string>
|
<string name="adding_contact">正在添加联系人……</string>
|
||||||
@@ -205,10 +191,12 @@
|
|||||||
<plurals name="contact_added_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="other">%d 新联系人已添加。</item>
|
<item quantity="other">%d 新联系人已添加。</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">添加此联系人比通常花费了更多时间</string>
|
||||||
|
<string name="adding_contact_slow_title">无法连接到联系人</string>
|
||||||
|
<string name="adding_contact_slow_text">添加此联系人比通常花费了更多时间。\n\n请检查您的联系人是否收到您的链接并已添加您:</string>
|
||||||
<string name="offline_state">无网络连接</string>
|
<string name="offline_state">无网络连接</string>
|
||||||
<string name="duplicate_link_dialog_title">重复的链接</string>
|
<string name="duplicate_link_dialog_title">重复的链接</string>
|
||||||
<string name="duplicate_link_dialog_text_1">您已经有此链接的待处理联系人:%s</string>
|
<string name="duplicate_link_dialog_text_1">您已经有此链接的待处理联系人:%s</string>
|
||||||
<string name="duplicate_link_dialog_text_1_contact">您已经有此链接的联系人:%s</string>
|
|
||||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||||
<string name="duplicate_link_dialog_text_2">%s 和 %s 是同一个人吗?</string>
|
<string name="duplicate_link_dialog_text_2">%s 和 %s 是同一个人吗?</string>
|
||||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||||
@@ -232,6 +220,7 @@
|
|||||||
<string name="introduction_button">做介绍</string>
|
<string name="introduction_button">做介绍</string>
|
||||||
<string name="introduction_sent">您的介绍已发送。</string>
|
<string name="introduction_sent">您的介绍已发送。</string>
|
||||||
<string name="introduction_error">介绍时发生错误。</string>
|
<string name="introduction_error">介绍时发生错误。</string>
|
||||||
|
<string name="introduction_response_error">回复介绍时出错</string>
|
||||||
<string name="introduction_request_sent">您已将 %1$s 介绍给 %2$s。</string>
|
<string name="introduction_request_sent">您已将 %1$s 介绍给 %2$s。</string>
|
||||||
<string name="introduction_request_received">%1$s 想要将您介绍给 %2$s。您希望将 %2$s 添加至您的联系人列表中吗?</string>
|
<string name="introduction_request_received">%1$s 想要将您介绍给 %2$s。您希望将 %2$s 添加至您的联系人列表中吗?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s 想要将您介绍给 %2$s,但是 %2$s 已经在您的联系人列表中。%1$s 可能并不知情,但您仍可以做出回复:</string>
|
<string name="introduction_request_exists_received">%1$s 想要将您介绍给 %2$s,但是 %2$s 已经在您的联系人列表中。%1$s 可能并不知情,但您仍可以做出回复:</string>
|
||||||
@@ -398,11 +387,20 @@
|
|||||||
<string name="pref_theme_dark">深色</string>
|
<string name="pref_theme_dark">深色</string>
|
||||||
<string name="pref_theme_auto">自动(白天)</string>
|
<string name="pref_theme_auto">自动(白天)</string>
|
||||||
<string name="pref_theme_system">系统默认</string>
|
<string name="pref_theme_system">系统默认</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">网络</string>
|
||||||
|
<string name="bluetooth_setting">通过蓝牙连接</string>
|
||||||
|
<string name="bluetooth_setting_enabled">只要联系人在附近时</string>
|
||||||
|
<string name="bluetooth_setting_disabled">仅在添加联系人时</string>
|
||||||
|
<string name="tor_network_setting">通过互联网连接(Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">基于位置自动选择</string>
|
<string name="tor_network_setting_automatic">基于位置自动选择</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">不通过网桥连接到 Tor</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">通过网桥连接到 Tor</string>
|
||||||
|
<string name="tor_network_setting_never">不要连接</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">自动选择:%1$s(在 %2$s)</string>
|
<string name="tor_network_setting_summary">自动选择:%1$s(在 %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">使用移动数据</string>
|
<string name="tor_mobile_data_title">使用移动数据</string>
|
||||||
|
<string name="tor_only_when_charging_title">只有在充电时通过网络(Tor)连接</string>
|
||||||
<string name="tor_only_when_charging_summary">当设备使用电池电量时关闭网络连接</string>
|
<string name="tor_only_when_charging_summary">当设备使用电池电量时关闭网络连接</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">安全</string>
|
<string name="security_settings_title">安全</string>
|
||||||
@@ -443,6 +441,8 @@
|
|||||||
<string name="panic_setting_signout_summary">触发应急开关时登出 Briar</string>
|
<string name="panic_setting_signout_summary">触发应急开关时登出 Briar</string>
|
||||||
<string name="purge_setting_title">删除帐户</string>
|
<string name="purge_setting_title">删除帐户</string>
|
||||||
<string name="purge_setting_summary">触发应急开关时删除您的 Briar 帐户。注意:这将导致您的身份信息、联系人和消息永久丢失。</string>
|
<string name="purge_setting_summary">触发应急开关时删除您的 Briar 帐户。注意:这将导致您的身份信息、联系人和消息永久丢失。</string>
|
||||||
|
<string name="uninstall_setting_title">卸载 Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">这需要在紧急事件中进行人工确认</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">消息通知</string>
|
<string name="notification_settings_title">消息通知</string>
|
||||||
<string name="notify_sign_in_title">提醒我登录</string>
|
<string name="notify_sign_in_title">提醒我登录</string>
|
||||||
|
|||||||
@@ -89,6 +89,7 @@
|
|||||||
<string name="delete">刪除</string>
|
<string name="delete">刪除</string>
|
||||||
<string name="accept">接受</string>
|
<string name="accept">接受</string>
|
||||||
<string name="decline">謝絕</string>
|
<string name="decline">謝絕</string>
|
||||||
|
<string name="options">選項</string>
|
||||||
<string name="online">在線</string>
|
<string name="online">在線</string>
|
||||||
<string name="offline">離線</string>
|
<string name="offline">離線</string>
|
||||||
<string name="send">發送</string>
|
<string name="send">發送</string>
|
||||||
@@ -152,6 +153,7 @@
|
|||||||
<string name="add_contact_remotely_title_case">添加遠處的聯絡人</string>
|
<string name="add_contact_remotely_title_case">添加遠處的聯絡人</string>
|
||||||
<string name="add_contact_nearby_title">添加附近的聯絡人</string>
|
<string name="add_contact_nearby_title">添加附近的聯絡人</string>
|
||||||
<string name="add_contact_remotely_title">添加遠處的聯絡人</string>
|
<string name="add_contact_remotely_title">添加遠處的聯絡人</string>
|
||||||
|
<string name="contact_name_hint">給聯絡人暱稱</string>
|
||||||
<string name="contact_link_intro">在此輸入您的聯絡人的鏈接</string>
|
<string name="contact_link_intro">在此輸入您的聯絡人的鏈接</string>
|
||||||
<string name="contact_link_hint">聯絡人的鏈接</string>
|
<string name="contact_link_hint">聯絡人的鏈接</string>
|
||||||
<string name="paste_button">貼上</string>
|
<string name="paste_button">貼上</string>
|
||||||
@@ -169,6 +171,7 @@
|
|||||||
<string name="pending_contact_requests_snackbar">有未處理的聯絡人請求</string>
|
<string name="pending_contact_requests_snackbar">有未處理的聯絡人請求</string>
|
||||||
<string name="pending_contact_requests">未處理的聯絡人請求</string>
|
<string name="pending_contact_requests">未處理的聯絡人請求</string>
|
||||||
<string name="no_pending_contacts">沒有未處理的聯絡人</string>
|
<string name="no_pending_contacts">沒有未處理的聯絡人</string>
|
||||||
|
<string name="add_contact_remote_connecting">連接中……</string>
|
||||||
<string name="waiting_for_contact_to_come_online">正等待聯絡人上網…</string>
|
<string name="waiting_for_contact_to_come_online">正等待聯絡人上網…</string>
|
||||||
<string name="connecting">連接中……</string>
|
<string name="connecting">連接中……</string>
|
||||||
<string name="adding_contact">正在添加聯絡人……</string>
|
<string name="adding_contact">正在添加聯絡人……</string>
|
||||||
@@ -188,6 +191,9 @@
|
|||||||
<plurals name="contact_added_notification_text">
|
<plurals name="contact_added_notification_text">
|
||||||
<item quantity="other">%d 新聯絡人已添加。</item>
|
<item quantity="other">%d 新聯絡人已添加。</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="adding_contact_slow_warning">添加聯絡人需時過長</string>
|
||||||
|
<string name="adding_contact_slow_title">不能連接至聯絡人</string>
|
||||||
|
<string name="adding_contact_slow_text">添加聯絡人需時過長。\n\n請檢查聯絡人已收到您的鏈接並且已添加您:</string>
|
||||||
<string name="offline_state">無互聯網連接</string>
|
<string name="offline_state">無互聯網連接</string>
|
||||||
<string name="duplicate_link_dialog_title">重覆的鏈接</string>
|
<string name="duplicate_link_dialog_title">重覆的鏈接</string>
|
||||||
<string name="duplicate_link_dialog_text_1">您已經有此鏈接的聯絡人,尚待處理:%s</string>
|
<string name="duplicate_link_dialog_text_1">您已經有此鏈接的聯絡人,尚待處理:%s</string>
|
||||||
@@ -214,6 +220,7 @@
|
|||||||
<string name="introduction_button">做介紹</string>
|
<string name="introduction_button">做介紹</string>
|
||||||
<string name="introduction_sent">您的介紹已發送。</string>
|
<string name="introduction_sent">您的介紹已發送。</string>
|
||||||
<string name="introduction_error">介紹時發生錯誤。</string>
|
<string name="introduction_error">介紹時發生錯誤。</string>
|
||||||
|
<string name="introduction_response_error">回覆介紹時出錯</string>
|
||||||
<string name="introduction_request_sent">您已將 %1$s 介紹給 %2$s。</string>
|
<string name="introduction_request_sent">您已將 %1$s 介紹給 %2$s。</string>
|
||||||
<string name="introduction_request_received">%1$s 想要將您介紹給 %2$s。您希望將 %2$s 添加至您的聯絡人列表中嗎?</string>
|
<string name="introduction_request_received">%1$s 想要將您介紹給 %2$s。您希望將 %2$s 添加至您的聯絡人列表中嗎?</string>
|
||||||
<string name="introduction_request_exists_received">%1$s 想要將您介紹給 %2$s,但是 %2$s 已經在您的聯絡人列表中。%1$s 可能並不知情,但您仍可以做出回覆:</string>
|
<string name="introduction_request_exists_received">%1$s 想要將您介紹給 %2$s,但是 %2$s 已經在您的聯絡人列表中。%1$s 可能並不知情,但您仍可以做出回覆:</string>
|
||||||
@@ -380,11 +387,20 @@
|
|||||||
<string name="pref_theme_dark">深色</string>
|
<string name="pref_theme_dark">深色</string>
|
||||||
<string name="pref_theme_auto">自動(白天)</string>
|
<string name="pref_theme_auto">自動(白天)</string>
|
||||||
<string name="pref_theme_system">系統默認</string>
|
<string name="pref_theme_system">系統默認</string>
|
||||||
<!--Settings Connections-->
|
<!--Settings Network-->
|
||||||
|
<string name="network_settings_title">網絡</string>
|
||||||
|
<string name="bluetooth_setting">通過藍牙連接</string>
|
||||||
|
<string name="bluetooth_setting_enabled">只要聯絡人在附近時</string>
|
||||||
|
<string name="bluetooth_setting_disabled">僅在添加聯絡人時</string>
|
||||||
|
<string name="tor_network_setting">通過互聯網連接(Tor)</string>
|
||||||
<string name="tor_network_setting_automatic">基於位置自動選擇</string>
|
<string name="tor_network_setting_automatic">基於位置自動選擇</string>
|
||||||
<!--How and when Briar will connect to Tor: E.g. "Don't connect to the Internet (in China)" or "Use Tor network with bridges (in Belarus)"-->
|
<string name="tor_network_setting_without_bridges">不通過網橋連接到 Tor</string>
|
||||||
|
<string name="tor_network_setting_with_bridges">通過網橋連接到 Tor</string>
|
||||||
|
<string name="tor_network_setting_never">不要連接</string>
|
||||||
|
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||||
<string name="tor_network_setting_summary">自動選擇:%1$s(在 %2$s)</string>
|
<string name="tor_network_setting_summary">自動選擇:%1$s(在 %2$s)</string>
|
||||||
<string name="tor_mobile_data_title">使用移動數據</string>
|
<string name="tor_mobile_data_title">使用移動數據</string>
|
||||||
|
<string name="tor_only_when_charging_title">只有在充電時通過網絡(Tor)連接</string>
|
||||||
<string name="tor_only_when_charging_summary">當裝置使用電池電量時關閉網絡連接</string>
|
<string name="tor_only_when_charging_summary">當裝置使用電池電量時關閉網絡連接</string>
|
||||||
<!--Settings Security and Panic-->
|
<!--Settings Security and Panic-->
|
||||||
<string name="security_settings_title">安全</string>
|
<string name="security_settings_title">安全</string>
|
||||||
@@ -425,6 +441,8 @@
|
|||||||
<string name="panic_setting_signout_summary">觸發緊急開關時登出 Briar</string>
|
<string name="panic_setting_signout_summary">觸發緊急開關時登出 Briar</string>
|
||||||
<string name="purge_setting_title">刪除帳戶</string>
|
<string name="purge_setting_title">刪除帳戶</string>
|
||||||
<string name="purge_setting_summary">觸發緊急開關時刪除您的 Briar 帳戶。注意:這將導致您的身份、聯絡人和訊息永久丟失。</string>
|
<string name="purge_setting_summary">觸發緊急開關時刪除您的 Briar 帳戶。注意:這將導致您的身份、聯絡人和訊息永久丟失。</string>
|
||||||
|
<string name="uninstall_setting_title">卸載 Briar</string>
|
||||||
|
<string name="uninstall_setting_summary">需要確認緊急事件</string>
|
||||||
<!--Settings Notifications-->
|
<!--Settings Notifications-->
|
||||||
<string name="notification_settings_title">消息通知</string>
|
<string name="notification_settings_title">消息通知</string>
|
||||||
<string name="notify_sign_in_title">提醒我登錄</string>
|
<string name="notify_sign_in_title">提醒我登錄</string>
|
||||||
|
|||||||
@@ -227,16 +227,6 @@
|
|||||||
android:targetPackage="@string/app_package"/>
|
android:targetPackage="@string/app_package"/>
|
||||||
</Preference>
|
</Preference>
|
||||||
|
|
||||||
<Preference
|
|
||||||
android:key="pref_key_export_log"
|
|
||||||
android:title="Export Current Log to SD Card"
|
|
||||||
app:iconSpaceReserved="false"/>
|
|
||||||
|
|
||||||
<Preference
|
|
||||||
android:key="pref_key_export_old_log"
|
|
||||||
android:title="Export Previous Log to SD Card"
|
|
||||||
app:iconSpaceReserved="false"/>
|
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="pref_key_explode"
|
android:key="pref_key_explode"
|
||||||
android:title="Crash"
|
android:title="Crash"
|
||||||
|
|||||||
@@ -68,8 +68,7 @@ Returns a JSON array of contacts:
|
|||||||
"alias" : "A local nickname",
|
"alias" : "A local nickname",
|
||||||
"handshakePublicKey": "XnYRd7a7E4CTqgAvh4hCxh/YZ0EPscxknB9ZcEOpSzY=",
|
"handshakePublicKey": "XnYRd7a7E4CTqgAvh4hCxh/YZ0EPscxknB9ZcEOpSzY=",
|
||||||
"verified": true,
|
"verified": true,
|
||||||
"lastChatActivity": 1557838312175,
|
"lastChatActivity": 1557838312175
|
||||||
"connected": false
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -393,19 +392,3 @@ will no longer work on making this `pendingContact` become `contact`.
|
|||||||
"type": "event"
|
"type": "event"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### A contact connected or disconnected
|
|
||||||
|
|
||||||
When Briar establishes a connection to a contact (the contact comes online),
|
|
||||||
it sends a `ContactConnectedEvent`.
|
|
||||||
When the last connection is lost (the contact goes offline), it sends a `ContactDisconnectedEvent`.
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"data": {
|
|
||||||
"contactId": 1
|
|
||||||
},
|
|
||||||
"name": "ContactConnectedEvent",
|
|
||||||
"type": "event"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import org.briarproject.bramble.api.db.DatabaseConfig
|
|||||||
import org.briarproject.bramble.api.event.EventBus
|
import org.briarproject.bramble.api.event.EventBus
|
||||||
import org.briarproject.bramble.api.lifecycle.IoExecutor
|
import org.briarproject.bramble.api.lifecycle.IoExecutor
|
||||||
import org.briarproject.bramble.api.network.NetworkManager
|
import org.briarproject.bramble.api.network.NetworkManager
|
||||||
import org.briarproject.bramble.api.plugin.BackoffFactory
|
|
||||||
import org.briarproject.bramble.api.plugin.PluginConfig
|
import org.briarproject.bramble.api.plugin.PluginConfig
|
||||||
import org.briarproject.bramble.api.plugin.TransportId
|
import org.briarproject.bramble.api.plugin.TransportId
|
||||||
import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory
|
import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory
|
||||||
@@ -70,16 +69,15 @@ internal class HeadlessModule(private val appDir: File) {
|
|||||||
@Provides
|
@Provides
|
||||||
internal fun providePluginConfig(
|
internal fun providePluginConfig(
|
||||||
@IoExecutor ioExecutor: Executor, torSocketFactory: SocketFactory,
|
@IoExecutor ioExecutor: Executor, torSocketFactory: SocketFactory,
|
||||||
backoffFactory: BackoffFactory, networkManager: NetworkManager,
|
networkManager: NetworkManager, locationUtils: LocationUtils, eventBus: EventBus,
|
||||||
locationUtils: LocationUtils, eventBus: EventBus, resourceProvider: ResourceProvider,
|
resourceProvider: ResourceProvider, circumventionProvider: CircumventionProvider,
|
||||||
circumventionProvider: CircumventionProvider, batteryManager: BatteryManager, clock: Clock
|
batteryManager: BatteryManager, clock: Clock
|
||||||
): PluginConfig {
|
): PluginConfig {
|
||||||
val duplex: List<DuplexPluginFactory> = if (isLinux() || isMac()) {
|
val duplex: List<DuplexPluginFactory> = if (isLinux() || isMac()) {
|
||||||
val torDirectory = File(appDir, "tor")
|
val torDirectory = File(appDir, "tor")
|
||||||
val tor = UnixTorPluginFactory(
|
val tor = UnixTorPluginFactory(
|
||||||
ioExecutor, networkManager, locationUtils, eventBus, torSocketFactory,
|
ioExecutor, networkManager, locationUtils, eventBus, torSocketFactory,
|
||||||
backoffFactory, resourceProvider, circumventionProvider, batteryManager, clock,
|
resourceProvider, circumventionProvider, batteryManager, clock, torDirectory
|
||||||
torDirectory
|
|
||||||
)
|
)
|
||||||
listOf(tor)
|
listOf(tor)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import com.fasterxml.jackson.databind.ObjectMapper
|
|||||||
import io.javalin.http.BadRequestResponse
|
import io.javalin.http.BadRequestResponse
|
||||||
import io.javalin.http.Context
|
import io.javalin.http.Context
|
||||||
import io.javalin.http.NotFoundResponse
|
import io.javalin.http.NotFoundResponse
|
||||||
import org.briarproject.bramble.api.connection.ConnectionRegistry
|
|
||||||
import org.briarproject.bramble.api.contact.ContactManager
|
import org.briarproject.bramble.api.contact.ContactManager
|
||||||
import org.briarproject.bramble.api.contact.HandshakeLinkConstants.LINK_REGEX
|
import org.briarproject.bramble.api.contact.HandshakeLinkConstants.LINK_REGEX
|
||||||
import org.briarproject.bramble.api.contact.PendingContactId
|
import org.briarproject.bramble.api.contact.PendingContactId
|
||||||
@@ -17,8 +16,6 @@ import org.briarproject.bramble.api.db.NoSuchPendingContactException
|
|||||||
import org.briarproject.bramble.api.event.Event
|
import org.briarproject.bramble.api.event.Event
|
||||||
import org.briarproject.bramble.api.event.EventListener
|
import org.briarproject.bramble.api.event.EventListener
|
||||||
import org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH
|
import org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH
|
||||||
import org.briarproject.bramble.api.plugin.event.ContactConnectedEvent
|
|
||||||
import org.briarproject.bramble.api.plugin.event.ContactDisconnectedEvent
|
|
||||||
import org.briarproject.bramble.util.StringUtils.toUtf8
|
import org.briarproject.bramble.util.StringUtils.toUtf8
|
||||||
import org.briarproject.briar.api.conversation.ConversationManager
|
import org.briarproject.briar.api.conversation.ConversationManager
|
||||||
import org.briarproject.briar.headless.event.WebSocketController
|
import org.briarproject.briar.headless.event.WebSocketController
|
||||||
@@ -35,8 +32,6 @@ internal const val EVENT_CONTACT_ADDED = "ContactAddedEvent"
|
|||||||
internal const val EVENT_PENDING_CONTACT_STATE_CHANGED = "PendingContactStateChangedEvent"
|
internal const val EVENT_PENDING_CONTACT_STATE_CHANGED = "PendingContactStateChangedEvent"
|
||||||
internal const val EVENT_PENDING_CONTACT_ADDED = "PendingContactAddedEvent"
|
internal const val EVENT_PENDING_CONTACT_ADDED = "PendingContactAddedEvent"
|
||||||
internal const val EVENT_PENDING_CONTACT_REMOVED = "PendingContactRemovedEvent"
|
internal const val EVENT_PENDING_CONTACT_REMOVED = "PendingContactRemovedEvent"
|
||||||
internal const val EVENT_CONTACT_CONNECTED = "ContactConnectedEvent"
|
|
||||||
internal const val EVENT_CONTACT_DISCONNECTED = "ContactDisconnectedEvent"
|
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@Singleton
|
@Singleton
|
||||||
@@ -46,8 +41,7 @@ constructor(
|
|||||||
private val contactManager: ContactManager,
|
private val contactManager: ContactManager,
|
||||||
private val conversationManager: ConversationManager,
|
private val conversationManager: ConversationManager,
|
||||||
private val objectMapper: ObjectMapper,
|
private val objectMapper: ObjectMapper,
|
||||||
private val webSocket: WebSocketController,
|
private val webSocket: WebSocketController
|
||||||
private val connectionRegistry: ConnectionRegistry
|
|
||||||
) : ContactController, EventListener {
|
) : ContactController, EventListener {
|
||||||
|
|
||||||
override fun eventOccurred(e: Event) = when (e) {
|
override fun eventOccurred(e: Event) = when (e) {
|
||||||
@@ -63,12 +57,6 @@ constructor(
|
|||||||
is PendingContactRemovedEvent -> {
|
is PendingContactRemovedEvent -> {
|
||||||
webSocket.sendEvent(EVENT_PENDING_CONTACT_REMOVED, e.output())
|
webSocket.sendEvent(EVENT_PENDING_CONTACT_REMOVED, e.output())
|
||||||
}
|
}
|
||||||
is ContactConnectedEvent -> {
|
|
||||||
webSocket.sendEvent(EVENT_CONTACT_CONNECTED, e.output())
|
|
||||||
}
|
|
||||||
is ContactDisconnectedEvent -> {
|
|
||||||
webSocket.sendEvent(EVENT_CONTACT_DISCONNECTED, e.output())
|
|
||||||
}
|
|
||||||
else -> {
|
else -> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -76,8 +64,7 @@ constructor(
|
|||||||
override fun list(ctx: Context): Context {
|
override fun list(ctx: Context): Context {
|
||||||
val contacts = contactManager.contacts.map { contact ->
|
val contacts = contactManager.contacts.map { contact ->
|
||||||
val latestMsgTime = conversationManager.getGroupCount(contact.id).latestMsgTime
|
val latestMsgTime = conversationManager.getGroupCount(contact.id).latestMsgTime
|
||||||
val connected = connectionRegistry.isConnected(contact.id)
|
contact.output(latestMsgTime)
|
||||||
contact.output(latestMsgTime, connected)
|
|
||||||
}
|
}
|
||||||
return ctx.json(contacts)
|
return ctx.json(contacts)
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user