mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 18:59:06 +01:00
Compare commits
44 Commits
release-1.
...
release-1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b20b03698 | ||
|
|
9da7fbf4f6 | ||
|
|
f64f442fcf | ||
|
|
fd2d5c9173 | ||
|
|
0cea137d75 | ||
|
|
a68fff9dd2 | ||
|
|
ddc8f4a7d7 | ||
|
|
f961b6a80b | ||
|
|
93439d9c17 | ||
|
|
f3ee884816 | ||
|
|
8ca22043cf | ||
|
|
9353b78da8 | ||
|
|
429bbe1275 | ||
|
|
c5fb1416bd | ||
|
|
e52cbd896e | ||
|
|
ab1b8784b7 | ||
|
|
55a4daa92f | ||
|
|
186bcc0b47 | ||
|
|
8b9140f477 | ||
|
|
f959c32935 | ||
|
|
1c060bc6db | ||
|
|
5e44e4d308 | ||
|
|
75d5dec45f | ||
|
|
d825227eb5 | ||
|
|
967dd1f18d | ||
|
|
4a4147b563 | ||
|
|
08b72af647 | ||
|
|
528e090c6f | ||
|
|
652f9e5705 | ||
|
|
6a91ec7a6b | ||
|
|
c3a9eff96b | ||
|
|
bd05d893eb | ||
|
|
6965bc0acd | ||
|
|
c6e9554026 | ||
|
|
ab8734e373 | ||
|
|
267956b36c | ||
|
|
ec84ddb38b | ||
|
|
ba2db48d8e | ||
|
|
186f61f771 | ||
|
|
95d8783852 | ||
|
|
b4f3604584 | ||
|
|
badccac90c | ||
|
|
1b8d1a5a8d | ||
|
|
2fe57d2597 |
@@ -13,8 +13,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 31
|
||||
versionCode 10418
|
||||
versionName "1.4.18"
|
||||
versionCode 10420
|
||||
versionName "1.4.20"
|
||||
consumerProguardFiles 'proguard-rules.txt'
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="org.briarproject.bramble">
|
||||
|
||||
<uses-feature
|
||||
@@ -7,15 +8,17 @@
|
||||
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<!-- The BLUETOOTH permission was supposed to be removed in API 31 but is still needed on some Xiaomi/Redmi/POCO devices running API 31 -->
|
||||
<uses-permission
|
||||
android:name="android.permission.BLUETOOTH"
|
||||
android:maxSdkVersion="30" />
|
||||
android:maxSdkVersion="31" />
|
||||
<uses-permission
|
||||
android:name="android.permission.BLUETOOTH_ADMIN"
|
||||
android:maxSdkVersion="30" />
|
||||
<uses-permission
|
||||
android:name="android.permission.BLUETOOTH_SCAN"
|
||||
android:usesPermissionFlags="neverForLocation" />
|
||||
android:usesPermissionFlags="neverForLocation"
|
||||
tools:targetApi="31" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
|
||||
@@ -118,6 +118,11 @@ class AndroidNetworkManager implements NetworkManager, Service {
|
||||
try {
|
||||
NetworkInfo net = connectivityManager.getActiveNetworkInfo();
|
||||
boolean connected = net != null && net.isConnected();
|
||||
// Research into Android's behavior to check network connectivity
|
||||
// (https://code.briarproject.org/briar/public-mesh-research/-/issues/19)
|
||||
// has shown that NetworkInfo#isConnected() returns true if the device
|
||||
// is connected to any Wifi, independent of whether any specific IP
|
||||
// address can be reached using it or any domain names can be resolved.
|
||||
boolean wifi = false, ipv6Only = false;
|
||||
if (connected) {
|
||||
wifi = net.getType() == TYPE_WIFI;
|
||||
|
||||
@@ -65,6 +65,9 @@ public class AndroidUtils {
|
||||
|
||||
public static Pair<String, String> getBluetoothAddressAndMethod(Context ctx,
|
||||
BluetoothAdapter adapter) {
|
||||
// If we don't have permission to access the adapter's address, let
|
||||
// the caller know we can't find it
|
||||
if (!hasBtConnectPermission(ctx)) return new Pair<>("", "");
|
||||
// Return the adapter's address if it's valid and not fake
|
||||
@SuppressLint("HardwareIds")
|
||||
String address = adapter.getAddress();
|
||||
|
||||
@@ -26,7 +26,7 @@ dependencyVerification {
|
||||
'org.apache-extras.beanshell:bsh:2.0b6:bsh-2.0b6.jar:a17955976070c0573235ee662f2794a78082758b61accffce8d3f8aedcd91047',
|
||||
'org.briarproject:obfs4proxy-android:0.0.14-tor1:obfs4proxy-android-0.0.14-tor1.jar:8b08068778b133484b17956d8f7a7710739c33f671a26a68156f4d34e6f28c30',
|
||||
'org.briarproject:snowflake-android:2.3.1:snowflake-android-2.3.1.jar:1f83c9a070f87b7074af13627709a8b5aced5460104be7166af736b1bb73c293',
|
||||
'org.briarproject:tor-android:0.4.5.14:tor-android-0.4.5.14.jar:7cf1beaa6c1db51fc8fac263aba9624ef289c3db29772509efcbc59f7057330a',
|
||||
'org.briarproject:tor-android:0.4.7.13:tor-android-0.4.7.13.jar:7852aab7d2298b80878c7719f34ce665725b494d673ecf2e6f9e697564638cc6',
|
||||
'org.checkerframework:checker-compat-qual:2.5.5:checker-compat-qual-2.5.5.jar:11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a',
|
||||
'org.checkerframework:checker-qual:3.12.0:checker-qual-3.12.0.jar:ff10785ac2a357ec5de9c293cb982a2cbb605c0309ea4cc1cb9b9bc6dbe7f3cb',
|
||||
'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9',
|
||||
|
||||
@@ -1,18 +1,26 @@
|
||||
package org.briarproject.bramble.api.keyagreement;
|
||||
|
||||
public interface KeyAgreementConstants {
|
||||
import org.briarproject.bramble.api.mailbox.MailboxConstants;
|
||||
|
||||
/**
|
||||
* The version of the BQP protocol used in beta releases. This version
|
||||
* number is reserved.
|
||||
*/
|
||||
byte BETA_PROTOCOL_VERSION = 89;
|
||||
public interface KeyAgreementConstants {
|
||||
|
||||
/**
|
||||
* The current version of the BQP protocol.
|
||||
*/
|
||||
byte PROTOCOL_VERSION = 4;
|
||||
|
||||
/**
|
||||
* The QR code format identifier, used to distinguish BQP QR codes from
|
||||
* QR codes used for other purposes. See
|
||||
* {@link MailboxConstants#QR_FORMAT_ID}.
|
||||
*/
|
||||
byte QR_FORMAT_ID = 0;
|
||||
|
||||
/**
|
||||
* The QR code format version.
|
||||
*/
|
||||
byte QR_FORMAT_VERSION = PROTOCOL_VERSION;
|
||||
|
||||
/**
|
||||
* The length of the BQP key commitment in bytes.
|
||||
*/
|
||||
|
||||
@@ -7,5 +7,5 @@ import java.io.IOException;
|
||||
@NotNullByDefault
|
||||
public interface PayloadParser {
|
||||
|
||||
Payload parse(byte[] raw) throws IOException;
|
||||
Payload parse(String payload) throws IOException;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.briarproject.bramble.api.mailbox;
|
||||
|
||||
import org.briarproject.bramble.api.keyagreement.KeyAgreementConstants;
|
||||
import org.briarproject.bramble.api.plugin.TransportId;
|
||||
|
||||
import java.util.List;
|
||||
@@ -19,6 +20,18 @@ public interface MailboxConstants {
|
||||
*/
|
||||
TransportId ID = new TransportId("org.briarproject.bramble.mailbox");
|
||||
|
||||
/**
|
||||
* The QR code format identifier, used to distinguish mailbox QR codes
|
||||
* from QR codes used for other purposes. See
|
||||
* {@link KeyAgreementConstants#QR_FORMAT_ID};
|
||||
*/
|
||||
byte QR_FORMAT_ID = 1;
|
||||
|
||||
/**
|
||||
* The QR code format version.
|
||||
*/
|
||||
byte QR_FORMAT_VERSION = 0;
|
||||
|
||||
/**
|
||||
* Mailbox API versions that we support as a client. This is reported to our
|
||||
* contacts by {@link MailboxUpdateManager}.
|
||||
|
||||
@@ -1,17 +1,44 @@
|
||||
package org.briarproject.bramble.api.mailbox;
|
||||
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType;
|
||||
|
||||
public abstract class MailboxPairingState {
|
||||
|
||||
public static class QrCodeReceived extends MailboxPairingState {
|
||||
public abstract static class Pending extends MailboxPairingState {
|
||||
|
||||
public final long timeStarted;
|
||||
|
||||
private Pending(long timeStarted) {
|
||||
this.timeStarted = timeStarted;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Pairing extends MailboxPairingState {
|
||||
public static class QrCodeReceived extends Pending {
|
||||
|
||||
public QrCodeReceived(long timeStarted) {
|
||||
super(timeStarted);
|
||||
}
|
||||
}
|
||||
|
||||
public static class Pairing extends Pending {
|
||||
|
||||
public Pairing(long timeStarted) {
|
||||
super(timeStarted);
|
||||
}
|
||||
}
|
||||
|
||||
public static class Paired extends MailboxPairingState {
|
||||
}
|
||||
|
||||
public static class InvalidQrCode extends MailboxPairingState {
|
||||
|
||||
public final QrCodeType qrCodeType;
|
||||
public final int formatVersion;
|
||||
|
||||
public InvalidQrCode(QrCodeType qrCodeType, int formatVersion) {
|
||||
this.qrCodeType = qrCodeType;
|
||||
this.formatVersion = formatVersion;
|
||||
}
|
||||
}
|
||||
|
||||
public static class MailboxAlreadyPaired extends MailboxPairingState {
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package org.briarproject.bramble.api.qrcode;
|
||||
|
||||
import org.briarproject.bramble.api.Pair;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
@NotNullByDefault
|
||||
public interface QrCodeClassifier {
|
||||
|
||||
enum QrCodeType {
|
||||
BQP,
|
||||
MAILBOX,
|
||||
UNKNOWN
|
||||
}
|
||||
|
||||
Pair<QrCodeType, Integer> classifyQrCode(String payload);
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package org.briarproject.bramble.api.qrcode;
|
||||
|
||||
import org.briarproject.bramble.api.FormatException;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
|
||||
/**
|
||||
* Thrown when a QR code that has been scanned does not have the expected type.
|
||||
*/
|
||||
@Immutable
|
||||
@NotNullByDefault
|
||||
public class WrongQrCodeTypeException extends FormatException {
|
||||
|
||||
private final QrCodeType qrCodeType;
|
||||
|
||||
public WrongQrCodeTypeException(QrCodeType qrCodeType) {
|
||||
this.qrCodeType = qrCodeType;
|
||||
}
|
||||
|
||||
public QrCodeType getQrCodeType() {
|
||||
return qrCodeType;
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,6 @@ package org.briarproject.bramble.util;
|
||||
import org.briarproject.bramble.api.FormatException;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.CharacterCodingException;
|
||||
import java.nio.charset.Charset;
|
||||
@@ -17,13 +16,18 @@ import javax.annotation.Nullable;
|
||||
import static java.nio.charset.CodingErrorAction.IGNORE;
|
||||
import static java.util.regex.Pattern.CASE_INSENSITIVE;
|
||||
|
||||
@SuppressWarnings("CharsetObjectCanBeUsed")
|
||||
@NotNullByDefault
|
||||
public class StringUtils {
|
||||
|
||||
private static final Charset UTF_8 = Charset.forName("UTF-8");
|
||||
private static Pattern MAC = Pattern.compile("[0-9a-f]{2}:[0-9a-f]{2}:" +
|
||||
"[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}",
|
||||
CASE_INSENSITIVE);
|
||||
public static final Charset UTF_8 = Charset.forName("UTF-8");
|
||||
public static final Charset US_ASCII = Charset.forName("US-ASCII");
|
||||
public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
|
||||
|
||||
private static final Pattern MAC =
|
||||
Pattern.compile("[0-9a-f]{2}:[0-9a-f]{2}:" +
|
||||
"[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}",
|
||||
CASE_INSENSITIVE);
|
||||
|
||||
private static final char[] HEX = new char[] {
|
||||
'0', '1', '2', '3', '4', '5', '6', '7',
|
||||
@@ -45,11 +49,7 @@ public class StringUtils {
|
||||
}
|
||||
|
||||
public static byte[] toUtf8(String s) {
|
||||
try {
|
||||
return s.getBytes("UTF-8");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new AssertionError(e);
|
||||
}
|
||||
return s.getBytes(UTF_8);
|
||||
}
|
||||
|
||||
public static String fromUtf8(byte[] bytes) {
|
||||
|
||||
@@ -17,6 +17,7 @@ import org.briarproject.bramble.lifecycle.LifecycleModule;
|
||||
import org.briarproject.bramble.mailbox.MailboxModule;
|
||||
import org.briarproject.bramble.plugin.PluginModule;
|
||||
import org.briarproject.bramble.properties.PropertiesModule;
|
||||
import org.briarproject.bramble.qrcode.QrCodeModule;
|
||||
import org.briarproject.bramble.record.RecordModule;
|
||||
import org.briarproject.bramble.reliability.ReliabilityModule;
|
||||
import org.briarproject.bramble.rendezvous.RendezvousModule;
|
||||
@@ -47,6 +48,7 @@ import dagger.Module;
|
||||
MailboxModule.class,
|
||||
PluginModule.class,
|
||||
PropertiesModule.class,
|
||||
QrCodeModule.class,
|
||||
RecordModule.class,
|
||||
ReliabilityModule.class,
|
||||
RendezvousModule.class,
|
||||
|
||||
@@ -19,7 +19,6 @@ import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
@@ -29,6 +28,7 @@ import javax.inject.Inject;
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static org.briarproject.bramble.api.crypto.DecryptionResult.INVALID_CIPHERTEXT;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.bramble.util.StringUtils.UTF_8;
|
||||
import static org.briarproject.bramble.util.StringUtils.fromHexString;
|
||||
import static org.briarproject.bramble.util.StringUtils.toHexString;
|
||||
|
||||
@@ -99,7 +99,7 @@ class AccountManagerImpl implements AccountManager {
|
||||
}
|
||||
try {
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(
|
||||
new FileInputStream(f), Charset.forName("UTF-8")));
|
||||
new FileInputStream(f), UTF_8));
|
||||
String key = reader.readLine();
|
||||
reader.close();
|
||||
return key;
|
||||
@@ -151,7 +151,7 @@ class AccountManagerImpl implements AccountManager {
|
||||
@GuardedBy("stateChangeLock")
|
||||
private void writeDbKeyToFile(String key, File f) throws IOException {
|
||||
FileOutputStream out = new FileOutputStream(f);
|
||||
out.write(key.getBytes(Charset.forName("UTF-8")));
|
||||
out.write(key.getBytes(UTF_8));
|
||||
out.flush();
|
||||
out.close();
|
||||
}
|
||||
|
||||
@@ -29,7 +29,6 @@ import org.briarproject.nullsafety.NotNullByDefault;
|
||||
import org.whispersystems.curve25519.Curve25519;
|
||||
import org.whispersystems.curve25519.Curve25519KeyPair;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import java.security.GeneralSecurityException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.Provider;
|
||||
@@ -51,6 +50,7 @@ import static org.briarproject.bramble.api.crypto.DecryptionResult.KEY_STRENGTHE
|
||||
import static org.briarproject.bramble.util.ByteUtils.INT_32_BYTES;
|
||||
import static org.briarproject.bramble.util.LogUtils.logDuration;
|
||||
import static org.briarproject.bramble.util.LogUtils.now;
|
||||
import static org.briarproject.bramble.util.StringUtils.US_ASCII;
|
||||
|
||||
@NotNullByDefault
|
||||
class CryptoComponentImpl implements CryptoComponent {
|
||||
@@ -460,7 +460,7 @@ class CryptoComponentImpl implements CryptoComponent {
|
||||
@Override
|
||||
public String encodeOnion(byte[] publicKey) {
|
||||
Digest digest = new SHA3Digest(256);
|
||||
byte[] label = ".onion checksum".getBytes(Charset.forName("US-ASCII"));
|
||||
byte[] label = ".onion checksum".getBytes(US_ASCII);
|
||||
digest.update(label, 0, label.length);
|
||||
digest.update(publicKey, 0, publicKey.length);
|
||||
digest.update(ONION_HS_PROTOCOL_VERSION);
|
||||
|
||||
@@ -39,12 +39,13 @@ import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.nio.charset.Charset;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.Scanner;
|
||||
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
|
||||
import static org.briarproject.bramble.util.StringUtils.UTF_8;
|
||||
|
||||
@Immutable
|
||||
@NotNullByDefault
|
||||
public class MessageEncrypter {
|
||||
@@ -228,7 +229,7 @@ public class MessageEncrypter {
|
||||
PublicKey publicKey =
|
||||
encrypter.getKeyParser().parsePublicKey(keyBytes);
|
||||
String message = readFully(System.in);
|
||||
byte[] plaintext = message.getBytes(Charset.forName("UTF-8"));
|
||||
byte[] plaintext = message.getBytes(UTF_8);
|
||||
byte[] ciphertext = encrypter.encrypt(publicKey, plaintext);
|
||||
System.out.println(AsciiArmour.wrap(ciphertext, LINE_LENGTH));
|
||||
}
|
||||
@@ -242,7 +243,7 @@ public class MessageEncrypter {
|
||||
encrypter.getKeyParser().parsePrivateKey(keyBytes);
|
||||
byte[] ciphertext = AsciiArmour.unwrap(readFully(System.in));
|
||||
byte[] plaintext = encrypter.decrypt(privateKey, ciphertext);
|
||||
System.out.println(new String(plaintext, Charset.forName("UTF-8")));
|
||||
System.out.println(new String(plaintext, UTF_8));
|
||||
}
|
||||
|
||||
private static String readFully(InputStream in) throws IOException {
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package org.briarproject.bramble.keyagreement;
|
||||
|
||||
import org.briarproject.bramble.api.data.BdfReaderFactory;
|
||||
import org.briarproject.bramble.api.data.BdfWriterFactory;
|
||||
import org.briarproject.bramble.api.keyagreement.KeyAgreementTask;
|
||||
import org.briarproject.bramble.api.keyagreement.PayloadEncoder;
|
||||
import org.briarproject.bramble.api.keyagreement.PayloadParser;
|
||||
@@ -19,13 +17,13 @@ public class KeyAgreementModule {
|
||||
}
|
||||
|
||||
@Provides
|
||||
PayloadEncoder providePayloadEncoder(BdfWriterFactory bdfWriterFactory) {
|
||||
return new PayloadEncoderImpl(bdfWriterFactory);
|
||||
PayloadEncoder providePayloadEncoder(PayloadEncoderImpl payloadEncoder) {
|
||||
return payloadEncoder;
|
||||
}
|
||||
|
||||
@Provides
|
||||
PayloadParser providePayloadParser(BdfReaderFactory bdfReaderFactory) {
|
||||
return new PayloadParserImpl(bdfReaderFactory);
|
||||
PayloadParser providePayloadParser(PayloadParserImpl payloadParser) {
|
||||
return payloadParser;
|
||||
}
|
||||
|
||||
@Provides
|
||||
|
||||
@@ -13,7 +13,8 @@ import java.io.IOException;
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.PROTOCOL_VERSION;
|
||||
import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.QR_FORMAT_ID;
|
||||
import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.QR_FORMAT_VERSION;
|
||||
|
||||
@Immutable
|
||||
@NotNullByDefault
|
||||
@@ -29,7 +30,8 @@ class PayloadEncoderImpl implements PayloadEncoder {
|
||||
@Override
|
||||
public byte[] encode(Payload p) {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
out.write(PROTOCOL_VERSION);
|
||||
int formatIdAndVersion = (QR_FORMAT_ID << 5) | QR_FORMAT_VERSION;
|
||||
out.write(formatIdAndVersion);
|
||||
BdfWriter w = bdfWriterFactory.createWriter(out);
|
||||
try {
|
||||
w.writeListStart(); // Payload start
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.briarproject.bramble.keyagreement;
|
||||
|
||||
import org.briarproject.bramble.api.FormatException;
|
||||
import org.briarproject.bramble.api.Pair;
|
||||
import org.briarproject.bramble.api.UnsupportedVersionException;
|
||||
import org.briarproject.bramble.api.data.BdfList;
|
||||
import org.briarproject.bramble.api.data.BdfReader;
|
||||
@@ -11,6 +12,9 @@ import org.briarproject.bramble.api.keyagreement.TransportDescriptor;
|
||||
import org.briarproject.bramble.api.plugin.BluetoothConstants;
|
||||
import org.briarproject.bramble.api.plugin.LanTcpConstants;
|
||||
import org.briarproject.bramble.api.plugin.TransportId;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType;
|
||||
import org.briarproject.bramble.api.qrcode.WrongQrCodeTypeException;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
@@ -21,34 +25,42 @@ import java.util.List;
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.BETA_PROTOCOL_VERSION;
|
||||
import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.COMMIT_LENGTH;
|
||||
import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.PROTOCOL_VERSION;
|
||||
import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.QR_FORMAT_VERSION;
|
||||
import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.TRANSPORT_ID_BLUETOOTH;
|
||||
import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.TRANSPORT_ID_LAN;
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.BQP;
|
||||
import static org.briarproject.bramble.util.StringUtils.ISO_8859_1;
|
||||
|
||||
@Immutable
|
||||
@NotNullByDefault
|
||||
class PayloadParserImpl implements PayloadParser {
|
||||
|
||||
private final BdfReaderFactory bdfReaderFactory;
|
||||
private final QrCodeClassifier qrCodeClassifier;
|
||||
|
||||
@Inject
|
||||
PayloadParserImpl(BdfReaderFactory bdfReaderFactory) {
|
||||
PayloadParserImpl(BdfReaderFactory bdfReaderFactory,
|
||||
QrCodeClassifier qrCodeClassifier) {
|
||||
this.bdfReaderFactory = bdfReaderFactory;
|
||||
this.qrCodeClassifier = qrCodeClassifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Payload parse(byte[] raw) throws IOException {
|
||||
ByteArrayInputStream in = new ByteArrayInputStream(raw);
|
||||
// First byte: the protocol version
|
||||
int protocolVersion = in.read();
|
||||
if (protocolVersion == -1) throw new FormatException();
|
||||
if (protocolVersion != PROTOCOL_VERSION) {
|
||||
boolean tooOld = protocolVersion < PROTOCOL_VERSION ||
|
||||
protocolVersion == BETA_PROTOCOL_VERSION;
|
||||
public Payload parse(String payloadString) throws IOException {
|
||||
Pair<QrCodeType, Integer> typeAndVersion =
|
||||
qrCodeClassifier.classifyQrCode(payloadString);
|
||||
QrCodeType qrCodeType = typeAndVersion.getFirst();
|
||||
if (qrCodeType != BQP) throw new WrongQrCodeTypeException(qrCodeType);
|
||||
int formatVersion = typeAndVersion.getSecond();
|
||||
if (formatVersion != QR_FORMAT_VERSION) {
|
||||
boolean tooOld = formatVersion < QR_FORMAT_VERSION;
|
||||
throw new UnsupportedVersionException(tooOld);
|
||||
}
|
||||
byte[] raw = payloadString.getBytes(ISO_8859_1);
|
||||
ByteArrayInputStream in = new ByteArrayInputStream(raw);
|
||||
// First byte: the format identifier and version (already parsed)
|
||||
if (in.read() == -1) throw new AssertionError();
|
||||
// The rest of the payload is a BDF list with one or more elements
|
||||
BdfReader r = bdfReaderFactory.createReader(in);
|
||||
BdfList payload = r.readList();
|
||||
|
||||
@@ -6,6 +6,7 @@ import org.briarproject.bramble.api.event.EventExecutor;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingTask;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxSettingsManager;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxUpdateManager;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier;
|
||||
import org.briarproject.bramble.api.system.Clock;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
@@ -25,6 +26,7 @@ class MailboxPairingTaskFactoryImpl implements MailboxPairingTaskFactory {
|
||||
private final MailboxApi api;
|
||||
private final MailboxSettingsManager mailboxSettingsManager;
|
||||
private final MailboxUpdateManager mailboxUpdateManager;
|
||||
private final QrCodeClassifier qrCodeClassifier;
|
||||
|
||||
@Inject
|
||||
MailboxPairingTaskFactoryImpl(
|
||||
@@ -34,7 +36,8 @@ class MailboxPairingTaskFactoryImpl implements MailboxPairingTaskFactory {
|
||||
Clock clock,
|
||||
MailboxApi api,
|
||||
MailboxSettingsManager mailboxSettingsManager,
|
||||
MailboxUpdateManager mailboxUpdateManager) {
|
||||
MailboxUpdateManager mailboxUpdateManager,
|
||||
QrCodeClassifier qrCodeClassifier) {
|
||||
this.eventExecutor = eventExecutor;
|
||||
this.db = db;
|
||||
this.crypto = crypto;
|
||||
@@ -42,12 +45,13 @@ class MailboxPairingTaskFactoryImpl implements MailboxPairingTaskFactory {
|
||||
this.api = api;
|
||||
this.mailboxSettingsManager = mailboxSettingsManager;
|
||||
this.mailboxUpdateManager = mailboxUpdateManager;
|
||||
this.qrCodeClassifier = qrCodeClassifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MailboxPairingTask createPairingTask(String qrCodePayload) {
|
||||
return new MailboxPairingTaskImpl(qrCodePayload, eventExecutor, db,
|
||||
crypto, clock, api, mailboxSettingsManager,
|
||||
mailboxUpdateManager);
|
||||
mailboxUpdateManager, qrCodeClassifier);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.briarproject.bramble.mailbox;
|
||||
|
||||
import org.briarproject.bramble.api.Consumer;
|
||||
import org.briarproject.bramble.api.FormatException;
|
||||
import org.briarproject.bramble.api.Pair;
|
||||
import org.briarproject.bramble.api.contact.Contact;
|
||||
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
||||
import org.briarproject.bramble.api.db.DatabaseComponent;
|
||||
@@ -9,18 +10,26 @@ import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.event.EventExecutor;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxAuthToken;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.ConnectionError;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.InvalidQrCode;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.MailboxAlreadyPaired;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Paired;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Pairing;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.QrCodeReceived;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.UnexpectedError;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingTask;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxProperties;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxSettingsManager;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxUpdate;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxUpdateManager;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType;
|
||||
import org.briarproject.bramble.api.system.Clock;
|
||||
import org.briarproject.bramble.mailbox.MailboxApi.ApiException;
|
||||
import org.briarproject.bramble.mailbox.MailboxApi.MailboxAlreadyPairedException;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -32,7 +41,10 @@ import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static org.briarproject.bramble.api.mailbox.MailboxConstants.QR_FORMAT_VERSION;
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.MAILBOX;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.bramble.util.StringUtils.ISO_8859_1;
|
||||
|
||||
@ThreadSafe
|
||||
@NotNullByDefault
|
||||
@@ -40,9 +52,6 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
|
||||
|
||||
private final static Logger LOG =
|
||||
getLogger(MailboxPairingTaskImpl.class.getName());
|
||||
@SuppressWarnings("CharsetObjectCanBeUsed") // Requires minSdkVersion >= 19
|
||||
private static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
|
||||
private static final int VERSION_REQUIRED = 32;
|
||||
|
||||
private final String payload;
|
||||
private final Executor eventExecutor;
|
||||
@@ -52,6 +61,8 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
|
||||
private final MailboxApi api;
|
||||
private final MailboxSettingsManager mailboxSettingsManager;
|
||||
private final MailboxUpdateManager mailboxUpdateManager;
|
||||
private final QrCodeClassifier qrCodeClassifier;
|
||||
private final long timeStarted;
|
||||
|
||||
private final Object lock = new Object();
|
||||
@GuardedBy("lock")
|
||||
@@ -68,7 +79,8 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
|
||||
Clock clock,
|
||||
MailboxApi api,
|
||||
MailboxSettingsManager mailboxSettingsManager,
|
||||
MailboxUpdateManager mailboxUpdateManager) {
|
||||
MailboxUpdateManager mailboxUpdateManager,
|
||||
QrCodeClassifier qrCodeClassifier) {
|
||||
this.payload = payload;
|
||||
this.eventExecutor = eventExecutor;
|
||||
this.db = db;
|
||||
@@ -77,7 +89,9 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
|
||||
this.api = api;
|
||||
this.mailboxSettingsManager = mailboxSettingsManager;
|
||||
this.mailboxUpdateManager = mailboxUpdateManager;
|
||||
state = new MailboxPairingState.QrCodeReceived();
|
||||
this.qrCodeClassifier = qrCodeClassifier;
|
||||
timeStarted = clock.currentTimeMillis();
|
||||
state = new QrCodeReceived(timeStarted);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -99,22 +113,30 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
Pair<QrCodeType, Integer> typeAndVersion =
|
||||
qrCodeClassifier.classifyQrCode(payload);
|
||||
QrCodeType qrCodeType = typeAndVersion.getFirst();
|
||||
int formatVersion = typeAndVersion.getSecond();
|
||||
if (qrCodeType != MAILBOX || formatVersion != QR_FORMAT_VERSION) {
|
||||
setState(new InvalidQrCode(qrCodeType, formatVersion));
|
||||
return;
|
||||
}
|
||||
try {
|
||||
pairMailbox();
|
||||
} catch (FormatException e) {
|
||||
onMailboxError(e, new MailboxPairingState.InvalidQrCode());
|
||||
onMailboxError(e, new InvalidQrCode(qrCodeType, formatVersion));
|
||||
} catch (MailboxAlreadyPairedException e) {
|
||||
onMailboxError(e, new MailboxPairingState.MailboxAlreadyPaired());
|
||||
onMailboxError(e, new MailboxAlreadyPaired());
|
||||
} catch (IOException e) {
|
||||
onMailboxError(e, new MailboxPairingState.ConnectionError());
|
||||
onMailboxError(e, new ConnectionError());
|
||||
} catch (ApiException | DbException e) {
|
||||
onMailboxError(e, new MailboxPairingState.UnexpectedError());
|
||||
onMailboxError(e, new UnexpectedError());
|
||||
}
|
||||
}
|
||||
|
||||
private void pairMailbox() throws IOException, ApiException, DbException {
|
||||
MailboxProperties mailboxProperties = decodeQrCodePayload(payload);
|
||||
setState(new MailboxPairingState.Pairing());
|
||||
setState(new Pairing(timeStarted));
|
||||
MailboxProperties ownerProperties = api.setup(mailboxProperties);
|
||||
long time = clock.currentTimeMillis();
|
||||
db.transaction(false, txn -> {
|
||||
@@ -133,7 +155,7 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
|
||||
}
|
||||
}
|
||||
});
|
||||
setState(new MailboxPairingState.Paired());
|
||||
setState(new Paired());
|
||||
}
|
||||
|
||||
private void onMailboxError(Exception e, MailboxPairingState state) {
|
||||
@@ -167,14 +189,6 @@ class MailboxPairingTaskImpl implements MailboxPairingTask {
|
||||
}
|
||||
throw new FormatException();
|
||||
}
|
||||
int version = bytes[0] & 0xFF;
|
||||
if (version != VERSION_REQUIRED) {
|
||||
if (LOG.isLoggable(WARNING)) {
|
||||
LOG.warning("QR code has not version " + VERSION_REQUIRED +
|
||||
": " + version);
|
||||
}
|
||||
throw new FormatException();
|
||||
}
|
||||
LOG.info("QR code is valid");
|
||||
byte[] onionPubKey = Arrays.copyOfRange(bytes, 1, 33);
|
||||
String onion = crypto.encodeOnion(onionPubKey);
|
||||
|
||||
@@ -46,7 +46,6 @@ import java.io.OutputStream;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
@@ -100,6 +99,7 @@ import static org.briarproject.bramble.util.IoUtils.copyAndClose;
|
||||
import static org.briarproject.bramble.util.IoUtils.tryToClose;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.bramble.util.PrivacyUtils.scrubOnion;
|
||||
import static org.briarproject.bramble.util.StringUtils.UTF_8;
|
||||
import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@@ -419,9 +419,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
|
||||
append(strb, "ClientTransportPlugin meek_lite exec", obfs4Path);
|
||||
String snowflakePath = getSnowflakeExecutableFile().getAbsolutePath();
|
||||
append(strb, "ClientTransportPlugin snowflake exec", snowflakePath);
|
||||
//noinspection CharsetObjectCanBeUsed
|
||||
return new ByteArrayInputStream(
|
||||
strb.toString().getBytes(Charset.forName("UTF-8")));
|
||||
return new ByteArrayInputStream(strb.toString().getBytes(UTF_8));
|
||||
}
|
||||
|
||||
private void listFiles(File f) {
|
||||
|
||||
@@ -7,7 +7,7 @@ import net.i2p.crypto.eddsa.spec.EdDSAPrivateKeySpec;
|
||||
import org.bouncycastle.util.encoders.Base64;
|
||||
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import static org.briarproject.bramble.util.StringUtils.US_ASCII;
|
||||
|
||||
class TorRendezvousCryptoImpl implements TorRendezvousCrypto {
|
||||
|
||||
@@ -31,6 +31,6 @@ class TorRendezvousCryptoImpl implements TorRendezvousCrypto {
|
||||
EdDSAPrivateKeySpec spec = new EdDSAPrivateKeySpec(seed, CURVE_SPEC);
|
||||
byte[] hash = spec.getH();
|
||||
byte[] base64 = Base64.encode(hash);
|
||||
return "ED25519-V3:" + new String(base64, Charset.forName("US-ASCII"));
|
||||
return "ED25519-V3:" + new String(base64, US_ASCII);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
package org.briarproject.bramble.qrcode;
|
||||
|
||||
import org.briarproject.bramble.api.Pair;
|
||||
import org.briarproject.bramble.api.keyagreement.KeyAgreementConstants;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxConstants;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.BQP;
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.MAILBOX;
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.UNKNOWN;
|
||||
import static org.briarproject.bramble.util.StringUtils.ISO_8859_1;
|
||||
|
||||
@Immutable
|
||||
@NotNullByDefault
|
||||
class QrCodeClassifierImpl implements QrCodeClassifier {
|
||||
|
||||
@Inject
|
||||
QrCodeClassifierImpl() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pair<QrCodeType, Integer> classifyQrCode(String payload) {
|
||||
byte[] bytes = payload.getBytes(ISO_8859_1);
|
||||
if (bytes.length == 0) return new Pair<>(UNKNOWN, 0);
|
||||
// If this is a Bramble QR code then the first byte encodes the
|
||||
// format ID (3 bits) and version (5 bits)
|
||||
int formatIdAndVersion = bytes[0] & 0xFF;
|
||||
int formatId = formatIdAndVersion >> 5;
|
||||
int formatVersion = formatIdAndVersion & 0x1F;
|
||||
if (formatId == KeyAgreementConstants.QR_FORMAT_ID) {
|
||||
return new Pair<>(BQP, formatVersion);
|
||||
}
|
||||
if (formatId == MailboxConstants.QR_FORMAT_ID) {
|
||||
return new Pair<>(MAILBOX, formatVersion);
|
||||
}
|
||||
return new Pair<>(UNKNOWN, 0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package org.briarproject.bramble.qrcode;
|
||||
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier;
|
||||
|
||||
import dagger.Module;
|
||||
import dagger.Provides;
|
||||
|
||||
@Module
|
||||
public class QrCodeModule {
|
||||
|
||||
@Provides
|
||||
QrCodeClassifier provideQrCodeClassifier(
|
||||
QrCodeClassifierImpl qrCodeClassifier) {
|
||||
return qrCodeClassifier;
|
||||
}
|
||||
}
|
||||
@@ -21,11 +21,11 @@ n Bridge obfs4 185.103.252.72:443 75F15E9339FF572F88F5588D429FEA379744BC53 cert=
|
||||
n Bridge obfs4 76.255.201.112:8888 96CF36C2ECCFB7376AB6BE905BECD2C2AE8AEFCD cert=+q0pjaiM0JMqHL/BKqCRD+pjflaw/S406eUDF7CnFgamvQW3l2HVLJhQ6uX9P8zff0PLGg iat-mode=0
|
||||
n Bridge obfs4 94.142.246.132:8088 135C158527AA9FE9A2F26EC515EB6999D813D347 cert=wTUz0/5FhAZRkitil5MprGbSF3JzjxjxI1kAmxAdSeDy98NgcLr11f/qUXWDC76Y97RiSg iat-mode=0
|
||||
n Bridge obfs4 20.102.79.78:22022 B5705F7E616DAB0F477E3E1ADC23E40413F683FE cert=1Cc/hwPtPjzFKGHVOP0j/qmBgnvquRx8+im35/u5TIYjDQ3FlMfA5VvTrQ/hbX8BZZooLQ iat-mode=0
|
||||
n Bridge obfs4 207.154.242.137:80 8E67A1B2A342652EE27376BD61BECF5806700E7F cert=qUrR9fan3XPNGNOwn9WGlXLJNZZx0grXH4AZXR+yoBbtbbj5Ak1n4a7TtjYgXcWcs/gHXw iat-mode=0
|
||||
n Bridge obfs4 152.70.180.20:1993 3327C43587E66AD5F874C4234A1D72C938AD7318 cert=s7xLRUO2psaX7TMUP2YhXdxItR4U6K7D+E3gQaS/+yWUppevtazIibq4dN1g5Reu6dD2QQ iat-mode=0
|
||||
n Bridge obfs4 144.202.12.254:10002 4E220F45CD404C8A3082A36326A5ED19BB8D4404 cert=iLz5YYWO4pUw7U7MRNOSvE0qO+IVeE4kVfFVWPO3coH3FmZtrkvlaTklfXxHZaCcXWBgaA iat-mode=0
|
||||
n Bridge obfs4 15.235.47.204:42058 869133925B3CD07683BDF01805C36448D090CE88 cert=PFwh4mzZlSTUdcEskpe20t998n5jbr81s+XoX7gmazqzUGHNhkendK5K1j2gOxesz9AkBw iat-mode=0
|
||||
n Bridge obfs4 51.75.93.136:45532 8402B84833527BC249B21AC885134197E624FB5A cert=LwXEf/Dgo0tKdMJByXdlvWiJqyyPw4T284Cg5qygDuIJJNFuz3ED9UhGil6H4Of3gM7wSg iat-mode=0
|
||||
n Bridge obfs4 109.14.168.159:5082 BFE1416DEFFE969581F016A4A319A87FFB26BA91 cert=n3X1CDdKBPXPIzfKh83p3ydfMzb0AD9gKC+/gIpHb7+xjjAnYO9x3LT+T/MvOIfAXxYySg iat-mode=0
|
||||
n Bridge obfs4 45.150.172.16:80 82849E69CBB25EA7F479155F7DCD89D85717FF47 cert=+Krdu1jmVQOxWkMj0mqJHgwbQV49eyD6mZDS+mRExssWNHosa60g4P5Gp81sBJKzN8NrSw iat-mode=0
|
||||
n Bridge obfs4 185.177.207.132:8443 4FB781F7A9DD39DA53A7996907817FC479874D19 cert=UL2gCAXWW5kEWY4TQ0lNeu6OAmzh40bXYVhMnTWVG8USnyy/zEKGSIPgmwTDMumWr9c1Pg iat-mode=0
|
||||
v Bridge 92.243.15.235:9001 477EAD3C04036B48235F1F27FC91420A286A4B7F
|
||||
v Bridge 213.108.108.145:17674 A39C0FE47963B6E8CFE9815549864DE544935A31
|
||||
v Bridge 213.196.191.96:9060 05E222E2A8C234234FE0CEB58B08A93B8FC360DB
|
||||
|
||||
@@ -20,7 +20,6 @@ import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.Charset;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
@@ -34,6 +33,7 @@ import static org.briarproject.bramble.test.TestUtils.getIdentity;
|
||||
import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
|
||||
import static org.briarproject.bramble.test.TestUtils.getSecretKey;
|
||||
import static org.briarproject.bramble.test.TestUtils.getTestDirectory;
|
||||
import static org.briarproject.bramble.util.StringUtils.UTF_8;
|
||||
import static org.briarproject.bramble.util.StringUtils.getRandomString;
|
||||
import static org.briarproject.bramble.util.StringUtils.toHexString;
|
||||
import static org.junit.Assert.assertArrayEquals;
|
||||
@@ -342,7 +342,7 @@ public class AccountManagerImplTest extends BrambleMockTestCase {
|
||||
private void storeDatabaseKey(File f, String hex) throws IOException {
|
||||
f.getParentFile().mkdirs();
|
||||
FileOutputStream out = new FileOutputStream(f);
|
||||
out.write(hex.getBytes(Charset.forName("UTF-8")));
|
||||
out.write(hex.getBytes(UTF_8));
|
||||
out.flush();
|
||||
out.close();
|
||||
}
|
||||
@@ -350,7 +350,7 @@ public class AccountManagerImplTest extends BrambleMockTestCase {
|
||||
@Nullable
|
||||
private String loadDatabaseKey(File f) throws IOException {
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(
|
||||
new FileInputStream(f), Charset.forName("UTF-8")));
|
||||
new FileInputStream(f), UTF_8));
|
||||
String hex = reader.readLine();
|
||||
reader.close();
|
||||
return hex;
|
||||
|
||||
@@ -2,21 +2,27 @@ package org.briarproject.bramble.keyagreement;
|
||||
|
||||
import org.briarproject.bramble.api.Bytes;
|
||||
import org.briarproject.bramble.api.FormatException;
|
||||
import org.briarproject.bramble.api.Pair;
|
||||
import org.briarproject.bramble.api.UnsupportedVersionException;
|
||||
import org.briarproject.bramble.api.data.BdfList;
|
||||
import org.briarproject.bramble.api.data.BdfReader;
|
||||
import org.briarproject.bramble.api.data.BdfReaderFactory;
|
||||
import org.briarproject.bramble.api.keyagreement.Payload;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType;
|
||||
import org.briarproject.bramble.api.qrcode.WrongQrCodeTypeException;
|
||||
import org.briarproject.bramble.test.BrambleMockTestCase;
|
||||
import org.jmock.Expectations;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
|
||||
import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.BETA_PROTOCOL_VERSION;
|
||||
import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.COMMIT_LENGTH;
|
||||
import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.PROTOCOL_VERSION;
|
||||
import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.QR_FORMAT_VERSION;
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.BQP;
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.MAILBOX;
|
||||
import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
|
||||
import static org.briarproject.bramble.util.StringUtils.getRandomString;
|
||||
import static org.junit.Assert.assertArrayEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
@@ -26,32 +32,29 @@ public class PayloadParserImplTest extends BrambleMockTestCase {
|
||||
|
||||
private final BdfReaderFactory bdfReaderFactory =
|
||||
context.mock(BdfReaderFactory.class);
|
||||
private final QrCodeClassifier qrCodeClassifier =
|
||||
context.mock(QrCodeClassifier.class);
|
||||
private final BdfReader bdfReader = context.mock(BdfReader.class);
|
||||
|
||||
private final PayloadParserImpl payloadParser =
|
||||
new PayloadParserImpl(bdfReaderFactory);
|
||||
private final String payload = getRandomString(123);
|
||||
|
||||
@Test(expected = FormatException.class)
|
||||
public void testThrowsFormatExceptionIfPayloadIsEmpty() throws Exception {
|
||||
payloadParser.parse(new byte[0]);
|
||||
private final PayloadParserImpl payloadParser =
|
||||
new PayloadParserImpl(bdfReaderFactory, qrCodeClassifier);
|
||||
|
||||
@Test(expected = WrongQrCodeTypeException.class)
|
||||
public void testThrowsExceptionForWrongQrCodeType() throws Exception {
|
||||
expectClassifyQrCode(payload, MAILBOX, QR_FORMAT_VERSION);
|
||||
|
||||
payloadParser.parse(payload);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testThrowsUnsupportedVersionExceptionForOldVersion()
|
||||
throws Exception {
|
||||
try {
|
||||
payloadParser.parse(new byte[] {PROTOCOL_VERSION - 1});
|
||||
fail();
|
||||
} catch (UnsupportedVersionException e) {
|
||||
assertTrue(e.isTooOld());
|
||||
}
|
||||
}
|
||||
expectClassifyQrCode(payload, BQP, QR_FORMAT_VERSION - 1);
|
||||
|
||||
@Test
|
||||
public void testThrowsUnsupportedVersionExceptionForBetaVersion()
|
||||
throws Exception {
|
||||
try {
|
||||
payloadParser.parse(new byte[] {BETA_PROTOCOL_VERSION});
|
||||
payloadParser.parse(payload);
|
||||
fail();
|
||||
} catch (UnsupportedVersionException e) {
|
||||
assertTrue(e.isTooOld());
|
||||
@@ -61,8 +64,10 @@ public class PayloadParserImplTest extends BrambleMockTestCase {
|
||||
@Test
|
||||
public void testThrowsUnsupportedVersionExceptionForNewVersion()
|
||||
throws Exception {
|
||||
expectClassifyQrCode(payload, BQP, QR_FORMAT_VERSION + 1);
|
||||
|
||||
try {
|
||||
payloadParser.parse(new byte[] {PROTOCOL_VERSION + 1});
|
||||
payloadParser.parse(payload);
|
||||
fail();
|
||||
} catch (UnsupportedVersionException e) {
|
||||
assertFalse(e.isTooOld());
|
||||
@@ -71,6 +76,8 @@ public class PayloadParserImplTest extends BrambleMockTestCase {
|
||||
|
||||
@Test(expected = FormatException.class)
|
||||
public void testThrowsFormatExceptionForEmptyList() throws Exception {
|
||||
expectClassifyQrCode(payload, BQP, QR_FORMAT_VERSION);
|
||||
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(bdfReaderFactory).createReader(
|
||||
with(any(ByteArrayInputStream.class)));
|
||||
@@ -79,7 +86,7 @@ public class PayloadParserImplTest extends BrambleMockTestCase {
|
||||
will(returnValue(new BdfList()));
|
||||
}});
|
||||
|
||||
payloadParser.parse(new byte[] {PROTOCOL_VERSION});
|
||||
payloadParser.parse(payload);
|
||||
}
|
||||
|
||||
@Test(expected = FormatException.class)
|
||||
@@ -87,6 +94,8 @@ public class PayloadParserImplTest extends BrambleMockTestCase {
|
||||
throws Exception {
|
||||
byte[] commitment = getRandomBytes(COMMIT_LENGTH);
|
||||
|
||||
expectClassifyQrCode(payload, BQP, QR_FORMAT_VERSION);
|
||||
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(bdfReaderFactory).createReader(
|
||||
with(any(ByteArrayInputStream.class)));
|
||||
@@ -97,7 +106,7 @@ public class PayloadParserImplTest extends BrambleMockTestCase {
|
||||
will(returnValue(false));
|
||||
}});
|
||||
|
||||
payloadParser.parse(new byte[] {PROTOCOL_VERSION});
|
||||
payloadParser.parse(payload);
|
||||
}
|
||||
|
||||
@Test(expected = FormatException.class)
|
||||
@@ -105,6 +114,7 @@ public class PayloadParserImplTest extends BrambleMockTestCase {
|
||||
throws Exception {
|
||||
byte[] commitment = getRandomBytes(COMMIT_LENGTH - 1);
|
||||
|
||||
expectClassifyQrCode(payload, BQP, QR_FORMAT_VERSION);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(bdfReaderFactory).createReader(
|
||||
with(any(ByteArrayInputStream.class)));
|
||||
@@ -115,7 +125,7 @@ public class PayloadParserImplTest extends BrambleMockTestCase {
|
||||
will(returnValue(true));
|
||||
}});
|
||||
|
||||
payloadParser.parse(new byte[] {PROTOCOL_VERSION});
|
||||
payloadParser.parse(payload);
|
||||
}
|
||||
|
||||
@Test(expected = FormatException.class)
|
||||
@@ -123,6 +133,7 @@ public class PayloadParserImplTest extends BrambleMockTestCase {
|
||||
throws Exception {
|
||||
byte[] commitment = getRandomBytes(COMMIT_LENGTH + 1);
|
||||
|
||||
expectClassifyQrCode(payload, BQP, QR_FORMAT_VERSION);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(bdfReaderFactory).createReader(
|
||||
with(any(ByteArrayInputStream.class)));
|
||||
@@ -133,12 +144,14 @@ public class PayloadParserImplTest extends BrambleMockTestCase {
|
||||
will(returnValue(true));
|
||||
}});
|
||||
|
||||
payloadParser.parse(new byte[] {PROTOCOL_VERSION});
|
||||
payloadParser.parse(payload);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAcceptsPayloadWithNoDescriptors() throws Exception {
|
||||
byte[] commitment = getRandomBytes(COMMIT_LENGTH);
|
||||
|
||||
expectClassifyQrCode(payload, BQP, QR_FORMAT_VERSION);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(bdfReaderFactory).createReader(
|
||||
with(any(ByteArrayInputStream.class)));
|
||||
@@ -149,8 +162,16 @@ public class PayloadParserImplTest extends BrambleMockTestCase {
|
||||
will(returnValue(true));
|
||||
}});
|
||||
|
||||
Payload p = payloadParser.parse(new byte[] {PROTOCOL_VERSION});
|
||||
Payload p = payloadParser.parse(payload);
|
||||
assertArrayEquals(commitment, p.getCommitment());
|
||||
assertTrue(p.getTransportDescriptors().isEmpty());
|
||||
}
|
||||
|
||||
private void expectClassifyQrCode(String payload, QrCodeType qrCodeType,
|
||||
int formatVersion) {
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(qrCodeClassifier).classifyQrCode(payload);
|
||||
will(returnValue(new Pair<>(qrCodeType, formatVersion)));
|
||||
}});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.briarproject.bramble.mailbox;
|
||||
|
||||
import org.briarproject.bramble.api.Pair;
|
||||
import org.briarproject.bramble.api.contact.Contact;
|
||||
import org.briarproject.bramble.api.crypto.CryptoComponent;
|
||||
import org.briarproject.bramble.api.db.DatabaseComponent;
|
||||
@@ -7,13 +8,24 @@ import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.db.Transaction;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxAuthToken;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.ConnectionError;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.InvalidQrCode;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.MailboxAlreadyPaired;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Paired;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Pairing;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.QrCodeReceived;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.UnexpectedError;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingTask;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxProperties;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxSettingsManager;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxUpdate;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxUpdateManager;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxVersion;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType;
|
||||
import org.briarproject.bramble.api.system.Clock;
|
||||
import org.briarproject.bramble.mailbox.MailboxApi.ApiException;
|
||||
import org.briarproject.bramble.mailbox.MailboxApi.MailboxAlreadyPairedException;
|
||||
import org.briarproject.bramble.test.BrambleMockTestCase;
|
||||
import org.briarproject.bramble.test.DbExpectations;
|
||||
import org.briarproject.bramble.test.ImmediateExecutor;
|
||||
@@ -27,6 +39,9 @@ import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import static java.util.Collections.singletonList;
|
||||
import static org.briarproject.bramble.api.mailbox.MailboxConstants.QR_FORMAT_VERSION;
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.BQP;
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.MAILBOX;
|
||||
import static org.briarproject.bramble.mailbox.MailboxTestUtils.getQrCodePayload;
|
||||
import static org.briarproject.bramble.test.TestUtils.getContact;
|
||||
import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
|
||||
@@ -48,9 +63,8 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
|
||||
context.mock(MailboxSettingsManager.class);
|
||||
private final MailboxUpdateManager mailboxUpdateManager =
|
||||
context.mock(MailboxUpdateManager.class);
|
||||
private final MailboxPairingTaskFactory factory =
|
||||
new MailboxPairingTaskFactoryImpl(executor, db, crypto, clock, api,
|
||||
mailboxSettingsManager, mailboxUpdateManager);
|
||||
private final QrCodeClassifier qrCodeClassifier =
|
||||
context.mock(QrCodeClassifier.class);
|
||||
|
||||
private final String onion = getRandomString(56);
|
||||
private final byte[] onionBytes = getRandomBytes(32);
|
||||
@@ -68,32 +82,50 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
|
||||
|
||||
@Test
|
||||
public void testInitialQrCodeReceivedState() {
|
||||
MailboxPairingTask task =
|
||||
factory.createPairingTask(getRandomString(42));
|
||||
MailboxPairingTask task = createPairingTask(getRandomString(42));
|
||||
task.addObserver(state ->
|
||||
assertTrue(state instanceof MailboxPairingState.QrCodeReceived)
|
||||
);
|
||||
assertTrue(state instanceof QrCodeReceived));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInvalidQrCode() {
|
||||
MailboxPairingTask task1 =
|
||||
factory.createPairingTask(getRandomString(42));
|
||||
task1.run();
|
||||
task1.addObserver(state ->
|
||||
assertTrue(state instanceof MailboxPairingState.InvalidQrCode)
|
||||
);
|
||||
public void testInvalidQrCodeType() {
|
||||
String payload = getRandomString(65);
|
||||
MailboxPairingTask task = createPairingTask(payload);
|
||||
|
||||
String goodLength = "00" + getRandomString(63);
|
||||
MailboxPairingTask task2 = factory.createPairingTask(goodLength);
|
||||
task2.run();
|
||||
task2.addObserver(state ->
|
||||
assertTrue(state instanceof MailboxPairingState.InvalidQrCode)
|
||||
);
|
||||
expectClassifyQrCode(payload, BQP, QR_FORMAT_VERSION);
|
||||
|
||||
task.run();
|
||||
task.addObserver(state ->
|
||||
assertTrue(state instanceof InvalidQrCode));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInvalidQrCodeVersion() {
|
||||
String payload = getRandomString(65);
|
||||
MailboxPairingTask task = createPairingTask(payload);
|
||||
|
||||
expectClassifyQrCode(payload, MAILBOX, QR_FORMAT_VERSION + 1);
|
||||
|
||||
task.run();
|
||||
task.addObserver(state ->
|
||||
assertTrue(state instanceof InvalidQrCode));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInvalidQrCodeLength() {
|
||||
String payload = getRandomString(42);
|
||||
MailboxPairingTask task = createPairingTask(payload);
|
||||
|
||||
expectClassifyQrCode(payload, MAILBOX, QR_FORMAT_VERSION);
|
||||
|
||||
task.run();
|
||||
task.addObserver(state ->
|
||||
assertTrue(state instanceof InvalidQrCode));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccessfulPairing() throws Exception {
|
||||
expectClassifyQrCode(validPayload, MAILBOX, QR_FORMAT_VERSION);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(crypto).encodeOnion(onionBytes);
|
||||
will(returnValue(onion));
|
||||
@@ -121,17 +153,14 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
|
||||
}});
|
||||
|
||||
AtomicInteger i = new AtomicInteger(0);
|
||||
MailboxPairingTask task = factory.createPairingTask(validPayload);
|
||||
MailboxPairingTask task = createPairingTask(validPayload);
|
||||
task.addObserver(state -> {
|
||||
if (i.get() == 0) {
|
||||
assertEquals(MailboxPairingState.QrCodeReceived.class,
|
||||
state.getClass());
|
||||
assertEquals(QrCodeReceived.class, state.getClass());
|
||||
} else if (i.get() == 1) {
|
||||
assertEquals(MailboxPairingState.Pairing.class,
|
||||
state.getClass());
|
||||
assertEquals(Pairing.class, state.getClass());
|
||||
} else if (i.get() == 2) {
|
||||
assertEquals(MailboxPairingState.Paired.class,
|
||||
state.getClass());
|
||||
assertEquals(Paired.class, state.getClass());
|
||||
} else fail("Unexpected change of state " + state.getClass());
|
||||
i.getAndIncrement();
|
||||
});
|
||||
@@ -140,24 +169,23 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
|
||||
|
||||
@Test
|
||||
public void testAlreadyPaired() throws Exception {
|
||||
testApiException(new MailboxApi.MailboxAlreadyPairedException(),
|
||||
MailboxPairingState.MailboxAlreadyPaired.class);
|
||||
testApiException(new MailboxAlreadyPairedException(),
|
||||
MailboxAlreadyPaired.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMailboxApiException() throws Exception {
|
||||
testApiException(new MailboxApi.ApiException(),
|
||||
MailboxPairingState.UnexpectedError.class);
|
||||
testApiException(new ApiException(), UnexpectedError.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testApiIOException() throws Exception {
|
||||
testApiException(new IOException(),
|
||||
MailboxPairingState.ConnectionError.class);
|
||||
testApiException(new IOException(), ConnectionError.class);
|
||||
}
|
||||
|
||||
private void testApiException(Exception e,
|
||||
Class<? extends MailboxPairingState> s) throws Exception {
|
||||
expectClassifyQrCode(validPayload, MAILBOX, QR_FORMAT_VERSION);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(crypto).encodeOnion(onionBytes);
|
||||
will(returnValue(onion));
|
||||
@@ -165,13 +193,14 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
|
||||
will(throwException(e));
|
||||
}});
|
||||
|
||||
MailboxPairingTask task = factory.createPairingTask(validPayload);
|
||||
MailboxPairingTask task = createPairingTask(validPayload);
|
||||
task.run();
|
||||
task.addObserver(state -> assertEquals(state.getClass(), s));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDbException() throws Exception {
|
||||
expectClassifyQrCode(validPayload, MAILBOX, QR_FORMAT_VERSION);
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(crypto).encodeOnion(onionBytes);
|
||||
will(returnValue(onion));
|
||||
@@ -188,10 +217,10 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
|
||||
will(throwException(new DbException()));
|
||||
}});
|
||||
|
||||
MailboxPairingTask task = factory.createPairingTask(validPayload);
|
||||
MailboxPairingTask task = createPairingTask(validPayload);
|
||||
task.run();
|
||||
task.addObserver(state -> assertEquals(state.getClass(),
|
||||
MailboxPairingState.UnexpectedError.class));
|
||||
task.addObserver(state ->
|
||||
assertEquals(state.getClass(), UnexpectedError.class));
|
||||
}
|
||||
|
||||
private PredicateMatcher<MailboxProperties> matches(MailboxProperties p2) {
|
||||
@@ -202,4 +231,22 @@ public class MailboxPairingTaskImplTest extends BrambleMockTestCase {
|
||||
p1.getServerSupports().equals(p2.getServerSupports()));
|
||||
}
|
||||
|
||||
private MailboxPairingTask createPairingTask(String qrCodePayload) {
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(clock).currentTimeMillis();
|
||||
will(returnValue(time));
|
||||
}});
|
||||
|
||||
return new MailboxPairingTaskImpl(qrCodePayload, executor, db,
|
||||
crypto, clock, api, mailboxSettingsManager,
|
||||
mailboxUpdateManager, qrCodeClassifier);
|
||||
}
|
||||
|
||||
private void expectClassifyQrCode(String payload, QrCodeType qrCodeType,
|
||||
int formatVersion) {
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(qrCodeClassifier).classifyQrCode(payload);
|
||||
will(returnValue(new Pair<>(qrCodeType, formatVersion)));
|
||||
}});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@ package org.briarproject.bramble.mailbox;
|
||||
import org.briarproject.bramble.api.WeakSingletonProvider;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.Charset;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.net.SocketFactory;
|
||||
@@ -11,20 +10,24 @@ import javax.net.SocketFactory;
|
||||
import okhttp3.OkHttpClient;
|
||||
|
||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||
import static org.briarproject.bramble.api.mailbox.MailboxConstants.QR_FORMAT_ID;
|
||||
import static org.briarproject.bramble.api.mailbox.MailboxConstants.QR_FORMAT_VERSION;
|
||||
import static org.briarproject.bramble.test.TestUtils.getRandomId;
|
||||
import static org.briarproject.bramble.util.StringUtils.ISO_8859_1;
|
||||
|
||||
class MailboxTestUtils {
|
||||
|
||||
static String getQrCodePayload(byte[] onionBytes, byte[] setupToken) {
|
||||
int formatIdAndVersion = (QR_FORMAT_ID << 5) | QR_FORMAT_VERSION;
|
||||
byte[] payloadBytes = ByteBuffer.allocate(65)
|
||||
.put((byte) 32) // 1
|
||||
.put((byte) formatIdAndVersion) // 1
|
||||
.put(onionBytes) // 32
|
||||
.put(setupToken) // 32
|
||||
.array();
|
||||
//noinspection CharsetObjectCanBeUsed
|
||||
return new String(payloadBytes, Charset.forName("ISO-8859-1"));
|
||||
return new String(payloadBytes, ISO_8859_1);
|
||||
}
|
||||
|
||||
// Used by mailbox integration tests
|
||||
static String getQrCodePayload(byte[] setupToken) {
|
||||
return getQrCodePayload(getRandomId(), setupToken);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
package org.briarproject.bramble.qrcode;
|
||||
|
||||
import org.briarproject.bramble.api.Pair;
|
||||
import org.briarproject.bramble.api.keyagreement.KeyAgreementConstants;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxConstants;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType;
|
||||
import org.briarproject.bramble.test.BrambleTestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.BQP;
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.MAILBOX;
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.UNKNOWN;
|
||||
import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
|
||||
import static org.briarproject.bramble.util.StringUtils.ISO_8859_1;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
public class QrCodeClassifierImplTest extends BrambleTestCase {
|
||||
|
||||
private final QrCodeClassifier classifier = new QrCodeClassifierImpl();
|
||||
|
||||
@Test
|
||||
public void testClassifiesEmptyStringAsUnknown() {
|
||||
Pair<QrCodeType, Integer> result = classifier.classifyQrCode("");
|
||||
assertEquals(UNKNOWN, result.getFirst());
|
||||
assertEquals(0, result.getSecond().intValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClassifiesKeyAgreement() {
|
||||
byte[] payloadBytes = getRandomBytes(123);
|
||||
for (int version = 0; version < 32; version++) {
|
||||
int typeAndVersion =
|
||||
(KeyAgreementConstants.QR_FORMAT_ID << 5) | version;
|
||||
payloadBytes[0] = (byte) typeAndVersion;
|
||||
String payload = new String(payloadBytes, ISO_8859_1);
|
||||
Pair<QrCodeType, Integer> result =
|
||||
classifier.classifyQrCode(payload);
|
||||
assertEquals(BQP, result.getFirst());
|
||||
assertEquals(version, result.getSecond().intValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClassifiesMailbox() {
|
||||
byte[] payloadBytes = getRandomBytes(123);
|
||||
for (int version = 0; version < 32; version++) {
|
||||
int typeAndVersion =
|
||||
(MailboxConstants.QR_FORMAT_ID << 5) | version;
|
||||
payloadBytes[0] = (byte) typeAndVersion;
|
||||
String payload = new String(payloadBytes, ISO_8859_1);
|
||||
Pair<QrCodeType, Integer> result =
|
||||
classifier.classifyQrCode(payload);
|
||||
assertEquals(MAILBOX, result.getFirst());
|
||||
assertEquals(version, result.getSecond().intValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClassifiesUnknownFormatIdAsUnknown() {
|
||||
byte[] payloadBytes = getRandomBytes(123);
|
||||
int unknownFormatId = MailboxConstants.QR_FORMAT_ID + 1;
|
||||
int typeAndVersion = unknownFormatId << 5;
|
||||
payloadBytes[0] = (byte) typeAndVersion;
|
||||
String payload = new String(payloadBytes, ISO_8859_1);
|
||||
Pair<QrCodeType, Integer> result = classifier.classifyQrCode(payload);
|
||||
assertEquals(UNKNOWN, result.getFirst());
|
||||
assertEquals(0, result.getSecond().intValue());
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,6 @@ import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.CharacterCodingException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.CharsetDecoder;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Semaphore;
|
||||
@@ -33,6 +32,7 @@ import static java.util.logging.Level.WARNING;
|
||||
import static jssc.SerialPort.PURGE_RXCLEAR;
|
||||
import static jssc.SerialPort.PURGE_TXCLEAR;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.bramble.util.StringUtils.US_ASCII;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
@@ -41,7 +41,6 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener {
|
||||
private static final Logger LOG =
|
||||
Logger.getLogger(ModemImpl.class.getName());
|
||||
|
||||
private static final Charset US_ASCII = Charset.forName("US-ASCII");
|
||||
private static final int MAX_LINE_LENGTH = 256;
|
||||
private static final int[] BAUD_RATES = {
|
||||
256000, 128000, 115200, 57600, 38400, 19200, 14400, 9600, 4800, 1200
|
||||
|
||||
@@ -30,8 +30,8 @@ dependencyVerification {
|
||||
'org.briarproject:obfs4proxy-windows:0.0.14-tor1:obfs4proxy-windows-0.0.14-tor1.jar:9dd122b31b3cd1616f168091dcdb01de049d1e052fe5c089b7627618a8a2694b',
|
||||
'org.briarproject:snowflake-linux:2.3.1:snowflake-linux-2.3.1.jar:99ecf4546d8f79eb8408168c09380fec596558ac934554bf7d4247ea7ef2c9f3',
|
||||
'org.briarproject:snowflake-windows:2.3.1:snowflake-windows-2.3.1.jar:d011f1a72c00a221f56380c19aad8ff11db8c2bb1adb0784125572d80b4d275a',
|
||||
'org.briarproject:tor-linux:0.4.5.14:tor-linux-0.4.5.14.jar:1844e54cf6df0c85cec219381a3364c759ae444a6b63f7558b757becb7d41d08',
|
||||
'org.briarproject:tor-windows:0.4.5.14:tor-windows-0.4.5.14.jar:d337afa1043f0cfa7e6e8c2473d682a5663a2c8052bb97a770450893c78c9b4f',
|
||||
'org.briarproject:tor-linux:0.4.7.13:tor-linux-0.4.7.13.jar:9819ee973cbcdc133f7d04aef9d4b957a35087627a790e532142d15412a9636f',
|
||||
'org.briarproject:tor-windows:0.4.7.13:tor-windows-0.4.7.13.jar:853d2769665614e26703cbe02e43b218b064c04a0bcd120fdc459cda45bd2606',
|
||||
'org.checkerframework:checker-compat-qual:2.5.5:checker-compat-qual-2.5.5.jar:11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a',
|
||||
'org.checkerframework:checker-qual:3.12.0:checker-qual-3.12.0.jar:ff10785ac2a357ec5de9c293cb982a2cbb605c0309ea4cc1cb9b9bc6dbe7f3cb',
|
||||
'org.hamcrest:hamcrest-core:2.1:hamcrest-core-2.1.jar:e09109e54a289d88506b9bfec987ddd199f4217c9464132668351b9a4f00bee9',
|
||||
|
||||
@@ -26,8 +26,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 31
|
||||
versionCode 10418
|
||||
versionName "1.4.18"
|
||||
versionCode 10420
|
||||
versionName "1.4.20"
|
||||
applicationId "org.briarproject.briar.android"
|
||||
buildConfigField "String", "TorVersion", "\"$tor_version\""
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package org.briarproject.briar.android.blog;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.text.Spanned;
|
||||
import android.text.util.Linkify;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -170,7 +171,12 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder {
|
||||
// TODO make author clickable #624
|
||||
|
||||
text.setText(c.getComment());
|
||||
if (fullText) text.setTextIsSelectable(true);
|
||||
Linkify.addLinks(text, Linkify.WEB_URLS);
|
||||
text.setMovementMethod(null);
|
||||
if (fullText) {
|
||||
text.setTextIsSelectable(true);
|
||||
makeLinksClickable(text, listener::onLinkClick);
|
||||
}
|
||||
|
||||
commentContainer.addView(v);
|
||||
}
|
||||
|
||||
@@ -3,12 +3,14 @@ package org.briarproject.briar.android.contact.add.nearby;
|
||||
import android.graphics.Bitmap;
|
||||
|
||||
import org.briarproject.bramble.api.identity.Author;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
abstract class AddContactState {
|
||||
|
||||
static class KeyAgreementListening extends AddContactState {
|
||||
|
||||
final Bitmap qrCode;
|
||||
|
||||
KeyAgreementListening(Bitmap qrCode) {
|
||||
@@ -29,6 +31,7 @@ abstract class AddContactState {
|
||||
}
|
||||
|
||||
static class ContactExchangeFinished extends AddContactState {
|
||||
|
||||
final ContactExchangeResult result;
|
||||
|
||||
ContactExchangeFinished(ContactExchangeResult result) {
|
||||
@@ -37,25 +40,34 @@ abstract class AddContactState {
|
||||
}
|
||||
|
||||
static class Failed extends AddContactState {
|
||||
/**
|
||||
* Non-null if failed due to the scanned QR code version.
|
||||
* True if the app producing the code is too old.
|
||||
* False if the scanning app is too old.
|
||||
*/
|
||||
@Nullable
|
||||
final Boolean qrCodeTooOld;
|
||||
|
||||
Failed(@Nullable Boolean qrCodeTooOld) {
|
||||
this.qrCodeTooOld = qrCodeTooOld;
|
||||
static class WrongQrCodeType extends Failed {
|
||||
|
||||
final QrCodeType qrCodeType;
|
||||
|
||||
WrongQrCodeType(QrCodeType qrCodeType) {
|
||||
this.qrCodeType = qrCodeType;
|
||||
}
|
||||
}
|
||||
|
||||
Failed() {
|
||||
this(null);
|
||||
static class WrongQrCodeVersion extends Failed {
|
||||
|
||||
/**
|
||||
* True if the app producing the code is too old.
|
||||
* False if the scanning app is too old.
|
||||
*/
|
||||
final boolean qrCodeTooOld;
|
||||
|
||||
WrongQrCodeVersion(boolean qrCodeTooOld) {
|
||||
this.qrCodeTooOld = qrCodeTooOld;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
abstract static class ContactExchangeResult {
|
||||
|
||||
static class Success extends ContactExchangeResult {
|
||||
|
||||
final Author remoteAuthor;
|
||||
|
||||
Success(Author remoteAuthor) {
|
||||
@@ -64,6 +76,7 @@ abstract class AddContactState {
|
||||
}
|
||||
|
||||
static class Error extends ContactExchangeResult {
|
||||
|
||||
@Nullable
|
||||
final Author duplicateAuthor;
|
||||
|
||||
|
||||
@@ -6,12 +6,15 @@ import android.view.MenuItem;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.briarproject.bramble.api.identity.Author;
|
||||
import org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||
import org.briarproject.briar.android.activity.BriarActivity;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.ContactExchangeFinished;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.ContactExchangeResult;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.Failed;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.Failed.WrongQrCodeType;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.Failed.WrongQrCodeVersion;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddNearbyContactViewModel.BluetoothDecision;
|
||||
import org.briarproject.briar.android.fragment.BaseFragment;
|
||||
import org.briarproject.briar.android.fragment.BaseFragment.BaseFragmentListener;
|
||||
@@ -34,6 +37,7 @@ import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
|
||||
import static android.widget.Toast.LENGTH_LONG;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.MAILBOX;
|
||||
import static org.briarproject.briar.android.contact.add.nearby.AddNearbyContactViewModel.BluetoothDecision.ACCEPTED;
|
||||
import static org.briarproject.briar.android.contact.add.nearby.AddNearbyContactViewModel.BluetoothDecision.REFUSED;
|
||||
|
||||
@@ -141,9 +145,15 @@ public class AddNearbyContactActivity extends BriarActivity
|
||||
ContactExchangeResult result =
|
||||
((ContactExchangeFinished) state).result;
|
||||
onContactExchangeResult(result);
|
||||
} else if (state instanceof WrongQrCodeType) {
|
||||
QrCodeType qrCodeType = ((WrongQrCodeType) state).qrCodeType;
|
||||
if (qrCodeType == MAILBOX) onMailboxQrCodeScanned();
|
||||
else onWrongQrCodeType();
|
||||
} else if (state instanceof WrongQrCodeVersion) {
|
||||
boolean qrCodeTooOld = ((WrongQrCodeVersion) state).qrCodeTooOld;
|
||||
onWrongQrCodeVersion(qrCodeTooOld);
|
||||
} else if (state instanceof Failed) {
|
||||
Boolean qrCodeTooOld = ((Failed) state).qrCodeTooOld;
|
||||
onAddingContactFailed(qrCodeTooOld);
|
||||
showErrorFragment();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,15 +180,27 @@ public class AddNearbyContactActivity extends BriarActivity
|
||||
} else throw new AssertionError();
|
||||
}
|
||||
|
||||
private void onAddingContactFailed(@Nullable Boolean qrCodeTooOld) {
|
||||
if (qrCodeTooOld == null) {
|
||||
showErrorFragment();
|
||||
} else {
|
||||
String msg;
|
||||
if (qrCodeTooOld) msg = getString(R.string.qr_code_too_old_1);
|
||||
else msg = getString(R.string.qr_code_too_new_1);
|
||||
showNextFragment(AddNearbyContactErrorFragment.newInstance(msg));
|
||||
}
|
||||
private void onMailboxQrCodeScanned() {
|
||||
String title = getString(R.string.qr_code_invalid);
|
||||
String msg = getString(R.string.mailbox_qr_code_for_contact);
|
||||
showNextFragment(
|
||||
AddNearbyContactErrorFragment.newInstance(title, msg, false));
|
||||
}
|
||||
|
||||
private void onWrongQrCodeType() {
|
||||
String title = getString(R.string.qr_code_invalid);
|
||||
String msg = getString(R.string.qr_code_format_unknown);
|
||||
showNextFragment(
|
||||
AddNearbyContactErrorFragment.newInstance(title, msg, false));
|
||||
}
|
||||
|
||||
private void onWrongQrCodeVersion(boolean qrCodeTooOld) {
|
||||
String title = getString(R.string.qr_code_invalid);
|
||||
String msg;
|
||||
if (qrCodeTooOld) msg = getString(R.string.qr_code_too_old_1);
|
||||
else msg = getString(R.string.qr_code_too_new_1);
|
||||
showNextFragment(
|
||||
AddNearbyContactErrorFragment.newInstance(title, msg, false));
|
||||
}
|
||||
|
||||
private void showErrorFragment() {
|
||||
|
||||
@@ -22,6 +22,7 @@ import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
|
||||
import static android.view.View.GONE;
|
||||
import static org.briarproject.briar.android.util.UiUtils.hideViewOnSmallScreen;
|
||||
import static org.briarproject.briar.android.util.UiUtils.onSingleLinkClick;
|
||||
|
||||
@@ -31,17 +32,22 @@ public class AddNearbyContactErrorFragment extends BaseFragment {
|
||||
|
||||
public static final String TAG =
|
||||
AddNearbyContactErrorFragment.class.getName();
|
||||
private static final String ERROR_MSG = "errorMessage";
|
||||
private static final String ARG_TITLE = "title";
|
||||
private static final String ARG_ERROR_MSG = "message";
|
||||
private static final String ARG_FEEDBACK = "feedback";
|
||||
|
||||
@Inject
|
||||
ViewModelProvider.Factory viewModelFactory;
|
||||
|
||||
private AddNearbyContactViewModel viewModel;
|
||||
|
||||
public static AddNearbyContactErrorFragment newInstance(String errorMsg) {
|
||||
public static AddNearbyContactErrorFragment newInstance(String title,
|
||||
String errorMessage, boolean feedback) {
|
||||
AddNearbyContactErrorFragment f = new AddNearbyContactErrorFragment();
|
||||
Bundle args = new Bundle();
|
||||
args.putString(ERROR_MSG, errorMsg);
|
||||
args.putString(ARG_TITLE, title);
|
||||
args.putString(ARG_ERROR_MSG, errorMessage);
|
||||
args.putBoolean(ARG_FEEDBACK, feedback);
|
||||
f.setArguments(args);
|
||||
return f;
|
||||
}
|
||||
@@ -66,19 +72,32 @@ public class AddNearbyContactErrorFragment extends BaseFragment {
|
||||
View v = inflater.inflate(R.layout.fragment_error_contact_exchange,
|
||||
container, false);
|
||||
|
||||
// set optional error message
|
||||
TextView explanation = v.findViewById(R.id.errorMessage);
|
||||
String title = null, errorMessage = null;
|
||||
boolean feedback = true;
|
||||
Bundle args = getArguments();
|
||||
String errorMessage = args == null ? null : args.getString(ERROR_MSG);
|
||||
if (errorMessage == null) {
|
||||
explanation.setText(getString(R.string.add_contact_error_two_way));
|
||||
} else {
|
||||
explanation.setText(args.getString(ERROR_MSG));
|
||||
if (args != null) {
|
||||
title = args.getString(ARG_TITLE);
|
||||
errorMessage = args.getString(ARG_ERROR_MSG);
|
||||
feedback = args.getBoolean(ARG_FEEDBACK, true);
|
||||
}
|
||||
|
||||
if (title != null) {
|
||||
TextView titleView = v.findViewById(R.id.errorTitle);
|
||||
titleView.setText(title);
|
||||
}
|
||||
|
||||
if (errorMessage != null) {
|
||||
TextView messageView = v.findViewById(R.id.errorMessage);
|
||||
messageView.setText(errorMessage);
|
||||
}
|
||||
|
||||
// make feedback link clickable
|
||||
TextView sendFeedback = v.findViewById(R.id.sendFeedback);
|
||||
onSingleLinkClick(sendFeedback, this::triggerFeedback);
|
||||
if (feedback) {
|
||||
// make feedback link clickable
|
||||
onSingleLinkClick(sendFeedback, this::triggerFeedback);
|
||||
} else {
|
||||
sendFeedback.setVisibility(GONE);
|
||||
}
|
||||
|
||||
// buttons
|
||||
Button tryAgain = v.findViewById(R.id.tryAgainButton);
|
||||
|
||||
@@ -43,6 +43,7 @@ import org.briarproject.bramble.api.plugin.PluginManager;
|
||||
import org.briarproject.bramble.api.plugin.TransportId;
|
||||
import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
|
||||
import org.briarproject.bramble.api.plugin.event.TransportStateEvent;
|
||||
import org.briarproject.bramble.api.qrcode.WrongQrCodeTypeException;
|
||||
import org.briarproject.bramble.api.system.AndroidExecutor;
|
||||
import org.briarproject.bramble.plugin.bluetooth.BluetoothPlugin;
|
||||
import org.briarproject.briar.R;
|
||||
@@ -50,9 +51,13 @@ import org.briarproject.briar.android.contact.add.nearby.AddContactState.Contact
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.ContactExchangeResult.Error;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.ContactExchangeResult.Success;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.ContactExchangeStarted;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.Failed;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.Failed.WrongQrCodeType;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.Failed.WrongQrCodeVersion;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.KeyAgreementListening;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.KeyAgreementStarted;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.KeyAgreementWaiting;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddContactState.QrCodeScanned;
|
||||
import org.briarproject.briar.android.qrcode.QrCodeDecoder;
|
||||
import org.briarproject.briar.android.qrcode.QrCodeUtils;
|
||||
import org.briarproject.briar.android.viewmodel.LiveEvent;
|
||||
@@ -60,7 +65,6 @@ import org.briarproject.briar.android.viewmodel.MutableLiveEvent;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
@@ -85,6 +89,7 @@ import static org.briarproject.bramble.api.plugin.Plugin.State.DISABLED;
|
||||
import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE;
|
||||
import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.bramble.util.StringUtils.ISO_8859_1;
|
||||
import static org.briarproject.briar.android.contact.add.nearby.AddNearbyContactPermissionManager.areEssentialPermissionsGranted;
|
||||
import static org.briarproject.briar.android.contact.add.nearby.AddNearbyContactViewModel.BluetoothDecision.NO_ADAPTER;
|
||||
import static org.briarproject.briar.android.contact.add.nearby.AddNearbyContactViewModel.BluetoothDecision.REFUSED;
|
||||
@@ -126,9 +131,6 @@ class AddNearbyContactViewModel extends AndroidViewModel
|
||||
REFUSED
|
||||
}
|
||||
|
||||
@SuppressWarnings("CharsetObjectCanBeUsed") // Requires minSdkVersion >= 19
|
||||
private static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
|
||||
|
||||
private final EventBus eventBus;
|
||||
private final AndroidExecutor androidExecutor;
|
||||
private final Executor ioExecutor;
|
||||
@@ -376,11 +378,11 @@ class AddNearbyContactViewModel extends AndroidViewModel
|
||||
} else if (e instanceof KeyAgreementAbortedEvent) {
|
||||
LOG.info("KeyAgreementAbortedEvent received");
|
||||
resetPayloadFlags();
|
||||
state.setValue(new AddContactState.Failed());
|
||||
state.setValue(new Failed());
|
||||
} else if (e instanceof KeyAgreementFailedEvent) {
|
||||
LOG.info("KeyAgreementFailedEvent received");
|
||||
resetPayloadFlags();
|
||||
state.setValue(new AddContactState.Failed());
|
||||
state.setValue(new Failed());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -446,22 +448,22 @@ class AddNearbyContactViewModel extends AndroidViewModel
|
||||
// Ignore results until the KeyAgreementTask is ready
|
||||
if (!gotLocalPayload || gotRemotePayload || currentTask == null) return;
|
||||
try {
|
||||
byte[] payloadBytes = result.getText().getBytes(ISO_8859_1);
|
||||
if (LOG.isLoggable(INFO))
|
||||
LOG.info("Remote payload is " + payloadBytes.length + " bytes");
|
||||
Payload remotePayload = payloadParser.parse(payloadBytes);
|
||||
Payload remotePayload = payloadParser.parse(result.getText());
|
||||
gotRemotePayload = true;
|
||||
currentTask.connectAndRunProtocol(remotePayload);
|
||||
state.postValue(new AddContactState.QrCodeScanned());
|
||||
state.postValue(new QrCodeScanned());
|
||||
} catch (WrongQrCodeTypeException e) {
|
||||
resetPayloadFlags();
|
||||
state.postValue(new WrongQrCodeType(e.getQrCodeType()));
|
||||
} catch (UnsupportedVersionException e) {
|
||||
resetPayloadFlags();
|
||||
state.postValue(new AddContactState.Failed(e.isTooOld()));
|
||||
state.postValue(new WrongQrCodeVersion(e.isTooOld()));
|
||||
} catch (IOException | IllegalArgumentException e) {
|
||||
LOG.log(WARNING, "QR Code Invalid", e);
|
||||
androidExecutor.runOnUiThread(() -> Toast.makeText(getApplication(),
|
||||
R.string.qr_code_invalid, LENGTH_LONG).show());
|
||||
resetPayloadFlags();
|
||||
state.postValue(new AddContactState.Failed());
|
||||
state.postValue(new Failed());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
@NotNullByDefault
|
||||
public abstract class BaseContactSelectorAdapter<I extends SelectableContactItem, H extends ContactItemViewHolder<I>>
|
||||
public abstract class BaseContactSelectorAdapter<I extends BaseSelectableContactItem, H extends ContactItemViewHolder<I>>
|
||||
extends BaseContactListAdapter<I, H> {
|
||||
|
||||
public BaseContactSelectorAdapter(Context context, Class<I> c,
|
||||
@@ -24,7 +24,7 @@ public abstract class BaseContactSelectorAdapter<I extends SelectableContactItem
|
||||
Collection<ContactId> selected = new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
SelectableContactItem item = items.get(i);
|
||||
BaseSelectableContactItem item = items.get(i);
|
||||
if (item.isSelected()) selected.add(item.getContact().getId());
|
||||
}
|
||||
return selected;
|
||||
|
||||
@@ -33,7 +33,7 @@ import static org.briarproject.briar.android.contactselection.ContactSelectorAct
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
public abstract class BaseContactSelectorFragment<I extends SelectableContactItem, A extends BaseContactSelectorAdapter<I, ? extends ContactItemViewHolder<I>>>
|
||||
public abstract class BaseContactSelectorFragment<I extends BaseSelectableContactItem, A extends BaseContactSelectorAdapter<I, ? extends ContactItemViewHolder<I>>>
|
||||
extends BaseFragment
|
||||
implements OnContactClickListener<I> {
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ import static org.briarproject.briar.android.util.UiUtils.GREY_OUT;
|
||||
|
||||
@UiThread
|
||||
@NotNullByDefault
|
||||
public class BaseSelectableContactHolder<I extends SelectableContactItem>
|
||||
public abstract class BaseSelectableContactHolder<I extends BaseSelectableContactItem>
|
||||
extends ContactItemViewHolder<I> {
|
||||
|
||||
private final CheckBox checkBox;
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package org.briarproject.briar.android.contactselection;
|
||||
|
||||
import org.briarproject.bramble.api.contact.Contact;
|
||||
import org.briarproject.briar.android.contact.ContactItem;
|
||||
import org.briarproject.briar.api.identity.AuthorInfo;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
|
||||
@NotThreadSafe
|
||||
@NotNullByDefault
|
||||
public abstract class BaseSelectableContactItem extends ContactItem {
|
||||
|
||||
private boolean selected;
|
||||
|
||||
public BaseSelectableContactItem(Contact contact, AuthorInfo authorInfo,
|
||||
boolean selected) {
|
||||
super(contact, authorInfo);
|
||||
this.selected = selected;
|
||||
}
|
||||
|
||||
boolean isSelected() {
|
||||
return selected;
|
||||
}
|
||||
|
||||
void toggleSelected() {
|
||||
selected = !selected;
|
||||
}
|
||||
|
||||
public abstract boolean isDisabled();
|
||||
|
||||
}
|
||||
@@ -10,7 +10,7 @@ import org.briarproject.nullsafety.NotNullByDefault;
|
||||
import java.util.Collection;
|
||||
|
||||
@NotNullByDefault
|
||||
public interface ContactSelectorController<I extends SelectableContactItem>
|
||||
public interface ContactSelectorController<I extends BaseSelectableContactItem>
|
||||
extends DbController {
|
||||
|
||||
void loadContacts(GroupId g, Collection<ContactId> selection,
|
||||
|
||||
@@ -11,6 +11,7 @@ import org.briarproject.briar.android.controller.DbControllerImpl;
|
||||
import org.briarproject.briar.android.controller.handler.ResultExceptionHandler;
|
||||
import org.briarproject.briar.api.identity.AuthorInfo;
|
||||
import org.briarproject.briar.api.identity.AuthorManager;
|
||||
import org.briarproject.briar.api.sharing.SharingManager.SharingStatus;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -53,10 +54,8 @@ public abstract class ContactSelectorControllerImpl
|
||||
AuthorInfo authorInfo = authorManager.getAuthorInfo(c);
|
||||
// was this contact already selected?
|
||||
boolean selected = selection.contains(c.getId());
|
||||
// can this contact be selected?
|
||||
boolean disabled = isDisabled(g, c);
|
||||
contacts.add(new SelectableContactItem(c, authorInfo,
|
||||
selected, disabled));
|
||||
selected, getSharingStatus(g, c)));
|
||||
}
|
||||
handler.onResult(contacts);
|
||||
} catch (DbException e) {
|
||||
@@ -67,7 +66,7 @@ public abstract class ContactSelectorControllerImpl
|
||||
}
|
||||
|
||||
@DatabaseExecutor
|
||||
protected abstract boolean isDisabled(GroupId g, Contact c)
|
||||
protected abstract SharingStatus getSharingStatus(GroupId g, Contact c)
|
||||
throws DbException;
|
||||
|
||||
}
|
||||
|
||||
@@ -2,15 +2,22 @@ package org.briarproject.briar.android.contactselection;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.android.contact.OnContactClickListener;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.annotation.UiThread;
|
||||
|
||||
import static android.view.View.GONE;
|
||||
import static android.view.View.VISIBLE;
|
||||
import static org.briarproject.briar.api.sharing.SharingManager.SharingStatus.ERROR;
|
||||
import static org.briarproject.briar.api.sharing.SharingManager.SharingStatus.INVITE_RECEIVED;
|
||||
import static org.briarproject.briar.api.sharing.SharingManager.SharingStatus.INVITE_SENT;
|
||||
import static org.briarproject.briar.api.sharing.SharingManager.SharingStatus.NOT_SUPPORTED;
|
||||
import static org.briarproject.briar.api.sharing.SharingManager.SharingStatus.SHARING;
|
||||
|
||||
@UiThread
|
||||
@NotNullByDefault
|
||||
@@ -27,6 +34,19 @@ class SelectableContactHolder
|
||||
super.bind(item, listener);
|
||||
|
||||
if (item.isDisabled()) {
|
||||
@StringRes int strRes;
|
||||
if (item.getSharingStatus() == SHARING) {
|
||||
strRes = R.string.forum_invitation_already_sharing;
|
||||
} else if (item.getSharingStatus() == INVITE_SENT) {
|
||||
strRes = R.string.forum_invitation_already_invited;
|
||||
} else if (item.getSharingStatus() == INVITE_RECEIVED) {
|
||||
strRes = R.string.forum_invitation_invite_received;
|
||||
} else if (item.getSharingStatus() == NOT_SUPPORTED) {
|
||||
strRes = R.string.forum_invitation_not_supported;
|
||||
} else if (item.getSharingStatus() == ERROR) {
|
||||
strRes = R.string.forum_invitation_error;
|
||||
} else throw new AssertionError("Unhandled SharingStatus");
|
||||
info.setText(strRes);
|
||||
info.setVisibility(VISIBLE);
|
||||
} else {
|
||||
info.setVisibility(GONE);
|
||||
|
||||
@@ -1,36 +1,33 @@
|
||||
package org.briarproject.briar.android.contactselection;
|
||||
|
||||
import org.briarproject.bramble.api.contact.Contact;
|
||||
import org.briarproject.briar.android.contact.ContactItem;
|
||||
import org.briarproject.briar.api.identity.AuthorInfo;
|
||||
import org.briarproject.briar.api.sharing.SharingManager.SharingStatus;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
|
||||
import static org.briarproject.briar.api.sharing.SharingManager.SharingStatus.SHAREABLE;
|
||||
|
||||
@NotThreadSafe
|
||||
@NotNullByDefault
|
||||
public class SelectableContactItem extends ContactItem {
|
||||
public class SelectableContactItem extends BaseSelectableContactItem {
|
||||
|
||||
private boolean selected;
|
||||
private final boolean disabled;
|
||||
private final SharingStatus sharingStatus;
|
||||
|
||||
public SelectableContactItem(Contact contact, AuthorInfo authorInfo,
|
||||
boolean selected, boolean disabled) {
|
||||
super(contact, authorInfo);
|
||||
this.selected = selected;
|
||||
this.disabled = disabled;
|
||||
boolean selected, SharingStatus sharingStatus) {
|
||||
super(contact, authorInfo, selected);
|
||||
this.sharingStatus = sharingStatus;
|
||||
}
|
||||
|
||||
boolean isSelected() {
|
||||
return selected;
|
||||
}
|
||||
|
||||
void toggleSelected() {
|
||||
selected = !selected;
|
||||
public SharingStatus getSharingStatus() {
|
||||
return sharingStatus;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDisabled() {
|
||||
return disabled;
|
||||
return sharingStatus != SHAREABLE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -66,6 +66,7 @@ import org.briarproject.briar.android.view.TextAttachmentController.AttachmentLi
|
||||
import org.briarproject.briar.android.view.TextInputView;
|
||||
import org.briarproject.briar.android.view.TextSendController;
|
||||
import org.briarproject.briar.android.view.TextSendController.SendState;
|
||||
import org.briarproject.briar.android.widget.LinkDialogFragment;
|
||||
import org.briarproject.briar.api.android.AndroidNotificationManager;
|
||||
import org.briarproject.briar.api.attachment.AttachmentHeader;
|
||||
import org.briarproject.briar.api.autodelete.event.ConversationMessagesDeletedEvent;
|
||||
@@ -476,6 +477,12 @@ public class ConversationActivity extends BriarActivity
|
||||
actionMode = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLinkClick(String url) {
|
||||
LinkDialogFragment f = LinkDialogFragment.newInstance(url);
|
||||
f.show(getSupportFragmentManager(), f.getUniqueTag());
|
||||
}
|
||||
|
||||
private void addSelectionTracker() {
|
||||
RecyclerView recyclerView = list.getRecyclerView();
|
||||
if (recyclerView.getAdapter() != adapter)
|
||||
@@ -925,6 +932,7 @@ public class ConversationActivity extends BriarActivity
|
||||
}
|
||||
|
||||
private void removeContact() {
|
||||
list.showProgressBar();
|
||||
runOnDbThread(() -> {
|
||||
try {
|
||||
contactManager.removeContact(contactId);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.briarproject.briar.android.conversation;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.util.Linkify;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
@@ -19,6 +20,7 @@ import static android.view.View.VISIBLE;
|
||||
import static org.briarproject.bramble.util.StringUtils.trim;
|
||||
import static org.briarproject.briar.android.util.UiUtils.formatDate;
|
||||
import static org.briarproject.briar.android.util.UiUtils.formatDuration;
|
||||
import static org.briarproject.briar.android.util.UiUtils.makeLinksClickable;
|
||||
import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER;
|
||||
|
||||
@UiThread
|
||||
@@ -58,6 +60,8 @@ abstract class ConversationItemViewHolder extends ViewHolder {
|
||||
|
||||
if (item.getText() != null) {
|
||||
text.setText(trim(item.getText()));
|
||||
Linkify.addLinks(text, Linkify.WEB_URLS);
|
||||
makeLinksClickable(text, listener::onLinkClick);
|
||||
}
|
||||
|
||||
long timestamp = item.getTime();
|
||||
|
||||
@@ -20,4 +20,6 @@ interface ConversationListener {
|
||||
|
||||
void onAutoDeleteTimerNoticeClicked();
|
||||
|
||||
void onLinkClick(String url);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.briarproject.briar.android.conversation;
|
||||
|
||||
import android.text.util.Linkify;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
||||
@@ -13,6 +14,7 @@ import static android.view.View.GONE;
|
||||
import static android.view.View.VISIBLE;
|
||||
import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty;
|
||||
import static org.briarproject.bramble.util.StringUtils.trim;
|
||||
import static org.briarproject.briar.android.util.UiUtils.makeLinksClickable;
|
||||
|
||||
@UiThread
|
||||
@NotNullByDefault
|
||||
@@ -40,6 +42,8 @@ class ConversationNoticeViewHolder extends ConversationItemViewHolder {
|
||||
} else {
|
||||
msgText.setVisibility(VISIBLE);
|
||||
msgText.setText(trim(text));
|
||||
Linkify.addLinks(msgText, Linkify.WEB_URLS);
|
||||
makeLinksClickable(msgText, listener::onLinkClick);
|
||||
layout.setBackgroundResource(isIncoming() ?
|
||||
R.drawable.notice_in_bottom : R.drawable.notice_out_bottom);
|
||||
}
|
||||
|
||||
@@ -436,7 +436,7 @@ class HotspotManager {
|
||||
}
|
||||
|
||||
private static String createWifiLoginString(String ssid, String password) {
|
||||
// https://en.wikipedia.org/wiki/QR_code#WiFi_network_login
|
||||
// https://en.wikipedia.org/wiki/QR_code#Joining_a_Wi%E2%80%91Fi_network
|
||||
// do not remove the dangling ';', it can cause problems to omit it
|
||||
return "WIFI:S:" + ssid + ";T:WPA;P:" + password + ";;";
|
||||
}
|
||||
|
||||
@@ -6,10 +6,24 @@ import android.widget.ProgressBar;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.ConnectionError;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.InvalidQrCode;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.MailboxAlreadyPaired;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Paired;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Pending;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.UnexpectedError;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||
import org.briarproject.briar.android.activity.BriarActivity;
|
||||
import org.briarproject.briar.android.fragment.FinalFragment;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.CameraError;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.IsPaired;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.NotSetup;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.OfflineWhenPairing;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.Pairing;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.ScanningQrCode;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.ShowDownload;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.WasUnpaired;
|
||||
import org.briarproject.briar.android.view.BlankFragment;
|
||||
import org.briarproject.nullsafety.MethodsNotNullByDefault;
|
||||
import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
||||
@@ -25,6 +39,9 @@ import androidx.lifecycle.ViewModelProvider;
|
||||
import static android.view.View.INVISIBLE;
|
||||
import static android.view.View.VISIBLE;
|
||||
import static android.widget.Toast.LENGTH_LONG;
|
||||
import static org.briarproject.bramble.api.mailbox.MailboxConstants.QR_FORMAT_VERSION;
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.BQP;
|
||||
import static org.briarproject.bramble.api.qrcode.QrCodeClassifier.QrCodeType.MAILBOX;
|
||||
import static org.briarproject.briar.android.util.UiUtils.showFragment;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@@ -56,24 +73,23 @@ public class MailboxActivity extends BriarActivity {
|
||||
}
|
||||
|
||||
viewModel.getPairingState().observeEvent(this, state -> {
|
||||
if (state instanceof MailboxState.NotSetup) {
|
||||
if (state instanceof NotSetup) {
|
||||
onNotSetup();
|
||||
} else if (state instanceof MailboxState.ShowDownload) {
|
||||
} else if (state instanceof ShowDownload) {
|
||||
onShowDownload();
|
||||
} else if (state instanceof MailboxState.ScanningQrCode) {
|
||||
} else if (state instanceof ScanningQrCode) {
|
||||
onScanningQrCode();
|
||||
} else if (state instanceof MailboxState.Pairing) {
|
||||
MailboxPairingState s =
|
||||
((MailboxState.Pairing) state).pairingState;
|
||||
} else if (state instanceof Pairing) {
|
||||
MailboxPairingState s = ((Pairing) state).pairingState;
|
||||
onMailboxPairingStateChanged(s);
|
||||
} else if (state instanceof MailboxState.OfflineWhenPairing) {
|
||||
} else if (state instanceof OfflineWhenPairing) {
|
||||
onOffline();
|
||||
} else if (state instanceof MailboxState.CameraError) {
|
||||
} else if (state instanceof CameraError) {
|
||||
onCameraError();
|
||||
} else if (state instanceof MailboxState.IsPaired) {
|
||||
onIsPaired(((MailboxState.IsPaired) state).isOnline);
|
||||
} else if (state instanceof MailboxState.WasUnpaired) {
|
||||
MailboxState.WasUnpaired s = (MailboxState.WasUnpaired) state;
|
||||
} else if (state instanceof IsPaired) {
|
||||
onIsPaired(((IsPaired) state).isOnline);
|
||||
} else if (state instanceof WasUnpaired) {
|
||||
WasUnpaired s = (WasUnpaired) state;
|
||||
onUnPaired(s.tellUserToWipeMailbox);
|
||||
} else {
|
||||
throw new AssertionError("Unknown state: " + state);
|
||||
@@ -104,7 +120,7 @@ public class MailboxActivity extends BriarActivity {
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
MailboxState s = viewModel.getPairingState().getLastValue();
|
||||
if (s instanceof MailboxState.Pairing) {
|
||||
if (s instanceof Pairing) {
|
||||
// don't go back in the flow if we are already pairing
|
||||
// with the mailbox. We provide a try-again button instead.
|
||||
supportFinishAfterTransition();
|
||||
@@ -158,33 +174,44 @@ public class MailboxActivity extends BriarActivity {
|
||||
}
|
||||
Fragment f;
|
||||
String tag;
|
||||
if (s instanceof MailboxPairingState.QrCodeReceived) {
|
||||
f = new MailboxConnectingFragment();
|
||||
if (s instanceof Pending) {
|
||||
long timeStarted = ((Pending) s).timeStarted;
|
||||
f = MailboxConnectingFragment.newInstance(timeStarted);
|
||||
tag = MailboxConnectingFragment.TAG;
|
||||
} else if (s instanceof MailboxPairingState.Pairing) {
|
||||
f = new MailboxConnectingFragment();
|
||||
tag = MailboxConnectingFragment.TAG;
|
||||
} else if (s instanceof MailboxPairingState.InvalidQrCode) {
|
||||
f = ErrorFragment.newInstance(
|
||||
R.string.mailbox_setup_qr_code_wrong_title,
|
||||
R.string.mailbox_setup_qr_code_wrong_description);
|
||||
} else if (s instanceof InvalidQrCode) {
|
||||
InvalidQrCode i = (InvalidQrCode) s;
|
||||
int errorRes;
|
||||
if (i.qrCodeType == MAILBOX) {
|
||||
if (i.formatVersion < QR_FORMAT_VERSION) {
|
||||
errorRes = R.string.mailbox_qr_code_too_old;
|
||||
} else if (i.formatVersion > QR_FORMAT_VERSION) {
|
||||
errorRes = R.string.mailbox_qr_code_too_new;
|
||||
} else {
|
||||
errorRes = R.string.mailbox_setup_qr_code_wrong_description;
|
||||
}
|
||||
} else if (i.qrCodeType == BQP) {
|
||||
errorRes = R.string.contact_qr_code_for_mailbox;
|
||||
} else {
|
||||
errorRes = R.string.mailbox_setup_qr_code_wrong_description;
|
||||
}
|
||||
f = ErrorFragment.newInstance(R.string.qr_code_invalid, errorRes);
|
||||
tag = ErrorFragment.TAG;
|
||||
} else if (s instanceof MailboxPairingState.MailboxAlreadyPaired) {
|
||||
} else if (s instanceof MailboxAlreadyPaired) {
|
||||
f = ErrorFragment.newInstance(
|
||||
R.string.mailbox_setup_already_paired_title,
|
||||
R.string.mailbox_setup_already_paired_description);
|
||||
tag = ErrorFragment.TAG;
|
||||
} else if (s instanceof MailboxPairingState.ConnectionError) {
|
||||
} else if (s instanceof ConnectionError) {
|
||||
f = ErrorFragment.newInstance(
|
||||
R.string.mailbox_setup_io_error_title,
|
||||
R.string.mailbox_setup_io_error_description);
|
||||
tag = ErrorFragment.TAG;
|
||||
} else if (s instanceof MailboxPairingState.UnexpectedError) {
|
||||
} else if (s instanceof UnexpectedError) {
|
||||
f = ErrorFragment.newInstance(
|
||||
R.string.mailbox_setup_assertion_error_title,
|
||||
R.string.mailbox_setup_assertion_error_description);
|
||||
tag = ErrorFragment.TAG;
|
||||
} else if (s instanceof MailboxPairingState.Paired) {
|
||||
} else if (s instanceof Paired) {
|
||||
f = FinalFragment.newInstance(R.string.mailbox_setup_paired_title,
|
||||
R.drawable.ic_check_circle_outline,
|
||||
R.color.briar_brand_green,
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
package org.briarproject.briar.android.mailbox;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.briarproject.bramble.api.plugin.TorConstants;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.nullsafety.MethodsNotNullByDefault;
|
||||
import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
||||
@@ -12,25 +17,71 @@ import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import static org.briarproject.briar.android.util.UiUtils.formatDuration;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
public class MailboxConnectingFragment extends Fragment {
|
||||
|
||||
static final String TAG = MailboxConnectingFragment.class.getName();
|
||||
|
||||
private static final String ARG_STARTED = "started";
|
||||
private static final long TIMEOUT_MS = TorConstants.EXTRA_CONNECT_TIMEOUT;
|
||||
private static final long REFRESH_INTERVAL_MS = 1_000;
|
||||
|
||||
private final Handler handler = new Handler(Looper.getMainLooper());
|
||||
// Capture a method reference so we use the same reference for posting
|
||||
// and removing
|
||||
private final Runnable refresher = this::updateProgressBar;
|
||||
|
||||
private ProgressBar progressBar;
|
||||
private long timeStarted;
|
||||
|
||||
public static MailboxConnectingFragment newInstance(long timeStarted) {
|
||||
MailboxConnectingFragment f = new MailboxConnectingFragment();
|
||||
Bundle args = new Bundle();
|
||||
args.putLong(ARG_STARTED, timeStarted);
|
||||
f.setArguments(args);
|
||||
return f;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater,
|
||||
@Nullable ViewGroup container,
|
||||
@Nullable Bundle savedInstanceState) {
|
||||
return inflater.inflate(R.layout.fragment_mailbox_connecting,
|
||||
View v = inflater.inflate(R.layout.fragment_mailbox_connecting,
|
||||
container, false);
|
||||
|
||||
progressBar = v.findViewById(R.id.progressBar);
|
||||
TextView info = v.findViewById(R.id.info);
|
||||
String duration = formatDuration(requireContext(), TIMEOUT_MS);
|
||||
info.setText(getString(R.string.mailbox_setup_connecting_info,
|
||||
duration));
|
||||
|
||||
timeStarted = requireArguments().getLong(ARG_STARTED);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
requireActivity().setTitle(R.string.mailbox_setup_title);
|
||||
updateProgressBar();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
super.onStop();
|
||||
handler.removeCallbacks(refresher);
|
||||
}
|
||||
|
||||
private void updateProgressBar() {
|
||||
long elapsedMs = System.currentTimeMillis() - timeStarted;
|
||||
int percent = (int) (elapsedMs * 100 / TIMEOUT_MS);
|
||||
percent = Math.min(Math.max(percent, 0), 100);
|
||||
progressBar.setProgress(percent);
|
||||
handler.postDelayed(refresher, REFRESH_INTERVAL_MS);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
||||
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxManager;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingState.Paired;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxPairingTask;
|
||||
import org.briarproject.bramble.api.mailbox.MailboxStatus;
|
||||
import org.briarproject.bramble.api.mailbox.event.OwnMailboxConnectionStatusEvent;
|
||||
@@ -24,7 +25,14 @@ import org.briarproject.bramble.api.plugin.TorConstants;
|
||||
import org.briarproject.bramble.api.plugin.TransportId;
|
||||
import org.briarproject.bramble.api.plugin.event.TransportInactiveEvent;
|
||||
import org.briarproject.bramble.api.system.AndroidExecutor;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.CameraError;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.IsPaired;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.NotSetup;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.OfflineWhenPairing;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.Pairing;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.ScanningQrCode;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.ShowDownload;
|
||||
import org.briarproject.briar.android.mailbox.MailboxState.WasUnpaired;
|
||||
import org.briarproject.briar.android.qrcode.QrCodeDecoder;
|
||||
import org.briarproject.briar.android.viewmodel.DbViewModel;
|
||||
import org.briarproject.briar.android.viewmodel.LiveEvent;
|
||||
@@ -113,7 +121,7 @@ class MailboxViewModel extends DbViewModel
|
||||
MailboxStatus mailboxStatus =
|
||||
mailboxManager.getMailboxStatus(txn);
|
||||
boolean isOnline = isTorActive();
|
||||
pairingState.postEvent(new MailboxState.IsPaired(isOnline));
|
||||
pairingState.postEvent(new IsPaired(isOnline));
|
||||
status.postValue(mailboxStatus);
|
||||
} else {
|
||||
pairingState.postEvent(new NotSetup());
|
||||
@@ -142,14 +150,14 @@ class MailboxViewModel extends DbViewModel
|
||||
@UiThread
|
||||
private void onTorInactive() {
|
||||
MailboxState lastState = pairingState.getLastValue();
|
||||
if (lastState instanceof MailboxState.IsPaired) {
|
||||
if (lastState instanceof IsPaired) {
|
||||
// we are already paired, so use IsPaired state
|
||||
pairingState.setEvent(new MailboxState.IsPaired(false));
|
||||
} else if (lastState instanceof MailboxState.Pairing) {
|
||||
MailboxState.Pairing p = (MailboxState.Pairing) lastState;
|
||||
pairingState.setEvent(new IsPaired(false));
|
||||
} else if (lastState instanceof Pairing) {
|
||||
Pairing p = (Pairing) lastState;
|
||||
// check that we not just finished pairing (showing success screen)
|
||||
if (!(p.pairingState instanceof MailboxPairingState.Paired)) {
|
||||
pairingState.setEvent(new MailboxState.OfflineWhenPairing());
|
||||
if (!(p.pairingState instanceof Paired)) {
|
||||
pairingState.setEvent(new OfflineWhenPairing());
|
||||
}
|
||||
// else ignore offline event as user will be leaving UI flow anyway
|
||||
}
|
||||
@@ -158,15 +166,15 @@ class MailboxViewModel extends DbViewModel
|
||||
@UiThread
|
||||
void onScanButtonClicked() {
|
||||
if (isTorActive()) {
|
||||
pairingState.setEvent(new MailboxState.ScanningQrCode());
|
||||
pairingState.setEvent(new ScanningQrCode());
|
||||
} else {
|
||||
pairingState.setEvent(new MailboxState.OfflineWhenPairing());
|
||||
pairingState.setEvent(new OfflineWhenPairing());
|
||||
}
|
||||
}
|
||||
|
||||
@UiThread
|
||||
void onCameraError() {
|
||||
pairingState.setEvent(new MailboxState.CameraError());
|
||||
pairingState.setEvent(new CameraError());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -182,7 +190,7 @@ class MailboxViewModel extends DbViewModel
|
||||
pairingTask = mailboxManager.startPairingTask(qrCodePayload);
|
||||
pairingTask.addObserver(this);
|
||||
} else {
|
||||
pairingState.postEvent(new MailboxState.OfflineWhenPairing());
|
||||
pairingState.postEvent(new OfflineWhenPairing());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -193,7 +201,7 @@ class MailboxViewModel extends DbViewModel
|
||||
LOG.info("New pairing state: " +
|
||||
mailboxPairingState.getClass().getSimpleName());
|
||||
}
|
||||
pairingState.setEvent(new MailboxState.Pairing(mailboxPairingState));
|
||||
pairingState.setEvent(new Pairing(mailboxPairingState));
|
||||
}
|
||||
|
||||
private boolean isTorActive() {
|
||||
@@ -203,7 +211,7 @@ class MailboxViewModel extends DbViewModel
|
||||
|
||||
@UiThread
|
||||
void showDownloadFragment() {
|
||||
pairingState.setEvent(new MailboxState.ShowDownload());
|
||||
pairingState.setEvent(new ShowDownload());
|
||||
}
|
||||
|
||||
@UiThread
|
||||
@@ -214,7 +222,7 @@ class MailboxViewModel extends DbViewModel
|
||||
@UiThread
|
||||
void checkIfOnlineWhenPaired() {
|
||||
boolean isOnline = isTorActive();
|
||||
pairingState.setEvent(new MailboxState.IsPaired(isOnline));
|
||||
pairingState.setEvent(new IsPaired(isOnline));
|
||||
}
|
||||
|
||||
LiveData<Boolean> checkConnection() {
|
||||
@@ -227,7 +235,7 @@ class MailboxViewModel extends DbViewModel
|
||||
checkConnection(success -> {
|
||||
boolean isOnline = isTorActive();
|
||||
// make UI move back to status fragment by changing pairingState
|
||||
pairingState.postEvent(new MailboxState.IsPaired(isOnline));
|
||||
pairingState.postEvent(new IsPaired(isOnline));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -246,7 +254,7 @@ class MailboxViewModel extends DbViewModel
|
||||
ioExecutor.execute(() -> {
|
||||
try {
|
||||
boolean wasWiped = mailboxManager.unPair();
|
||||
pairingState.postEvent(new MailboxState.WasUnpaired(!wasWiped));
|
||||
pairingState.postEvent(new WasUnpaired(!wasWiped));
|
||||
} catch (DbException e) {
|
||||
handleException(e);
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import org.briarproject.briar.android.privategroup.memberlist.GroupMemberListAct
|
||||
import org.briarproject.briar.android.privategroup.reveal.RevealContactsActivity;
|
||||
import org.briarproject.briar.android.threaded.ThreadListActivity;
|
||||
import org.briarproject.briar.android.threaded.ThreadListViewModel;
|
||||
import org.briarproject.briar.android.widget.LinkDialogFragment;
|
||||
import org.briarproject.nullsafety.MethodsNotNullByDefault;
|
||||
import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
||||
|
||||
@@ -158,6 +159,12 @@ public class GroupActivity extends
|
||||
if (isDissolved != null && !isDissolved) super.onReplyClick(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLinkClick(String url){
|
||||
LinkDialogFragment f = LinkDialogFragment.newInstance(url);
|
||||
f.show(getSupportFragmentManager(), f.getUniqueTag());
|
||||
}
|
||||
|
||||
private void setGroupEnabled(boolean enabled) {
|
||||
sendController.setReady(enabled);
|
||||
list.getRecyclerView().setAlpha(enabled ? 1f : 0.5f);
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.briarproject.briar.api.privategroup.PrivateGroupFactory;
|
||||
import org.briarproject.briar.api.privategroup.PrivateGroupManager;
|
||||
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationFactory;
|
||||
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager;
|
||||
import org.briarproject.briar.api.sharing.SharingManager.SharingStatus;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -140,8 +141,8 @@ class CreateGroupControllerImpl extends ContactSelectorControllerImpl
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isDisabled(GroupId g, Contact c) throws DbException {
|
||||
return !groupInvitationManager.isInvitationAllowed(c, g);
|
||||
protected SharingStatus getSharingStatus(GroupId g, Contact c) throws DbException {
|
||||
return groupInvitationManager.getSharingStatus(c, g);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -92,7 +92,7 @@ class RevealContactsControllerImpl extends DbControllerImpl
|
||||
boolean selected =
|
||||
disabled || selection.contains(c.getId());
|
||||
items.add(new RevealableContactItem(c, authorInfo, selected,
|
||||
disabled, m.getVisibility()));
|
||||
m.getVisibility()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,22 +1,24 @@
|
||||
package org.briarproject.briar.android.privategroup.reveal;
|
||||
|
||||
import org.briarproject.bramble.api.contact.Contact;
|
||||
import org.briarproject.briar.android.contactselection.SelectableContactItem;
|
||||
import org.briarproject.briar.android.contactselection.BaseSelectableContactItem;
|
||||
import org.briarproject.briar.api.identity.AuthorInfo;
|
||||
import org.briarproject.briar.api.privategroup.Visibility;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
|
||||
import static org.briarproject.briar.api.privategroup.Visibility.INVISIBLE;
|
||||
|
||||
@NotThreadSafe
|
||||
@NotNullByDefault
|
||||
class RevealableContactItem extends SelectableContactItem {
|
||||
class RevealableContactItem extends BaseSelectableContactItem {
|
||||
|
||||
private final Visibility visibility;
|
||||
|
||||
RevealableContactItem(Contact contact, AuthorInfo authorInfo,
|
||||
boolean selected, boolean disabled, Visibility visibility) {
|
||||
super(contact, authorInfo, selected, disabled);
|
||||
boolean selected, Visibility visibility) {
|
||||
super(contact, authorInfo, selected);
|
||||
this.visibility = visibility;
|
||||
}
|
||||
|
||||
@@ -24,4 +26,8 @@ class RevealableContactItem extends SelectableContactItem {
|
||||
return visibility;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDisabled() {
|
||||
return visibility != INVISIBLE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,7 +41,6 @@ public class QrCodeDecoder implements PreviewConsumer, PreviewCallback {
|
||||
private final ResultCallback callback;
|
||||
|
||||
private Camera camera = null;
|
||||
private int cameraIndex = 0;
|
||||
|
||||
public QrCodeDecoder(AndroidExecutor androidExecutor,
|
||||
@IoExecutor Executor ioExecutor, ResultCallback callback) {
|
||||
@@ -53,14 +52,12 @@ public class QrCodeDecoder implements PreviewConsumer, PreviewCallback {
|
||||
@Override
|
||||
public void start(Camera camera, int cameraIndex) {
|
||||
this.camera = camera;
|
||||
this.cameraIndex = cameraIndex;
|
||||
askForPreviewFrame();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
camera = null;
|
||||
cameraIndex = 0;
|
||||
}
|
||||
|
||||
@UiThread
|
||||
|
||||
@@ -310,14 +310,12 @@ class BriarReportCollector {
|
||||
btLeAdvertise);
|
||||
}
|
||||
|
||||
if (hasBtConnectPermission(ctx)) {
|
||||
Pair<String, String> p = getBluetoothAddressAndMethod(ctx, bt);
|
||||
String address = p.getFirst();
|
||||
String method = p.getSecond();
|
||||
connectivityInfo.add("BluetoothAddress",
|
||||
scrubMacAddress(address));
|
||||
connectivityInfo.add("BluetoothAddressMethod", method);
|
||||
}
|
||||
Pair<String, String> p = getBluetoothAddressAndMethod(ctx, bt);
|
||||
String address = p.getFirst();
|
||||
String method = p.getSecond();
|
||||
connectivityInfo.add("BluetoothAddress",
|
||||
scrubMacAddress(address));
|
||||
connectivityInfo.add("BluetoothAddressMethod", method);
|
||||
}
|
||||
return new ReportItem("Connectivity", R.string.dev_report_connectivity,
|
||||
connectivityInfo);
|
||||
|
||||
@@ -13,6 +13,7 @@ import org.briarproject.briar.android.contactselection.ContactSelectorController
|
||||
import org.briarproject.briar.android.controller.handler.ExceptionHandler;
|
||||
import org.briarproject.briar.api.blog.BlogSharingManager;
|
||||
import org.briarproject.briar.api.identity.AuthorManager;
|
||||
import org.briarproject.briar.api.sharing.SharingManager.SharingStatus;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.util.Collection;
|
||||
@@ -47,8 +48,9 @@ class ShareBlogControllerImpl extends ContactSelectorControllerImpl
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isDisabled(GroupId g, Contact c) throws DbException {
|
||||
return !blogSharingManager.canBeShared(g, c);
|
||||
protected SharingStatus getSharingStatus(GroupId g, Contact c)
|
||||
throws DbException {
|
||||
return blogSharingManager.getSharingStatus(g, c);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -13,6 +13,7 @@ import org.briarproject.briar.android.contactselection.ContactSelectorController
|
||||
import org.briarproject.briar.android.controller.handler.ExceptionHandler;
|
||||
import org.briarproject.briar.api.forum.ForumSharingManager;
|
||||
import org.briarproject.briar.api.identity.AuthorManager;
|
||||
import org.briarproject.briar.api.sharing.SharingManager.SharingStatus;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.util.Collection;
|
||||
@@ -47,8 +48,9 @@ class ShareForumControllerImpl extends ContactSelectorControllerImpl
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isDisabled(GroupId g, Contact c) throws DbException {
|
||||
return !forumSharingManager.canBeShared(g, c);
|
||||
protected SharingStatus getSharingStatus(GroupId g, Contact c)
|
||||
throws DbException {
|
||||
return forumSharingManager.getSharingStatus(g, c);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.animation.Animator;
|
||||
import android.animation.ArgbEvaluator;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.content.Context;
|
||||
import android.text.util.Linkify;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.animation.AccelerateInterpolator;
|
||||
@@ -20,6 +21,7 @@ import androidx.annotation.UiThread;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import static androidx.core.content.ContextCompat.getColor;
|
||||
import static org.briarproject.briar.android.util.UiUtils.makeLinksClickable;
|
||||
|
||||
@UiThread
|
||||
@NotNullByDefault
|
||||
@@ -43,6 +45,8 @@ public abstract class BaseThreadItemViewHolder<I extends ThreadItem>
|
||||
@CallSuper
|
||||
public void bind(I item, ThreadItemListener<I> listener) {
|
||||
textView.setText(StringUtils.trim(item.getText()));
|
||||
Linkify.addLinks(textView, Linkify.WEB_URLS);
|
||||
makeLinksClickable(textView, listener::onLinkClick);
|
||||
|
||||
author.setAuthor(item.getAuthor(), item.getAuthorInfo());
|
||||
author.setDate(item.getTimestamp());
|
||||
|
||||
@@ -137,6 +137,7 @@ public class ThreadItemAdapter<I extends ThreadItem>
|
||||
|
||||
public interface ThreadItemListener<I> {
|
||||
void onReplyClick(I item);
|
||||
void onLinkClick(String url);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ import org.briarproject.briar.android.view.TextSendController;
|
||||
import org.briarproject.briar.android.view.TextSendController.SendListener;
|
||||
import org.briarproject.briar.android.view.TextSendController.SendState;
|
||||
import org.briarproject.briar.android.view.UnreadMessageButton;
|
||||
import org.briarproject.briar.android.widget.LinkDialogFragment;
|
||||
import org.briarproject.briar.api.attachment.AttachmentHeader;
|
||||
import org.briarproject.nullsafety.MethodsNotNullByDefault;
|
||||
import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
||||
@@ -202,6 +203,12 @@ public abstract class ThreadListActivity<I extends ThreadItem, A extends ThreadI
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLinkClick(String url) {
|
||||
LinkDialogFragment f = LinkDialogFragment.newInstance(url);
|
||||
f.show(getSupportFragmentManager(), f.getUniqueTag());
|
||||
}
|
||||
|
||||
protected void setToolbarSubTitle(SharingInfo sharingInfo) {
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
|
||||
@@ -51,12 +51,12 @@
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/margin_xlarge"
|
||||
android:text="@string/add_contact_error_two_way"
|
||||
android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
|
||||
app:layout_constraintBottom_toTopOf="@+id/sendFeedback"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/errorTitle"
|
||||
tools:text="error explanation" />
|
||||
app:layout_constraintTop_toBottomOf="@+id/errorTitle" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sendFeedback"
|
||||
|
||||
@@ -1,31 +1,51 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/progressBar"
|
||||
style="?android:attr/progressBarStyleLarge"
|
||||
android:layout_width="wrap_content"
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
style="@style/TextAppearance.AppCompat.Large"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="16dp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/textView"
|
||||
android:layout_marginHorizontal="@dimen/margin_xlarge"
|
||||
android:layout_marginTop="@dimen/margin_xlarge"
|
||||
android:gravity="center"
|
||||
android:text="@string/mailbox_setup_connecting"
|
||||
app:layout_constraintBottom_toTopOf="@+id/progressBar"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView"
|
||||
style="@style/TextAppearance.AppCompat.Large"
|
||||
android:layout_width="wrap_content"
|
||||
<ProgressBar
|
||||
android:id="@+id/progressBar"
|
||||
style="?android:attr/progressBarStyleHorizontal"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="16dp"
|
||||
android:text="@string/mailbox_setup_connecting"
|
||||
android:layout_marginHorizontal="@dimen/margin_xlarge"
|
||||
android:layout_marginTop="@dimen/margin_xlarge"
|
||||
android:max="100"
|
||||
app:layout_constraintBottom_toTopOf="@+id/info"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/title" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/info"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/margin_xlarge"
|
||||
android:layout_marginTop="@dimen/margin_xlarge"
|
||||
android:layout_marginBottom="@dimen/margin_xlarge"
|
||||
android:gravity="center"
|
||||
android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/progressBar" />
|
||||
app:layout_constraintTop_toBottomOf="@+id/progressBar"
|
||||
tools:text="This may take up to 2 minutes" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
android:paddingBottom="@dimen/listitem_vertical_margin"
|
||||
android:textColor="?android:attr/textColorSecondary"
|
||||
android:textSize="@dimen/text_size_small"
|
||||
android:textColorLink="@color/briar_text_link"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/authorView"
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
android:layout_marginRight="@dimen/message_bubble_padding_sides_inner"
|
||||
android:layout_marginBottom="@dimen/message_bubble_padding_bottom_inner"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:textColorLink="@color/briar_text_link"
|
||||
app:layout_constrainedWidth="true"
|
||||
app:layout_constraintBottom_toTopOf="@+id/statusLayout"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
android:layout_marginRight="@dimen/message_bubble_padding_sides_inner"
|
||||
android:layout_marginBottom="@dimen/message_bubble_padding_bottom_inner"
|
||||
android:textColor="@color/briar_text_primary_inverse"
|
||||
android:textColorLink="@color/briar_text_link_inverse"
|
||||
app:layout_constrainedWidth="true"
|
||||
app:layout_constraintBottom_toTopOf="@+id/statusLayout"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
android:layout_marginRight="@dimen/message_bubble_margin_non_tail"
|
||||
android:background="@drawable/msg_in_top"
|
||||
android:elevation="@dimen/message_bubble_elevation"
|
||||
android:textColorLink="@color/briar_text_link"
|
||||
tools:text="Short message"
|
||||
tools:visibility="visible" />
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
android:background="@drawable/msg_out_top"
|
||||
android:elevation="@dimen/message_bubble_elevation"
|
||||
android:textColor="@color/briar_text_primary_inverse"
|
||||
android:textColorLink="@color/briar_text_link_inverse"
|
||||
tools:text="This is a long long long message that spans over several lines.\n\nIt ends here."
|
||||
tools:visibility="visible" />
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
android:background="@drawable/msg_in_top"
|
||||
android:elevation="@dimen/message_bubble_elevation"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:textColorLink="@color/briar_text_link"
|
||||
tools:text="Short message"
|
||||
tools:visibility="visible" />
|
||||
|
||||
|
||||
@@ -114,6 +114,7 @@
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:textIsSelectable="true"
|
||||
android:textSize="@dimen/text_size_medium"
|
||||
android:textColorLink="@color/briar_text_link"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
||||
@@ -224,6 +224,7 @@
|
||||
<string name="menu_contact">Контакт</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">Добавяне на контакт на живо</string>
|
||||
<string name="add_contact_error_two_way">Сканирахте ли взаимно кодовете си за QR?</string>
|
||||
<string name="face_to_face">Трябва да се срещнете лично с човека, чиито контакт искате да добавите.\n\nТака никой не може да се представи за вас или да чете съобщенията ви в бъдеще.</string>
|
||||
<string name="continue_button">Напред</string>
|
||||
<string name="try_again_button">Нов опит</string>
|
||||
@@ -239,6 +240,7 @@
|
||||
<string name="authenticating_with_device">Удостоверяване с устройство\u2026</string>
|
||||
<string name="connection_error_title">Не може да бъде установена връзка с контакта</string>
|
||||
<string name="connection_error_feedback">Ако проблемът продължава, <a href="feedback">изпратете обратна връзка</a>, за да ни помогнете да подобрим приложението.</string>
|
||||
<string name="info_both_must_scan">Трябва взаимно да сканирате кодовете си за QR</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">Добавяне на контакт отдалечено</string>
|
||||
<string name="add_contact_nearby_title">Добавяне на контакт на живо</string>
|
||||
@@ -296,6 +298,7 @@
|
||||
<string name="different_person_button">Не</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s и %2$s са изпратили еднакви препратки.\n\nЕдиният от двамата вероятно се опитва да разбере кои са контактите ви.\n\nНе им споделяйте, че сте получили същата препратка от друг човек.</string>
|
||||
<string name="pending_contact_updated_toast">Обновена чакаща заявка за контакт</string>
|
||||
<string name="info_both_must_enter_links">Трябва взаимно да добавите препратките си</string>
|
||||
<!--Peer trust levels-->
|
||||
<string name="peer_trust_level_unverified">Непроверен контакт</string>
|
||||
<string name="peer_trust_level_verified">Проверен контакт</string>
|
||||
@@ -329,6 +332,7 @@
|
||||
<string name="connect_via_bluetooth_intro">В случай, че връзка чрез Bluetooth не се установява автоматично можете да използвате този екран, за да се свържете ръчно.\n\nВие и контакта трябва да бъдете близо един до друг.\n\nДвамата трябва да докоснете бутона „Старт“ едновременно.</string>
|
||||
<string name="connect_via_bluetooth_already_discovering">Осъществява св връзка през Bluetooth. По-късно опитайте отново.</string>
|
||||
<string name="connect_via_bluetooth_no_location_permission">Не може да продължи без разрешение за местоположение</string>
|
||||
<string name="connect_via_bluetooth_no_bluetooth_permission">Не може да продължи без разрешение за устройства наблизо</string>
|
||||
<string name="connect_via_bluetooth_start">Свързване чрез Bluetooth…</string>
|
||||
<string name="connect_via_bluetooth_success">Успешно е създaдена връзка чрез Bluetooth</string>
|
||||
<string name="connect_via_bluetooth_error">Не може да бъде установена връзка чрез Bluetooth.</string>
|
||||
@@ -586,10 +590,8 @@
|
||||
\nСлед това свържете Mailbox с Briar чрез сканиране на кода за QR от приложението Mailbox.</string>
|
||||
<string name="mailbox_setup_download_link">Споделяне на препратка за изтегляне</string>
|
||||
<string name="mailbox_setup_button_scan">Сканиране на кода за QR на пощенска кутия</string>
|
||||
<string name="permission_camera_qr_denied_body">Отказахте достъп до камерата, но тя е необходима за добавянето на контакти.\n\nОбмислете дали да не дадете разрешение.</string>
|
||||
<string name="mailbox_setup_connecting">Свързване…</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Грешен код на QR</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Сканираният код е недействителен. Отворете приложението Briar Malibox на устройството, на което е инсталирано и сканирайте кода, който то предостави.</string>
|
||||
<string name="permission_camera_qr_denied_body">Отказахте достъп до камерата, но достъп е необходим за сканиране на кодове за QR.\n\nОбмислете дали да не дадете разрешение.</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_already_paired_title">Пощенската кутия е вече свързана</string>
|
||||
<string name="mailbox_setup_already_paired_description">Прекъснете връзката с пощенската кутия от другото устройство и опитайте отново.</string>
|
||||
<string name="mailbox_setup_io_error_title">Грешка при свързване</string>
|
||||
@@ -718,14 +720,20 @@
|
||||
<string name="permission_camera_title">Разрешение за камера</string>
|
||||
<string name="permission_camera_request_body">За да сканира кода за QR, Briar трябва да използва камерата.</string>
|
||||
<string name="permission_location_title">Разрешение за местоположение</string>
|
||||
<string name="permission_location_request_body">За да открива устройства чрез Bluetooth, на Briar му е необходимо разрешение за достъп до местоположението.\n\nBriar не го пази и не го споделя с никого.</string>
|
||||
<string name="permission_location_request_body">За да открива устройства чрез Bluetooth, Briar се нуждае от разрешение за достъп до местоположението.\n\nBriar не го пази и не го споделя с никого.</string>
|
||||
<string name="permission_camera_location_title">Камера и местоположение</string>
|
||||
<string name="permission_camera_location_request_body">За да сканира кодове за QR, на Briar му е необходимо разрешение за достъп до камерата.\n\nЗа да открива устройства чрез Bluetooth, на Briar му е необходимо разрешение за достъп до местоположението.\n\nBriar не го пази и не го споделя с никого.</string>
|
||||
<string name="permission_camera_denied_body">Отказахте достъп до камерата, но тя е необходима за добавянето на контакти.\n\nОбмислете дали да не дадете разрешение.</string>
|
||||
<string name="permission_location_denied_body">Отказахте достъп до местоположението, но то е необходимо за откриване на устройства чрез Bluetooth.\n\nОбмислете дали да не дадете разрешение.</string>
|
||||
<string name="permission_camera_location_request_body">За да сканира кода за QR, Briar трябва да използва камерата.\n\nЗа да открива устройства чрез Bluetooth, Briar трябва да има достъп до местоположението.\n\nBriar не го пази и не го споделя с никого.</string>
|
||||
<string name="permission_camera_bluetooth_title">Камера и устройства наблизо</string>
|
||||
<string name="permission_camera_bluetooth_request_body">За да сканира кода за QR, Briar трябва да използва камерата.\n\nЗа да открива устройства чрез Bluetooth, Briar се нуждае от достъп до местоположението. Briar се нуждае от разрешение да намира и да се свързва с устройства наблизо.</string>
|
||||
<string name="permission_camera_denied_body">Отказахте достъп до камерата, но достъп е необходим за добавяне на контакти.\n\nОбмислете дали да не дадете разрешение.</string>
|
||||
<string name="permission_location_denied_body">Отказахте достъп до местоположението, но достъп е необходим за откриване на устройства чрез Bluetooth.\n\nОбмислете дали да не дадете разрешение.</string>
|
||||
<string name="permission_location_setting_title">Настройки на местоположението</string>
|
||||
<string name="permission_location_setting_body">Местоположението на устройството ви трябва да е включено, за да бъдат откривани устройства чрез Bluetooth. За да продължите включете местоположението. След това можете да го изключите.</string>
|
||||
<string name="permission_location_setting_body">За да бъдат откривани устройства чрез Bluetooth местоположението на устройството ви трябва да е включено. За да продължите включете местоположението. След това можете да го изключите.</string>
|
||||
<string name="permission_location_setting_hotspot_body">За да създаде безжична точка за достъп местоположението на устройството ви трябва да е включено. За да продължите включете местоположението. След това можете да го изключите.</string>
|
||||
<string name="permission_location_setting_button">Включване на местеположение</string>
|
||||
<string name="permission_bluetooth_title">Разрешение за устройства наблизо</string>
|
||||
<string name="permission_bluetooth_body">За да извършва разговори чрез Bluetooth, Briar се нуждае от разрешение да намира и да се свързва с устройства наблизо.</string>
|
||||
<string name="permission_bluetooth_denied_body">Отказахте достъп до устройства наблизо, но достъп е необходим за използване на Bluetooth.\n\nОбмислете дали да не дадете разрешение.</string>
|
||||
<string name="qr_code">Код за QR</string>
|
||||
<string name="show_qr_code_fullscreen">Код за QR на цял екран</string>
|
||||
<!--App Locking-->
|
||||
@@ -747,8 +755,10 @@
|
||||
<string name="hotspot_notification_channel_title">Безжична точка за достъп</string>
|
||||
<string name="hotspot_notification_title">Споделяне на Briar извън мрежа</string>
|
||||
<string name="hotspot_button_connected">Напред</string>
|
||||
<string name="permission_hotspot_location_request_body">За да създаде безжична точка за достъп, на Briar му е необходимо разрешение за достъп до местоположението.\n\nBriar не го пази и не го споделя с никого.</string>
|
||||
<string name="permission_hotspot_location_denied_body">Отказахте достъп до местоположението, но то е необходимо за създаване на безжична точка за достъп.\n\nОбмислете дали да не дадете разрешение.</string>
|
||||
<string name="permission_hotspot_location_request_body">За да създаде безжична точка за достъп, Briar се нуждае от разрешение за достъп до местоположението.\n\nBriar не го пази и не го споделя с никого.</string>
|
||||
<string name="permission_hotspot_location_request_precise_body">За да създаде безжична точка за достъп, Briar се нуждае от разрешение за достъп до точното местоположение.\n\nBriar не го пази и не го споделя с никого.</string>
|
||||
<string name="permission_hotspot_location_denied_body">Отказахте достъп до местоположението, но достъп е необходим за създаване на безжична точка за достъп.\n\nОбмислете дали да не дадете разрешение.</string>
|
||||
<string name="permission_hotspot_location_denied_precise_body">Отказахте достъп до точното местоположение, но достъп е необходим за създаване на безжична точка за достъп.\n\nОбмислете дали да не дадете разрешение.</string>
|
||||
<string name="wifi_settings_title">Настройки на Wi-Fi</string>
|
||||
<string name="wifi_settings_request_enable_body">За да създаде безжична точка за достъп, Briar се нуждае от безжична мрежа. Включете Wi-Fi.</string>
|
||||
<string name="hotspot_tab_manual">Ръчно</string>
|
||||
|
||||
@@ -1,36 +1,35 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<!--Setup-->
|
||||
<string name="setup_title">Benvingut a Briar</string>
|
||||
<string name="setup_name_explanation">El vostre sobrenom etiquetarà tot el que publiqueu. Després de crear el compte ja no podreu canviar el sobrenom.</string>
|
||||
<string name="setup_next">Següent</string>
|
||||
<string name="setup_password_intro">Establiu una contrasenya</string>
|
||||
<string name="setup_password_explanation">El compte de Briar s\'emmagatzema xifrat en el vostre dispositiu, no en el núvol. Si oblideu la contrasenya o desinstal·leu Briar no podreu recuperar el vostre compte ni les dades associades.\n\nTrieu una contrasenya llarga que sigui difícil d\'endevinar, com ara quatre paraules aleatòries o deu lletres, números i símbols aleatoris.</string>
|
||||
<string name="dnkm_doze_title">Connexions en segon pla</string>
|
||||
<string name="dnkm_doze_intro">Per rebre missatges Briar necessita estar connectat en segon pla.</string>
|
||||
<string name="dnkm_doze_explanation">Per rebre missatges Briar necessita estar connectat en segon pla. Desactiveu les optimitzacions de la bateria per permetre que Briar resti sempre connectat.</string>
|
||||
<string name="dnkm_doze_button">Permet connexions</string>
|
||||
<string name="choose_nickname">Trieu el sobrenom</string>
|
||||
<string name="choose_password">Trieu la contrasenya</string>
|
||||
<string name="confirm_password">Confirmeu la contrasenya</string>
|
||||
<string name="name_too_long">El nom és massa llarg</string>
|
||||
<string name="password_too_weak">La contrasenya és massa feble</string>
|
||||
<string name="passwords_do_not_match">Les contrasenyes no coincideixen</string>
|
||||
<string name="create_account_button">Crea el compte</string>
|
||||
<string name="more_info">Més informació</string>
|
||||
<string name="don_t_ask_again">No tornis a preguntar-ho</string>
|
||||
<string name="dnkm_huawei_protected_text">Feu un toc sobre el botó següent i assegureu-vos de que Briar consta com a protegit a la pantalla «Aplicacions protegides».</string>
|
||||
<string name="dnkm_huawei_protected_button">Protegeix Briar</string>
|
||||
<string name="dnkm_huawei_protected_help">Si no afegiu Briar a la llista d\'aplicacions protegides, s\'evitarà que Briar s\'executi en segon pla.</string>
|
||||
<string name="dnkm_huawei_app_launch_text">Premeu el botó, obriu la pantalla «Llença app» i assegureu-vos que Briar està configurat com «Gestiona a ma».</string>
|
||||
<string name="dnkm_huawei_app_launch_button">Obriu la configuració de la bateria</string>
|
||||
<string name="dnkm_huawei_app_launch_help">Si Briar no està configurat com a «Gestiona manualment» a la pantalla «Llença app», no podrà executar-se en segon pla.</string>
|
||||
<string name="dnkm_xiaomi_text">Per executar-se en segon pla, Briar necessita ser blocat en la llista d\'aplicacions recents.</string>
|
||||
<string name="dnkm_xiaomi_button">Protegeix Briar</string>
|
||||
<string name="dnkm_xiaomi_help">Si Briar no està blocat a la llista d\'aplicacions recents, no podrà executar-se en segon pla.</string>
|
||||
<string name="dnkm_xiaomi_dialog_body_old">1. Obriu la llista d\'aplicacions recents (de canvi d\'aplicació)\n\n2. Desplaceu avall la icona de Briar per mostrar la icona del cadenat\n\n3. Si el cadenat és obert, premeu per tancar-lo.</string>
|
||||
<string name="dnkm_xiaomi_dialog_body_new">1. Obriu la llista d\'aplicacions recents (canvi d\'aplicació)\n\n2. Premeu la icona de Briar fins que es mostra la icona del cadenat\n\n3. Si el cadenat és obert, premeu per tancar-lo.</string>
|
||||
<string name="dnkm_warning_dozed">%s no s\'ha pogut executar en segon pla</string>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!--Setup-->
|
||||
<string name="setup_title">Benvingut a Briar</string>
|
||||
<string name="setup_name_explanation">El vostre sobrenom etiquetarà tot el que publiqueu. Després de crear el compte ja no podreu canviar el sobrenom.</string>
|
||||
<string name="setup_next">Següent</string>
|
||||
<string name="setup_password_intro">Establiu una contrasenya</string>
|
||||
<string name="setup_password_explanation">El compte de Briar s\'emmagatzema xifrat en el vostre dispositiu, no en el núvol. Si oblideu la contrasenya o desinstal·leu Briar no podreu recuperar el vostre compte ni les dades associades.\n\nTrieu una contrasenya llarga que sigui difícil d\'endevinar, com ara quatre paraules aleatòries o deu lletres, números i símbols aleatoris.</string>
|
||||
<string name="dnkm_doze_intro">Per rebre missatges Briar necessita estar connectat en segon pla.</string>
|
||||
<string name="dnkm_doze_explanation">Per rebre missatges Briar necessita estar connectat en segon pla. Desactiveu les optimitzacions de la bateria per permetre que Briar resti sempre connectat.</string>
|
||||
<string name="choose_nickname">Trieu el sobrenom</string>
|
||||
<string name="choose_password">Trieu la contrasenya</string>
|
||||
<string name="confirm_password">Confirmeu la contrasenya</string>
|
||||
<string name="name_too_long">El nom és massa llarg</string>
|
||||
<string name="password_too_weak">La contrasenya és massa feble</string>
|
||||
<string name="passwords_do_not_match">Les contrasenyes no coincideixen</string>
|
||||
<string name="create_account_button">Crea el compte</string>
|
||||
<string name="more_info">Més informació</string>
|
||||
<string name="don_t_ask_again">No tornis a preguntar-ho</string>
|
||||
<string name="dnkm_huawei_protected_text">Feu un toc sobre el botó següent i assegureu-vos de que Briar consta com a protegit a la pantalla «Aplicacions protegides».</string>
|
||||
<string name="dnkm_huawei_protected_button">Protegeix Briar</string>
|
||||
<string name="dnkm_huawei_protected_help">Si no afegiu Briar a la llista d\'aplicacions protegides, s\'evitarà que Briar s\'executi en segon pla.</string>
|
||||
<string name="dnkm_huawei_app_launch_text">Premeu el botó, obriu la pantalla «Llença app» i assegureu-vos que Briar està configurat com «Gestiona a ma».</string>
|
||||
<string name="dnkm_huawei_app_launch_help">Si Briar no està configurat com a «Gestiona manualment» a la pantalla «Llença app», no podrà executar-se en segon pla.</string>
|
||||
<string name="dnkm_xiaomi_text">Per executar-se en segon pla, Briar necessita ser blocat en la llista d\'aplicacions recents.</string>
|
||||
<string name="dnkm_xiaomi_button">Protegeix Briar</string>
|
||||
<string name="dnkm_xiaomi_help">Si Briar no està blocat a la llista d\'aplicacions recents, no podrà executar-se en segon pla.</string>
|
||||
<string name="dnkm_xiaomi_dialog_body_old">1. Obriu la llista d\'aplicacions recents (de canvi d\'aplicació)\n\n2. Desplaceu avall la icona de Briar per mostrar la icona del cadenat\n\n3. Si el cadenat és obert, premeu per tancar-lo.</string>
|
||||
<string name="dnkm_xiaomi_dialog_body_new">1. Obriu la llista d\'aplicacions recents (també anomenada commutador d\'aplicacions)\n\n2. Si el Briar té una petita imatge d\'un cadenat al costat del seu nom, no cal que feu res\n\n3. Si no hi ha cadenat, manteniu premuda la imatge de Briar fins que aparegui el botó del cadenat i, a continuació, toqueu-lo</string>
|
||||
<string name="dnkm_xiaomi_lock_apps_text">Toqueu el botó següent per obrir la configuració de seguretat. Toqueu «Augmenta la velocitat» i, a continuació, toqueu «Bloca aplicacions» i assegureu-vos que el Briar estigui configurat a \"Blocat\".</string>
|
||||
<string name="dnkm_xiaomi_lock_apps_help">Si el Briar no està configurat com a «Blocat» a la pantalla «Bloca aplicacions», no es podrà executar en segon pla.</string>
|
||||
<string name="dnkm_warning_dozed_1">El Briar no va poder executar-se en segon pla</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Contrasenya</string>
|
||||
<string name="try_again">La contrasenya és incorrecta, torneu a escriure-la</string>
|
||||
@@ -41,14 +40,25 @@
|
||||
<string name="dialog_title_lost_password">Contrasenya perduda</string>
|
||||
<string name="dialog_message_lost_password">El vostre compte de Briar s\'emmagatzema només en el vostre dispositiu i xifrat. La contrasenya, doncs, no es pot restablir. Voleu esborrar el compte i crear-ne un de nou?\n\nAtenció! Si esborreu el compte la vostra identitat, els contactes i els missatges antics es perdran per sempre.</string>
|
||||
<string name="startup_failed_activity_title">Error iniciant Briar</string>
|
||||
<string name="startup_failed_clock_error">El Briar no s\'ha pogut iniciar perquè l\'hora del dispositiu és incorrecte.\n\nConfigureu l\'hora del dispositiu correctament i torneu-ho a provar.</string>
|
||||
<string name="startup_failed_db_error">El Briar no ha pogut obrir la base de dades que conté el vostre compte, els vostres contactes i els vostres missatges.\n\nActualitzeu a la darrera versió de l\'aplicació i torneu-ho a provar, o configureu un compte nou seleccionant «He oblidat la meva contrasenya» a la sol·licitud de contrasenya.</string>
|
||||
<string name="startup_failed_data_too_old_error">El vostre compte s\'ha creat amb una versió antiga d\'aquesta aplicació i no es pot obrir amb aquesta versió.\n\nHeu de tornar a instal·lar la versió antiga o configurar un compte nou escollint «He oblidat la meva contrasenya» a la sol·licitud de contrasenya.</string>
|
||||
<string name="startup_failed_data_too_new_error">El vostre compte s\'ha creat amb una versió més recent d\'aquesta aplicació i no es pot obrir amb aquesta versió.\n\nActualitzeu a la versió més recent i torneu-ho a provar.</string>
|
||||
<string name="startup_failed_service_error">El Briar no ha pogut iniciar un component necessari.\n\nActualitzeu l\'aplicació a la darrera versió i torna-ho a provar.</string>
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="one">Aquesta és una versió de prova de Briar. El vostre compte expira en %d dia i no es pot renovar.</item>
|
||||
<item quantity="other">Aquesta és una versió de prova de Briar. El vostre compte caducarà en %d dies i no es podrà renovar.</item>
|
||||
</plurals>
|
||||
<plurals name="old_android_expiry_warning">
|
||||
<item quantity="one">L\'Android 4 ja no és compatible. El Briar deixarà de funcionar a %s (d\'aquí a %d dia). Instal·leu el Briar en un dispositiu més nou i creeu un compte nou.</item>
|
||||
<item quantity="other">L\'Android 4 ja no és compatible. El Briar deixarà de funcionar a %s (d\'aquí a %d dies). Instal·leu el Briar en un dispositiu més nou i creeu un compte nou.</item>
|
||||
</plurals>
|
||||
<string name="expiry_date_reached">Aquesta versió de Briar ha caducat.\nGràcies per haver-lo provat!</string>
|
||||
<string name="download_briar">Per continuar utilitzant Briar, baixeu la darrera versió.</string>
|
||||
<string name="create_new_account">Haureu de crear un compte nou, però podeu utilitzar el mateix sobrenom.</string>
|
||||
<string name="download_briar_button">Descarrega la darrera versió</string>
|
||||
<string name="old_android_expiry_date_reached">El Briar ja no funciona amb l\'Android 4.\nInstal·leu el Briar en un dispositiu més nou.</string>
|
||||
<string name="old_android_delete_account">Podeu tocar el botó següent per suprimir el vostre compte d\'aquest dispositiu.</string>
|
||||
<string name="delete_account_button">Esborreu el compte</string>
|
||||
<string name="startup_open_database">S\'està desxifrant la base de dades...</string>
|
||||
<string name="startup_migrate_database">S\'està actualitzant la base de dades...</string>
|
||||
@@ -145,6 +155,7 @@
|
||||
<string name="error_start_activity">No està disponible en el vostre sistema</string>
|
||||
<string name="status_heading">Estat</string>
|
||||
<string name="error">Error</string>
|
||||
<string name="info">Informació</string>
|
||||
<!--Contacts and Private Conversations-->
|
||||
<string name="no_contacts">No hi ha cap contacte per mostrar</string>
|
||||
<string name="no_contacts_action">Toqueu la icona + per afegir un contacte</string>
|
||||
@@ -216,6 +227,7 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="menu_contact">Contacte</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">Afegeix un contacte proper</string>
|
||||
<string name="add_contact_error_two_way">Tots dos heu escanejat el codi QR de l\'altre?</string>
|
||||
<string name="face_to_face">Heu de coincidir en el mateix lloc amb la persona que voleu afegir com a contacte.\n\nD\'aquesta manera evitareu que algú suplanti les vostres identitats o pugui llegir els vostres missatges en el futur.</string>
|
||||
<string name="continue_button">Continua</string>
|
||||
<string name="try_again_button">Torna-ho a provar</string>
|
||||
@@ -224,13 +236,16 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="contact_added_toast">S\'ha afegit el contacte %s</string>
|
||||
<string name="contact_already_exists">El contacte %s ja existia</string>
|
||||
<string name="qr_code_invalid">El codi QR és invàlid</string>
|
||||
<string name="qr_code_too_old">El codi QR que heu escanejat prové d\'una versió antiga de %s.\n\nDemaneu al vostre contacte que l\'actualitzi i torneu a provar-ho.</string>
|
||||
<string name="qr_code_too_new">El codi QR que heu escanejat prové d\'una versió de %s més nova que la vostra.\n\nActualitzeu la vostra aplicació i torneu a provar-ho.</string>
|
||||
<string name="qr_code_too_old_1">El codi QR que heu escanejat prové d\'una versió anterior del Briar.\n\nDemaneu al vostre contacte que actualitzi a la versió més recent i, a continuació, torneu-ho a provar.</string>
|
||||
<string name="qr_code_too_new_1">El codi QR que heu escanejat prové d\'una versió més recent del Briar.\n\nActualitzeu a la darrera versió i torneu-ho a provar.</string>
|
||||
<string name="mailbox_qr_code_for_contact">El codi QR que heu escanejat prové del Briar Mailbox.\n\nSi voleu enllaçar una bústia de correu, seleccioneu Configuració > Bústia del menú Briar.</string>
|
||||
<string name="qr_code_format_unknown">El codi QR que heu escanejat no serveix per afegir un contacte del Briar.\n\nEscanejeu el codi QR que es mostra a la pantalla del vostre contacte.</string>
|
||||
<string name="camera_error">Error de la càmera</string>
|
||||
<string name="connecting_to_device">Connectant-se al dispositiu\u2026</string>
|
||||
<string name="authenticating_with_device">Autenticant-se amb el dispositiu\u2026</string>
|
||||
<string name="connection_error_title">No ha pogut connectar-se al vostre contacte</string>
|
||||
<string name="connection_error_feedback">Si aquest problema persisteix, <a href="feedback">envieu-nos un comentari</a> per ajudar-nos a millorar l\'aplicació.</string>
|
||||
<string name="info_both_must_scan">Tots dos heu d\'escanejar el codi QR de l\'altre</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">Afegeix un contacte llunyà</string>
|
||||
<string name="add_contact_nearby_title">Afegeix un contacte proper</string>
|
||||
@@ -277,6 +292,7 @@ Així que l\'actualitzi li veureu una icona diferent .</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_contact">Ja teniu un contacte amb aquest enllaç: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%1$s i %2$s són la mateixa persona?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -285,10 +301,17 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
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-->
|
||||
<string name="different_person_button">Persones diferents</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s i %2$s us han enviat el mateix enllaç.\n\nÉs possible que un d\'ells estigui intentant descobrir qui són els teus contactes.\n\nNo els diguis que has rebut el mateix enllaç d\'una altra persona.</string>
|
||||
<string name="pending_contact_updated_toast">S\'ha actualitzat la sol·licitud de contacte pendent</string>
|
||||
<string name="info_both_must_enter_links">Tots dos heu d\'afegir l\'enllaç de l\'altre</string>
|
||||
<!--Peer trust levels-->
|
||||
<string name="peer_trust_level_unverified">Contacte no verificat</string>
|
||||
<string name="peer_trust_level_verified">Contacte verificat</string>
|
||||
<string name="peer_trust_level_ourselves">Jo</string>
|
||||
<string name="peer_trust_level_stranger">Estrany</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Presenteu als vostres contactes</string>
|
||||
<string name="introduction_onboarding_text">Podeu presentar als vostres contactes entre si, de manera que no necessitin trobar-se en persona per a relacionar-se a través de Briar.</string>
|
||||
<string name="introduction_onboarding_text">Presenteu els vostres contactes entre ells perquè es puguin connectar al Briar.</string>
|
||||
<string name="introduction_menu_item">Presenta-li un altre contacte</string>
|
||||
<string name="introduction_activity_title">Trieu un contacte</string>
|
||||
<string name="introduction_not_possible">Ja teniu una presentació en marxa entre aquests contactes. Si us plau, primer deixeu que aquesta presentació acabi. Si vós o els contactes presentats sovint esteu desconnectats, la presentació pot trigar temps.</string>
|
||||
@@ -311,9 +334,14 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<!--Connect via Bluetooth-->
|
||||
<string name="menu_item_connect_via_bluetooth">Connecta via bluetooth</string>
|
||||
<string name="connect_via_bluetooth_title">Connecta via bluetooth</string>
|
||||
<string name="connect_via_bluetooth_intro">En cas que les connexions Bluetooth no funcionin automàticament, podeu utilitzar aquesta pantalla per connectar-vos manualment.\n\nEl vostre contacte ha d\'estar a prop perquè això funcioni.\n\nVós i el vostre contacte hauríeu de prémer «Inicia» alhora.</string>
|
||||
<string name="connect_via_bluetooth_already_discovering">Ja s\'està provant de connectar-se mitjançant Bluetooth. Torneu-ho a provar més tard.</string>
|
||||
<string name="connect_via_bluetooth_no_location_permission">No es pot continuar sense permís per obtenir la posició.</string>
|
||||
<string name="connect_via_bluetooth_no_bluetooth_permission">No es pot continuar sense el permís de dispositius propers</string>
|
||||
<string name="connect_via_bluetooth_start">Connectant-se via Bluetooth...</string>
|
||||
<string name="connect_via_bluetooth_success">S\'ha connectat via Bluetooth.</string>
|
||||
<string name="connect_via_bluetooth_error">No s\'ha pogut connectar mitjançant Bluetooth.</string>
|
||||
<string name="connect_via_bluetooth_error_not_supported">El Bluetooth no és compatible amb el dispositiu.</string>
|
||||
<!--Private Groups-->
|
||||
<string name="groups_list_empty">No hi ha cap grup per mostrar</string>
|
||||
<string name="groups_list_empty_action">Toqueu la icona + per crear un grup o demaneu als vostres contactes que us afegeixin als seus grups</string>
|
||||
@@ -406,6 +434,10 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="forum_declined_toast">Heu refusat la invitació</string>
|
||||
<string name="shared_by_format">Compartit per %s</string>
|
||||
<string name="forum_invitation_already_sharing">Ja l\'esteu compartint</string>
|
||||
<string name="forum_invitation_already_invited">La invitació ja s\'ha enviat</string>
|
||||
<string name="forum_invitation_invite_received">La invitació ja s\'ha rebut</string>
|
||||
<string name="forum_invitation_not_supported">Aquest contacte no és compatible</string>
|
||||
<string name="forum_invitation_error">Això és un error i no és culpa vostre</string>
|
||||
<string name="forum_invitation_response_accepted_sent">Heu acceptat la invitació al fòrum enviada per %s.</string>
|
||||
<string name="forum_invitation_response_declined_sent">Heu refusat la invitació al fòrum enviada per %s.</string>
|
||||
<string name="forum_invitation_response_declined_auto">La invitació al blog de %s s\'ha declinat automàticament.</string>
|
||||
@@ -560,11 +592,104 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="choose_ringtone_title">Trieu el so d\'avís</string>
|
||||
<string name="cannot_load_ringtone">No s\'ha pogut carregar el so d\'avís</string>
|
||||
<!--Mailbox-->
|
||||
<string name="mailbox_setup_connecting">S\'està connectant...</string>
|
||||
<string name="mailbox_settings_title">Bústia</string>
|
||||
<string name="mailbox_setup_title">Configuració de la bústia</string>
|
||||
<string name="mailbox_setup_intro">Una bústia permet als vostres contactes enviar-vos missatges mentre esteu fora de línia. La bústia rebrà els vostres missatges i els emmagatzemarà fins que us connecteu.\n
|
||||
\nPodeu instal·lar l\'aplicació Briar Mailbox en un dispositiu de recanvi. Mantingueu-lo connectat a l\'alimentació i a la Wi-Fi perquè estigui sempre en línia.</string>
|
||||
<string name="mailbox_setup_download">Primer, instal·leu l\'aplicació Mailbox en un altre dispositiu cercant «Briar Mailbox» a Google Play o allà on hageu baixat el Briar.\n
|
||||
\nA continuació, enllaceu la vostra bústia amb Briar escanejant el codi QR que mostra l\'aplicació Mailbox.</string>
|
||||
<string name="mailbox_setup_download_link">Comparteix l\'enllaç de baixada</string>
|
||||
<string name="mailbox_setup_button_scan">Escaneja el codi QR de la bústia</string>
|
||||
<string name="permission_camera_qr_denied_body">Heu denegat l\'accés a la càmera, però per escanejar un codi QR cal utilitzar-la.\n\nConsidereu concedir l\'accés.</string>
|
||||
<string name="mailbox_setup_connecting">S\'està connectant a la bústia...</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_connecting_info">Això pot trigar fins a %1s</string>
|
||||
<string name="mailbox_qr_code_too_old">El codi QR que heu escanejat prové d\'una versió anterior del Briar Mailbox.\n\nActualitzeu el Briar Mailbox a la darrera versió i torneu-ho a provar.</string>
|
||||
<string name="mailbox_qr_code_too_new">El codi QR que heu escanejat prové d\'una versió més recent de Briar Mailbox.\n\nActualitzeu el Briar a la darrera versió i torneu-ho a provar.</string>
|
||||
<string name="contact_qr_code_for_mailbox">El codi QR que heu escanejat serveix per afegir un contacte del Briar.\n\nSi voleu afegir un contacte, aneu a la llista de contactes i toqueu la icona +.</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">El codi QR que heu escanejat no prové del Briar Mailbox.\n\nObriu l\'aplicació Briar Mailbox al dispositiu Mailbox i escanegeu el codi QR que hi apareix.</string>
|
||||
<string name="mailbox_setup_already_paired_title">La bústia ja està enllaçada</string>
|
||||
<string name="mailbox_setup_already_paired_description">Desenllaceu la bústia de l\'altre dispositiu i torneu-ho a provar.</string>
|
||||
<string name="mailbox_setup_io_error_title">No s\'ha pogut connectar</string>
|
||||
<string name="mailbox_setup_io_error_description">Assegureu-vos que tots dos dispositius estiguin connectats a Internet i torneu-ho a provar.</string>
|
||||
<string name="mailbox_setup_assertion_error_title">Error de bústia</string>
|
||||
<string name="mailbox_setup_assertion_error_description">Envieu comentaris (amb dades anònimes) mitjançant l\'aplicació Briar si el problema persisteix.</string>
|
||||
<string name="mailbox_setup_camera_error_description">No s\'ha pogut accedir a la càmera. Torneu-ho a provar després de reiniciar el dispositiu.</string>
|
||||
<string name="mailbox_setup_paired_title">Connectat</string>
|
||||
<string name="mailbox_setup_paired_description">La vostra bústia s\'ha enllaçat correctament amb el Briar.\n
|
||||
\nMantingueu la vostra bústia connectada a l\'alimentació i a la Wi-Fi perquè estigui sempre en línia.</string>
|
||||
<string name="tor_offline_title">Fora de línia</string>
|
||||
<string name="tor_offline_description">Assegureu-vos que aquest dispositiu estigui en línia i que es permeten les connexions a Internet.\n
|
||||
\nDesprés, espereu que la icona del globus terraqüi a la pantalla de configuració de connexió es torni verda.</string>
|
||||
<string name="tor_offline_button_check">Comproveu la configuració de la connexió</string>
|
||||
<string name="mailbox_status_title">Estat de la bústia</string>
|
||||
<string name="mailbox_status_connected_title">La bústia s\'està executant</string>
|
||||
<string name="mailbox_status_problem_title">El Briar té problemes per connectar-se a la bústia</string>
|
||||
<string name="mailbox_status_failure_title">La bústia no està disponible</string>
|
||||
<string name="mailbox_status_app_too_old_title">En Briar és massa antic</string>
|
||||
<string name="mailbox_status_app_too_old_message">Actualitzeu el Briar a la darrera versió i torneu-ho a provar.</string>
|
||||
<string name="mailbox_status_mailbox_too_old_title">La bústia és massa antiga</string>
|
||||
<string name="mailbox_status_mailbox_too_old_message">Actualitza la vostra bústia a la darrera versió i torneu-ho a provar.</string>
|
||||
<string name="mailbox_status_check_button">Comprova la connexió</string>
|
||||
<!--Example for string substitution: Last connection: 3min ago-->
|
||||
<string name="mailbox_status_connected_info">Última connexió: %s</string>
|
||||
<!--Indicates that there never was a connection to the mailbox. Last connection: Never-->
|
||||
<string name="mailbox_status_connected_never">Mai</string>
|
||||
<string name="mailbox_status_unlink_button">Desenllaça</string>
|
||||
<string name="mailbox_status_unlink_dialog_title">Voleu desenllaçar la bústia?</string>
|
||||
<string name="mailbox_status_unlink_dialog_question">Esteu segur que voleu desenllaçar la vostra bústia?</string>
|
||||
<string name="mailbox_status_unlink_dialog_warning">Si desenllaçeu la vostra bústia no podreu rebre missatges mentre el Briar estigui fora de línia.</string>
|
||||
<string name="mailbox_status_unlink_no_wipe_title">La vostra bústia s\'ha desenllaçat</string>
|
||||
<string name="mailbox_status_unlink_no_wipe_message">La propera vegada que tingueu accés al vostre dispositiu Mailbox, obriu l\'aplicació Mailbox i toqueu el botó «Desenllaça» per completar el procés.\n\nSi ja no teniu accés al dispositiu Mailbox, no us preocupeu. Les vostres dades estan xifrades, de manera que es mantindran segures encara que no completeu el procés.</string>
|
||||
<string name="mailbox_status_unlink_success">La vostra bústia s\'ha desenllaçat</string>
|
||||
<string name="mailbox_error_notification_channel_title">Problema amb la bústia Briar</string>
|
||||
<string name="mailbox_error_notification_title">La bústia Briar no està disponible</string>
|
||||
<string name="mailbox_error_notification_text">Toqueu per solucionar el problema.</string>
|
||||
<string name="mailbox_error_wizard_button">Soluciona el problema</string>
|
||||
<string name="mailbox_error_wizard_title">Assistent per a la resolució de problemes de la bústia</string>
|
||||
<string name="mailbox_error_wizard_question1">Teniu accés al vostre dispositiu Mailbox?</string>
|
||||
<string name="mailbox_error_wizard_answer1">Sí, hi tinc accés ara mateix.</string>
|
||||
<string name="mailbox_error_wizard_answer2">Ara mateix no, però hi puc accedir més tard.</string>
|
||||
<string name="mailbox_error_wizard_answer3">No, ja no hi tinc accés.</string>
|
||||
<string name="mailbox_error_wizard_info1_1">Comproveu que el dispositiu Mailbox estigui encès i connectat a Internet.</string>
|
||||
<string name="mailbox_error_wizard_question1_1">Obriu l\'aplicació Mailbox. Què veus?</string>
|
||||
<string name="mailbox_error_wizard_answer1_1">Veig instruccions per configurar la bústia</string>
|
||||
<string name="mailbox_error_wizard_answer1_2">Veig un codi QR</string>
|
||||
<string name="mailbox_error_wizard_answer1_3">Veig «El Mailbox s\'està executant»</string>
|
||||
<string name="mailbox_error_wizard_answer1_4">Veig «Dispositiu fora de línia»</string>
|
||||
<string name="mailbox_error_wizard_info1_1_1">Desenllaceu la vostra bústia mitjançant el botó següent i, a continuació, seguiu les instruccions del dispositiu Mailbox per enllaçar-la de nou.</string>
|
||||
<string name="mailbox_error_wizard_info_1_1_2">Desenllaceu la bústia amb el botó següent i escanegeu el codi QR per tornar-la a enllaçar.</string>
|
||||
<string name="mailbox_error_wizard_info1_1_3">Feu servir el botó següent per comprovar la connexió entre Briar i el Mailbox.\n\n
|
||||
Si la connexió torna a fallar:\n
|
||||
\u2022 Comproveu que les aplicacions Mailbox i Briar estiguin actualitzades a la darrera versió.\n
|
||||
\u2022 Reinicieu els vostres dispositius Mailbox i Briar i torneu-ho a provar.</string>
|
||||
<string name="mailbox_error_wizard_info1_1_4">Comproveu que el dispositiu Mailbox estigui connectat correctament a Internet.\n\nComproveu que l\'hora, data i zona horària del dispositiu Mailbox siguin correctes.\n\nComproveu que les aplicacions Mailbox i Briar estiguin actualitzades a la darrera versió.\ n\nReinicieu els vostres dispositius Mailbox i Briar i torneu-ho a provar.</string>
|
||||
<string name="mailbox_error_wizard_info2">Torneu a aquesta pantalla quan tingueu accés al dispositiu.</string>
|
||||
<string name="mailbox_error_wizard_info3">Desenllaceu la vostra bústia amb el botó següent.\n\nDesprés de desenllaçar la vostra bústia antiga, podeu configurar una bústia nova en qualsevol moment.</string>
|
||||
<!--About-->
|
||||
<string name="about_title">Quant a</string>
|
||||
<string name="briar_version">Versió del Briar: %s</string>
|
||||
<string name="tor_version">Versió del Tor: %s</string>
|
||||
<string name="links">Enllaços</string>
|
||||
<string name="briar_website">\u2022 <a href="">Lloc web</a></string>
|
||||
<string name="briar_source_code">\u2022 <a href="">Codi font</a></string>
|
||||
<string name="briar_changelog">\u2022 <a href="">Registre de canvis</a></string>
|
||||
<string name="briar_privacy_policy">\u2022 <a href="">Política de privadesa</a></string>
|
||||
<!--Here translators can add their names or Transifex usernames(eg "Thanks to all the contributors at the Localization Lab, especially Tom, Matthew and Jerry")-->
|
||||
<string name="translator_thanks">Gràcies a tots els col·laboradors del Localization Lab, especialment a Jaime Muñoz</string>
|
||||
<!--Conversation Settings-->
|
||||
<string name="disappearing_messages_title">Missatges efímers</string>
|
||||
<string name="disappearing_messages_explanation_long">Si activeu aquesta configuració, es crearà un/a nou/va
|
||||
els missatges d\'aquesta conversa desapareixen automàticament al cap de 7\u00A0dies.
|
||||
\n\nEl compte enrere per a la còpia del missatge del remitent comença després d\'haver estat lliurat.
|
||||
El compte enrere comença per al destinatari després que hagi llegit el missatge.
|
||||
\n\nEls missatges que desapareixeran estan marcats amb una icona de bomba.
|
||||
\n\nTingues en compte que els destinataris encara poden fer còpies dels missatges que envieu.
|
||||
\n\nSi canvieu aquesta configuració, s\'aplicarà als vostres missatges nous immediatament i als vostres
|
||||
missatges del contacte un cop rebin el vostre següent missatge.
|
||||
El vostre contacte també pot canviar aquesta configuració per a tots dos.</string>
|
||||
<string name="learn_more">Més informació</string>
|
||||
<string name="disappearing_messages_summary">Feu que els missatges futurs d\'aquesta conversa desapareguin automàticament al cap de 7\u00A0dies.</string>
|
||||
<!--Settings Actions-->
|
||||
<string name="pref_category_actions">Accions</string>
|
||||
<string name="send_feedback">Envieu comentaris</string>
|
||||
@@ -575,6 +700,7 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="link_warning_open_link">Obre l\'enllaç</string>
|
||||
<!--Crash Reporter-->
|
||||
<string name="crash_report_title">Informe de fallida de Briar</string>
|
||||
<string name="briar_crashed">El Briar ha fallat</string>
|
||||
<string name="not_your_fault">Això no és culpa vostra.</string>
|
||||
<string name="please_send_report">Ajudi\'ns a construir un Briar millor enviant-nos un informe de fallida.</string>
|
||||
<string name="report_is_encrypted">Us garantim que l\'informe es xifra i s\'envia de manera segura.</string>
|
||||
@@ -582,19 +708,35 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="describe_crash">Descriviu el que hi ha succeït (opcional)</string>
|
||||
<string name="enter_feedback">Escriviu els vostres comentaris</string>
|
||||
<string name="optional_contact_email">La vostra adreça de correu (opcional)</string>
|
||||
<string name="privacy_policy">En enviar-nos dades, accepteu la nostra <a href="">política de privadesa</a></string>
|
||||
<string name="include_debug_report_crash">Inclou dades anònimes sobre la fallida</string>
|
||||
<string name="include_debug_report_feedback">Inclou dades anònimes sobre el dispositiu</string>
|
||||
<string name="dev_report_user_info">Informació de l\'usuari</string>
|
||||
<string name="dev_report_basic_info">Informació bàsica</string>
|
||||
<string name="dev_report_device_info">Informació del dispositiu</string>
|
||||
<string name="dev_report_stacktrace">Traça de la pila</string>
|
||||
<string name="dev_report_time_info">Informació del temps</string>
|
||||
<string name="dev_report_memory">Memòria</string>
|
||||
<string name="dev_report_storage">Emmagatzematge</string>
|
||||
<string name="dev_report_connectivity">Connectivitat</string>
|
||||
<string name="dev_report_network_usage">Ús de la xarxa</string>
|
||||
<string name="dev_report_build_config">Configuració de la compilació</string>
|
||||
<string name="dev_report_logcat">Registre de l\'aplicació</string>
|
||||
<string name="dev_report_device_features">Característiques del dispositiu</string>
|
||||
<string name="send_report">Envia l\'informe</string>
|
||||
<string name="close">Tanca</string>
|
||||
<string name="dev_report_sending">S\'està enviant els comentaris...</string>
|
||||
<string name="dev_report_sent">Comentaris enviats</string>
|
||||
<string name="dev_report_saved">S\'ha desat l\'informe. Se us enviarà la propera vegada que inicieu sessió a Briar.</string>
|
||||
<string name="dev_report_error">Error: no s\'ha pogut enviar l\'informe</string>
|
||||
<!--Sign Out-->
|
||||
<string name="progress_title_logout">S\'està tancant la sessió de Briar...</string>
|
||||
<!--Screen Filters & Tapjacking-->
|
||||
<string name="screen_filter_title">S\'ha detectat superposició de la pantalla</string>
|
||||
<string name="screen_filter_body">Una altra aplicació es troba damunt de Briar. Per protegir la vostra seguretat, Briar no respondrà a les pulsacions quan una altra aplicació s\'hi hagi sobreposat.\n\nLes següents aplicacions poden estar sobreposades a Briar:\n\n%1$s</string>
|
||||
<string name="screen_filter_body_api_30">Una altra aplicació està dibuixant a sobre del Briar. Per protegir la vostra seguretat, el Briar no respondrà als tocs quan hi hagi una altra aplicació dibuixant a sobre.\n\nReviseu les aplicacions a continuació per trobar l\'aplicació responsable.</string>
|
||||
<string name="screen_filter_allow">Permet que aquestes aplicacions se sobreposin a Briar</string>
|
||||
<string name="screen_filter_review_apps">Revisa les aplicacions</string>
|
||||
<!--Permission Requests-->
|
||||
<string name="permission_camera_title">Permís de la càmera</string>
|
||||
<string name="permission_camera_request_body">Per escanejar el codi QR, Briar necessita accedir a la càmera.</string>
|
||||
@@ -602,7 +744,17 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="permission_location_request_body">Per a descobrir dispositius Bluetooth, Briar necessita accedir a la vostra posició.\n\nBriar no guarda la vostra posició ni la comparteix amb ningú.</string>
|
||||
<string name="permission_camera_location_title">Permís d\'accés a la càmera i a la posició</string>
|
||||
<string name="permission_camera_location_request_body">Per escanejar el codi QR, Briar necessita accedir a la càmera.\n\nPer trobar dispositius Bluetooth, Briar necessita accedir a la vostra posició.\n\nBriar no guarda la vostra posició ni la comparteix amb ningú.</string>
|
||||
<string name="permission_camera_bluetooth_title">Càmera i dispositius propers</string>
|
||||
<string name="permission_camera_bluetooth_request_body">Per escanejar el codi QR, el Briar necessita accedir a la càmera.\n\nPer descobrir dispositius Bluetooth, el Briar necessita permís per trobar i connectar-se a dispositius propers.</string>
|
||||
<string name="permission_camera_denied_body">Heu denegat l\'accés a la càmera però per afegir contactes cal utilitzar la càmera.\n\nRecomanem que permeteu l\'accés a la càmera.</string>
|
||||
<string name="permission_location_denied_body">Heu denegat l\'accés a la vostra ubicació, però el Briar necessita aquest permís per descobrir dispositius Bluetooth.\n\nPenseu en concedir l\'accés.</string>
|
||||
<string name="permission_location_setting_title">Configuració d\'ubicació</string>
|
||||
<string name="permission_location_setting_body">La configuració d\'ubicació del dispositiu ha d\'estar activada per trobar altres dispositius mitjançant Bluetooth. Activeu la ubicació per continuar. Podeu tornar a desactivar-lo després.</string>
|
||||
<string name="permission_location_setting_hotspot_body">La configuració d\'ubicació del dispositiu s\'ha d\'activar per crear un punt d\'accés Wi-Fi. Activeu la ubicació per continuar. Podeu tornar a desactivar-lo després.</string>
|
||||
<string name="permission_location_setting_button">Activa la ubicació</string>
|
||||
<string name="permission_bluetooth_title">Permís de dispositius propers</string>
|
||||
<string name="permission_bluetooth_body">Per utilitzar la comunicació Bluetooth, el Briar necessita permís per trobar i connectar-se a dispositius propers.</string>
|
||||
<string name="permission_bluetooth_denied_body">Heu denegat l\'accés als dispositius propers, però el Briar necessita aquest permís per utilitzar Bluetooth.\n\nPenseu en concedir l\'accés.</string>
|
||||
<string name="qr_code">Codi QR</string>
|
||||
<string name="show_qr_code_fullscreen">Mostra el codi QR a pantalla completa</string>
|
||||
<!--App Locking-->
|
||||
@@ -615,17 +767,92 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<!--Connections Screen-->
|
||||
<string name="transports_help_text">Briar pot contactar els vostres contactes via Internet, WiFi o Bluetooth.\n\nTotes les connexions d\'Internet van via la xarxa Tor per privacitat.\n\nSi es pot arribar a un contacte per diversos mètodes, Briar els usa tots simultàniament.</string>
|
||||
<!--Share app offline-->
|
||||
<string name="hotspot_title">Comparteix aquesta aplicació fora de línia</string>
|
||||
<string name="hotspot_intro">Compartiu aquesta aplicació amb algú proper sense connexió a Internet mitjançant la Wi-Fi del telèfon.
|
||||
\n\nEl vostre telèfon iniciarà un punt d\'accés Wi-Fi. Les persones properes poden connectar-se al punt d\'accés i baixar l\'aplicació Briar des del telèfon.</string>
|
||||
<string name="hotspot_button_start_sharing">Inicia el punt d\'accés</string>
|
||||
<string name="hotspot_button_stop_sharing">Atura el punt d\'accés</string>
|
||||
<string name="hotspot_progress_text_start">S\'està configurant el punt d\'accés...</string>
|
||||
<string name="hotspot_notification_channel_title">Punt d\'accés Wi-Fi</string>
|
||||
<string name="hotspot_notification_title">Compartint el Briar fora de línia</string>
|
||||
<string name="hotspot_button_connected">Endavant</string>
|
||||
<string name="permission_hotspot_location_request_body">Per crear un punt d\'accés Wi-Fi, el Briar necessita permís per accedir a la vostra ubicació.\n\nel Briar no emmagatzema la vostra ubicació ni la comparteix amb ningú.</string>
|
||||
<string name="permission_hotspot_location_request_precise_body">Per crear un punt d\'accés Wi-Fi, el Briar necessita permís per accedir a la vostra ubicació precisa.\n\nel Briar no emmagatzema la vostra ubicació ni la comparteix amb ningú.</string>
|
||||
<string name="permission_hotspot_location_denied_body">Heu denegat l\'accés a la vostra ubicació, però el Briar necessita aquest permís per crear un punt d\'accés Wi-Fi.\n\nPenseu en concedir l\'accés.</string>
|
||||
<string name="permission_hotspot_location_denied_precise_body">Heu denegat l\'accés a la vostra ubicació precisa, però el Briar necessita aquest permís per crear un punt d\'accés Wi-Fi.\n\nPenseu en concedir l\'accés.</string>
|
||||
<string name="wifi_settings_title">Configuració Wi-Fi</string>
|
||||
<string name="wifi_settings_request_enable_body">Per crear un punt d\'accés Wi-Fi, el Briar ha d\'utilitzar Wi-Fi. Activeu-lo.</string>
|
||||
<string name="hotspot_tab_manual">Manual</string>
|
||||
<!--The placeholder to be inserted into the string 'hotspot_manual_wifi': People can connect by %s-->
|
||||
<string name="hotspot_scanning_a_qr_code">escanejant un codi QR</string>
|
||||
<!--Wi-Fi setup-->
|
||||
<!--The %s placeholder will be replaced with the translation of 'hotspot_scanning_a_qr_code'-->
|
||||
<string name="hotspot_manual_wifi">El vostre telèfon proporciona un punt d\'accés Wi-Fi. Les persones que vulguin baixar el Briar es poden connectar al punt d\'accés afegint-lo a la configuració Wi-Fi del seu dispositiu mitjançant els detalls següents o mitjançant %s. Quan s\'hagin connectat al punt d\'accés, premeu «Següent».</string>
|
||||
<string name="hotspot_manual_wifi_ssid">Nom de la xarxa</string>
|
||||
<string name="hotspot_qr_wifi">El vostre telèfon proporciona un punt d\'accés Wi-Fi. Les persones que vulguin baixar el Briar poden connectar-se al punt d\'accés escanejant aquest codi QR. Quan s\'hagin connectat al punt d\'accés, premeu «Següent».</string>
|
||||
<string name="hotspot_no_peers_connected">No hi ha cap dispositiu connectat</string>
|
||||
<plurals name="hotspot_peers_connected">
|
||||
<item quantity="one">%s dispositiu connectat</item>
|
||||
<item quantity="other">%s dispositius connectats</item>
|
||||
</plurals>
|
||||
<!--Download link-->
|
||||
<!--The %s placeholder will be replaced with the translation of 'hotspot_scanning_a_qr_code'-->
|
||||
<string name="hotspot_manual_site">El vostre telèfon proporciona un punt d\'accés Wi-Fi. Les persones connectades al punt d\'accés poden baixar el Briar escrivint l\'enllaç següent en un navegador web o %s.</string>
|
||||
<string name="hotspot_manual_site_address">Adreça (URL)</string>
|
||||
<string name="hotspot_qr_site">El vostre telèfon proporciona una punt d\'accés Wi-Fi. Les persones connectades al punt d\'accés poden baixar el Briar escanejant aquest codi QR.</string>
|
||||
<!--e.g. Download Briar 1.2.20-->
|
||||
<string name="website_download_title_1">Baixa el Briar %s</string>
|
||||
<string name="website_download_intro_1">Algú a prop ha compartit el Briar amb vós.</string>
|
||||
<string name="website_download_button">Baixa el Briar</string>
|
||||
<string name="website_download_outro">Un cop finalitzada la baixada, obriu el fitxer baixat i instal·leu-lo.</string>
|
||||
<string name="website_troubleshooting_title">Detecció d\'errors</string>
|
||||
<string name="website_troubleshooting_1">Si no podeu baixar l\'aplicació, proveu amb un altre navegador web.</string>
|
||||
<string name="website_troubleshooting_2_old">Per instal·lar l\'aplicació baixada, és possible que hàgiu de permetre la instal·lació d\'aplicacions des de «Fonts desconegudes» a la configuració del sistema. Després, potser haureu de tornar a baixar l\'aplicació. Us recomanem que desactiveu la configuració «Fonts desconegudes» després d\'instal·lar l\'aplicació.</string>
|
||||
<string name="website_troubleshooting_2_new">Per instal·lar l\'aplicació baixada, potser haureu de permetre que el navegador instal·li aplicacions desconegudes. Després d\'instal·lar l\'aplicació, us recomanem que elimineu el permís del navegador per instal·lar aplicacions desconegudes.</string>
|
||||
<string name="hotspot_help_wifi_title">Problemes amb la connexió Wi-Fi:</string>
|
||||
<string name="hotspot_help_wifi_1">Proveu a desactivar i reactivar la Wi-Fi als dos telèfons i torneu-ho a provar.</string>
|
||||
<string name="hotspot_help_wifi_2">Si el vostre telèfon es queixa que la Wi-Fi no té Internet, digueu-li que voleu mantenir-vos connectat de totes maneres.</string>
|
||||
<string name="hotspot_help_wifi_3">Reinicieu el telèfon que executa el punt d\'accés Wi-Fi, inicieu el Briar i torneu a provar de compartir.</string>
|
||||
<string name="hotspot_help_site_title">Problemes per visitar el lloc web local:</string>
|
||||
<string name="hotspot_help_site_1">Torneu a comprovar que heu introduït l\'adreça exactament com es mostra. Un petit error pot fer que falli.</string>
|
||||
<string name="hotspot_help_site_2">Assegureu-vos que el vostre telèfon encara estigui connectat a la Wi-Fi correcta (vegeu més amunt) quan intenteu accedir al lloc.</string>
|
||||
<string name="hotspot_help_site_3">Si teniu un tallafoc, comproveu que no bloquegi l\'accés.</string>
|
||||
<string name="hotspot_help_site_4">Si podeu visitar el lloc, però no baixar l\'aplicació Briar, proveu-ho amb un navegador web diferent.</string>
|
||||
<string name="hotspot_help_fallback_title">No funciona res?</string>
|
||||
<string name="hotspot_help_fallback_intro">Podeu provar de desar l\'aplicació com a fitxer .apk per compartir-la d\'una altra manera. Un cop el fitxer s\'ha transferit a l\'altre dispositiu, es pot utilitzar per instal·lar el Briar.
|
||||
\n\nConsell: per compartir mitjançant Bluetooth, és possible que hàgiu de canviar el nom del fitxer perquè acabi amb .zip.</string>
|
||||
<string name="hotspot_help_fallback_button">Desa l\'aplicació</string>
|
||||
<!--error handling-->
|
||||
<string name="hotspot_error_intro">S\'ha produït un error en intentar compartir l\'aplicació mitjançant Wi-Fi:</string>
|
||||
<string name="hotspot_error_no_wifi_direct">El dispositiu no és compatible amb Wi-Fi Direct</string>
|
||||
<string name="hotspot_error_start_callback_failed">El punt d\'accés no s\'ha pogut iniciar: error %s</string>
|
||||
<string name="hotspot_error_start_callback_failed_unknown">El punt d\'accés no s\'ha pogut iniciar amb un error desconegut, motiu %d</string>
|
||||
<string name="hotspot_error_start_callback_no_group_info">El punt d\'accés no s\'ha pogut iniciar: no hi ha informació del grup</string>
|
||||
<string name="hotspot_error_web_server_start">S\'ha produït un error en iniciar el servidor web</string>
|
||||
<string name="hotspot_error_web_server_serve">S\'ha produït un error en presentar el lloc web.\n\nSi el problema persisteix, envieu comentaris (amb dades anònimes) mitjançant l\'aplicació Briar.</string>
|
||||
<string name="hotspot_flag_test">Avís: aquesta aplicació s\'ha instal·lat amb l\'Android Studio i NO es pot instal·lar en un altre dispositiu.</string>
|
||||
<string name="hotspot_error_framework_busy">No es pot iniciar el punt d\'accés.\n\nSi teniu un altre punt d\'accés en execució o compartiu la vostra connexió a Internet mitjançant Wi-Fi, proveu d\'aturar-lo i torneu-ho a provar més tard.</string>
|
||||
<!--Transfer Data via Removable Drives-->
|
||||
<string name="removable_drive_menu_title">Connecta mitjançant una unitat extraïble</string>
|
||||
<string name="removable_drive_intro">Si no us podeu connectar al vostre contacte a través d\'Internet, Wi-Fi o Bluetooth, el Briar també pot transferir missatges en una unitat extraïble, com ara un llapis USB o una targeta SD.</string>
|
||||
<string name="removable_drive_explanation">Si no podeu connectar-vos al vostre contacte a través d\'Internet, Wi-Fi o Bluetooth, el Briar també pot transferir missatges en una unitat extraïble, com ara un llapis USB o una targeta SD.\n\nQuan feu servir el botó «Envia dades», qualsevol dada que estigui esperant per ser enviada al contacte s\'escriurà a la unitat extraïble. Això inclou missatges privats, fitxers adjunts, blogs, fòrums i grups privats.\n\nTot es xifrarà abans que s\'escrigui a la unitat extraïble.\n\nQuan el vostre contacte rebi la unitat extraïble, pot utilitzar el botó «Rebre dades» per importar els missatges al Briar.</string>
|
||||
<string name="removable_drive_title_send">Envia dades</string>
|
||||
<string name="removable_drive_title_receive">Rebre dades</string>
|
||||
<string name="removable_drive_send_intro">Toqueu el botó següent per crear un fitxer nou que contingui els missatges xifrats. Podeu triar on es desarà el fitxer.\n\nSi voleu desar el fitxer en una unitat extraïble, inseriu la unitat ara.</string>
|
||||
<string name="removable_drive_send_no_data">Actualment no hi ha cap missatge esperant per ser enviat a aquest contacte.</string>
|
||||
<string name="removable_drive_send_not_supported">Aquest contacte utilitza una versió antiga del Briar o un dispositiu antic que no admet aquesta funció.</string>
|
||||
<string name="removable_drive_send_button">Trieu el fitxer per exportar</string>
|
||||
<string name="removable_drive_ongoing">Espereu que es completi la tasca en curs</string>
|
||||
<string name="removable_drive_receive_intro">Toqueu el botó següent per triar el fitxer que t\'ha enviat el vostre contacte.\n\nSi el fitxer es troba en una unitat extraïble, inseriu-la ara.</string>
|
||||
<string name="removable_drive_receive_button">Trieu el fitxer per importar</string>
|
||||
<string name="removable_drive_success_send_title">Exportació correcta</string>
|
||||
<string name="removable_drive_success_send_text">Les dades s\'han exportat correctament. Ara teniu 28 dies per transportar el fitxer al vostre contacte.\n\nSi el fitxer es troba en una unitat extraïble, feu servir la notificació de la barra d\'estat per expulsar la unitat abans de desconnectar-la.</string>
|
||||
<string name="removable_drive_success_receive_title">Importació correcta</string>
|
||||
<string name="removable_drive_success_receive_text">S\'han rebut tots els missatges xifrats continguts en aquest fitxer.</string>
|
||||
<string name="removable_drive_error_send_title">S\'ha produït un error en exportar les dades</string>
|
||||
<string name="removable_drive_error_send_text">S\'ha produït un error escrivint dades al fitxer.\n\nSi utilitzeu una unitat extraïble, assegureu-vos que estigui inserida correctament i torneu-ho a provar.\n\nSi l\'error persisteix, envieu comentaris per informar l\'equip del Briar sobre el assumpte.</string>
|
||||
<string name="removable_drive_error_receive_title">S\'ha produït un error en importar les dades</string>
|
||||
<string name="removable_drive_error_receive_text">El fitxer seleccionat no contenia res que el Briar pogués reconèixer.\n\nComproveu que heu triat el fitxer correcte.\n\nSi el vostre contacte va crear el fitxer fa més de 28 dies, el Briar no el podrà reconèixer.</string>
|
||||
<!--Screenshots-->
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_alice">Alba</string>
|
||||
|
||||
@@ -237,6 +237,8 @@
|
||||
<string name="qr_code_invalid">Der QR-Code ist ungültig</string>
|
||||
<string name="qr_code_too_old_1">Der QR-Code, den du gescannt hast, kommt von einer älteren Version von Briar.\n\nBitte deinen Kontakt, zur neuesten Version upzudaten, und versuche es erneut.</string>
|
||||
<string name="qr_code_too_new_1">Der QR-Code, den du gescannt hast, kommt von einer neueren Version.\n\nBitte aktualisiere Briar auf die neueste Version und versuche es erneut.</string>
|
||||
<string name="mailbox_qr_code_for_contact">Der QR-Code, den du gescannt hast, stammt von einer Briar-Mailbox.\n\nWenn du dich mit einer Mailbox verbinden willst, dann wähle in den Einstellungen > Mailbox im Briar-Menü.</string>
|
||||
<string name="qr_code_format_unknown">Der QR-Code, den du gescannt hast, ist nicht dazu gedacht, einen Kontakt hinzuzufügen.\n\nBitte scanne den QR-Code, der auf dem Display deines Kontaktes angezeigt wird.</string>
|
||||
<string name="camera_error">Kamerafehler</string>
|
||||
<string name="connecting_to_device">Verbinde mit Gerät\u2026</string>
|
||||
<string name="authenticating_with_device">Authentifiziere Gerät\u2026</string>
|
||||
@@ -431,6 +433,10 @@
|
||||
<string name="forum_declined_toast">Einladung abgelehnt</string>
|
||||
<string name="shared_by_format">Geteilt durch %s</string>
|
||||
<string name="forum_invitation_already_sharing">Bereits geteilt.</string>
|
||||
<string name="forum_invitation_already_invited">Die Einladung wurde bereits versendet.</string>
|
||||
<string name="forum_invitation_invite_received">Die Einladung wurde bereits empfangen.</string>
|
||||
<string name="forum_invitation_not_supported">Dies wird von diesem Kontakt nicht unterstützt.</string>
|
||||
<string name="forum_invitation_error">Fehler. Dies ist ein Bug und ist nicht dein Fehler.</string>
|
||||
<string name="forum_invitation_response_accepted_sent">Du hast die Forumeinladung von %s angenommen.</string>
|
||||
<string name="forum_invitation_response_declined_sent">Du hast die Forumeinladung von %s abgelehnt.</string>
|
||||
<string name="forum_invitation_response_declined_auto">Die Forumeinladung von %s wurde automatisch abgelehnt.</string>
|
||||
@@ -594,9 +600,13 @@
|
||||
<string name="mailbox_setup_download_link">Download-Link teilen</string>
|
||||
<string name="mailbox_setup_button_scan">Mailbox QR-Code scannen</string>
|
||||
<string name="permission_camera_qr_denied_body">Du hast den Zugriff auf die Kamera verweigert, aber das Scannen eines QR-Codes erfordert die Verwendung der Kamera.\n\nBitte gewähre den Zugriff.</string>
|
||||
<string name="mailbox_setup_connecting">Verbinde…</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Falscher QR-Code</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Der gescannte Code ist ungültig. Bitte öffne die Briar Mailbox-App auf deinem Mailbox-Gerät und scanne den dort angezeigten QR-Code.</string>
|
||||
<string name="mailbox_setup_connecting">Verbinde mit der Mailbox…</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_connecting_info">Dies könnte %1s erfordern.</string>
|
||||
<string name="mailbox_qr_code_too_old">Der QR-Code, den du gescannt hast, stammt von einer älteren Briar-Mailbox Version.\n\nBitte aktualisiere die Briar-Mailbox auf die neueste Version und probiere es noch einmal.</string>
|
||||
<string name="mailbox_qr_code_too_new">Der QR-Code, den du gescannt hast, stammt von einer neueren Briar-Mailbox Version.\n\nBitte aktualisiere Briar auf die neueste Version und probiere es noch einmal.</string>
|
||||
<string name="contact_qr_code_for_mailbox">Der QR-Code, den du gescannt hast, ist dafür gedacht, einen Kontakt hinzuzufügen.\n\nWenn du einen Kontakt hinzufügen möchtest, gehe bitte zur Kontaktliste und klicke auf das + Symbol.</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Der QR-Code, den du gescannt hast, stammt nicht von einer Briar-Mailbox.\n\nBitte öffne die Briar-Mailbox auf deinem Mailbox-Gerät und scanne den davon angezeigten QR-Code.</string>
|
||||
<string name="mailbox_setup_already_paired_title">Mailbox bereits verknüpft</string>
|
||||
<string name="mailbox_setup_already_paired_description">Verknüpfung der Mailbox auf deinem anderen Gerät aufheben und erneut versuchen.</string>
|
||||
<string name="mailbox_setup_io_error_title">Keine Verknüpfung möglich</string>
|
||||
|
||||
@@ -235,6 +235,7 @@
|
||||
<string name="menu_contact">Contacto</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">Agregar contacto cercano</string>
|
||||
<string name="add_contact_error_two_way">¿Ambos escanearon los códigos QR del otro?</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="try_again_button">Prueba de nuevo</string>
|
||||
@@ -308,6 +309,7 @@
|
||||
<string name="different_person_button">Diferente Persona</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s y %2$s te enviaron el mismo enlace.\n\nUno de ellos puede estar tratando de descubrir quiénes son tus contactos.\n\nNo les digas que recibiste el mismo enlace de otra persona.</string>
|
||||
<string name="pending_contact_updated_toast">Contacto pendiente actualizado</string>
|
||||
<string name="info_both_must_enter_links">Ambos deben agregar los enlaces del otro</string>
|
||||
<!--Peer trust levels-->
|
||||
<string name="peer_trust_level_unverified">Contacto no verificado</string>
|
||||
<string name="peer_trust_level_verified">Contacto verificado</string>
|
||||
@@ -341,6 +343,7 @@
|
||||
<string name="connect_via_bluetooth_intro">En el caso que las conexiones Bluetooth no funcionen automáticamente, puedes usar esta pantalla para conectarte manualmente.\n\nTu contacto necesita estar cerca para que esto funcione.\n\nAmbos deberían presionar \"Inicio\" al mismo tiempo.</string>
|
||||
<string name="connect_via_bluetooth_already_discovering">Ya se está intentando conectar vía Bluetooth. Por favor inténtalo de nuevo en unos segundos.</string>
|
||||
<string name="connect_via_bluetooth_no_location_permission">No se puede continuar sin permiso de ubicación</string>
|
||||
<string name="connect_via_bluetooth_no_bluetooth_permission">No se puede continuar sin el permiso de dispositivos cercanos</string>
|
||||
<string name="connect_via_bluetooth_start">Conectar mediante Bluetooth...</string>
|
||||
<string name="connect_via_bluetooth_success">Conectado exitosamente mediante Bluetooth</string>
|
||||
<string name="connect_via_bluetooth_error">No se pudo conectar mediante Bluetooth.</string>
|
||||
@@ -604,9 +607,7 @@
|
||||
<string name="mailbox_setup_download_link">Compartir enlace de descarga</string>
|
||||
<string name="mailbox_setup_button_scan">Escanear código QR de Buzón</string>
|
||||
<string name="permission_camera_qr_denied_body">Has denegado el acceso a la cámara, pero para escanear un código QR se requiere el uso de la cámara.\n\nPor favor considera conceder el acceso.</string>
|
||||
<string name="mailbox_setup_connecting">Conectando...</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Código QR erróneo</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">El código escaneado no es válido. Por favor abre la aplicación Buzón de Briar en tu dispositivo de buzón y escanea el código QR que presenta.</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_already_paired_title">Buzón ya vinculado</string>
|
||||
<string name="mailbox_setup_already_paired_description">Desvincula el Buzón en tu otro dispositivo e inténtalo de nuevo.</string>
|
||||
<string name="mailbox_setup_io_error_title">No se pudo conectar</string>
|
||||
@@ -743,6 +744,7 @@
|
||||
<string name="permission_location_request_body">Para descubrir dispositivos Bluetooth, Briar necesita permiso para acceder tu ubicación.\n\nBriar no la almacena o la comparte con nadie.</string>
|
||||
<string name="permission_camera_location_title">Cámara y ubicación</string>
|
||||
<string name="permission_camera_location_request_body">Para escanear el código QR, Briar necesita acceso a la cámara.\n\nPara descubrir dispositivos Bluetooth, Briar necesita permiso para acceder tu ubicación.\n\nBriar no la almacena o la comparte con nadie.</string>
|
||||
<string name="permission_camera_bluetooth_title">Cámara y dispositivos cercanos</string>
|
||||
<string name="permission_camera_denied_body">Has denegado el acceso a la cámara, pero para añadir contactos se requiere el uso de la cámara.\n\nPor favor considera la posibilidad de conceder el acceso.</string>
|
||||
<string name="permission_location_denied_body">Has denegado el acceso a tu ubicación, pero Briar necesita este permiso para descubrir dispositivos Bluetooth.\n\nPor favor considera la posibilidad de conceder el acceso.</string>
|
||||
<string name="permission_location_setting_title">Configuración de ubicación</string>
|
||||
|
||||
@@ -247,6 +247,8 @@
|
||||
<string name="qr_code_invalid">کد کیوآر نامعتبر می باشد</string>
|
||||
<string name="qr_code_too_old_1">کد QR که اسکن کردهاید مربوط به نسخه قدیمی Briar است.\n\nلطفا از مخاطب خود بخواهید به آخرین نسخه ارتقا دهد و سپس دوباره امتحان کنید.</string>
|
||||
<string name="qr_code_too_new_1">کد QR که اسکن کردهاید مربوط به نسخه جدیدتری از Briar است.\n\nلطفا به آخرین نسخه ارتقا دهید و سپس دوباره امتحان کنید.</string>
|
||||
<string name="mailbox_qr_code_for_contact">کد QR که اسکن کردهاید از صندوق پستی Briar میآید.\n\nاگر میخواهید یک صندوق پستی را پیوند دهید، لطفا تنظیمات > صندوق پستی از منوی Briar را انتخاب کنید.</string>
|
||||
<string name="qr_code_format_unknown">کد QR که اسکن کرده اید برای افزودن مخاطب Briar نیست.\n\nلطفا کد QR نشان داده شده در صفحه مخاطب خود را اسکن کنید.</string>
|
||||
<string name="camera_error">خطای دوربین</string>
|
||||
<string name="connecting_to_device">اتصال به دستگاهu2026\</string>
|
||||
<string name="authenticating_with_device">تصدیق سازی با دستگاه u2026\</string>
|
||||
@@ -626,9 +628,13 @@
|
||||
<string name="mailbox_setup_download_link">اشتراک لینک دانلود</string>
|
||||
<string name="mailbox_setup_button_scan">اسکن کد QR Mailbox</string>
|
||||
<string name="permission_camera_qr_denied_body">شما دسترسی به دوربین را رد کردهاید، اما اسکن کد QR مستلزم استفاده از دوربین است.\n\nلطفا دسترسی به دوربین را بدهید.</string>
|
||||
<string name="mailbox_setup_connecting">در حال اتصال...</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">کد QR اشتباه است</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">کد اسکنشده نامعتبر است. لطفا برنامه Briar Mailbox را در دستگاه Mailbox خود باز کنید و کد QR ارائهشده را اسکن کنید.</string>
|
||||
<string name="mailbox_setup_connecting">در حال اتصال به صندوق پست…</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_connecting_info">این ممکن است تا %1s طول بکشد</string>
|
||||
<string name="mailbox_qr_code_too_old">کد QR که اسکن کردهاید از نسخه قدیمیتری از صندوق پستی Briar آمده است.\n\nلطفا صندوق پستی Briar را به آخرین نسخه ارتقا دهید و سپس دوباره امتحان کنید.</string>
|
||||
<string name="mailbox_qr_code_too_new">کد QR که اسکن کردهاید از نسخه جدیدتری از صندوق پستی Briar آمده است.\n\nلطفا Briar را به آخرین نسخه ارتقا دهید و سپس دوباره امتحان کنید.</string>
|
||||
<string name="contact_qr_code_for_mailbox">کد QR که اسکن کردهاید برای افزودن مخاطب Briar است.\n\nاگر میخواهید مخاطبی را اضافه کنید، لطفا به فهرست مخاطبین بروید و روی نماد + ضربه بزنید.</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">کد QR که اسکن کردهاید از صندوق پستی Briar نمیآید.\n\nلطفا برنامه صندوق پستی Briar را در دستگاه مربوط به صندوق پستی خود باز کنید و کد QR ارائهشده را اسکن کنید.</string>
|
||||
<string name="mailbox_setup_already_paired_title">صندوقپستی قبلا متصل شده است</string>
|
||||
<string name="mailbox_setup_already_paired_description">اتصال صندوقپستی دستگاه دیگرتان را لغو کنید و دوباره امتحان کنید.</string>
|
||||
<string name="mailbox_setup_io_error_title">متصل نشد</string>
|
||||
|
||||
@@ -593,9 +593,7 @@
|
||||
<string name="mailbox_setup_download_link">Partager le lien de téléchargement</string>
|
||||
<string name="mailbox_setup_button_scan">Balayer le code QR de Boîte de courriel</string>
|
||||
<string name="permission_camera_qr_denied_body">Vous avez refusé l’accès à l’appareil photo, mais le balayage d’un code QR de contacts exige de l’utiliser.\n\nVeuillez envisager d’y accorder l’accès.</string>
|
||||
<string name="mailbox_setup_connecting">Connexion…</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Le code QR est erroné</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Le code balayé est invalide. Veuillez ouvrir l’appli Boîte de courriel de Briar sur votre appareil Boîte de courriel et balayer le code qu’elle présente.</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_already_paired_title">La Boîte de courriel est déjà reliée</string>
|
||||
<string name="mailbox_setup_already_paired_description">Annuler le lien avec la Boîte de courriel sur l’autre appareil et réessayer.</string>
|
||||
<string name="mailbox_setup_io_error_title">Connexion impossible</string>
|
||||
|
||||
@@ -578,9 +578,7 @@
|
||||
<string name="mailbox_setup_download_link">Deila niðurhalstengli</string>
|
||||
<string name="mailbox_setup_button_scan">Skanna QR-kóða pósthólfs</string>
|
||||
<string name="permission_camera_qr_denied_body">Þú hefur hafnað aðgangi að myndavélinni, en það að skanna QR-kóða krefst notkun hennar.\n\nÍhugaðu að veita þennan aðgang.</string>
|
||||
<string name="mailbox_setup_connecting">Tengist…</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Rangur QR-kóði</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Skannaði kóðinn er ógildur. Opnaðu Briar Mailbox forritið á pósthólfstækinu þínu og skannaðu QR-kóðann sem það birtir.</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_already_paired_title">Pósthólf er þegar tengt</string>
|
||||
<string name="mailbox_setup_already_paired_description">Aftengdu pósthólfið á hinu tækinu þínu og prófaðu aftur.</string>
|
||||
<string name="mailbox_setup_io_error_title">Mistókst að tengjast</string>
|
||||
|
||||
@@ -246,6 +246,8 @@
|
||||
<string name="qr_code_invalid">Il codice QR non è valido</string>
|
||||
<string name="qr_code_too_old_1">Il codice QR che hai scansionato proviene da una versione più vecchia di Briar.\n\nChiedi al tuo contatto di aggiornare all\'ultima versione e poi riprova.</string>
|
||||
<string name="qr_code_too_new_1">Il codice QR che hai scansionato proviene da una versione più recente di Briar.\n\nAggiorna all\'ultima versione e poi riprova.</string>
|
||||
<string name="mailbox_qr_code_for_contact">Il codice QR che hai scansionato proviene da Briar Mailbox\n\nSe vuoi collegare una casella postale, scegli Impostazioni > Casella postale dal menu di Briar.</string>
|
||||
<string name="qr_code_format_unknown">Il codice QR che hai scansionato non è fatto per l\'aggiunta di un contatto Briar.\n\nScansiona il codice QR mostrato nello schermo del tuo contatto.</string>
|
||||
<string name="camera_error">Errore fotocamera</string>
|
||||
<string name="connecting_to_device">Connessione al dispositivo\u2026</string>
|
||||
<string name="authenticating_with_device">Autenticazione con il dispositivo\u2026</string>
|
||||
@@ -444,6 +446,10 @@
|
||||
<string name="forum_declined_toast">Invito declinato</string>
|
||||
<string name="shared_by_format">Condiviso da %s</string>
|
||||
<string name="forum_invitation_already_sharing">Già in condivisione</string>
|
||||
<string name="forum_invitation_already_invited">Invito già spedito</string>
|
||||
<string name="forum_invitation_invite_received">Invito già ricevuto</string>
|
||||
<string name="forum_invitation_not_supported">Non supportato da questo contatto</string>
|
||||
<string name="forum_invitation_error">Errore. Si tratta di un bug, non è colpa tua</string>
|
||||
<string name="forum_invitation_response_accepted_sent">Hai accettato l\'invito al forum da %s</string>
|
||||
<string name="forum_invitation_response_declined_sent">Hai declinato l\'invito al forum da %s</string>
|
||||
<string name="forum_invitation_response_declined_auto">L\'invito di %s al forum è stato rifiutato automaticamente.</string>
|
||||
@@ -608,9 +614,13 @@
|
||||
<string name="mailbox_setup_download_link">Condividi link di download</string>
|
||||
<string name="mailbox_setup_button_scan">Scansiona codice QR Mailbox</string>
|
||||
<string name="permission_camera_qr_denied_body">Hai negato l\'accesso alla fotocamera, ma la scansione di un codice QR ne richiede l\'utilizzo.\n\nPrendi in considerazione di consentirne l\'accesso.</string>
|
||||
<string name="mailbox_setup_connecting">Connessione in corso...</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Codice QR errato</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Il codice scansionato non è valido. Apri l\'app Briar Mailbox nel tuo dispositivo della casella postale e scansiona il codice QR che mostra.</string>
|
||||
<string name="mailbox_setup_connecting">Connessione alla casella postale…</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_connecting_info">Potrebbe impiegarci %1s</string>
|
||||
<string name="mailbox_qr_code_too_old">Il codice QR che hai scansionato proviene da una versione più vecchia di Briar Mailbox.\n\nAggiorna Briar Mailbox all\'ultima versione e poi riprova.</string>
|
||||
<string name="mailbox_qr_code_too_new">Il codice QR che hai scansionato proviene da una versione più recente di Briar Mailbox.\n\nAggiorna Briar all\'ultima versione e poi riprova.</string>
|
||||
<string name="contact_qr_code_for_mailbox">Il codice QR che hai scansionato è fatto per l\'aggiunta di un contatto Briar.\n\nSe vuoi aggiungere un contatto, vai nell\'elenco dei contatti e tocca l\'icona + .</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Il codice QR che hai scansionato non proviene da Briar Mailbox.\n\nApri l\'app Briar Mailbox sul tuo dispositivo della casella postale e scansiona il codice QR mostrato.</string>
|
||||
<string name="mailbox_setup_already_paired_title">Casella postale già collegata</string>
|
||||
<string name="mailbox_setup_already_paired_description">Scollega la casella postale sul tuo altro dispositivo e riprova.</string>
|
||||
<string name="mailbox_setup_io_error_title">Impossibile connettere</string>
|
||||
|
||||
@@ -214,6 +214,7 @@
|
||||
<string name="menu_contact">連絡先</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">近くの人を連絡先に追加する</string>
|
||||
<string name="add_contact_error_two_way">お互いのQRコードを読み取りましたか?</string>
|
||||
<string name="face_to_face">連絡先として追加したい人と会う必要があります。\n\nこれにより、だれかがあなたになりすましたり、メッセージを読んだりするのを防ぐことができます。</string>
|
||||
<string name="continue_button">続ける</string>
|
||||
<string name="try_again_button">もう一度やり直してください</string>
|
||||
@@ -222,13 +223,16 @@
|
||||
<string name="contact_added_toast">追加された連絡先:%s</string>
|
||||
<string name="contact_already_exists">連絡先%sは既に存在しています </string>
|
||||
<string name="qr_code_invalid">QRコードが無効です</string>
|
||||
<string name="qr_code_too_old_1">スキャンしたQRコードはBriarの古いバージョンから取得されました。\n\n最新版へアップグレードしてもらって、もう一度お試しください。</string>
|
||||
<string name="qr_code_too_new_1">スキャンしたQRコードは、新しいバージョンのBriarから取得されました。\n\n最新版にアップグレードしてから、もう一度お試しください。</string>
|
||||
<string name="qr_code_too_old_1">読み取ったQRコードは、Briarの古いバージョンから生じました。\n\n最新版へアップグレードしてもらって、もう一度お試しください。</string>
|
||||
<string name="qr_code_too_new_1">読み取ったQRコードは、新しいバージョンのBriarから生じました。\n\n最新版にアップグレードしてから、もう一度お試しください。</string>
|
||||
<string name="mailbox_qr_code_for_contact">読み取ったQRコードは、Briarメールボックスから生じるものです。\n\nメールボックスに関連付けたいならば、設定を選択してください> Briarメニューからメールボックス</string>
|
||||
<string name="qr_code_format_unknown">読み取ったQRコードは、Briarの連絡先を追加するために示されたものではありません。\n\nあなたの連絡先の画面上に表示されたQRコードを読み取ってください。</string>
|
||||
<string name="camera_error">カメラエラー</string>
|
||||
<string name="connecting_to_device">端末に接続中\u2026</string>
|
||||
<string name="authenticating_with_device">端末同士での認証中\u2026</string>
|
||||
<string name="connection_error_title">連絡先に接続できませんでした</string>
|
||||
<string name="connection_error_feedback">この問題が解決しない場合、アプリを改善するために<a href="feedback">フィードバック</a>を送信してください。</string>
|
||||
<string name="info_both_must_scan">お互いのQRコードを読み取る必要があります</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">離れた場所にいる相手を連絡先に追加</string>
|
||||
<string name="add_contact_nearby_title">近くにいる相手を連絡先に追加</string>
|
||||
@@ -285,6 +289,7 @@
|
||||
<string name="different_person_button">別の人</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$sと%2$sから同じリンクを受信しました。\n\nどちらかがあなたの連絡先の内容を知ろうとしている可能性があります。\n\n他の人から同じリンクを受け取ったことを伝えないでください。</string>
|
||||
<string name="pending_contact_updated_toast">保留中の連絡先が更新されました</string>
|
||||
<string name="info_both_must_enter_links">お互いのリンクを追加する必要があります</string>
|
||||
<!--Peer trust levels-->
|
||||
<string name="peer_trust_level_unverified">検証されてない連絡先</string>
|
||||
<string name="peer_trust_level_verified">検証された連絡先</string>
|
||||
@@ -569,13 +574,17 @@
|
||||
<string name="mailbox_setup_intro">メールボックスはあなたがオフラインの間、連絡先があなたにメッセージを送信することを有効にします。メールボックスはあなたがオンラインになるまで、メッセージを受信し保管します。\n
|
||||
\n予備端末上にBriarのメールボックスアプリをインストールできます。それを電源とWi-Fiに接続し、常時オンラインにしてください。</string>
|
||||
<string name="mailbox_setup_download">最初に、Google PlayまたはBriarをダウンロードしたどこかで\"Briar Mailbox\"を検索して、他の端末上にメールボックスアプリをインストールします。\n
|
||||
\nそして、メールボックスアプリによって表示されるQRコードをスキャンして、Briarとあなたのメールボックス結びつけます。</string>
|
||||
\nそして、メールボックスアプリによって表示されるQRコードを読み取って、Briarとあなたのメールボックス結びつけます。</string>
|
||||
<string name="mailbox_setup_download_link">ダウンロードリンクを共有</string>
|
||||
<string name="mailbox_setup_button_scan">メールボックスのQRコードをスキャン</string>
|
||||
<string name="permission_camera_qr_denied_body">カメラへのアクセスをが拒否されましたが、QRコードをスキャンするにはカメラを使用する必要があります。\n\nカメラへのアクセスの許可を考えてください。</string>
|
||||
<string name="mailbox_setup_connecting">接続中…</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">不正なQRコード</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">スキャンされたコードは無効です。メールボックス端末上のBriarメールボックスアプリを開き、提示されたQRコードをスキャンしてください。</string>
|
||||
<string name="mailbox_setup_button_scan">メールボックスのQRコードを読み取る</string>
|
||||
<string name="permission_camera_qr_denied_body">あなたはカメラにアクセスすることを拒否しましたが、QRコードを読み取るには、カメラを使用する必要があります。\n\nアクセス権を付与することを考慮願います。</string>
|
||||
<string name="mailbox_setup_connecting">メールボックスへ接続中…</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_connecting_info">%1sまでかかる場合があります</string>
|
||||
<string name="mailbox_qr_code_too_old">読み取ったQRコードは、古いバージョンのBriarメールボックスから生じました。\n\nBriarメールボックスを最新版にアップグレードしてから、もう一度お試しください。</string>
|
||||
<string name="mailbox_qr_code_too_new">読み取ったQRコードは、新しいバージョンのBriarメールボックスから生じました。\n\nBriarを最新版にアップグレードしてから、もう一度お試しください。</string>
|
||||
<string name="contact_qr_code_for_mailbox">読み取ったQRコードは、Briarの連絡先を追加するためのものです。\n\n連絡先を追加したいならば、連絡先一覧に行き、+アイコンをタップしてください。</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">読み取ったQRコードは、Briarメールボックスから生じたものではありません。メールボックス端末上のBriarメールボックスアプリを開き、提示されたQRコードを読み取ってください。</string>
|
||||
<string name="mailbox_setup_already_paired_title">メールボックスは既に結びつけられています</string>
|
||||
<string name="mailbox_setup_already_paired_description">あなたの端末上のメールボックスの結びつけを解き、再試行してください。</string>
|
||||
<string name="mailbox_setup_io_error_title">接続できません</string>
|
||||
@@ -707,16 +716,22 @@
|
||||
<string name="screen_filter_review_apps">アプリを確認</string>
|
||||
<!--Permission Requests-->
|
||||
<string name="permission_camera_title">カメラへのアクセス許可</string>
|
||||
<string name="permission_camera_request_body">QRコードをスキャンするには、Briarはカメラにアクセスする必要があります。</string>
|
||||
<string name="permission_camera_request_body">QRコードを読み取るには、Briarはカメラにアクセスする必要があります。</string>
|
||||
<string name="permission_location_title">位置情報へのアクセスの許可</string>
|
||||
<string name="permission_location_request_body">Bluetooth端末を検出するには、Briarがあなたの位置情報へのアクセスを必要とします。\n\nBriarはあなたの場所を保存したり、誰とも共有したりしません。</string>
|
||||
<string name="permission_camera_location_title">カメラと位置情報</string>
|
||||
<string name="permission_camera_location_request_body">QRコードをスキャンするには、Briarはカメラにアクセスする必要があります。\n\nBluetooth端末を検出するには、Briarは現在地情報にアクセスする許可が必要です。\n\nBriarは現在地を保存したり、誰とも共有したりしません。</string>
|
||||
<string name="permission_camera_denied_body">カメラへのアクセスをが拒否されましたが、連絡先を追加するにはカメラを使用する必要があります。\n\nカメラへのアクセスの許可を考えてください。</string>
|
||||
<string name="permission_location_denied_body">あなたの位置情報にアクセスすることを拒否しましたが、BriarはBluetooth端末を発見するのに、この権限が必要です。\n\nアクセス権を付与することを考慮願います。</string>
|
||||
<string name="permission_camera_location_request_body">QRコードを読み取るには、Briarはカメラにアクセスする必要があります。\n\nBluetooth端末を検出するには、Briarは現在地情報にアクセスする許可が必要です。\n\nBriarは現在地を保存したり、誰とも共有したりしません。</string>
|
||||
<string name="permission_camera_bluetooth_title">カメラと付近の端末</string>
|
||||
<string name="permission_camera_bluetooth_request_body">QRコードを読み取るには、Briarはカメラにアクセスする必要があります。\n\nBluetooth端末を検出するには、Briarは付近の端末を探し接続する許可が必要です。</string>
|
||||
<string name="permission_camera_denied_body">あなたはカメラにアクセスすることを拒否しましたが、連絡先を追加するには、カメラを使用する必要があります。\n\nアクセス権を付与することを考慮願います。</string>
|
||||
<string name="permission_location_denied_body">あなたは位置情報にアクセスすることを拒否しましたが、BriarはBluetooth端末を発見するのに、この権限が必要です。\n\nアクセス権を付与することを考慮願います。</string>
|
||||
<string name="permission_location_setting_title">位置情報設定</string>
|
||||
<string name="permission_location_setting_body">端末の位置情報設定は、Bluetoothを介して他の端末を見つけるために、オンにする必要があります。続けるには位置情報を有効にしてください。その後、位置情報を無効にできます。</string>
|
||||
<string name="permission_location_setting_hotspot_body">端末の位置情報設定は、Wi-Fiホットスポットを作成するために、オンにする必要があります。続けるには位置情報を有効にしてください。その後、位置情報を無効にできます。</string>
|
||||
<string name="permission_location_setting_button">位置情報を有効化</string>
|
||||
<string name="permission_bluetooth_title">付近の端末の権限</string>
|
||||
<string name="permission_bluetooth_body">Bluetooth通信を使用するには、Briarは付近の端末を探し接続する権限が必要です。</string>
|
||||
<string name="permission_bluetooth_denied_body">あなたは付近の端末にアクセスすることを拒否しましたが、BriarはBluetoothを使用するのに、この権限が必要です。\n\nアクセス権を付与することを考慮願います。</string>
|
||||
<string name="qr_code">QRコード</string>
|
||||
<string name="show_qr_code_fullscreen">QRコードを全画面表示する</string>
|
||||
<!--App Locking-->
|
||||
@@ -739,17 +754,19 @@
|
||||
<string name="hotspot_notification_title">Briarをオフラインで共有</string>
|
||||
<string name="hotspot_button_connected">次へ</string>
|
||||
<string name="permission_hotspot_location_request_body">Wi-Fiホットスポットを作るには、Briarはあなたの位置情報にアクセスする権限が必要です。\n\nBriarはあなたの位置情報を保存せず、誰かに共有することもありません。</string>
|
||||
<string name="permission_hotspot_location_denied_body">あなたの位置情報にアクセスすることを拒否しましたが、BriarはWi-Fiホットスポットを作るのに、この権限が必要です。\n\nアクセス権を付与することを考慮願います。</string>
|
||||
<string name="permission_hotspot_location_request_precise_body">Wi-Fiホットスポットを作るには、Briarはあなたの正確な位置情報にアクセスする権限が必要です。\n\nBriarはあなたの位置情報を保存せず、誰かに共有することもありません。</string>
|
||||
<string name="permission_hotspot_location_denied_body">あなたは位置情報にアクセスすることを拒否しましたが、BriarはWi-Fiホットスポットを作るのに、この権限が必要です。\n\nアクセス権を付与することを考慮願います。</string>
|
||||
<string name="permission_hotspot_location_denied_precise_body">あなたは正確な位置情報にアクセスすることを拒否しましたが、BriarはWi-Fiホットスポットを作るのに、この権限が必要です。\n\nアクセス権を付与することを考慮願います。</string>
|
||||
<string name="wifi_settings_title">Wi-Fi設定</string>
|
||||
<string name="wifi_settings_request_enable_body">Wi-Fiホットスポットを作るには、BriarWi-Fiの使用が必要です。有効にしてください。</string>
|
||||
<string name="hotspot_tab_manual">手動</string>
|
||||
<!--The placeholder to be inserted into the string 'hotspot_manual_wifi': People can connect by %s-->
|
||||
<string name="hotspot_scanning_a_qr_code">QRコードをスキャン</string>
|
||||
<string name="hotspot_scanning_a_qr_code">QRコードを読み取る</string>
|
||||
<!--Wi-Fi setup-->
|
||||
<!--The %s placeholder will be replaced with the translation of 'hotspot_scanning_a_qr_code'-->
|
||||
<string name="hotspot_manual_wifi">あなたの電話機はWi-Fiホットスポットを提供しています。Briarのダウンロードを希望する人は、以下の方法で端末のWi-Fi設定に追加するか、または %s によるホットスポットに接続してください。そのホットスポットに接続されたら、「次へ」を押してください。</string>
|
||||
<string name="hotspot_manual_wifi_ssid">ネットワーク名</string>
|
||||
<string name="hotspot_qr_wifi">あなたの電話機はWi-Fiホットスポットを提供しています。Briarのダウンロードを希望する人は、このQRコードをスキャンしてホットスポットに接続してください。そのホットスポットに接続されたら、「次へ」を押してください。</string>
|
||||
<string name="hotspot_qr_wifi">あなたの電話機はWi-Fiホットスポットを提供しています。Briarのダウンロードを希望する人は、このQRコードを読み取ってホットスポットに接続してください。そのホットスポットに接続されたら、「次へ」を押してください。</string>
|
||||
<string name="hotspot_no_peers_connected">接続された端末なし</string>
|
||||
<plurals name="hotspot_peers_connected">
|
||||
<item quantity="other">%s機の接続された端末</item>
|
||||
@@ -758,7 +775,7 @@
|
||||
<!--The %s placeholder will be replaced with the translation of 'hotspot_scanning_a_qr_code'-->
|
||||
<string name="hotspot_manual_site">あなたの電話機はWi-Fiホットスポットを提供しています。ホットスポットに接続された人は、ウェブブラウザまたは %s 内で以下のリンクを入力して、Briarをダウンロードできます。</string>
|
||||
<string name="hotspot_manual_site_address">アドレス(URL)</string>
|
||||
<string name="hotspot_qr_site">あなたの電話機はWi-Fiホットスポットを提供しています。ホットスポットに接続された人は、このQRコードをスキャンして、Briarをダウンロードできます。</string>
|
||||
<string name="hotspot_qr_site">あなたの電話機はWi-Fiホットスポットを提供しています。ホットスポットに接続された人は、このQRコードを読み取って、Briarをダウンロードできます。</string>
|
||||
<!--e.g. Download Briar 1.2.20-->
|
||||
<string name="website_download_title_1">Briar %sをダウンロード</string>
|
||||
<string name="website_download_intro_1">近くの誰かが、あなたとBriarを共有しました。</string>
|
||||
|
||||
@@ -588,9 +588,7 @@
|
||||
<string name="mailbox_setup_download_link">ჩამოტვირთვის ბმულის გაზიარება</string>
|
||||
<string name="mailbox_setup_button_scan">საფოსტო ყუთის QR კოდის სკანირება</string>
|
||||
<string name="permission_camera_qr_denied_body">თქვენ უარყავით კამერაზე წვდომა, მაგრამ QR კოდის სკანირებისთვის საჭიროა კამერის გამოყენება.\n\nგთხოვთ, განიხილოთ წვდომის მინიჭება.</string>
|
||||
<string name="mailbox_setup_connecting">უკავშირდება…</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">არასწორი QR კოდი</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">სკანირებული კოდი არასწორია. გთხოვთ გახსნათ Briar Mailbox აპი თქვენს მოწყობილობაზე საფოსტო ყუთით და დაასკანიროთ იქ არსებული QR კოდი.</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_already_paired_title">საფოსტო ყუთი უკვე დაკავშირებულია</string>
|
||||
<string name="mailbox_setup_already_paired_description">ჩახსენით საფოსტო ყუთი სათადარიგო მოწყობილობაზე და ისევ სცადეთ.</string>
|
||||
<string name="mailbox_setup_io_error_title">დაკავშირება ვერ ხერხდება</string>
|
||||
|
||||
@@ -604,8 +604,7 @@
|
||||
\nGalite įsidiegti Briar pašto dėžutę laisvame atsarginiame įrenginyje. Palikite įrenginį prijungtą prie maitinimo šaltinio ir belaidžio (Wi-Fi) ryšio, kad jis būtų pastoviai prijungtas prie interneto.</string>
|
||||
<string name="mailbox_setup_download_link">Bendrinti atsisiuntimo nuorodą</string>
|
||||
<string name="mailbox_setup_button_scan">Skenuoti pašto dėžutės QR kodą</string>
|
||||
<string name="mailbox_setup_connecting">Jungiamasi…</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Neteisingas QR kodas</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_already_paired_title">Pašto dėžutė jau susieta</string>
|
||||
<string name="mailbox_setup_io_error_title">Nepavyko prisijungti</string>
|
||||
<string name="mailbox_setup_io_error_description">Įsitikinkite, kad abu įrenginiai yra prisijungę prie interneto ir bandykite dar kartą.</string>
|
||||
|
||||
@@ -283,7 +283,11 @@
|
||||
<string name="duplicate_link_dialog_text_3">%1$sနှင့်%2$s တူညီသောလင့်ခ်ကို သင့်အား ပေးပို့ခဲ့သည်။ \n\n သူတို့ထဲမှ တစ်ဦးက သင့်အဆက်အသွယ်များသည် မည်သူဖြစ်သည်ကို ရှာဖွေရန် ကြိုးစားနေပေမည်။ \n\nသင်သည် အခြားသူတစ်ဦးထံမှ တူညီသောလင့်ခ်ကို ရရှိထားကြောင်း ၎င်းတို့အား မပြောပါနှင့်။</string>
|
||||
<string name="pending_contact_updated_toast">ဆိုင်းငံ့ထားသော အဆက်အသွယ်ကို အပ်ဒိတ်လုပ်ပြီး</string>
|
||||
<!--Peer trust levels-->
|
||||
<string name="peer_trust_level_unverified">မစိစစ်ရသေးသော အဆက်အသွယ်</string>
|
||||
<string name="peer_trust_level_verified">စိစစ်ထားပြီးသော အဆက်အသွယ်
|
||||
</string>
|
||||
<string name="peer_trust_level_ourselves">ကျွနု်ပ်ကို</string>
|
||||
<string name="peer_trust_level_stranger">သူစိမ်း</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">သင့်ရဲ့ အဆက်အသွယ်လိပ်စာများကို မိတ်ဆက်ပါ</string>
|
||||
<string name="introduction_menu_item">မိတ်ဆက်ခြင်း ပြုလုပ်ပါ</string>
|
||||
@@ -404,6 +408,8 @@
|
||||
<string name="forum_declined_toast">ဖိတ်ကြားမှု ငြင်းဆိုခဲ့သည်</string>
|
||||
<string name="shared_by_format">%s မှ မျှဝေခဲ့သည်</string>
|
||||
<string name="forum_invitation_already_sharing">မျှဝေထားခြင်းဖြစ်သည်</string>
|
||||
<string name="forum_invitation_already_invited">ဖိတ်ကြားစာ ပို့ပြီးပြီ</string>
|
||||
<string name="forum_invitation_invite_received">ဖိတ်ကြားစာ လက်ခံရရှိသည်</string>
|
||||
<string name="forum_invitation_response_accepted_sent">%s မှ ဖိတ်ကြားမှုကို သင်သည် လက်ခံခဲ့ပါသည်။</string>
|
||||
<string name="forum_invitation_response_declined_sent">%s မှ ဖိတ်ကြားမှုကို သင်သည် ငြင်းဆိုခဲ့ပါသည်။</string>
|
||||
<string name="forum_invitation_response_declined_auto">%s မှ ပို့ထားသော ဖိုရမ်သို့ ဖိတ်ခေါ်ချက်ကို အလိုအလျောက် ငြင်းပယ်ခဲ့ပါသည်။</string>
|
||||
@@ -565,8 +571,7 @@
|
||||
<string name="mailbox_setup_download_link">ဒေါင်းလုဒ်လင့်ခ်ကို မျှဝေပါ</string>
|
||||
<string name="mailbox_setup_button_scan">စာတိုက်ပုံး QR ကုဒ်ကို စကင်န်ဖတ်ပါ</string>
|
||||
<string name="permission_camera_qr_denied_body">သင်သည် ကင်မရာအသုံးပြုခွင့်ကို ငြင်းပယ်ထားသော်လည်း QR ကုဒ်ကို စကင်န်ဖတ်ရန် ကင်မရာကို အသုံးပြုရန် လိုအပ်ပါသည်။ \n\nကျေးဇူးပြု၍ ဝင်ရောက်ခွင့်ပြုရန် စဉ်းစားပါ။</string>
|
||||
<string name="mailbox_setup_connecting">ချိတ်ဆက်နေသည်…</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">QR ကုဒ် မှားနေသည်</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_paired_title">ချိတ်ဆက်ပြီးပါပြီ</string>
|
||||
<string name="tor_offline_title">အော့ဖ်လိုင်း</string>
|
||||
<string name="tor_offline_button_check">ချိတ်ဆက်မှု ဆက်တင်များကို စစ်ဆေးပါ</string>
|
||||
|
||||
@@ -589,9 +589,7 @@
|
||||
<string name="mailbox_setup_download_link">Dele nedlastingslenke</string>
|
||||
<string name="mailbox_setup_button_scan">Skanne Mailboks-QR-kode</string>
|
||||
<string name="permission_camera_qr_denied_body">Du har forbudt tilgang til kameraet, men for å kunne skanne QR-koder kreves kameratilgang.\n\nVennligst vurder å gi tilgang.</string>
|
||||
<string name="mailbox_setup_connecting">Kobler til…</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Feil QR-kode</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Den skannede koden er ugyldig. Vennligst åpne Briar Mailboks-app\'en på din Mailboks-enhet og skann QR-koden den viser frem.</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_already_paired_title">Mailboks\'en er allerede lenket opp</string>
|
||||
<string name="mailbox_setup_already_paired_description">Lenke fra Mailboks-appen på din andre enhet og prøv igjen.</string>
|
||||
<string name="mailbox_setup_io_error_title">Kunne ikke koble til</string>
|
||||
|
||||
@@ -618,9 +618,7 @@
|
||||
<string name="mailbox_setup_download_link">Udostępnij łącze pobierania</string>
|
||||
<string name="mailbox_setup_button_scan">Zeskanuj kod QR aplikacji Mailbox</string>
|
||||
<string name="permission_camera_qr_denied_body">Odmówiłeś dostępu do aparatu, ale zeskanowanie kodu QR wymaga użycia aparatu.\n\nRozważ przyznanie dostępu.</string>
|
||||
<string name="mailbox_setup_connecting">Trwa łączenie...</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Nieprawidłowy kod QR</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Zeskanowany kod jest nieprawidłowy. Otwórz aplikację Briar Mailbox na urządzeniu z Mailbox i zeskanuj wyświetlany kod QR. </string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_already_paired_title">Mailbox już podłączony</string>
|
||||
<string name="mailbox_setup_already_paired_description">Odłącz Mailbox na drugim urządzeniu i spróbuj ponownie.</string>
|
||||
<string name="mailbox_setup_io_error_title">Nie udało się połączyć</string>
|
||||
|
||||
@@ -600,9 +600,7 @@
|
||||
<string name="mailbox_setup_download_link">Compartilhar Link de Download</string>
|
||||
<string name="mailbox_setup_button_scan">Escanear código QR do Mailbox</string>
|
||||
<string name="permission_camera_qr_denied_body">Você negou acesso à câmera, mas escanear um código QR requer o uso da câmera.\n\nPor favor, considere conceder acesso.</string>
|
||||
<string name="mailbox_setup_connecting">Conectando...</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Código QR errado</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">O código escaneado é inválido. Por favor, abra o app Briar Mailbox no seu dispositivo Mailbox e escaneie o código QR apresentado.</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_already_paired_title">Mailbox já vinculado</string>
|
||||
<string name="mailbox_setup_already_paired_description">Desvincule o Mailbox no seu outro dispositivo e tente de novo.</string>
|
||||
<string name="mailbox_setup_io_error_title">Não foi possível conectar</string>
|
||||
|
||||
@@ -161,6 +161,7 @@
|
||||
<string name="error_start_activity">Indisponibil pentru sistemul dvs.</string>
|
||||
<string name="status_heading">Stare:</string>
|
||||
<string name="error">Eroare</string>
|
||||
<string name="info">Informații</string>
|
||||
<!--Contacts and Private Conversations-->
|
||||
<string name="no_contacts">Niciun contact de afișat</string>
|
||||
<string name="no_contacts_action">Atingeți iconița + pentru a adăuga un contact</string>
|
||||
@@ -234,6 +235,7 @@
|
||||
<string name="menu_contact">Contact</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">Adăugați un contact din apropiere</string>
|
||||
<string name="add_contact_error_two_way">Ați scanat amândoi codurile QR ale celuilalt?</string>
|
||||
<string name="face_to_face">Trebuie să vă întâlniți cu persoana pe care doriți să o adăugați la contacte.\n\nAcest pas împiedică alte persoane să se substituie dvs. sau să citească mesajele dvs. în viitor.</string>
|
||||
<string name="continue_button">Continuați</string>
|
||||
<string name="try_again_button">Încercați din nou</string>
|
||||
@@ -244,11 +246,14 @@
|
||||
<string name="qr_code_invalid">Codul QR este nevalid!</string>
|
||||
<string name="qr_code_too_old_1">Codul QR pe care l-ați scanat provine de la o versiune Briar mai veche.\n\nSolicitați contactului să actualizeze aplicația la cea mai recentă versiune, după care încercați din nou.</string>
|
||||
<string name="qr_code_too_new_1">Codul QR pe care l-ați scanat provine de la o versiune Briar mai nouă.\n\nActualizați aplicația la cea mai recentă versiune, după care încercați din nou.</string>
|
||||
<string name="mailbox_qr_code_for_contact">Codul QR pe care l-ați scanat provine de la o Cutie poștală Briar.\n\nDacă doriți să conectați Cutia poștală, vă rugăm să mergeți în Setări > Cutie Poștală în meniul Briar..</string>
|
||||
<string name="qr_code_format_unknown">Codul QR pe care l-ați scanat nu este menit pentru a adăuga un contact Briar.\n\nVă rugăm să scanați codul QR afișat pe ecranul contactului dumneavoastră.</string>
|
||||
<string name="camera_error">Eroare cameră</string>
|
||||
<string name="connecting_to_device">Se conectează la dispozitiv\u2026</string>
|
||||
<string name="authenticating_with_device">Se realizează autentificarea cu dispozitivul\u2026</string>
|
||||
<string name="connection_error_title">Nu a fost posibilă conectarea cu contactul dvs.</string>
|
||||
<string name="connection_error_feedback">Dacă problema persistă, <a href="feedback">trimiteți feedback</a> pentru a ne ajuta să îmbunătățim aplicația.</string>
|
||||
<string name="info_both_must_scan">Trebuie să scanați amândoi codurile QR ale celuilalt.</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">Adăugați contact de la distanță</string>
|
||||
<string name="add_contact_nearby_title">Adaugă un contact din apropiere</string>
|
||||
@@ -307,6 +312,7 @@
|
||||
<string name="different_person_button">Persoană diferită</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s și %2$sv-au trimis același link.\n\nUna dintre aceste persoane ar putea încerca să afle cine sunt contactele dvs.\n\nNu îi spuneți că ați primit același link de la altcineva.</string>
|
||||
<string name="pending_contact_updated_toast">Contact în așteptare actualizat</string>
|
||||
<string name="info_both_must_enter_links">Amândoi trebuie să adăugați linkurile celuilalt</string>
|
||||
<!--Peer trust levels-->
|
||||
<string name="peer_trust_level_unverified">Contact neverificat</string>
|
||||
<string name="peer_trust_level_verified">Contact verificat</string>
|
||||
@@ -340,6 +346,7 @@
|
||||
<string name="connect_via_bluetooth_intro">În cazul în care conexiunile Bluetooth nu funcționează automat, puteți utiliza acest ecran pentru a vă conecta manual.\n\nContactul trebuie să fie în apropiere pentru ca procedura să funcționeze.\n\nDvs. și contactul trebuie să apăsați pe „Start” simultan.</string>
|
||||
<string name="connect_via_bluetooth_already_discovering">Încercați deja să vă conectați prin Bluetooth. Încercați din nou în scurt timp.</string>
|
||||
<string name="connect_via_bluetooth_no_location_permission">Nu se poate continua fără a permite accesul la locație</string>
|
||||
<string name="connect_via_bluetooth_no_bluetooth_permission">Nu se poate continua fără permisiunea dispozitivelor din apropiere</string>
|
||||
<string name="connect_via_bluetooth_start">Se conectează prin Bluetooth...</string>
|
||||
<string name="connect_via_bluetooth_success">Conectare reușită prin Bluetooth</string>
|
||||
<string name="connect_via_bluetooth_error">Nu s-a reușit conectarea prin Bluetooth.</string>
|
||||
@@ -603,9 +610,13 @@
|
||||
<string name="mailbox_setup_download_link">Partajați linkul de descărcare</string>
|
||||
<string name="mailbox_setup_button_scan">Scanați codul QR al cutiei poștale</string>
|
||||
<string name="permission_camera_qr_denied_body">Ați refuzat accesul la cameră, dar scanarea unui cod QR necesită utilizarea camerei.\n\nLuați în considerare acordarea accesului.</string>
|
||||
<string name="mailbox_setup_connecting">Se conectează...</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Cod QR greșit</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Codul scanat nu este valid. Deschideți aplicația de cutie poștală Briar pe dispozitivul pe care este instalată și scanați codul QR pe care îl afișează.</string>
|
||||
<string name="mailbox_setup_connecting">Se conectează la Cutia poștală…</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_connecting_info">Asta ar putea dura până la %1s</string>
|
||||
<string name="mailbox_qr_code_too_old">Codul QR pe care l-ați scanat provine de la o versiune de Cutie poștală Briar mai veche.\n\nActualizați Cutia poștală la cea mai recentă versiune, după care încercați din nou.</string>
|
||||
<string name="mailbox_qr_code_too_new">Codul QR pe care l-ați scanat provine de la o versiune de Cutie poștală Briar mai nouă.\n\nActualizați Briar la cea mai recentă versiune, după care încercați din nou.</string>
|
||||
<string name="contact_qr_code_for_mailbox">Codul QR pe care l-ați scanat este pentru a adăuga un contact Briar.\n\nDacă doriți să adăugați un contact, vă rugăm să mergeți la lista de contacte și să apăsați +.</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Codul QR pe care l-ați scanat nu provine de la o Cutie poștală Briar.\n\nVă rugăm să deschideți aplicația de Cutie poștală Briar pe dispozitivul pe care este instalată și scanați codul QR pe care îl afișează.</string>
|
||||
<string name="mailbox_setup_already_paired_title">Cutia poștală este deja conectată</string>
|
||||
<string name="mailbox_setup_already_paired_description">Anulați conectarea cutiei poștale la celălalt dispozitiv și încercați din nou.</string>
|
||||
<string name="mailbox_setup_io_error_title">Nu s-a reușit conectarea</string>
|
||||
@@ -742,11 +753,17 @@
|
||||
<string name="permission_location_request_body">Pentru a putea descoperi dispozitive Bluetooth, Briar are nevoie de permisiunea de a accesa locația dvs.\n\nBriar nu stochează locația dvs. și nici nu o partajează cu nimeni. </string>
|
||||
<string name="permission_camera_location_title">Cameră foto și locație</string>
|
||||
<string name="permission_camera_location_request_body">Pentru a scana codul QR, Briar are nevoie de acces la camera foto.\n\nPentru a putea descoperi dispozitive Bluetooth, Briar are nevoie de permisiunea de acces la locația dvs.\n\nBriar nu stochează locația dvs. și nici nu o partajează cu nimeni.</string>
|
||||
<string name="permission_camera_bluetooth_title">Camera și dispozitivele din apropiere</string>
|
||||
<string name="permission_camera_bluetooth_request_body">Pentru a scana codul QR, Briar are nevoie de acces la camera foto.\n\nPentru a descoperi dispozitive Bluetooth, Briar are nevoie de permisiunea de a găsi și de a se conecta la dispozitivele din apropiere.</string>
|
||||
<string name="permission_camera_denied_body">Ați refuzat accesul la camera foto, dar folosirea acesteia este obligatorie pentru a adăuga contacte.\n\nVă rugăm să luați în considerare acordarea accesului.</string>
|
||||
<string name="permission_location_denied_body">Ați refuzat accesul la locație, dar Briar are nevoie de această permisiune pentru a descoperi dispozitive Bluetooth.\n\nVă rugăm să luați în considerare acordarea accesului.</string>
|
||||
<string name="permission_location_setting_title">Setări privind locația</string>
|
||||
<string name="permission_location_setting_body">Funcția de locație a dispozitivului dvs. trebuie să fie activată pentru a găsi alte dispozitive prin Bluetooth. Activați locația pentru a continua. Puteți să o dezactivați din nou ulterior.</string>
|
||||
<string name="permission_location_setting_hotspot_body">Setarea de localizare a dispozitivului dumneavoastră trebuie să fie activată pentru a crea un hotspot Wi-Fi. Vă rugăm să activați localizarea pentru a continua. Puteți să o dezactivați din nou după aceea.</string>
|
||||
<string name="permission_location_setting_button">Activați locația</string>
|
||||
<string name="permission_bluetooth_title">Permisiunea dispozitivelor apropiate</string>
|
||||
<string name="permission_bluetooth_body">Pentru a utiliza comunicarea Bluetooth, Briar are nevoie de permisiunea de a găsi și de a se conecta la dispozitivele din apropiere.</string>
|
||||
<string name="permission_bluetooth_denied_body">Ați refuzat accesul la dispozitivele din apropiere, dar Briar are nevoie de această permisiune pentru a utiliza Bluetooth.\n\nVă rugăm să luați în considerare acordarea accesului.</string>
|
||||
<string name="qr_code">Cod QR</string>
|
||||
<string name="show_qr_code_fullscreen">Afișați codul QR pe tot ecranul</string>
|
||||
<!--App Locking-->
|
||||
@@ -769,7 +786,9 @@
|
||||
<string name="hotspot_notification_title">Se partajează Brian offline</string>
|
||||
<string name="hotspot_button_connected">Înainte</string>
|
||||
<string name="permission_hotspot_location_request_body">Pentru a crea un hotspot Wi-Fi, Briar are nevoie de permisiunea de a accesa locația dvs.\n\nBriar nu stochează locația dvs. și nici nu o partajează cu nimeni.</string>
|
||||
<string name="permission_hotspot_location_request_precise_body">Pentru a crea un hotspot Wi-Fi, Briar are nevoie de permisiunea de a accesa locația dumneavoastră exactă.\n\nBriar nu stochează locația dumneavoastră și nu o împărtășește cu nimeni.</string>
|
||||
<string name="permission_hotspot_location_denied_body">Ați refuzat accesul la locație, dar Briar are nevoie de această permisiune pentru a crea un hotspot Wi-Fi.\n\nVă rugăm să luați în considerare acordarea accesului.</string>
|
||||
<string name="permission_hotspot_location_denied_precise_body">Ați refuzat accesul la locația dumneavoastră exactă, dar Briar are nevoie de această permisiune pentru a crea un hotspot Wi-Fi.Vă rugăm să luați în considerare acordarea accesului.</string>
|
||||
<string name="wifi_settings_title">Se setează Wi-Fi</string>
|
||||
<string name="wifi_settings_request_enable_body">Pentru a crea un hotspot Wi-Fi, Briar trebuie să folosească Wi-Fi. Vă rugăm să activați funcția.</string>
|
||||
<string name="hotspot_tab_manual">Manual</string>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<string name="setup_name_explanation">Ваш псевдоним будет отображаться рядом с любым размещаемым вами контентом. Его нельзя изменить после создания аккаунта.</string>
|
||||
<string name="setup_next">Вперед</string>
|
||||
<string name="setup_password_intro">Придумайте пароль</string>
|
||||
<string name="setup_password_explanation">Ваш аккаунт Briar хранится в зашифрованном виде только на устройстве. Если вы забудете свой пароль или удалите Briar, то не сможете восстановить свою учетную запись.\n\nПридумайте длинный пароль, который трудно угадать, например четыре случайных слова или десять случайных букв, цифр и символов.</string>
|
||||
<string name="setup_password_explanation">Аккаунт Briar хранится в зашифрованном виде только на устройстве. Если вы забудете свой пароль или удалите Briar, восстановить аккаунт будет невозможно.\n\nПридумайте длинный пароль, который трудно угадать, например четыре случайных слова или десять случайных букв, цифр и символов.</string>
|
||||
<string name="dnkm_doze_intro">Для получения сообщений Briar должен работать в фоновом режиме.</string>
|
||||
<string name="dnkm_doze_explanation">Для получения сообщений Briar должен работать в фоновом режиме. Отключите оптимизацию электропитания для Briar.</string>
|
||||
<string name="choose_nickname">Придумайте псевдоним</string>
|
||||
@@ -14,7 +14,7 @@
|
||||
<string name="name_too_long">Слишком длинное имя</string>
|
||||
<string name="password_too_weak">Пароль слишком слабый</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="don_t_ask_again">Больше не спрашивать</string>
|
||||
<string name="dnkm_huawei_protected_text">Нажмите кнопку ниже и убедитесь, что Briar отображается на экране защищенных приложений.</string>
|
||||
@@ -38,11 +38,11 @@
|
||||
<string name="sign_in_button">Войти</string>
|
||||
<string name="forgotten_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_activity_title">Сбой при запуске Briar</string>
|
||||
<string name="startup_failed_clock_error">Briar не удалось запустить, поскольку время на устройстве выставлено некорректно.\n\nПожалуйста, установите правильное время на часах вашего устройства и повторите попытку.</string>
|
||||
<string name="startup_failed_db_error">Briar не смог открыть базу данных, содержащую вашу учетную запись, контакты и сообщения.\n\nПожалуйста, обновите приложение до последней версии и повторите попытку, или создайте новую учетную запись, выбрав \'Я забыл пароль\' в подсказке пароля.</string>
|
||||
<string name="startup_failed_data_too_old_error">Ваша учетная запись была создана в старой версии этого приложения и не может быть открыта в текущей версии.\n\nНеобходимо либо повторно установить старую версию, либо создать новую учетную запись, выбрав \'Я забыл пароль\' в подсказке пароля.</string>
|
||||
<string name="startup_failed_db_error">Briar не смог открыть базу данных, содержащую ваш аккаунт, контакты и сообщения.\n\nПожалуйста, обновите приложение до последней версии и повторите попытку, или создайте новый аккаунт, выбрав \'Я забыл пароль\' в подсказке пароля.</string>
|
||||
<string name="startup_failed_data_too_old_error">Ваш аккаунт был создан в старой версии Briar, поэтому открыть его в этой версии приложения не удастся.\n\nВам необходимо либо установить старую версию, либо создать новый аккаунт, выбрав \'я забыл свой пароль\' на этапе авторизации в приложении.</string>
|
||||
<string name="startup_failed_data_too_new_error">Ваш аккаунт был создан в более новой версии этого приложения и не может быть открыт в текущей версии.\n\nПожалуйста, обновите приложение до последней версии и повторите попытку.</string>
|
||||
<string name="startup_failed_service_error">Briar не смог запустить необходимый компонент.\n\nПожалуйста, обновите приложение до последней версии и повторите попытку.</string>
|
||||
<plurals name="expiry_warning">
|
||||
@@ -55,11 +55,11 @@
|
||||
<item quantity="one">Android 4 больше не поддерживается. Briar перестанет работать на %s (через %d день). Пожалуйста, установите Briar на более современное устройство и создайте новую учетную запись.</item>
|
||||
<item quantity="few">Android 4 больше не поддерживается. Briar перестанет работать на %s (через %d дня). Пожалуйста, установите Briar на более современное устройство и создайте новую учетную запись.</item>
|
||||
<item quantity="many">Android 4 больше не поддерживается. Briar перестанет работать на %s (через %d дней). Пожалуйста, установите Briar на более современное устройство и создайте новую учетную запись.</item>
|
||||
<item quantity="other">Android 4 больше не поддерживается. Briar перестанет работать на %s (через %d дней). Пожалуйста, установите Briar на более современное устройство и создайте новую учетную запись.</item>
|
||||
<item quantity="other">Android 4 больше не поддерживается. Briar перестанет работать на %s (через %d дней). Пожалуйста, установите Briar на более современное устройство и создайте новый аккаунт.</item>
|
||||
</plurals>
|
||||
<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="old_android_expiry_date_reached">Briar больше не работает на Android 4.\nПожалуйста, установите Briar на более современное устройство.</string>
|
||||
<string name="old_android_delete_account">Вы можете нажать кнопку ниже, чтобы удалить свой аккаунт с этого устройства.</string>
|
||||
@@ -255,6 +255,8 @@
|
||||
<string name="qr_code_invalid">Неверный QR-код</string>
|
||||
<string name="qr_code_too_old_1">QR-код, который вы сосканировали, сгенерирован в старой версии Briar.\n\nПопросите вашего собеседника обновиться до последней версии и повторите попытку.</string>
|
||||
<string name="qr_code_too_new_1">QR-код, который вы сосканировали, сгенерирован в новой версии Briar.\n\nОбновите приложение до последней версии и повторите попытку.</string>
|
||||
<string name="mailbox_qr_code_for_contact">QR-код, который вы сосканировали, получен из Briar Mailbox.\n\nЕсли вы хотите связать Mailbox, пожалуйста, выберите Настройки > Mailbox в меню Briar.</string>
|
||||
<string name="qr_code_format_unknown">QR-код, который вы сосканировали, не предназначен для добавления контакта Briar.\n\nПожалуйста, сосканируйте QR-код, показанный на экране вашего контакта.</string>
|
||||
<string name="camera_error">Ошибка камеры</string>
|
||||
<string name="connecting_to_device">Подключение к устройству\u2026</string>
|
||||
<string name="authenticating_with_device">Аутентификация с устройством\u2026</string>
|
||||
@@ -274,7 +276,7 @@
|
||||
<string name="send_link_title">Обмен ссылками</string>
|
||||
<string name="add_contact_choose_nickname">Выберите псевдоним</string>
|
||||
<string name="add_contact_choose_a_nickname">Введите псевдоним</string>
|
||||
<string name="nickname_intro">Задайте этому контакту псевдоним. Его можете видеть только вы.</string>
|
||||
<string name="nickname_intro">Задайте этому контакту псевдоним. Его сможете видеть только вы.</string>
|
||||
<string name="your_link">Передайте эту ссылку контакту, который вы хотите добавить.</string>
|
||||
<string name="link_clip_label">Ссылка Briar</string>
|
||||
<string name="link_copied_toast">Ссылка скопирована</string>
|
||||
@@ -457,6 +459,10 @@
|
||||
<string name="forum_declined_toast">Приглашение отклонено</string>
|
||||
<string name="shared_by_format">Совместно %s</string>
|
||||
<string name="forum_invitation_already_sharing">Уже поделился(-лась)</string>
|
||||
<string name="forum_invitation_already_invited">Приглашение уже отправлено</string>
|
||||
<string name="forum_invitation_invite_received">Приглашение уже получено</string>
|
||||
<string name="forum_invitation_not_supported">Не поддерживается этим контактом</string>
|
||||
<string name="forum_invitation_error">Ошибка. Это программная ошибка, а не ваша вина</string>
|
||||
<string name="forum_invitation_response_accepted_sent">Вы приняли приглашение на форум от %s.</string>
|
||||
<string name="forum_invitation_response_declined_sent">Вы отклонили приглашение на форум от %s.</string>
|
||||
<string name="forum_invitation_response_declined_auto">Приглашение на форум от %s было отклонено автоматически.</string>
|
||||
@@ -589,7 +595,7 @@
|
||||
<string name="panic_setting_signout_title">Выйти</string>
|
||||
<string name="panic_setting_signout_summary">Выйти из Briar, если нажата тревожная кнопка</string>
|
||||
<string name="purge_setting_title">Удалить аккаунт</string>
|
||||
<string name="purge_setting_summary">Удалить вашу учетную запись Briar при нажатии тревожной кнопки. Внимание: это необратимо удалит ваши идентификаторы, контакты и сообщения</string>
|
||||
<string name="purge_setting_summary">Удалить ваш аккаунт Briar при нажатии тревожной кнопки. Внимание: это необратимо удалит ваши идентификаторы, контакты и сообщения</string>
|
||||
<!--Settings Notifications-->
|
||||
<string name="notification_settings_title">Уведомления</string>
|
||||
<string name="notify_sign_in_title">Напомнить мне войти</string>
|
||||
@@ -622,9 +628,13 @@
|
||||
<string name="mailbox_setup_download_link">Поделиться ссылкой на загрузку</string>
|
||||
<string name="mailbox_setup_button_scan">Сканирование QR-кода Mailbox</string>
|
||||
<string name="permission_camera_qr_denied_body">Вы запретили доступ к камере, однако сканирование QR-кода требует использования камеры.\n\nПожалуйста, рассмотрите возможность предоставления доступа.</string>
|
||||
<string name="mailbox_setup_connecting">Соединение...</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Неправильный QR-код</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Отсканированный код недействителен. Пожалуйста, откройте приложение Briar Mailbox на вашем устройстве и просканируйте представленный QR-код.</string>
|
||||
<string name="mailbox_setup_connecting">Подключение к Mailbox…</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_connecting_info">Это может занять до %1s</string>
|
||||
<string name="mailbox_qr_code_too_old">QR-код, который вы сосканировали, получен из старой версии Briar Mailbox.\n\nПожалуйста, обновите Briar Mailbox до последней версии и повторите попытку.</string>
|
||||
<string name="mailbox_qr_code_too_new">QR-код, который вы сосканировали, получен из более новой версии Briar Mailbox.\n\nПожалуйста, обновите Briar до последней версии и повторите попытку.</string>
|
||||
<string name="contact_qr_code_for_mailbox">QR-код, который вы сосканировали, предназначен для добавления контакта Briar.\n\nЕсли вы хотите добавить контакт, перейдите в список контактов и нажмите на значок +.</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">QR-код, который вы сосканировали, получен не от Briar Mailbox.\n\nПожалуйста, откройте приложение Briar Mailbox на вашем устройстве Mailbox и сосканируйте представленный QR-код.</string>
|
||||
<string name="mailbox_setup_already_paired_title">Maibox уже связан</string>
|
||||
<string name="mailbox_setup_already_paired_description">Отвяжите Mailbox на другом устройстве и повторите попытку.</string>
|
||||
<string name="mailbox_setup_io_error_title">Не удалось подключиться</string>
|
||||
|
||||
@@ -238,6 +238,8 @@ dhe s’mund të hapet me këtë version.\n\nJu lutemi, përmirësojeni me versi
|
||||
<string name="qr_code_invalid">Kodi QR është i pavlefshëm</string>
|
||||
<string name="qr_code_too_old_1">Kodi QR që keni skanuar vjen prej një versioni të vjetër të Briar-it.\n\nJu lutemi, kërkojini kontaktit tuaj ta përmirësojë me versionin më të ri dhe mandej riprovoni.</string>
|
||||
<string name="qr_code_too_new_1">Kodi QR që keni skanuar vjen prej një versioni më të ri të Briar-it.\n\nJu lutemi, përmirësojeni me versionin më të ri dhe mandej riprovoni.</string>
|
||||
<string name="mailbox_qr_code_for_contact">Kodi QR që keni skanuar vjen prej Kutisë Postare të Briar-it.\n\nNëse doni një lidhje për te Kutia Postare, ju lutemi, zgjidhni Rregullime > Kuti Postare, që nga menuja e Briar-it.</string>
|
||||
<string name="qr_code_format_unknown">Kodi QR që keni skanuar s’është menduar për shtim të një kontakti Briar.\n\nJu lutemi, skanoni kodin QR të shfaqur te ekrani i kontaktit tuaj.</string>
|
||||
<string name="camera_error">Gabim kamere</string>
|
||||
<string name="connecting_to_device">Po lidhet me pajisjen\u2026</string>
|
||||
<string name="authenticating_with_device">Po bëhet mirëfilltësimi me pajisjen\u2026</string>
|
||||
@@ -432,6 +434,10 @@ dhe s’mund të hapet me këtë version.\n\nJu lutemi, përmirësojeni me versi
|
||||
<string name="forum_declined_toast">Ftesa u hodh poshtë</string>
|
||||
<string name="shared_by_format">Ndarë nga %s</string>
|
||||
<string name="forum_invitation_already_sharing">Ndarë tashmë</string>
|
||||
<string name="forum_invitation_already_invited">Ftesë e dërguar tashmë</string>
|
||||
<string name="forum_invitation_invite_received">Ftesë e marrë tashmë</string>
|
||||
<string name="forum_invitation_not_supported">Nuk mbulohet prej këtij kontakti</string>
|
||||
<string name="forum_invitation_error">Gabim. Kjo është një e metë dhe jo për fajin tuaj</string>
|
||||
<string name="forum_invitation_response_accepted_sent">Pranuat ftesën e forumit nga %s.</string>
|
||||
<string name="forum_invitation_response_declined_sent">Hodhët poshtë ftesën e forumit nga %s.</string>
|
||||
<string name="forum_invitation_response_declined_auto">Ftesa për në forum nga %s u hodh poshtë automatikisht.</string>
|
||||
@@ -595,9 +601,13 @@ dhe s’mund të hapet me këtë version.\n\nJu lutemi, përmirësojeni me versi
|
||||
<string name="mailbox_setup_download_link">Ndani Lidhje Shkarkimi</string>
|
||||
<string name="mailbox_setup_button_scan">Skanoni kod QR Kutie postare</string>
|
||||
<string name="permission_camera_qr_denied_body">Keni mohuar hyrjen te kamera, por skanimi i një kodi QR lyp përdorimin e kamerës.\n\nJu lutemi, shihni mundësinë e dhënies së hyrjes.</string>
|
||||
<string name="mailbox_setup_connecting">Po lidhjet…</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Kod QR i gabuar</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Kodi i skanuar është i pavlefshëm. Ju lutemi, hapni aplikacionin Kuti Postare Briar në pajisjen tuaj me Kutinë Postare dhe skanoni kodin QR që paraqitet.</string>
|
||||
<string name="mailbox_setup_connecting">Po bëhet lidhja me Kutinë postare…</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_connecting_info">Kjo mund të dojë deri në %1s</string>
|
||||
<string name="mailbox_qr_code_too_old">Kodi QR që keni skanuar vjen prej një versioni të vjetër të Kutisë Postare të Briar-it.\n\nJu lutemi, përditësojeni Kutinë Postare të Briar-it me versionin më të ri dhe mandej riprovoni.</string>
|
||||
<string name="mailbox_qr_code_too_new">Kodi QR që keni skanuar vjen prej një versioni më të ri të Kutisë Postare të Briar-it.\n\nJu lutemi, përmirësojeni Briar-in me versionin më të ri dhe mandej riprovoni.</string>
|
||||
<string name="contact_qr_code_for_mailbox">Kodi QR që keni skanuar është për shtim të një kontakti Briar.\n\nNëse doni të shtoni një kontakt, ju lutemi, kaloni te lista e kontakteve dhe prekni ikonën +.</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Kodi QR që keni skanuar s’vjen prej Kutisë Postare të Briar-it.\n\nJu lutemi, hapni aplikacionin Kuti Postare Briar në pajisjen tuaj me Kutinë Postare dhe skanoni kodin QR që paraqitet.</string>
|
||||
<string name="mailbox_setup_already_paired_title">Kuti postare tashmë e lidhur</string>
|
||||
<string name="mailbox_setup_already_paired_description">Shkëputeni Kutinë postare në pajisjen tuaj tjetër dhe riprovoni.</string>
|
||||
<string name="mailbox_setup_io_error_title">S’u bë dot lidhje</string>
|
||||
|
||||
@@ -590,9 +590,7 @@ Vänlige installera Briar på en nyare enhet.</string>
|
||||
<string name="mailbox_setup_download_link">Dela hämtningslänk</string>
|
||||
<string name="mailbox_setup_button_scan">Skanna Mailbox QR-kod</string>
|
||||
<string name="permission_camera_qr_denied_body">Du har nekat åtkomst till kameran, men att skanna en QR-kod kräver användning av kameran.\n\nÖverväg att bevilja tillstånd.</string>
|
||||
<string name="mailbox_setup_connecting">Ansluter...</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Felaktig QR-kod</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Den skannade koden är ogiltig. Öppna Briar Mailbox-appen på din Mailbox-enhet och skanna QR-koden som visas.</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_already_paired_title">Mailbox redan länkad</string>
|
||||
<string name="mailbox_setup_already_paired_description">Avlänka Mailbox på din andra enhet och försök igen.</string>
|
||||
<string name="mailbox_setup_io_error_title">Kunde inte ansluta</string>
|
||||
|
||||
@@ -313,6 +313,10 @@
|
||||
<string name="duplicate_link_dialog_text_3">%1$s та %2$s надіслали вам однакові посилання.\n\nХтось із них, можливо, намагається виявити ваші контакти.\n\nНе кажіть їм, що вже отримували це посилання від когось іще.</string>
|
||||
<string name="pending_contact_updated_toast">Оновлено нерозглянутий контакт</string>
|
||||
<!--Peer trust levels-->
|
||||
<string name="peer_trust_level_unverified">Неперевірений контакт</string>
|
||||
<string name="peer_trust_level_verified">Перевірений контакт</string>
|
||||
<string name="peer_trust_level_ourselves">Я</string>
|
||||
<string name="peer_trust_level_stranger">Чужинець</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Поділитися своїми контактами</string>
|
||||
<string name="introduction_onboarding_text">Представте свої контакти навзаєм, щоб вони могли спілкуватись у Briar.</string>
|
||||
@@ -341,6 +345,7 @@
|
||||
<string name="connect_via_bluetooth_intro">Якщо Bluetooth-з\'єднання не спрацьовують автоматично, можете з\'єднатися вручну на цьому екрані.\n\nВаш контакт має бути поруч, щоб це спрацювало.\n\nВам обом слід одночасно натиснути «Почати».</string>
|
||||
<string name="connect_via_bluetooth_already_discovering">Спроба Bluetooth-з\'єднання вже триває. Повторіть трохи пізніше.</string>
|
||||
<string name="connect_via_bluetooth_no_location_permission">Не вдається продовжити без дозволу на отримання місцезнаходження</string>
|
||||
<string name="connect_via_bluetooth_no_bluetooth_permission">Неможливо продовжите без дозволу пристроїв поблизу</string>
|
||||
<string name="connect_via_bluetooth_start">Триває Bluetooth-з\'єднання...</string>
|
||||
<string name="connect_via_bluetooth_success">Bluetooth-з\'єднання успішне</string>
|
||||
<string name="connect_via_bluetooth_error">Не вдалося з\'єднатися через Bluetooth.</string>
|
||||
@@ -443,6 +448,10 @@
|
||||
<string name="forum_declined_toast">Запрошення було відхилено</string>
|
||||
<string name="shared_by_format">Поширено %s</string>
|
||||
<string name="forum_invitation_already_sharing">Вже поширюється</string>
|
||||
<string name="forum_invitation_already_invited">Запрошення вже відправлене</string>
|
||||
<string name="forum_invitation_invite_received">Запрошення вже отримано</string>
|
||||
<string name="forum_invitation_not_supported">Не підтримується цим контактом</string>
|
||||
<string name="forum_invitation_error">Помилка. Це збій програми, а не ваша провина</string>
|
||||
<string name="forum_invitation_response_accepted_sent">Ви прийняли запрошення до форуму від %s.</string>
|
||||
<string name="forum_invitation_response_declined_sent">Ви відхилили запрошення до форуму від %s.</string>
|
||||
<string name="forum_invitation_response_declined_auto">Запрошення до форуму від %s відхилено автоматично.</string>
|
||||
@@ -608,9 +617,8 @@
|
||||
<string name="mailbox_setup_download_link">Поширити посилання на завантаження</string>
|
||||
<string name="mailbox_setup_button_scan">Сканувати QR-код Mailbox</string>
|
||||
<string name="permission_camera_qr_denied_body">Ви заборонили доступ до камери, але камера потрібна для сканування QR-коду.\n\nБудь ласка, надайте доступ.</string>
|
||||
<string name="mailbox_setup_connecting">Під\'єднання...</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Хибний QR-код</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">Проскановано хибний код. Будь ласка, відкрийте застосунок Briar Mailbox на своєму Mailbox-пристрої та проскануйте показаний ним QR-код.</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_connecting_info">Це може зайняти до %1s</string>
|
||||
<string name="mailbox_setup_already_paired_title">Mailbox уже під\'єднано</string>
|
||||
<string name="mailbox_setup_already_paired_description">Від\'єднайте Mailbox від свого іншого пристрою й повторіть спробу.</string>
|
||||
<string name="mailbox_setup_io_error_title">Не вдалося з\'єднатися</string>
|
||||
@@ -629,19 +637,39 @@
|
||||
<string name="mailbox_status_connected_title">Mailbox працює</string>
|
||||
<string name="mailbox_status_problem_title">Не вдається з\'єднати Briar із Mailbox</string>
|
||||
<string name="mailbox_status_failure_title">Mailbox недоступна</string>
|
||||
<string name="mailbox_status_app_too_old_title">Версія Briar занадто стара</string>
|
||||
<string name="mailbox_status_app_too_old_message">Оновіть Briar до найновішої версії та спробуйте ще.</string>
|
||||
<string name="mailbox_status_mailbox_too_old_title">Версія потової скриньки занадто стара</string>
|
||||
<string name="mailbox_status_check_button">Перевірити з\'єднання</string>
|
||||
<!--Example for string substitution: Last connection: 3min ago-->
|
||||
<string name="mailbox_status_connected_info">З\'єднання було: %s</string>
|
||||
<!--Indicates that there never was a connection to the mailbox. Last connection: Never-->
|
||||
<string name="mailbox_status_connected_never">Ніколи</string>
|
||||
<string name="mailbox_status_unlink_button">Від\'єднати</string>
|
||||
<string name="mailbox_status_unlink_dialog_title">Від\'єднати потову скриньку?</string>
|
||||
<string name="mailbox_status_unlink_dialog_question">Ви впевнені що хочете від\'єднати поштову скриньку?</string>
|
||||
<string name="mailbox_status_unlink_dialog_warning">Якщо ви від\'єднаєте вашу поштову скриньку, ви не зможете отримувати повідомлення поки Briar не на зв\'язку</string>
|
||||
<string name="mailbox_status_unlink_no_wipe_title">Ваша поштова скринька від\'єднана</string>
|
||||
<string name="mailbox_status_unlink_success">Ваша поштова скринька від\'єднана</string>
|
||||
<string name="mailbox_error_notification_channel_title">Проблема з поштовою скринькою Briar</string>
|
||||
<string name="mailbox_error_notification_title">Поштова скринька Briar не доступна</string>
|
||||
<string name="mailbox_error_notification_text">Натисніть щоб виправити проблему</string>
|
||||
<string name="mailbox_error_wizard_button">Виправити проблему</string>
|
||||
<string name="mailbox_error_wizard_question1">Ви маєте доступ до вашого пристрою Mailbox?</string>
|
||||
<string name="mailbox_error_wizard_answer1_1">Я бачу вказівки щодо налаштування Mailbox</string>
|
||||
<string name="mailbox_error_wizard_answer1_2">Я бачу QR-код</string>
|
||||
<string name="mailbox_error_wizard_info2">Будь ласка повертайтесь до цього екрану коли у вас буде доступ до пристрою</string>
|
||||
<!--About-->
|
||||
<string name="about_title">Про</string>
|
||||
<string name="briar_version">Версія Briar %s</string>
|
||||
<string name="tor_version">Версія Tor %s</string>
|
||||
<string name="links">Посилання</string>
|
||||
<string name="briar_website">\u2022 <a href="">Вебсайт</a></string>
|
||||
<string name="briar_source_code">\u2022 <a href="">Вихідний код</a></string>
|
||||
<string name="briar_changelog">\u2022 <a href="">Список змін та доповнень</a></string>
|
||||
<string name="briar_privacy_policy">\u2022 <a href="">Політика конфіденційности</a></string>
|
||||
<!--Here translators can add their names or Transifex usernames(eg "Thanks to all the contributors at the Localization Lab, especially Tom, Matthew and Jerry")-->
|
||||
<string name="translator_thanks">Дякуємо всім хто вніс свій внесок у Localization Lab</string>
|
||||
<!--Conversation Settings-->
|
||||
<string name="disappearing_messages_title">Самознищувані повідомлення</string>
|
||||
<string name="disappearing_messages_explanation_long">Коли цей параметр увімкнено, нові
|
||||
@@ -673,6 +701,7 @@
|
||||
<string name="describe_crash">Опишіть, що сталося (за бажанням)</string>
|
||||
<string name="enter_feedback">Введіть свій відгук</string>
|
||||
<string name="optional_contact_email">Ваша електронна адреса (необов\'язково)</string>
|
||||
<string name="privacy_policy">Відправляючи нам дані ви погоджуєтесь з нашою <a href="">політикою конфіденційности</a></string>
|
||||
<string name="include_debug_report_crash">Додати анонімну інформацію про аварійний збій</string>
|
||||
<string name="include_debug_report_feedback">Додати анонімну інформацію про цей пристрій</string>
|
||||
<string name="dev_report_user_info">Користувацькі дані</string>
|
||||
@@ -708,11 +737,13 @@
|
||||
<string name="permission_location_request_body">Щоб знайти Bluetooth-пристрої, Briar потребує доступу до інформації про ваше місцезнаходження.\n\nBriar не зберігає дані про ваше місцезнаходження та не ділиться ні з ким цією інформацією.</string>
|
||||
<string name="permission_camera_location_title">Камера та місцезнаходження</string>
|
||||
<string name="permission_camera_location_request_body">Щоб відсканувати QR-код, Briar потребує доступу до камери.\n\nЩоб знайти Bluetooth-пристрої, Briar потребує доступу до інформації про ваше місцезнаходження.\n\nBriar не зберігає дані про ваше місцезнаходження та не ділиться ні з ким цією інформацією.</string>
|
||||
<string name="permission_camera_bluetooth_title">Камера та пристрої поблизу</string>
|
||||
<string name="permission_camera_denied_body">Ви відмовилися надати доступ до камери, але додавання контактів потребує використання камери.\n\nБудь ласка, подумайте про можливість надання доступу.</string>
|
||||
<string name="permission_location_denied_body">Ви заборонили доступ до місцеперебування, але Briar потребує цього доступу, щоб знаходити Bluetooth-пристрої.\n\nБудь ласка, надайте доступ.</string>
|
||||
<string name="permission_location_setting_title">Визначення місцеперебування</string>
|
||||
<string name="permission_location_setting_body">Ваш пристрій не дозволяє визначати місцеперебування, а це потрібно для знаходження інших пристроїв через Bluetooth. Будь ласка, увімкніть визначення місцеперебування, щоб продовжити. Згодом ви зможете знову його вимкнути.</string>
|
||||
<string name="permission_location_setting_button">Увімкнути визначення місцеперебування</string>
|
||||
<string name="permission_bluetooth_title">Дозволи на пристроях поблизу</string>
|
||||
<string name="qr_code">QR-код</string>
|
||||
<string name="show_qr_code_fullscreen">Вивести QR-код на весь екран</string>
|
||||
<!--App Locking-->
|
||||
@@ -759,6 +790,9 @@
|
||||
<string name="hotspot_manual_site_address">Адреса (URL)</string>
|
||||
<string name="hotspot_qr_site">Ваш телефон надає точку доступу Wi-Fi. З\'єднані з нею можуть завантажити Briar, просканувавши цей QR-код.</string>
|
||||
<!--e.g. Download Briar 1.2.20-->
|
||||
<string name="website_download_title_1">Завантаження Briar %s</string>
|
||||
<string name="website_download_intro_1">Хтось поблизу поділився з вами Briar.</string>
|
||||
<string name="website_download_button">Завантажити Briar</string>
|
||||
<string name="website_download_outro">Після завантаження, відкрийте завантажений файл і встановіть його.</string>
|
||||
<string name="website_troubleshooting_title">Виправлення неполадок</string>
|
||||
<string name="website_troubleshooting_1">Якщо не вдається завантажити застосунок, повторіть спробу іншим вебпереглядачем.</string>
|
||||
|
||||
@@ -20,13 +20,13 @@
|
||||
<string name="dnkm_huawei_protected_text">轻按下方的按钮将 Briar 加入“受保护的应用”列表。</string>
|
||||
<string name="dnkm_huawei_protected_button">保护 Briar</string>
|
||||
<string name="dnkm_huawei_protected_help">如果 Briar 未被加入受保护应用列表,它将无法在后台运行。</string>
|
||||
<string name="dnkm_huawei_app_launch_text">轻按下方按钮,打开“App launch”界面,确保 Briar 被设置为“手动管理”。</string>
|
||||
<string name="dnkm_huawei_app_launch_help">如果“App 启动”界面中 Briar 没有被设置为“手动管理”,则其将无法在后台运行。</string>
|
||||
<string name="dnkm_huawei_app_launch_text">轻按下方按钮,打开“应用启动管理”界面,确保 Briar 被设置为“手动管理”。</string>
|
||||
<string name="dnkm_huawei_app_launch_help">如果“应用启动管理”界面中 Briar 没有设置为“手动管理”,将无法在后台运行。</string>
|
||||
<string name="dnkm_xiaomi_text">要在后台运行,需将 Briar 锁定在最近的应用列表中。</string>
|
||||
<string name="dnkm_xiaomi_button">保护 Briar</string>
|
||||
<string name="dnkm_xiaomi_help">如果未将 Briar 锁定到最近的应用列表,它将无法在后台运行。</string>
|
||||
<string name="dnkm_xiaomi_dialog_body_old">1. 打开最近的应用列表(也称为应用切换器)\n\n2. 向下滑动 Briar 的图像,显示挂锁图标\n\n3.如果挂锁没有被锁上,轻按锁定它</string>
|
||||
<string name="dnkm_xiaomi_dialog_body_new">1. 打开最近的应用列表 (也称为应用切换器)\n\n2. 如果 Briar 名称边上有挂锁图片,那么你无需做任何事 \n\n3. 如果没有挂锁图片,按住 Briar 图片直到挂锁按钮出现,接着轻按它</string>
|
||||
<string name="dnkm_xiaomi_dialog_body_new">1. 打开最近的应用列表 (也称为应用切换器)\n\n2. 如果 Briar 名称边上有挂锁图标,那么您无需做任何事 \n\n3. 如果没有挂锁图标,按住 Briar 直到挂锁按钮出现,接着轻按它</string>
|
||||
<string name="dnkm_xiaomi_lock_apps_text">请轻按下方图片打开安全性设置。轻按 “提高速度”,接着轻按 “锁定应用”,并确保 Briar 状态被设为 “已锁定”</string>
|
||||
<string name="dnkm_xiaomi_lock_apps_help">如 Briar 未在“锁定应用”屏幕中被设为“已锁定”,它将无法在后台运行。</string>
|
||||
<string name="dnkm_warning_dozed_1">Briar 无法在后台运行</string>
|
||||
@@ -40,10 +40,10 @@
|
||||
<string name="dialog_title_lost_password">密码遗失</string>
|
||||
<string name="dialog_message_lost_password">您的 Briar 帐户被加密储存在您的设备上,而非云端,因此我们无法重置您的密码。您是否希望删除帐户,重新开始?\n\n注意:删除帐户将导致您的身份信息、联系人和消息永久丢失。</string>
|
||||
<string name="startup_failed_activity_title">Briar 启动失败</string>
|
||||
<string name="startup_failed_clock_error">无法启动 Briar,因为你设备的时间错误。\n\n请设置您的设备时钟到正确的时间,然后再试一次。</string>
|
||||
<string name="startup_failed_db_error">Bria r无法打开包含您的帐户、联系人和信息的数据库。\n\n请升级到最新版本再试一次,或者在密码提示时选择“我忘记密码”建立新账号。</string>
|
||||
<string name="startup_failed_data_too_old_error">您的帐户是用这个应用程序的旧版本创建的,不能用这个版本打开。\n\n你必须重新安装旧版本,或者在密码提示时选择“我忘记密码”,建立一个新帐户。</string>
|
||||
<string name="startup_failed_data_too_new_error">您的帐户是用这个应用程序的较新版本创建的,不能用这个版本打开。\n\n请升级到最新版本,然后重试。</string>
|
||||
<string name="startup_failed_clock_error">无法启动 Briar,因为设备的时钟错误。\n\n请将设备的时钟设置为正确的时间,然后重试。</string>
|
||||
<string name="startup_failed_db_error">Briar 无法打开包含您的帐户、联系人和信息的数据库。\n\n请升级到最新版本再试一次,或者在密码提示时选择“我忘记密码”建立新账号。</string>
|
||||
<string name="startup_failed_data_too_old_error">您的帐户是用此应用程序的旧版本创建的,不能用此版本打开。\n\n您必须重新安装旧版本,或者在密码提示时选择“我忘记密码”,建立一个新帐户。</string>
|
||||
<string name="startup_failed_data_too_new_error">您的帐户是用此应用程序的较新版本创建的,不能用此版本打开。\n\n请升级到最新版本,然后重试。</string>
|
||||
<string name="startup_failed_service_error">Briar 无法启动必需的组件。\n\n请升级到最新版并重新尝试。</string>
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="other">这是 Briar 的一个测试版本。您的帐户将在 %d 天后到期,且无法延期。</item>
|
||||
@@ -167,9 +167,9 @@
|
||||
<string name="set_contact_alias_hint">联系人姓名</string>
|
||||
<string name="menu_item_disappearing_messages">让消息自动消失 </string>
|
||||
<!--The first placeholder will show a duration like "7 days". The second placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_you_enabled">你的消息将在 %1$s 后消失。%2$s</string>
|
||||
<string name="auto_delete_msg_you_enabled">您的消息将在 %1$s 后消失。%2$s</string>
|
||||
<!--The placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_you_disabled">你的消息不会消失。%1$s</string>
|
||||
<string name="auto_delete_msg_you_disabled">您的消息不会消失。%1$s</string>
|
||||
<!--The first placeholder will show a contact's name. The second placeholder will show a duration like "7 days". The third placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_contact_enabled">%1$s的消息将在%2$s后消失。%3$s</string>
|
||||
<plurals name="duration_minutes">
|
||||
@@ -185,8 +185,8 @@
|
||||
<string name="auto_delete_msg_contact_disabled">%1$s的消息不会消失。%2$s</string>
|
||||
<string name="tap_to_learn_more">轻按了解更多</string>
|
||||
<string name="auto_delete_changed_warning_title">更改了让消息自动消失的设置</string>
|
||||
<string name="auto_delete_changed_warning_message_enabled">自你开始编辑你的消息,使消息消失的设置已经启用。</string>
|
||||
<string name="auto_delete_changed_warning_message_disabled">自你开始编辑你的消息,使消息消失的设置已经启用。 </string>
|
||||
<string name="auto_delete_changed_warning_message_enabled">因为您开始编写您的消息,已启用消息自动消失。</string>
|
||||
<string name="auto_delete_changed_warning_message_disabled">因为您开始编写您的消息,已关闭消息自动消失。</string>
|
||||
<string name="auto_delete_changed_warning_send">不论如何都要发送</string>
|
||||
<string name="delete_all_messages">删除全部消息</string>
|
||||
<string name="dialog_title_delete_all_messages">确认删除消息</string>
|
||||
@@ -217,7 +217,7 @@
|
||||
<string name="menu_contact">联系人</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">添加附近的联系人</string>
|
||||
<string name="add_contact_error_two_way">你和联系人互扫二维码了吗?</string>
|
||||
<string name="add_contact_error_two_way">您和联系人互扫二维码了吗?</string>
|
||||
<string name="face_to_face">您必须面对面添加联系人。\n\n这样将防止未来他人冒充您的身份并查看您的信息。</string>
|
||||
<string name="continue_button">继续</string>
|
||||
<string name="try_again_button">重试</string>
|
||||
@@ -226,14 +226,16 @@
|
||||
<string name="contact_added_toast">联系人已添加:%s</string>
|
||||
<string name="contact_already_exists">联系人 %s 已存在</string>
|
||||
<string name="qr_code_invalid">二维码无效</string>
|
||||
<string name="qr_code_too_old_1">你已扫描的二维码来自旧版本的 Briar 。\n\n请让你的联系人升级到最新版本,然后重试。</string>
|
||||
<string name="qr_code_too_new_1">你已扫描的二维码来自较新版本的 Briar。\n\n请升级到最新版本,然后重试。</string>
|
||||
<string name="qr_code_too_old_1">您扫描的二维码来自旧版本的 Briar。\n\n请让您的联系人升级到最新版本,然后重试。</string>
|
||||
<string name="qr_code_too_new_1">您扫描的二维码来自新版本的 Briar。\n\n请升级到最新版本,然后重试。</string>
|
||||
<string name="mailbox_qr_code_for_contact">你已经扫过的二维码来自 Briar Mailbox。\n\n如果你想链接一个 Mailbox,请从 Briar 菜单中选择设置> Mailbox</string>
|
||||
<string name="qr_code_format_unknown">你已经扫过的二维码不是用来添加 Briar 联系人的。\n\n请扫描显示在你联系人设备屏幕上的二维码。</string>
|
||||
<string name="camera_error">相机出错</string>
|
||||
<string name="connecting_to_device">正在连接至设备\u2026</string>
|
||||
<string name="authenticating_with_device">正在验证设备\u2026</string>
|
||||
<string name="connection_error_title">无法连接到您的联系人</string>
|
||||
<string name="connection_error_feedback">如果该问题仍存在,请 <a href="feedback">发送反馈</a> 帮助我们改善应用。</string>
|
||||
<string name="info_both_must_scan">你和联系人必须互扫二维码</string>
|
||||
<string name="info_both_must_scan">您和联系人必须互扫二维码</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">添加远处的联系人</string>
|
||||
<string name="add_contact_nearby_title">添加附近的联系人</string>
|
||||
@@ -288,9 +290,9 @@
|
||||
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-->
|
||||
<string name="different_person_button">不同的人</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s 和 %2$s 给你发送了同样的链接。\n\n其中一个人可能企图找出谁是你的联系人。\n\n 不要告诉他们你从其他人那里收到了相同的链接。</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s 和 %2$s 给您发送了相同的链接。\n\n其中一个人可能企图找出谁是您的联系人。\n\n 不要告诉他们您从其他人那里收到了相同的链接。</string>
|
||||
<string name="pending_contact_updated_toast">待处理联系人已更新</string>
|
||||
<string name="info_both_must_enter_links">你和联系人必须互相添加链接</string>
|
||||
<string name="info_both_must_enter_links">您和联系人必须互相添加链接</string>
|
||||
<!--Peer trust levels-->
|
||||
<string name="peer_trust_level_unverified">未验证的联系人</string>
|
||||
<string name="peer_trust_level_verified">已验证的联系人</string>
|
||||
@@ -298,7 +300,7 @@
|
||||
<string name="peer_trust_level_stranger">陌生人</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">介绍您的联系人</string>
|
||||
<string name="introduction_onboarding_text">向你的联系人互相介绍彼此,这样他们可以在 Briar 上建立联系</string>
|
||||
<string name="introduction_onboarding_text">介绍您的联系人互相认识,这样他们可以在 Briar 上建立联系。</string>
|
||||
<string name="introduction_menu_item">做介绍</string>
|
||||
<string name="introduction_activity_title">选择联系人</string>
|
||||
<string name="introduction_not_possible">您已将这两位联系人互相介绍过。请先等待该任务完成。如果您或您的联系人很少在线,这可能需要一些时间。</string>
|
||||
@@ -321,7 +323,7 @@
|
||||
<!--Connect via Bluetooth-->
|
||||
<string name="menu_item_connect_via_bluetooth">通过蓝牙连接</string>
|
||||
<string name="connect_via_bluetooth_title">通过蓝牙连接</string>
|
||||
<string name="connect_via_bluetooth_intro">如果蓝牙无法自动连接,您可以使用此界面进行手动连接。\n\n你的联系人需要在附近,这样才能工作。\n\n你和你的联系人应该同时按“开始。</string>
|
||||
<string name="connect_via_bluetooth_intro">如果蓝牙无法自动连接,您可以使用此界面进行手动连接。\n\n您的联系人需要在附近,这样才能工作。\n\n您和您的联系人应该同时按“开始”。</string>
|
||||
<string name="connect_via_bluetooth_already_discovering">已经在尝试通过蓝牙连接。请稍后再试</string>
|
||||
<string name="connect_via_bluetooth_no_location_permission">没有位置权限不能继续 </string>
|
||||
<string name="connect_via_bluetooth_no_bluetooth_permission">没有附近设备权限无法继续运行</string>
|
||||
@@ -418,6 +420,10 @@
|
||||
<string name="forum_declined_toast">邀请已谢绝</string>
|
||||
<string name="shared_by_format">由 %s 分享</string>
|
||||
<string name="forum_invitation_already_sharing">已在分享</string>
|
||||
<string name="forum_invitation_already_invited">邀请已发送</string>
|
||||
<string name="forum_invitation_invite_received">已收到邀请</string>
|
||||
<string name="forum_invitation_not_supported">不被此联系人所支持</string>
|
||||
<string name="forum_invitation_error">错误。这是一个故障,不是你的问题</string>
|
||||
<string name="forum_invitation_response_accepted_sent">您接受了来自 %s的论坛邀请</string>
|
||||
<string name="forum_invitation_response_declined_sent">您谢绝了来自 %s的论坛邀请</string>
|
||||
<string name="forum_invitation_response_declined_auto">来自 %s 的论坛邀请被自动拒绝了</string>
|
||||
@@ -579,10 +585,14 @@
|
||||
\n然后通过扫描邮箱应用显示的二维码将你的 Mailbox 与Briar 链接起来。</string>
|
||||
<string name="mailbox_setup_download_link">分享下载链接</string>
|
||||
<string name="mailbox_setup_button_scan">扫描 Mailbox 二维码</string>
|
||||
<string name="permission_camera_qr_denied_body">你拒绝了使用相机,但扫描二维码需要使用相机。\n\n请考虑授予访问权限。</string>
|
||||
<string name="mailbox_setup_connecting">连接中……</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">错误的二维码</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">扫描的代码无效。请在安装有 Mailbox 应用的设备上打开 Briar Mailbox 应用,并扫描它显示的二维码。</string>
|
||||
<string name="permission_camera_qr_denied_body">您拒绝了相机权限,但扫描二维码需要使用相机。\n\n请考虑授予访问权限。</string>
|
||||
<string name="mailbox_setup_connecting">正在连接到 Mailbox…</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_connecting_info">这可能最多需要 %1s 分钟</string>
|
||||
<string name="mailbox_qr_code_too_old">你已经扫过的二维码来自旧版本的 Briar Mailbox。\n\n请升级 Briar Mailbox 到最新版本后再试一次</string>
|
||||
<string name="mailbox_qr_code_too_new">你已经扫过的二维码来自新版本的 Briar Mailbox。\n\n请升级 Briar 到最新版本后再试一次。</string>
|
||||
<string name="contact_qr_code_for_mailbox">你已经扫过的二维码的用途是添加 Briar 联系人。\n\n如果你想添加联系人,请转到联系人列表,并轻按 + 图标。</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">你已经扫过的二维码不是来自 Briar Mailbox。\n\n请在装有 Mailbox 应用的设备商上打开 Briar Mailbox 并扫描该应用显示的二维码。</string>
|
||||
<string name="mailbox_setup_already_paired_title">Mailbox 已链接</string>
|
||||
<string name="mailbox_setup_already_paired_description">取消链接你其他设备上的 Mailbox 并重试。</string>
|
||||
<string name="mailbox_setup_io_error_title">无法连接</string>
|
||||
|
||||
@@ -1,47 +1,66 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<!--Setup-->
|
||||
<string name="setup_title">歡迎來到 Briar</string>
|
||||
<string name="setup_name_explanation">您的暱稱將顯示在您發佈的任何內容旁。暱稱在創建帳戶後將無法更改。</string>
|
||||
<string name="setup_next">下一步</string>
|
||||
<string name="setup_password_intro">設置密碼</string>
|
||||
<string name="setup_password_explanation">您的 Briar 帳戶被加密儲存在您的裝置上,而非在雲端。卸載 Briar 或忘記密碼將導致帳戶無法恢復。請設置不易被猜出的長密碼,比如四個隨機英文單詞,或是由隨機字母、數字和符號組成的十位字符。</string>
|
||||
<string name="dnkm_doze_title">背景網絡連接</string>
|
||||
<string name="dnkm_doze_intro">爲了接收消息,Briar 需要在後臺保持連接。</string>
|
||||
<string name="dnkm_doze_explanation">Briar 需要保持背景網絡連接去接收消息。爲此,請停用電量優化選項。</string>
|
||||
<string name="dnkm_doze_button">允許連接</string>
|
||||
<string name="choose_nickname">設置暱稱</string>
|
||||
<string name="choose_password">設置密碼</string>
|
||||
<string name="confirm_password">確認密碼</string>
|
||||
<string name="name_too_long">暱稱過長</string>
|
||||
<string name="password_too_weak">密碼不夠強</string>
|
||||
<string name="passwords_do_not_match">兩個密碼並不相同</string>
|
||||
<string name="create_account_button">創建帳戶</string>
|
||||
<string name="more_info">更多信息</string>
|
||||
<string name="don_t_ask_again">不再詢問</string>
|
||||
<string name="dnkm_huawei_protected_text">輕按下方的按鈕將 Briar 加入“受保護的程式”列表。</string>
|
||||
<string name="dnkm_huawei_protected_button">保護 Briar</string>
|
||||
<string name="dnkm_huawei_protected_help">如果 Briar 未被加入受保護程式列表,它將無法在背景運行。</string>
|
||||
<string name="dnkm_warning_dozed">%s 無法在背景運行。</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">密碼</string>
|
||||
<string name="try_again">密碼錯誤,請重試</string>
|
||||
<string name="sign_in_button">登錄</string>
|
||||
<string name="forgotten_password">我忘記了密碼</string>
|
||||
<string name="dialog_title_lost_password">忘記密碼</string>
|
||||
<string name="dialog_message_lost_password">您的 Briar 帳戶被加密儲存在您的裝置上,而非在雲端。因此我們無法重置您的密碼。您是否希望刪除帳戶,重新開始?\n\n注意:刪除帳戶將永久失去您以前的身份、聯絡人和訊息。</string>
|
||||
<string name="startup_failed_notification_title">Briar 無法啓動</string>
|
||||
<string name="startup_failed_notification_text">輕按查看更多信息。</string>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!--Setup-->
|
||||
<string name="setup_title">歡迎來到 Briar</string>
|
||||
<string name="setup_name_explanation">您的暱稱將顯示在您發佈的任何內容旁。暱稱在創建帳戶後將無法更改。</string>
|
||||
<string name="setup_next">下一步</string>
|
||||
<string name="setup_password_intro">設置密碼</string>
|
||||
<string name="setup_password_explanation">您的 Briar 帳戶被加密儲存在您的裝置上,而非在雲端。卸載 Briar 或忘記密碼將導致帳戶無法恢復。請設置不易被猜出的長密碼,比如四個隨機英文單詞,或是由隨機字母、數字和符號組成的十位字符。</string>
|
||||
<string name="dnkm_doze_intro">爲了接收消息,Briar 需要在後臺保持連接。</string>
|
||||
<string name="dnkm_doze_explanation">Briar 需要保持背景網絡連接去接收消息。爲此,請停用電量優化選項。</string>
|
||||
<string name="choose_nickname">設置暱稱</string>
|
||||
<string name="choose_password">設置密碼</string>
|
||||
<string name="confirm_password">確認密碼</string>
|
||||
<string name="name_too_long">暱稱過長</string>
|
||||
<string name="password_too_weak">密碼不夠強</string>
|
||||
<string name="passwords_do_not_match">兩個密碼並不相同</string>
|
||||
<string name="create_account_button">創建帳戶</string>
|
||||
<string name="more_info">更多信息</string>
|
||||
<string name="don_t_ask_again">不再詢問</string>
|
||||
<string name="dnkm_huawei_protected_text">輕按下方的按鈕將 Briar 加入“受保護的程式”列表。</string>
|
||||
<string name="dnkm_huawei_protected_button">保護 Briar</string>
|
||||
<string name="dnkm_huawei_protected_help">如果 Briar 未被加入受保護程式列表,它將無法在背景運行。</string>
|
||||
<string name="dnkm_huawei_app_launch_text">請輕觸下方按鍵以打開\"啟動軟體\"畫面,確認 Briar 調至\"手動管理\"模式</string>
|
||||
<string name="dnkm_huawei_app_launch_help">若 Briar 未調至\"手動管理\"模式,它將無法在背景中執行</string>
|
||||
<string name="dnkm_xiaomi_text">為能在背景中執行,Briar 須被鎖定在最近使用應用軟體清單上</string>
|
||||
<string name="dnkm_xiaomi_button">保護 Briar</string>
|
||||
<string name="dnkm_xiaomi_help">若 Briar 未鎖到最近使用的程式清單裏,它將無法背景中執行。</string>
|
||||
<string name="dnkm_xiaomi_dialog_body_old">1. 打開最近使用的程式清單(亦稱軟體快速切換)n\n2,滑動到軟體圖像後會出現掛鎖圖標 \n\n3,若掛鎖為打開狀態,請輕觸它改變成關鎖。</string>
|
||||
<string name="dnkm_xiaomi_dialog_body_new">1. 打開最近使用的程式清單(亦稱軟體快速切換)n\n2。若 Briar 旁邊出現掛鎖圖標則無須其它更動 \n\n3,若無掛鎖則輕觸軟體圖標直到現出掛鎖按鍵,點觸掛鎖進行更動。</string>
|
||||
<string name="dnkm_xiaomi_lock_apps_text">請輕觸下方按鍵以開啟安全設定。觸點\"加速\"後再觸\"鎖定應用軟體\",將其設置為鎖定狀態。</string>
|
||||
<string name="dnkm_xiaomi_lock_apps_help">若 Briar 在\"鎖定應用\"的畫面中未被設置為\"鎖定\",則無法在背景中執行。</string>
|
||||
<string name="dnkm_warning_dozed_1">Briar 無法在背景運行。</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">密碼</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="forgotten_password">我忘記了密碼</string>
|
||||
<string name="dialog_title_lost_password">忘記密碼</string>
|
||||
<string name="dialog_message_lost_password">您的 Briar 帳戶被加密儲存在您的裝置上,而非在雲端。因此我們無法重置您的密碼。您是否希望刪除帳戶,重新開始?\n\n注意:刪除帳戶將永久失去您以前的身份、聯絡人和訊息。</string>
|
||||
<string name="startup_failed_activity_title">Briar 啓動失敗</string>
|
||||
<string name="startup_failed_db_error">由於某些原因,Briar 數據庫已損壞並且無法修復。您的帳戶、數據和所有聯絡人已經丟失。很不幸,您需要重新安裝 Briar 或者在提示輸入密碼時選擇“我忘記了密碼”來重新創建一個 Briar 帳戶。</string>
|
||||
<string name="startup_failed_data_too_old_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_clock_error">由於您設備上的時間有誤,Briar 無法啟動
|
||||
|
||||
請重新設置好正確的時間後再試試。</string>
|
||||
<string name="startup_failed_db_error">Briar 無法打開存有您帳號、聯絡人資料及聊天訊息的資料庫。\n\n請將 Briar 更新至最新版後再試試。再不然就得新建帳號,其方式是在彈出的密碼視窗中選取\"遺忘密碼\"來建立新帳號。</string>
|
||||
<string name="startup_failed_data_too_old_error">您的帳號在是之前的舊版本應用創建,但在本版本中無法啟用。\n\n您必須重新安裝舊的版本或是另設新帳號,請在彈出的密碼視窗中選取\"遺忘密碼\"來設新帳號。</string>
|
||||
<string name="startup_failed_data_too_new_error">您的帳號在是新版本的應用中建立,但在舊版中無法開啟。請更新到最新版後再試試看</string>
|
||||
<string name="startup_failed_service_error">Briar 無法啟動所需的元件\n\n請昇級至最新版後再重試</string>
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="other">這是 Briar 的測試版本。您的帳戶將在 %d 天後到期,且無法延期。</item>
|
||||
</plurals>
|
||||
<plurals name="old_android_expiry_warning">
|
||||
<item quantity="other">Briar 已不再支援 Android 4,它將在%s停止運作(%d天時間),請在較新的設備上安裝Briar 並建立新帳號。</item>
|
||||
</plurals>
|
||||
<string name="expiry_date_reached">本軟件已過期。\n感謝您的測試!</string>
|
||||
<string name="download_briar">爲了繼續使用 Briar,請下載最新版。</string>
|
||||
<string name="create_new_account">您要創建一個新帳戶,但可以續用現時的暱稱。</string>
|
||||
<string name="download_briar_button">下載最新版</string>
|
||||
<string name="old_android_expiry_date_reached">Briar 不再支援 Android 4 \n 請在較新設備上安裝 Briar </string>
|
||||
<string name="old_android_delete_account">您可以輕觸下方按鍵好從設備上刪除帳號</string>
|
||||
<string name="delete_account_button">刪除帳戶</string>
|
||||
<string name="startup_open_database">正在解密數據庫……</string>
|
||||
<string name="startup_migrate_database">正在更新數據庫……</string>
|
||||
<string name="startup_compact_database">正在壓縮數據庫……</string>
|
||||
@@ -56,12 +75,36 @@
|
||||
<string name="lock_button">鎖定程式</string>
|
||||
<string name="settings_button">設置</string>
|
||||
<string name="sign_out_button">登出</string>
|
||||
<string name="transports_onboarding_text">觸點此處可控制 Briar 連接聯絡人的方式</string>
|
||||
<!--Transports: Tor-->
|
||||
<string name="transport_tor">互聯網</string>
|
||||
<string name="tor_device_status_online_wifi">您的手機是透過 Wi-Fi 連上網際網路</string>
|
||||
<string name="tor_device_status_online_mobile">您的手機是透過電信數據連上網際網路</string>
|
||||
<string name="tor_device_status_offline">您的手機無法連上網際網路</string>
|
||||
<string name="tor_plugin_status_enabling">Briar 正在連接網際網路</string>
|
||||
<string name="tor_plugin_status_active">Briar 正在連接網際網路</string>
|
||||
<string name="tor_plugin_status_inactive">Briar 無法連上網際網路</string>
|
||||
<string name="tor_plugin_status_disabled">Briar 被設置為無法使用網際網路</string>
|
||||
<string name="tor_plugin_status_disabled_mobile_data">Briar 被設置為無法使用電信數據</string>
|
||||
<string name="tor_plugin_status_disabled_battery">當使用電池時,Briar 被設置為無法使用網際網路</string>
|
||||
<string name="tor_plugin_status_disabled_country_blocked">Briar 被設置為無法在這個國家使用網際網路</string>
|
||||
<!--Transports: Wi-Fi-->
|
||||
<string name="transport_lan">Wi-Fi</string>
|
||||
<string name="transport_lan_long">同一個 Wi-Fi 網路</string>
|
||||
<string name="lan_device_status_on">您的手機已連上 Wi-Fi</string>
|
||||
<string name="lan_device_status_off">您的手機未連上 Wi-Fi</string>
|
||||
<string name="lan_plugin_status_enabling">Briar 正在連接 Wi-Fi 網路</string>
|
||||
<string name="lan_plugin_status_active">Briar 已連接 Wi-Fi 網路</string>
|
||||
<string name="lan_plugin_status_inactive">Briar 無法連上 Wi-Fi 網路</string>
|
||||
<string name="lan_plugin_status_disabled">Briar 被設為無法連接 Wi-Fi 網路</string>
|
||||
<!--Transports: Bluetooth-->
|
||||
<string name="transport_bt">藍牙</string>
|
||||
<string name="bt_device_status_on">您的手機已開啟藍牙</string>
|
||||
<string name="bt_device_status_off">您的手機關閉了藍牙</string>
|
||||
<string name="bt_plugin_status_enabling">Briar 正在連接藍牙</string>
|
||||
<string name="bt_plugin_status_active">Briar 已連上藍牙</string>
|
||||
<string name="bt_plugin_status_inactive">Briar 無法連上藍牙</string>
|
||||
<string name="bt_plugin_status_disabled">Briar 被設置成無法使用藍牙</string>
|
||||
<!--Notifications-->
|
||||
<string name="reminder_notification_title">已登出 Briar</string>
|
||||
<string name="reminder_notification_text">輕按以重新登錄。</string>
|
||||
@@ -97,6 +140,8 @@
|
||||
<string name="allow">允許</string>
|
||||
<string name="open">打開</string>
|
||||
<string name="change">變動</string>
|
||||
<string name="start">開始</string>
|
||||
<string name="finish">結束</string>
|
||||
<string name="no_data">沒有數據</string>
|
||||
<string name="ellipsis">……</string>
|
||||
<string name="text_too_long">輸入的文本過長</string>
|
||||
@@ -104,13 +149,18 @@
|
||||
<string name="fix">修復</string>
|
||||
<string name="help">幫助</string>
|
||||
<string name="sorry">抱歉</string>
|
||||
<string name="error_start_activity">您的系統無法使用</string>
|
||||
<string name="status_heading">狀態:</string>
|
||||
<string name="error">錯誤</string>
|
||||
<string name="info">資訊</string>
|
||||
<!--Contacts and Private Conversations-->
|
||||
<string name="no_contacts">尚無聯絡人可供顯示</string>
|
||||
<string name="no_contacts_action">輕按 + 號即可添加聯絡人</string>
|
||||
<string name="date_no_private_messages">沒有消息。</string>
|
||||
<string name="no_private_messages">尚無消息可供顯示</string>
|
||||
<string name="message_hint">輸入信息</string>
|
||||
<string name="message_hint">新訊息</string>
|
||||
<string name="message_hint_auto_delete">新消失的訊息</string>
|
||||
<string name="message_error">發送訊息時出錯</string>
|
||||
<string name="image_caption_hint">添加圖片描述(可選)</string>
|
||||
<string name="image_attach">附加圖片</string>
|
||||
<string name="image_attach_error">無法附加圖片</string>
|
||||
@@ -118,6 +168,39 @@
|
||||
<string name="image_attach_error_invalid_mime_type">圖片格式不支援: %s</string>
|
||||
<string name="set_contact_alias">更改聯絡人姓名</string>
|
||||
<string name="set_contact_alias_hint">聯絡人姓名</string>
|
||||
<string name="menu_item_disappearing_messages">已消失的訊息</string>
|
||||
<!--The first placeholder will show a duration like "7 days". The second placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_you_enabled">您的訊息將在%1$s%2$s 消失</string>
|
||||
<!--The placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_you_disabled">您的訊息不會消失%1$s</string>
|
||||
<!--The first placeholder will show a contact's name. The second placeholder will show a duration like "7 days". The third placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_contact_enabled">%1$s的訊息將在 %2$s. %3$s消失</string>
|
||||
<plurals name="duration_minutes">
|
||||
<item quantity="other">%d 分鐘</item>
|
||||
</plurals>
|
||||
<plurals name="duration_hours">
|
||||
<item quantity="other">%d 小時</item>
|
||||
</plurals>
|
||||
<plurals name="duration_days">
|
||||
<item quantity="other">%d 天</item>
|
||||
</plurals>
|
||||
<!--The first placeholder will show a contact's name. The second placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_contact_disabled">%1$s的訊息將不會消失%2$s</string>
|
||||
<string name="tap_to_learn_more">輕觸了解詳情</string>
|
||||
<string name="auto_delete_changed_warning_title">改變消失的訊息</string>
|
||||
<string name="auto_delete_changed_warning_message_enabled">撰寫訊息之前已啟用了消失功能</string>
|
||||
<string name="auto_delete_changed_warning_message_disabled">撰寫訊息之前已關閉了消失功能</string>
|
||||
<string name="auto_delete_changed_warning_send">無論怎樣都要發送</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_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="dialog_title_delete_contact">確認刪除聯絡人</string>
|
||||
<string name="dialog_message_delete_contact">確認要刪除該聯絡人和與其交流訊息嗎?</string>
|
||||
@@ -133,8 +216,11 @@
|
||||
<string name="dialog_message_no_image_support">您的聯絡人的 Briar 版本尚未支持圖片附件。一旦他們升級後您就會看到一個不同的圖標。</string>
|
||||
<string name="dialog_title_image_support">您現在可以向此聯絡人發送圖片</string>
|
||||
<string name="dialog_message_image_support">輕按此圖標即可附加圖片。</string>
|
||||
<string name="messaging_too_many_attachments_toast">只會送出第一個%d圖像</string>
|
||||
<string name="menu_contact">聯繫</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">添加附近的聯絡人</string>
|
||||
<string name="add_contact_error_two_way">你們互相掃瞄彼此的二維碼了嗎? </string>
|
||||
<string name="face_to_face">您必須面對面添加聯絡人。\n\n這樣將防止他人冒充您的身份並查看您的信息。</string>
|
||||
<string name="continue_button">繼續</string>
|
||||
<string name="try_again_button">重試</string>
|
||||
@@ -143,13 +229,16 @@
|
||||
<string name="contact_added_toast">已添加聯絡人:%s</string>
|
||||
<string name="contact_already_exists">聯絡人 %s 已存在</string>
|
||||
<string name="qr_code_invalid">二維碼無效</string>
|
||||
<string name="qr_code_too_old">您所掃描的二維碼來自舊版本 %s 。\n\n請讓您的聯絡人升級到最新版本並重試。</string>
|
||||
<string name="qr_code_too_new">您所掃描的二維碼來自新版本 %s 。\n\n請升級到最新版本並重試。</string>
|
||||
<string name="qr_code_too_old_1">您所掃的二維碼已是舊版本\n\n 請通知您的聯絡人更新至最新版後再試試</string>
|
||||
<string name="qr_code_too_new_1">您所掃的二維碼為較新的版本\n\n 請更新至最新版後再試試</string>
|
||||
<string name="mailbox_qr_code_for_contact">您所掃二維碼來自 Briar Mailbox\n\n 若要連接 Mailbox,請到 Briar 主選單選取Mailbox設定。</string>
|
||||
<string name="qr_code_format_unknown">您所掃二維碼並非用於新增聯絡人\n\n 請確認這是您的聯絡人畫面上的二維碼</string>
|
||||
<string name="camera_error">相機出錯</string>
|
||||
<string name="connecting_to_device">正在連接至裝置\u2026</string>
|
||||
<string name="authenticating_with_device">正在驗證裝置\u2026</string>
|
||||
<string name="connection_error_title">無法連接到您的聯絡人</string>
|
||||
<string name="connection_error_feedback">如果該問題仍存在,請 <a href="feedback">發送反饋</a> 幫助我們改善程式。</string>
|
||||
<string name="info_both_must_scan">你們必須互相掃瞄彼此的二維碼</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">添加遠處的聯絡人</string>
|
||||
<string name="add_contact_nearby_title">添加附近的聯絡人</string>
|
||||
@@ -193,8 +282,9 @@
|
||||
<string name="offline_state">無互聯網連接</string>
|
||||
<string name="duplicate_link_dialog_title">重覆的鏈接</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-->
|
||||
<string name="duplicate_link_dialog_text_2">%s與%s是同一個人嗎?</string>
|
||||
<string name="duplicate_link_dialog_text_2"> %1$s 和 %2$s 是同一個人嗎?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
@@ -203,11 +293,17 @@
|
||||
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-->
|
||||
<string name="different_person_button">不同的人</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s和%s向您發送了相同的鏈接。\n\n 其中一個可能正試圖調查您的聯絡人是誰。\n\n請不要告訴他們您收到了來自其他人的相同鏈接。</string>
|
||||
<string name="duplicate_link_dialog_text_3">%1$s和 %2$s向您發送了相同的鏈接。\n\n 其中一個可能正試圖調查您的聯絡人是誰。\n\n請不要告訴他們您收到了與他人的相同鏈接。</string>
|
||||
<string name="pending_contact_updated_toast">已更新尚待處理的聯絡人</string>
|
||||
<string name="info_both_must_enter_links">你們必須互相加入對方的鏈接 </string>
|
||||
<!--Peer trust levels-->
|
||||
<string name="peer_trust_level_unverified">未驗證的聯絡人</string>
|
||||
<string name="peer_trust_level_verified">已驗證的聯絡人</string>
|
||||
<string name="peer_trust_level_ourselves">我</string>
|
||||
<string name="peer_trust_level_stranger">陌生人</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">介紹您的聯絡人</string>
|
||||
<string name="introduction_onboarding_text">您可以互相介紹您的聯絡人,這樣他們可以直接在 Briar 上建立聯繫而不必親自見面。</string>
|
||||
<string name="introduction_onboarding_text">介紹您的聯絡人互相認識,這樣他們就可透過 Briar 聯繫</string>
|
||||
<string name="introduction_menu_item">做介紹</string>
|
||||
<string name="introduction_activity_title">選擇聯絡人</string>
|
||||
<string name="introduction_not_possible">您已將這兩位聯絡人互相介紹過。請先等待該任務完成。如果您或您的聯絡人很少在線,這可能需要一些時間。</string>
|
||||
@@ -223,9 +319,21 @@
|
||||
<string name="introduction_response_accepted_sent">您已接受與 %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_auto">對%1$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_by_introducee">%1$s 表示 %2$s 謝絕了介紹。</string>
|
||||
<!--Connect via Bluetooth-->
|
||||
<string name="menu_item_connect_via_bluetooth">通過藍牙連接</string>
|
||||
<string name="connect_via_bluetooth_title">通過藍牙連接</string>
|
||||
<string name="connect_via_bluetooth_intro">若無法自動連接藍牙,可在本畫面中進行手動連接\n\n 您的聯絡人必須就在附近才行 \n\n 你們雙方要同時按下\"啟動\"鍵。</string>
|
||||
<string name="connect_via_bluetooth_already_discovering">已嘗試透過藍牙連接,請稍候再試</string>
|
||||
<string name="connect_via_bluetooth_no_location_permission">須同意定位授權才能繼續</string>
|
||||
<string name="connect_via_bluetooth_no_bluetooth_permission">無鄰近設備授權無法繼續</string>
|
||||
<string name="connect_via_bluetooth_start">透過藍牙連接...</string>
|
||||
<string name="connect_via_bluetooth_success">成功地以藍牙連接</string>
|
||||
<string name="connect_via_bluetooth_error">無法透過藍牙連接</string>
|
||||
<string name="connect_via_bluetooth_error_not_supported">本設備不支援藍牙</string>
|
||||
<!--Private Groups-->
|
||||
<string name="groups_list_empty">尚無群組可供展示</string>
|
||||
<string name="groups_list_empty_action">輕按 + 號創建群組,或讓您的聯絡人分享群組給您</string>
|
||||
@@ -267,6 +375,7 @@
|
||||
</plurals>
|
||||
<string name="groups_invitations_response_accepted_sent">您接受了來自 %s 的群組邀請。</string>
|
||||
<string name="groups_invitations_response_declined_sent">您謝絕了來自 %s 的群組邀請。</string>
|
||||
<string name="groups_invitations_response_declined_auto">來自%s的小組邀請已自動回絕</string>
|
||||
<string name="groups_invitations_response_accepted_received">%s 接受了群組邀請。</string>
|
||||
<string name="groups_invitations_response_declined_received">%s 謝絕了群組邀請。</string>
|
||||
<string name="sharing_status_groups">只有創建者可以邀請新成員加入群組。下面是目前的群組成員。</string>
|
||||
@@ -316,6 +425,7 @@
|
||||
<string name="forum_invitation_already_sharing">已在分享</string>
|
||||
<string name="forum_invitation_response_accepted_sent">您接受了來自 %s的論壇邀請</string>
|
||||
<string name="forum_invitation_response_declined_sent">您謝絕了來自 %s的論壇邀請</string>
|
||||
<string name="forum_invitation_response_declined_auto">來自%s論壇的邀請已自動拒絕</string>
|
||||
<string name="forum_invitation_response_accepted_received">%s 接受了論壇邀請。</string>
|
||||
<string name="forum_invitation_response_declined_received">%s 謝絕了論壇邀請。</string>
|
||||
<string name="sharing_status">分享狀態</string>
|
||||
@@ -349,6 +459,7 @@
|
||||
<string name="blogs_sharing_snackbar">博客已分享給選中的聯絡人</string>
|
||||
<string name="blogs_sharing_response_accepted_sent">您接受了來自 %s 的博客邀請。</string>
|
||||
<string name="blogs_sharing_response_declined_sent">您謝絕了來自 %s 的博客邀請。</string>
|
||||
<string name="blogs_sharing_response_declined_auto">來自%s的部落格邀請已自動回絕</string>
|
||||
<string name="blogs_sharing_response_accepted_received">%s 接受了博客邀請。</string>
|
||||
<string name="blogs_sharing_response_declined_received">%s 謝絕了博客邀請。</string>
|
||||
<string name="blogs_sharing_invitation_received">%1$s 向您分享博客 “%2$s”。</string>
|
||||
@@ -362,6 +473,8 @@
|
||||
<string name="blogs_rss_feeds_import_button">導入</string>
|
||||
<string name="blogs_rss_feeds_import_hint">輸入 RSS 訂閱源鏈接</string>
|
||||
<string name="blogs_rss_feeds_import_error">抱歉!導入訂閱源時發生錯誤。</string>
|
||||
<string name="blogs_rss_feeds_import_exists">此來源已滙入</string>
|
||||
<string name="blogs_rss_feeds">RSS 消息源</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">已導入:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">作者:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">最後更新於:</string>
|
||||
@@ -371,6 +484,10 @@
|
||||
<string name="blogs_rss_feeds_manage_empty_state">尚無訂閱源可供顯示\n\n輕按 + 號導入訂閱源</string>
|
||||
<string name="blogs_rss_feeds_manage_error">加載訂閱源時出錯。請稍候再試。</string>
|
||||
<!--Settings Profile Picture-->
|
||||
<string name="change_profile_picture">輕觸更改使用者圖像</string>
|
||||
<string name="dialog_confirm_profile_picture_title">更改使用者圖像</string>
|
||||
<string name="dialog_confirm_profile_picture_remark">只有您的聯絡人可乆看到這張照片</string>
|
||||
<string name="change_profile_picture_failed_message">抱歉,更新個人圖像時出了一點問題</string>
|
||||
<!--Settings Display-->
|
||||
<string name="pref_language_title">語言 & 區域</string>
|
||||
<string name="pref_language_changed">該設置將會在 Briar 重啓後生效。請登出並重啓 Briar。</string>
|
||||
@@ -382,10 +499,20 @@
|
||||
<string name="pref_theme_auto">自動(白天)</string>
|
||||
<string name="pref_theme_system">系統默認</string>
|
||||
<!--Settings Connections-->
|
||||
<string name="network_settings_title">連線</string>
|
||||
<string name="bluetooth_setting">透過藍牙連接聯絡人</string>
|
||||
<string name="wifi_setting">透過同一個 Wi-Fi 連接聯絡人</string>
|
||||
<string name="tor_enable_title">透過網際網路連接聯絡人</string>
|
||||
<string name="tor_enable_summary">為保護隱私,全部的連接都透過 Tor 網路</string>
|
||||
<string name="tor_network_setting">連接 Tor 網路的方式</string>
|
||||
<string name="tor_network_setting_automatic">基於位置自動選擇</string>
|
||||
<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 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_summary">自動選擇:%1$s(在 %2$s)</string>
|
||||
<string name="tor_mobile_data_title">使用移動數據</string>
|
||||
<string name="tor_only_when_charging_title">在充電時才連接到網際網路</string>
|
||||
<string name="tor_only_when_charging_summary">當裝置使用電池電量時關閉網絡連接</string>
|
||||
<!--Settings Security and Panic-->
|
||||
<string name="security_settings_title">安全</string>
|
||||
@@ -448,8 +575,108 @@
|
||||
<string name="notify_sound_setting_disabled">無</string>
|
||||
<string name="choose_ringtone_title">選擇鈴聲</string>
|
||||
<string name="cannot_load_ringtone">無法加載鈴聲</string>
|
||||
<!--Settings Feedback-->
|
||||
<string name="feedback_settings_title">反饋</string>
|
||||
<!--Mailbox-->
|
||||
<string name="mailbox_settings_title">Mailbox</string>
|
||||
<string name="mailbox_setup_title">Mailbox 設置</string>
|
||||
<string name="mailbox_setup_intro">Mailbox 讓聯絡人在您離線時仍然可向您發送訊息。在您上線前,Mailbox 會代為接收並儲存給訊息。\n
|
||||
\n 您可在備用設備上安裝 Briar Mailbox,讓它接上電源與 Wi-Fi 以維持在線狀態</string>
|
||||
<string name="mailbox_setup_download">首先,在另一台設備上透過 Google Play 或其它下載 Briar 的地方搜尋“Briar Mailbox”,以安裝 Mailbox 。\n
|
||||
\n再掃瞄 Mailbox 的二維掃瞄將 它與 Briar 鏈接起來。</string>
|
||||
<string name="mailbox_setup_download_link">分享下載鏈接</string>
|
||||
<string name="mailbox_setup_button_scan">掃描 Mailbox 二維碼</string>
|
||||
<string name="permission_camera_qr_denied_body">您限制了相機使用權限,但掃瞄二維碼必須用到相關 \n\n 請同意使用照片</string>
|
||||
<string name="mailbox_setup_connecting">Mailbox 連接中...</string>
|
||||
<!--This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes".-->
|
||||
<string name="mailbox_setup_connecting_info">它要花上 %1s的時間</string>
|
||||
<string name="mailbox_qr_code_too_old">您所掃的二維碼為舊版的 Briar Mailbox \n\n 請更新至最新版後再試試</string>
|
||||
<string name="mailbox_qr_code_too_new">您所掃的二維碼為較新版的 Briar Mailbox \n\n 請更新至最新版後再試試</string>
|
||||
<string name="contact_qr_code_for_mailbox">您所掃瞄的二維碼是為了添增 Briar 聯絡人 .\n\n 要新增聯絡人,請到聯絡人清單下輕觸 + 圖示</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">您所掃的二維碼並非來自 Briar Mailbox \n\n 請在 Mailbox 設備上打開 Briar Mailbox 應用再掃它所提供的二維碼。 </string>
|
||||
<string name="mailbox_setup_already_paired_title">Mailbox 已連接</string>
|
||||
<string name="mailbox_setup_already_paired_description">解除其它設備的 Mailbox 鏈接後再試試</string>
|
||||
<string name="mailbox_setup_io_error_title">無法連接</string>
|
||||
<string name="mailbox_setup_io_error_description">確認二台設備都已連上網後再重試</string>
|
||||
<string name="mailbox_setup_assertion_error_title">Mailbox 出錯</string>
|
||||
<string name="mailbox_setup_assertion_error_description">如果問題一直持續,請利用 Briar 發送反饋(其為匿名資料)</string>
|
||||
<string name="mailbox_setup_camera_error_description">無法使用相機,不妨重開機後再試試</string>
|
||||
<string name="mailbox_setup_paired_title">已連接</string>
|
||||
<string name="mailbox_setup_paired_description">您已順利地完成 Briar Mailbox 的連接 \n
|
||||
將 Mailbox 維持通電與Wi-Fi,以保持在線狀態 </string>
|
||||
<string name="tor_offline_title">離線</string>
|
||||
<string name="tor_offline_description">確認這台設備可以順利地使用際網網路上線 \n
|
||||
\n 接下來請等候連線畫面的球狀圖標變成綠色</string>
|
||||
<string name="tor_offline_button_check">檢查連線設置</string>
|
||||
<string name="mailbox_status_title">Mailbox 狀態</string>
|
||||
<string name="mailbox_status_connected_title">郵箱正在運行</string>
|
||||
<string name="mailbox_status_problem_title">Briar 無法順利連接 Mailbox</string>
|
||||
<string name="mailbox_status_failure_title">Mailbox 無法使用</string>
|
||||
<string name="mailbox_status_app_too_old_title">Briar 版本過舊</string>
|
||||
<string name="mailbox_status_app_too_old_message">更新 Briar 至最新版後再試試看</string>
|
||||
<string name="mailbox_status_mailbox_too_old_title">Mailbox 版本過舊</string>
|
||||
<string name="mailbox_status_mailbox_too_old_message">更新 Mailbox 至最新版後再試試看</string>
|
||||
<string name="mailbox_status_check_button">檢查連線</string>
|
||||
<!--Example for string substitution: Last connection: 3min ago-->
|
||||
<string name="mailbox_status_connected_info">最近一次連接%s</string>
|
||||
<!--Indicates that there never was a connection to the mailbox. Last connection: Never-->
|
||||
<string name="mailbox_status_connected_never">永不</string>
|
||||
<string name="mailbox_status_unlink_button">解除鏈接</string>
|
||||
<string name="mailbox_status_unlink_dialog_title">解除 Mailbox 鏈接? </string>
|
||||
<string name="mailbox_status_unlink_dialog_question">確定要解除 Mailbox 鏈接? </string>
|
||||
<string name="mailbox_status_unlink_dialog_warning">若移除 Mailbox 鏈接,您將無法在 Briar 離線時收取訊息</string>
|
||||
<string name="mailbox_status_unlink_no_wipe_title">您已移除 Mailbox 鏈接</string>
|
||||
<string name="mailbox_status_unlink_no_wipe_message">下回使用 Mailbox 設備時,請打開 Mailbox 輕觸\"移除鏈接\"鍵以完成手續。\n\n 若無法使用 Mailbox 設備也別擔心,因為您的資料都經過加密保護即便未能完成最後一道程序但依然安全。</string>
|
||||
<string name="mailbox_status_unlink_success">您已移除 Mailbox 鏈接</string>
|
||||
<string name="mailbox_error_notification_channel_title">Briar Mailbox 問題</string>
|
||||
<string name="mailbox_error_notification_title">Briar Mailbox 無法使用</string>
|
||||
<string name="mailbox_error_notification_text">輕觸以修復問題</string>
|
||||
<string name="mailbox_error_wizard_button">解決問題</string>
|
||||
<string name="mailbox_error_wizard_title">Mailbox 疑難處理精靈</string>
|
||||
<string name="mailbox_error_wizard_question1">您可以取用 Mailbox 裝置嗎?</string>
|
||||
<string name="mailbox_error_wizard_answer1">是的,我手上正拿著它</string>
|
||||
<string name="mailbox_error_wizard_answer2">目前沒有,但我稍晚可以拿到</string>
|
||||
<string name="mailbox_error_wizard_answer3">我無法再取用那台設備</string>
|
||||
<string name="mailbox_error_wizard_info1_1">檢查 Mailbox 裝置是否開啟並已連上網際網路
|
||||
</string>
|
||||
<string name="mailbox_error_wizard_question1_1">打開 Mailbox 應用,您看到什麼東西</string>
|
||||
<string name="mailbox_error_wizard_answer1_1">如何設置 Mailbox 的指示</string>
|
||||
<string name="mailbox_error_wizard_answer1_2">出現二維碼</string>
|
||||
<string name="mailbox_error_wizard_answer1_3">看到\" Mailbox 正在執行\"</string>
|
||||
<string name="mailbox_error_wizard_answer1_4">顯示\"設備離線\"</string>
|
||||
<string name="mailbox_error_wizard_info1_1_1">請按下方按鈕以移除 Mailbox 鏈接,之後再按設備指示重新鏈接</string>
|
||||
<string name="mailbox_error_wizard_info_1_1_2">請按下方按鈕以移除 Mailbox 鏈接,之後再掃一次二維碼以重新鏈接</string>
|
||||
<string name="mailbox_error_wizard_info1_1_3">請利用下方按鈕來檢查 Briar 與 Mailbox 之間的連接\n\n
|
||||
若連接再次失敗:\n
|
||||
\u2022 分別檢查 Mailbox Briar 是否為最新版本\n
|
||||
\u2022 重開機 Mailbox and Briar 設備後再試試.</string>
|
||||
<string name="mailbox_error_wizard_info1_1_4">檢查 Mailbox 設備是否妥當地連上網路 \n\n 確認設備上的時間、日期、時區正確 \n\n 檢查 Mailbox 和 Briar 皆為最新版本 \n\n 重啟 Mailbox 設備後再試試</string>
|
||||
<string name="mailbox_error_wizard_info2">當您能使用該設備後,請再回到本畫面操作</string>
|
||||
<string name="mailbox_error_wizard_info3">請按下方按鈕以移除 Mailbox 鏈接,移除後您隨時可以重新設置新的 Mailbox </string>
|
||||
<!--About-->
|
||||
<string name="about_title">關於</string>
|
||||
<string name="briar_version">Briar 版本: %s</string>
|
||||
<string name="tor_version">Tor 版本: %s</string>
|
||||
<string name="links">鏈接</string>
|
||||
<string name="briar_website">\u2022 <a href="">網站</a></string>
|
||||
<string name="briar_source_code">\u2022 <a href="">源代碼</a></string>
|
||||
<string name="briar_changelog">\u2022 <a href="">更新記錄</a></string>
|
||||
<string name="briar_privacy_policy">\u2022 <a href="">隱私政策</a></string>
|
||||
<!--Here translators can add their names or Transifex usernames(eg "Thanks to all the contributors at the Localization Lab, especially Tom, Matthew and Jerry")-->
|
||||
<string name="translator_thanks">感謝所有 Localization Lab 的貢獻者</string>
|
||||
<!--Conversation Settings-->
|
||||
<string name="disappearing_messages_title">已消失的訊息</string>
|
||||
<string name="disappearing_messages_explanation_long">打開這個設置將會
|
||||
對話中的訊息將自動在 7\u00A0天後消失.
|
||||
\n\n發送的訊息送達後,開始倒數將消失的時間
|
||||
在對方讀過訊息後即開始倒數時間
|
||||
\n\n畫有炸彈圖示的訊息將會消失
|
||||
\n\n請記住對方仍然可以保留您所送出的訊息
|
||||
\n\n若您改變設定,即會立即影響之後的新訊息
|
||||
聯絡人接到下一則訊息後舊訊息即消失.
|
||||
您的聯絡人也可為雙方更改設定.</string>
|
||||
<string name="learn_more">了解更多</string>
|
||||
<string name="disappearing_messages_summary">讓這個對話的訊息會在 7\u00A0 天後自動消失</string>
|
||||
<!--Settings Actions-->
|
||||
<string name="pref_category_actions">行為</string>
|
||||
<string name="send_feedback">提交反饋</string>
|
||||
<!--Link Warning-->
|
||||
<string name="link_warning_title">鏈接警告</string>
|
||||
@@ -458,7 +685,7 @@
|
||||
<string name="link_warning_open_link">打開鏈接</string>
|
||||
<!--Crash Reporter-->
|
||||
<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="please_send_report">請發送崩潰報告,以幫助我們優化 Briar 。</string>
|
||||
<string name="report_is_encrypted">我們保證會加密並安全地發送報告。</string>
|
||||
@@ -466,17 +693,35 @@
|
||||
<string name="describe_crash">描述發生了什麼(選填)</string>
|
||||
<string name="enter_feedback">輸入您的反饋</string>
|
||||
<string name="optional_contact_email">您的郵箱地址(選填)</string>
|
||||
<string name="privacy_policy">向我們發送資料即表示您同意我們的 <a href="">隱私權政策</a></string>
|
||||
<string name="include_debug_report_crash">包含關於本次崩潰的匿名數據</string>
|
||||
<string name="include_debug_report_feedback">包含關於本裝置的匿名數據</string>
|
||||
<string name="dev_report_user_info">用戶資訊 </string>
|
||||
<string name="dev_report_basic_info">基本資訊</string>
|
||||
<string name="dev_report_device_info">設備資訊</string>
|
||||
<string name="dev_report_stacktrace">堆疊追踪</string>
|
||||
<string name="dev_report_time_info">時間資訊</string>
|
||||
<string name="dev_report_memory">記憶體</string>
|
||||
<string name="dev_report_storage">容量</string>
|
||||
<string name="dev_report_connectivity">連接能力</string>
|
||||
<string name="dev_report_network_usage">網路用量</string>
|
||||
<string name="dev_report_build_config">版本設定</string>
|
||||
<string name="dev_report_logcat">應用軟體日誌</string>
|
||||
<string name="dev_report_device_features">設備特色</string>
|
||||
<string name="send_report">發送報告</string>
|
||||
<string name="close">關閉</string>
|
||||
<string name="dev_report_sending">發送反饋...</string>
|
||||
<string name="dev_report_sent">送出反饋</string>
|
||||
<string name="dev_report_saved">報告已保存,將於您下次登錄時發送。</string>
|
||||
<string name="dev_report_error">錯誤: 發送報告失敗</string>
|
||||
<!--Sign Out-->
|
||||
<string name="progress_title_logout">正在登出 Briar……</string>
|
||||
<!--Screen Filters & Tapjacking-->
|
||||
<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_api_30">另一個程式覆蓋在 Briar 之上。爲了保護您的安全,在其他程式覆蓋的情況下 Briar 不會對觸控感應。\n\n檢查以下程式可能覆蓋的應用軟體:</string>
|
||||
<string name="screen_filter_allow">允許這些程式覆蓋在上方</string>
|
||||
<string name="screen_filter_review_apps">評價應用軟體</string>
|
||||
<!--Permission Requests-->
|
||||
<string name="permission_camera_title">相機權限</string>
|
||||
<string name="permission_camera_request_body">Briar 需要獲得相機權限以掃描二維碼。</string>
|
||||
@@ -484,7 +729,17 @@
|
||||
<string name="permission_location_request_body">Briar 需要位置信息權限以發現藍牙裝置。\n\nBriar 不會存儲您的位置或將它分享給任何人。</string>
|
||||
<string name="permission_camera_location_title">相機和位置</string>
|
||||
<string name="permission_camera_location_request_body"> Briar 需要相機權限以掃描二維碼。\n\nBriar 需要位置信息權限以發現藍牙裝置。\n\nBriar 不會存儲您的位置或將它分享給任何人。</string>
|
||||
<string name="permission_camera_bluetooth_title">照機與鄰近設備</string>
|
||||
<string name="permission_camera_bluetooth_request_body"> Briar 需要相機權限才能掃描二維碼。\n\n 需要位置信息權限以發現和連接鄰近的藍牙裝置。</string>
|
||||
<string name="permission_camera_denied_body">您已拒絕相機權限,而添加聯絡人需要使用相機。\n\n請考慮授予相機權限。</string>
|
||||
<string name="permission_location_denied_body">您拒絕取得位置定位之授權,但 Briar 必須要有此授權方能利用找到其它藍牙設備\n\n 請同意此權限</string>
|
||||
<string name="permission_location_setting_title">位置設定</string>
|
||||
<string name="permission_location_setting_body">您必須開啟設備的位置以借由藍牙找到其它設備, 當然您稍後可關閉位置功能</string>
|
||||
<string name="permission_location_setting_hotspot_body">您必須開啟設備的位置功能才能建立 Wi-Fi 熱點,當然您稍後可關閉位置功能</string>
|
||||
<string name="permission_location_setting_button">啟動定位</string>
|
||||
<string name="permission_bluetooth_title">精近設備授權</string>
|
||||
<string name="permission_bluetooth_body">使用藍牙通訊時,Briar 必須取得授權去搜尋與連接鄰近的設備</string>
|
||||
<string name="permission_bluetooth_denied_body">您拒絕鄰近設備的取用,但 Briar 必須要有此授權方能使用藍牙功能\n\n 請同意此權限</string>
|
||||
<string name="qr_code">二維碼</string>
|
||||
<string name="show_qr_code_fullscreen">全熒幕顯示二維碼</string>
|
||||
<!--App Locking-->
|
||||
@@ -495,6 +750,93 @@
|
||||
<string name="lock_is_locked">Briar 已鎖定</string>
|
||||
<string name="lock_tap_to_unlock">輕按以解鎖</string>
|
||||
<!--Connections Screen-->
|
||||
<string name="transports_help_text"> Briar 可透過網際網路、Wi-Fi 或藍牙來建立聯繫 \n\n 為隱私保護,Briar 在網際網路上都是透過 Tor 網路 \n\n 若聯絡人能使用多種連線方式,則 Briar 會併行利用</string>
|
||||
<!--Share app offline-->
|
||||
<string name="hotspot_title">離線分享此應用</string>
|
||||
<string name="hotspot_intro">透過手機 Wi-Fi 在即便沒有網際網路的情況下,仍可以向鄰近者分享 Briar 應用
|
||||
\n\n 您的手機將開啟 Wi-Fi 熱點,連上此熱點後附近的人就可以從您的手機下載 Brair </string>
|
||||
<string name="hotspot_button_start_sharing">啟動熱點</string>
|
||||
<string name="hotspot_button_stop_sharing">關閉熱點</string>
|
||||
<string name="hotspot_progress_text_start">設置熱點</string>
|
||||
<string name="hotspot_notification_channel_title">Wi-Fi 熱點</string>
|
||||
<string name="hotspot_notification_title">離線分享 Briar</string>
|
||||
<string name="hotspot_button_connected">下一步</string>
|
||||
<string name="permission_hotspot_location_request_body">建立 Wi-Fi 熱點,Briar 須得到設備位置權限 \n\n Briar 不會儲存也不會與他人分享您的位置資料</string>
|
||||
<string name="permission_hotspot_location_request_precise_body">建立 Wi-Fi 熱點,Briar 必須了解設備的準確定位 \n\n Briar 不會儲存也不會與他人分享您的位置資料</string>
|
||||
<string name="permission_hotspot_location_denied_body">您拒絕 Briar 使用設備位置權限,但Briar 須有此授權才能為您建立 Wi-Fi 熱點\n\n 請考慮同意此項授權</string>
|
||||
<string name="permission_hotspot_location_denied_precise_body">您拒絕 Briar 取得設備精確位置的資料,但Briar 須有此授權才能為您建立 Wi-Fi 熱點\n\n 請考慮同意此項授權</string>
|
||||
<string name="wifi_settings_title">Wi-Fi 設定</string>
|
||||
<string name="wifi_settings_request_enable_body">要建立 Wi-Fi 熱點,Briar 必項使用 Wi-Fi , 請打開它</string>
|
||||
<string name="hotspot_tab_manual">手動</string>
|
||||
<!--The placeholder to be inserted into the string 'hotspot_manual_wifi': People can connect by %s-->
|
||||
<string name="hotspot_scanning_a_qr_code">掃瞄二維碼</string>
|
||||
<!--Wi-Fi setup-->
|
||||
<!--The %s placeholder will be replaced with the translation of 'hotspot_scanning_a_qr_code'-->
|
||||
<string name="hotspot_manual_wifi">您的手機正提供 Wi-Fi 熱點。想下载 Briar 的人先連上此熱點,其操作是在自己設備的 Wi-Fi 設置使用進階或借由 %s。順利連接熱點,請按 “下一步”。</string>
|
||||
<string name="hotspot_manual_wifi_ssid">網路名稱</string>
|
||||
<string name="hotspot_qr_wifi">您的手機正提供 Wi-Fi 熱點。想下载 Briar 的人可掃瞄二維碼來連上此熱點。順利連接熱點,請按 “下一步”。</string>
|
||||
<string name="hotspot_no_peers_connected">未有設備連接</string>
|
||||
<plurals name="hotspot_peers_connected">
|
||||
<item quantity="other">%s 個設備連接</item>
|
||||
</plurals>
|
||||
<!--Download link-->
|
||||
<!--The %s placeholder will be replaced with the translation of 'hotspot_scanning_a_qr_code'-->
|
||||
<string name="hotspot_manual_site">您的手機正提供 Wi-Fi 熱點,連上此熱點的設備可打開瀏覽器鏈接或 %s以下載 Briar </string>
|
||||
<string name="hotspot_manual_site_address">網址 (URL)</string>
|
||||
<string name="hotspot_qr_site">您的手機提供了 Wi-Fi 熱點,連上此熱點的設備可借由掃這個二維碼來下載 Briar </string>
|
||||
<!--e.g. Download Briar 1.2.20-->
|
||||
<string name="website_download_title_1">下載 Briar %s</string>
|
||||
<string name="website_download_intro_1">附近有人要與您分享 Briar</string>
|
||||
<string name="website_download_button">下載 Briar</string>
|
||||
<string name="website_download_outro">下載完畢後,請打開下載檔案進行安裝</string>
|
||||
<string name="website_troubleshooting_title">故障排除</string>
|
||||
<string name="website_troubleshooting_1">如無法下載本應用,請利用其它不同的網頁瀏覽器再試試</string>
|
||||
<string name="website_troubleshooting_2_old">安裝時,您可能要打開系統設定中同意安裝不明來源應用的選項。勾選後再重新下載。建議在安裝完成後,取消安裝不明來源應用的授權。</string>
|
||||
<string name="website_troubleshooting_2_new">安裝時,瀏覽器可能要調整為同意安裝不明來源應用。建議在安裝完成後,即取消瀏覽器可安裝不明來源應用的授權。</string>
|
||||
<string name="hotspot_help_wifi_title">連線 Wi-Fi 出問題</string>
|
||||
<string name="hotspot_help_wifi_1">二支手機都試著關掉重開 Wi-Fi Direct 再試看看</string>
|
||||
<string name="hotspot_help_wifi_2">如您的手機顯示所連的 Wi-Fi 並無連接網際網路,請表示仍要繼續連接</string>
|
||||
<string name="hotspot_help_wifi_3">請將執行 Wi-Fi 熱點的手機關掉重啟後再次打開 Briar 試試</string>
|
||||
<string name="hotspot_help_site_title">無法訪問本地網站: </string>
|
||||
<string name="hotspot_help_site_1">仔細檢查輸入的網址是否正確,小小錯誤也不行</string>
|
||||
<string name="hotspot_help_site_2">當您嘗試訪問這個網站時,請先確認手機已連接正確的 Wi-Fi (見上)</string>
|
||||
<string name="hotspot_help_site_3">若有安裝防護軟體,請確認它不會封鎖 Briar 存取</string>
|
||||
<string name="hotspot_help_site_4">若您能訪問該網站但無法下載 Briar 應用,請先試試其它不同的瀏覽器</string>
|
||||
<string name="hotspot_help_fallback_title">沒有用</string>
|
||||
<string name="hotspot_help_fallback_intro">您可以試著把這個應用存成 .apk 檔案來作分享。該檔案被傳輸到其它設備上,就可用來安裝 Briar
|
||||
\n\n 提示: 若透過藍牙分享則可能需先將副檔名改為 .zip </string>
|
||||
<string name="hotspot_help_fallback_button">儲存應用軟體</string>
|
||||
<!--error handling-->
|
||||
<string name="hotspot_error_intro">無法透過 Wi-Fi 來分享 Briar 應用</string>
|
||||
<string name="hotspot_error_no_wifi_direct">設備不能用 Wi-Fi Direct</string>
|
||||
<string name="hotspot_error_start_callback_failed">熱點啟動失敗: 錯誤訊息 %s</string>
|
||||
<string name="hotspot_error_start_callback_failed_unknown">熱點因不名錯誤無法啟動,原因為 %d</string>
|
||||
<string name="hotspot_error_start_callback_no_group_info">熱點無法啟動: 無群組資訊</string>
|
||||
<string name="hotspot_error_web_server_start">啟動網站伺服器時出錯</string>
|
||||
<string name="hotspot_error_web_server_serve">網站出問題 \n\n 如果問題一直持續,請利用 Briar 發送反饋(其為匿名資料)</string>
|
||||
<string name="hotspot_flag_test">警告:此應用安裝於 Android Studio 因此不能在其它設備上安裝</string>
|
||||
<string name="hotspot_error_framework_busy">無法打開熱點 \n\n 或您正在執行其它熱點或是利用 Wi-Fi 分享網路連接,請先暫停它們然後再重試開啟熱點</string>
|
||||
<!--Transfer Data via Removable Drives-->
|
||||
<string name="removable_drive_menu_title">透過移動硬碟連線</string>
|
||||
<string name="removable_drive_intro">若無法連上網際網路、也不能使用 Wi-Fi 或藍牙,Briar 還可以透過移動裝置如 USB 或 SD 卡來傳輸訊息。</string>
|
||||
<string name="removable_drive_explanation">若無法透過網際網路、藍牙或Wi-Fi 聯繫聯絡人,Briar 還可以利用 隨身碟 或 SD 記憶卡來傳輸訊息 \n\n 若按下\"發送資料\" 鍵,原本待發送給聯絡人的資料將會寫入到隨身碟中,其包括私人訊息、附件、部落格、論壇與私人小組等 \n\n 這些資料都會予以加密再寫入移動式儲存器 \n\n 若您的聯絡人拿到這個隨身碟,他們可利用\"接收資料\"按鍵把資料滙入 Briar . </string>
|
||||
<string name="removable_drive_title_send">發送資料</string>
|
||||
<string name="removable_drive_title_receive">接收資料</string>
|
||||
<string name="removable_drive_send_intro">輕敲下方按鍵即可建立一個涵蓋加密訊息的新檔案,並決定它要存放的位置\n\n 若要將新檔案存到隨身碟,現在即請接入。</string>
|
||||
<string name="removable_drive_send_no_data">目前沒有待送出的訊息給這名聯絡人</string>
|
||||
<string name="removable_drive_send_not_supported">這名聯絡人使用舊版本 Briar 或過舊的設備故無法使用此功能</string>
|
||||
<string name="removable_drive_send_button">選取滙出之檔案</string>
|
||||
<string name="removable_drive_ongoing">請靜候進行中的任務完成</string>
|
||||
<string name="removable_drive_receive_intro">輕點下方來選擇聯絡人發送的檔案 \n\n 若檔案是在移動式硬碟,請接入</string>
|
||||
<string name="removable_drive_receive_button">選取滙出之檔案</string>
|
||||
<string name="removable_drive_success_send_title">成功滙出</string>
|
||||
<string name="removable_drive_success_send_text">成功滙出資料,您有 28 天的時間可將此份檔案傳給您的聯絡人\n\n 若檔案存在可移式設備,利用狀態列的通知來退出它</string>
|
||||
<string name="removable_drive_success_receive_title">成功滙入</string>
|
||||
<string name="removable_drive_success_receive_text">已收到檔案中全部加密的訊息</string>
|
||||
<string name="removable_drive_error_send_title">滙出資料出錯</string>
|
||||
<string name="removable_drive_error_send_text">檔案無法寫入資料 \n\n 如是使用隨身碟,請檢查是否完整接入。若此問題持續無法解決,請向 Briar 團隊反應此問題</string>
|
||||
<string name="removable_drive_error_receive_title">滙入資料出錯</string>
|
||||
<string name="removable_drive_error_receive_text">Briar 無法辨識所選取的檔案 \n\n 請確認是否為正確檔案 \n\n 若選取的檔案是28 天之前所創建的,則 Briar 就無法辨識了。</string>
|
||||
<!--Screenshots-->
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_alice">愛麗詩</string>
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
|
||||
<!-- text colors -->
|
||||
<color name="briar_text_link">@color/briar_blue_400</color>
|
||||
<color name="briar_text_link_inverse">@android:color/white</color>
|
||||
<color name="briar_text_primary">#df000000</color>
|
||||
<color name="briar_text_primary_inverse">@android:color/white</color>
|
||||
<color name="briar_text_secondary_inverse">#b4ffffff</color>
|
||||
|
||||
@@ -252,6 +252,8 @@
|
||||
<string name="qr_code_invalid">The QR code is invalid</string>
|
||||
<string name="qr_code_too_old_1">The QR code you have scanned comes from an older version of Briar.\n\nPlease ask your contact to upgrade to the latest version and then try again.</string>
|
||||
<string name="qr_code_too_new_1">The QR code you have scanned comes from a newer version of Briar.\n\nPlease upgrade to the latest version and then try again.</string>
|
||||
<string name="mailbox_qr_code_for_contact">The QR code you have scanned comes from Briar Mailbox.\n\nIf you want to link a Mailbox, please choose Settings > Mailbox from the Briar menu.</string>
|
||||
<string name="qr_code_format_unknown">The QR code you have scanned is not meant for adding a Briar contact.\n\nPlease scan the QR code shown on your contact\'s screen.</string>
|
||||
<string name="camera_error">Camera error</string>
|
||||
<string name="connecting_to_device">Connecting to device\u2026</string>
|
||||
<string name="authenticating_with_device">Authenticating with device\u2026</string>
|
||||
@@ -459,6 +461,10 @@
|
||||
<string name="forum_declined_toast">Invitation declined</string>
|
||||
<string name="shared_by_format">Shared by %s</string>
|
||||
<string name="forum_invitation_already_sharing">Already sharing</string>
|
||||
<string name="forum_invitation_already_invited">Invitation already sent</string>
|
||||
<string name="forum_invitation_invite_received">Invitation already received</string>
|
||||
<string name="forum_invitation_not_supported">Not supported by this contact</string>
|
||||
<string name="forum_invitation_error">Error. This is a bug and not your fault</string>
|
||||
<string name="forum_invitation_response_accepted_sent">You accepted the forum invitation from %s.</string>
|
||||
<string name="forum_invitation_response_declined_sent">You declined the forum invitation from %s.</string>
|
||||
<string name="forum_invitation_response_declined_auto">The forum invitation from %s was automatically declined.</string>
|
||||
@@ -633,9 +639,13 @@
|
||||
<string name="mailbox_setup_download_link">Share Download Link</string>
|
||||
<string name="mailbox_setup_button_scan">Scan Mailbox QR code</string>
|
||||
<string name="permission_camera_qr_denied_body">You have denied access to the camera, but scanning a QR code requires using the camera.\n\nPlease consider granting access.</string>
|
||||
<string name="mailbox_setup_connecting">Connecting…</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_title">Wrong QR code</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">The scanned code is invalid. Please open the Briar Mailbox app on your Mailbox device and scan the QR code it presents.</string>
|
||||
<string name="mailbox_setup_connecting">Connecting to Mailbox…</string>
|
||||
<!-- This string is shown when connecting to a Mailbox for the first time. The placeholder will be replaced with a duration, e.g. "2 minutes". -->
|
||||
<string name="mailbox_setup_connecting_info">This may take up to %1s</string>
|
||||
<string name="mailbox_qr_code_too_old">The QR code you have scanned comes from an older version of Briar Mailbox.\n\nPlease upgrade Briar Mailbox to the latest version and then try again.</string>
|
||||
<string name="mailbox_qr_code_too_new">The QR code you have scanned comes from a newer version of Briar Mailbox.\n\nPlease upgrade Briar to the latest version and then try again.</string>
|
||||
<string name="contact_qr_code_for_mailbox">The QR code you have scanned is for adding a Briar contact.\n\nIf you want to add a contact, please go to the contact list and tap the + icon.</string>
|
||||
<string name="mailbox_setup_qr_code_wrong_description">The QR code you have scanned does not come from Briar Mailbox.\n\nPlease open the Briar Mailbox app on your Mailbox device and scan the QR code it presents.</string>
|
||||
<string name="mailbox_setup_already_paired_title">Mailbox already linked</string>
|
||||
<string name="mailbox_setup_already_paired_description">Unlink the Mailbox on your other device and try again.</string>
|
||||
<string name="mailbox_setup_io_error_title">Could not connect</string>
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.briarproject.briar.api.client.ProtocolStateException;
|
||||
import org.briarproject.briar.api.client.SessionId;
|
||||
import org.briarproject.briar.api.conversation.ConversationManager.ConversationClient;
|
||||
import org.briarproject.briar.api.privategroup.PrivateGroup;
|
||||
import org.briarproject.briar.api.sharing.SharingManager.SharingStatus;
|
||||
import org.briarproject.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.util.Collection;
|
||||
@@ -79,8 +80,13 @@ public interface GroupInvitationManager extends ConversationClient {
|
||||
Collection<GroupInvitationItem> getInvitations() throws DbException;
|
||||
|
||||
/**
|
||||
* Returns true if the given contact can be invited to the given private
|
||||
* group.
|
||||
* Returns the current {@link SharingStatus} for the given {@link Contact}
|
||||
* and {@link PrivateGroup} identified by the given {@link GroupId}.
|
||||
* This indicates whether the {@link PrivateGroup} can be shared
|
||||
* with the contact.
|
||||
*
|
||||
* @throws ProtocolStateException if {@link PrivateGroup}
|
||||
* was already dissolved.
|
||||
*/
|
||||
boolean isInvitationAllowed(Contact c, GroupId g) throws DbException;
|
||||
SharingStatus getSharingStatus(Contact c, GroupId g) throws DbException;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user