mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 02:39:05 +01:00
Compare commits
1 Commits
alpha-1.3.
...
upgrade-te
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0134f5da14 |
@@ -15,8 +15,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 30
|
||||
versionCode 10304
|
||||
versionName "1.3.4"
|
||||
versionCode 10302
|
||||
versionName "1.3.2"
|
||||
consumerProguardFiles 'proguard-rules.txt'
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
@@ -50,7 +50,7 @@ dependencies {
|
||||
compileOnly 'javax.annotation:jsr250-api:1.0'
|
||||
|
||||
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
|
||||
testImplementation 'junit:junit:4.12'
|
||||
testImplementation 'junit:junit:4.13.1'
|
||||
testImplementation "org.jmock:jmock:2.8.2"
|
||||
testImplementation "org.jmock:jmock-junit4:2.8.2"
|
||||
testImplementation "org.jmock:jmock-legacy:2.8.2"
|
||||
|
||||
@@ -10,20 +10,17 @@ import org.briarproject.bramble.api.Pair;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Scanner;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import static android.content.Context.MODE_PRIVATE;
|
||||
import static android.os.Build.VERSION.SDK_INT;
|
||||
import static java.lang.Runtime.getRuntime;
|
||||
import static java.util.Arrays.asList;
|
||||
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull;
|
||||
|
||||
@@ -121,17 +118,4 @@ public class AndroidUtils {
|
||||
public static String[] getSupportedImageContentTypes() {
|
||||
return new String[] {"image/jpeg", "image/png", "image/gif"};
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static String getSystemProperty(String propName) {
|
||||
try {
|
||||
Process p = getRuntime().exec("getprop " + propName);
|
||||
Scanner s = new Scanner(p.getInputStream());
|
||||
String line = s.nextLine();
|
||||
s.close();
|
||||
return line;
|
||||
} catch (SecurityException | IOException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ dependencyVerification {
|
||||
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
|
||||
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
||||
'javax.xml.bind:jaxb-api:2.3.1:jaxb-api-2.3.1.jar:88b955a0df57880a26a74708bc34f74dcaf8ebf4e78843a28b50eae945732b06',
|
||||
'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a',
|
||||
'junit:junit:4.13.1:junit-4.13.1.jar:c30719db974d6452793fe191b3638a5777005485bae145924044530ffa5f6122',
|
||||
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
|
||||
'net.sf.jopt-simple:jopt-simple:4.9:jopt-simple-4.9.jar:26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5',
|
||||
'net.sf.kxml:kxml2:2.3.0:kxml2-2.3.0.jar:f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2',
|
||||
|
||||
@@ -10,7 +10,7 @@ dependencies {
|
||||
implementation "com.google.dagger:dagger:2.24"
|
||||
implementation 'com.google.code.findbugs:jsr305:3.0.2'
|
||||
|
||||
testImplementation 'junit:junit:4.12'
|
||||
testImplementation 'junit:junit:4.13.1'
|
||||
testImplementation "org.jmock:jmock:2.8.2"
|
||||
testImplementation "org.jmock:jmock-junit4:2.8.2"
|
||||
testImplementation "org.jmock:jmock-legacy:2.8.2"
|
||||
|
||||
@@ -3,7 +3,7 @@ package org.briarproject.bramble.api.keyagreement.event;
|
||||
import org.briarproject.bramble.api.event.Event;
|
||||
|
||||
/**
|
||||
* An event that is broadcast when a BQP protocol begins.
|
||||
* An event that is broadcast when a BQP protocol completes.
|
||||
*/
|
||||
public class KeyAgreementStartedEvent extends Event {
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ dependencyVerification {
|
||||
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
|
||||
'com.google.dagger:dagger:2.24:dagger-2.24.jar:550a6e46a6dfcdf1d764887b6090cea94f783327e50e5c73754f18facfc70b64',
|
||||
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
||||
'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a',
|
||||
'junit:junit:4.13.1:junit-4.13.1.jar:c30719db974d6452793fe191b3638a5777005485bae145924044530ffa5f6122',
|
||||
'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d',
|
||||
'org.apache.ant:ant:1.9.4:ant-1.9.4.jar:649ae0730251de07b8913f49286d46bba7b92d47c5f332610aa426c4f02161d8',
|
||||
'org.beanshell:bsh:1.3.0:bsh-1.3.0.jar:9b04edc75d19db54f1b4e8b5355e9364384c6cf71eb0a1b9724c159d779879f8',
|
||||
|
||||
@@ -21,7 +21,7 @@ dependencies {
|
||||
|
||||
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
|
||||
testImplementation 'org.hsqldb:hsqldb:2.3.5' // The last version that supports Java 1.6
|
||||
testImplementation 'junit:junit:4.12'
|
||||
testImplementation 'junit:junit:4.13.1'
|
||||
testImplementation "org.jmock:jmock:2.8.2"
|
||||
testImplementation "org.jmock:jmock-junit4:2.8.2"
|
||||
testImplementation "org.jmock:jmock-legacy:2.8.2"
|
||||
|
||||
@@ -473,16 +473,6 @@ abstract class AbstractBluetoothPlugin<S, SS> implements BluetoothPlugin,
|
||||
return discoverSemaphore.availablePermits() == 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disablePolling() {
|
||||
connectionLimiter.startLimiting();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void enablePolling() {
|
||||
connectionLimiter.endLimiting();
|
||||
}
|
||||
|
||||
@Override
|
||||
public DuplexTransportConnection discoverAndConnectForSetup(String uuid) {
|
||||
DuplexTransportConnection conn = discoverAndConnect(uuid);
|
||||
@@ -511,9 +501,9 @@ abstract class AbstractBluetoothPlugin<S, SS> implements BluetoothPlugin,
|
||||
if (s.getNamespace().equals(ID.getString()))
|
||||
ioExecutor.execute(() -> onSettingsUpdated(s.getSettings()));
|
||||
} else if (e instanceof KeyAgreementListeningEvent) {
|
||||
connectionLimiter.startLimiting();
|
||||
ioExecutor.execute(connectionLimiter::keyAgreementStarted);
|
||||
} else if (e instanceof KeyAgreementStoppedListeningEvent) {
|
||||
connectionLimiter.endLimiting();
|
||||
ioExecutor.execute(connectionLimiter::keyAgreementEnded);
|
||||
} else if (e instanceof RemoteTransportPropertiesUpdatedEvent) {
|
||||
RemoteTransportPropertiesUpdatedEvent r =
|
||||
(RemoteTransportPropertiesUpdatedEvent) e;
|
||||
|
||||
@@ -7,15 +7,14 @@ import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
|
||||
interface BluetoothConnectionLimiter {
|
||||
|
||||
/**
|
||||
* Tells the limiter to not allow regular polling connections (because we
|
||||
* are about to do key agreement, or connect via BT for setup).
|
||||
* Informs the limiter that key agreement has started.
|
||||
*/
|
||||
void startLimiting();
|
||||
void keyAgreementStarted();
|
||||
|
||||
/**
|
||||
* Tells the limiter to no longer limit regular polling connections.
|
||||
* Informs the limiter that key agreement has ended.
|
||||
*/
|
||||
void endLimiting();
|
||||
void keyAgreementEnded();
|
||||
|
||||
/**
|
||||
* Returns true if a contact connection can be opened. This method does not
|
||||
|
||||
@@ -30,37 +30,34 @@ class BluetoothConnectionLimiterImpl implements BluetoothConnectionLimiter {
|
||||
private final List<DuplexTransportConnection> connections =
|
||||
new LinkedList<>();
|
||||
@GuardedBy("lock")
|
||||
private int limitingInProgress = 0;
|
||||
private boolean keyAgreementInProgress = false;
|
||||
|
||||
BluetoothConnectionLimiterImpl(EventBus eventBus) {
|
||||
this.eventBus = eventBus;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startLimiting() {
|
||||
public void keyAgreementStarted() {
|
||||
synchronized (lock) {
|
||||
limitingInProgress++;
|
||||
keyAgreementInProgress = true;
|
||||
}
|
||||
LOG.info("Limiting started");
|
||||
LOG.info("Key agreement started");
|
||||
eventBus.broadcast(new CloseSyncConnectionsEvent(ID));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endLimiting() {
|
||||
public void keyAgreementEnded() {
|
||||
synchronized (lock) {
|
||||
limitingInProgress--;
|
||||
if (limitingInProgress < 0) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
keyAgreementInProgress = false;
|
||||
}
|
||||
LOG.info("Limiting ended");
|
||||
LOG.info("Key agreement ended");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canOpenContactConnection() {
|
||||
synchronized (lock) {
|
||||
if (limitingInProgress > 0) {
|
||||
LOG.info("Can't open contact connection while limiting");
|
||||
if (keyAgreementInProgress) {
|
||||
LOG.info("Can't open contact connection during key agreement");
|
||||
return false;
|
||||
} else {
|
||||
LOG.info("Can open contact connection");
|
||||
|
||||
@@ -11,10 +11,6 @@ public interface BluetoothPlugin extends DuplexPlugin {
|
||||
|
||||
boolean isDiscovering();
|
||||
|
||||
void disablePolling();
|
||||
|
||||
void enablePolling();
|
||||
|
||||
@Nullable
|
||||
DuplexTransportConnection discoverAndConnectForSetup(String uuid);
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
Bridge obfs4 192.95.36.142:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=1
|
||||
Bridge obfs4 38.229.1.78:80 C8CBDB2464FC9804A69531437BCF2BE31FDD2EE4 cert=Hmyfd2ev46gGY7NoVxA9ngrPF2zCZtzskRTzoWXbxNkzeVnGFPWmrTtILRyqCTjHR+s9dg iat-mode=1
|
||||
Bridge obfs4 38.229.33.83:80 0BAC39417268B96B9F514E7F63FA6FBA1A788955 cert=VwEFpk9F/UN9JED7XpG1XOjm/O8ZCXK80oPecgWnNDZDv5pdkhq1OpbAH0wNqOT6H6BmRQ iat-mode=1
|
||||
Bridge obfs4 37.218.245.14:38224 D9A82D2F9C2F65A18407B1D2B764F130847F8B5D cert=bjRaMrr1BRiAW8IE9U5z27fQaYgOhX1UCmOpg2pFpoMvo6ZgQMzLsaTzzQNTlm7hNcb+Sg iat-mode=0
|
||||
Bridge obfs4 85.31.186.26:443 91A6354697E6B02A386312F68D82CF86824D3606 cert=PBwr+S8JTVZo6MPdHnkTwXJPILWADLqfMGoVvhZClMq/Urndyd42BwX9YFJHZnBB3H0XCw iat-mode=0
|
||||
Bridge obfs4 193.11.166.194:27015 2D82C2E354D531A68469ADF7F878FA6060C6BACA cert=4TLQPJrTSaDffMK7Nbao6LC7G9OW/NHkUwIdjLSS3KYf0Nv4/nQiiI8dY2TcsQx01NniOg iat-mode=0
|
||||
|
||||
@@ -18,7 +18,7 @@ dependencyVerification {
|
||||
'com.squareup:javapoet:1.11.1:javapoet-1.11.1.jar:9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90',
|
||||
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
|
||||
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
||||
'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a',
|
||||
'junit:junit:4.13.1:junit-4.13.1.jar:c30719db974d6452793fe191b3638a5777005485bae145924044530ffa5f6122',
|
||||
'net.i2p.crypto:eddsa:0.2.0:eddsa-0.2.0.jar:a7cb1b85c16e2f0730b9204106929a1d9aaae1df728adc7041a8b8b605692140',
|
||||
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
|
||||
'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d',
|
||||
|
||||
@@ -23,7 +23,7 @@ dependencies {
|
||||
|
||||
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
|
||||
testImplementation project(path: ':bramble-core', configuration: 'testOutput')
|
||||
testImplementation 'junit:junit:4.12'
|
||||
testImplementation 'junit:junit:4.13.1'
|
||||
testImplementation "org.jmock:jmock:2.8.2"
|
||||
testImplementation "org.jmock:jmock-junit4:2.8.2"
|
||||
testImplementation "org.jmock:jmock-legacy:2.8.2"
|
||||
|
||||
@@ -23,10 +23,8 @@ import org.junit.runners.Parameterized;
|
||||
import org.junit.runners.Parameterized.Parameters;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.inject.Inject;
|
||||
@@ -47,22 +45,15 @@ import static org.junit.Assume.assumeTrue;
|
||||
public class BridgeTest extends BrambleTestCase {
|
||||
|
||||
@Parameters
|
||||
public static Iterable<Params> data() {
|
||||
public static Iterable<String> data() {
|
||||
BrambleJavaIntegrationTestComponent component =
|
||||
DaggerBrambleJavaIntegrationTestComponent.builder().build();
|
||||
BrambleCoreIntegrationTestEagerSingletons.Helper
|
||||
.injectEagerSingletons(component);
|
||||
// Share a failure counter among all the test instances
|
||||
AtomicInteger failures = new AtomicInteger(0);
|
||||
List<String> bridges =
|
||||
component.getCircumventionProvider().getBridges(false);
|
||||
List<Params> states = new ArrayList<>(bridges.size());
|
||||
for (String bridge : bridges) states.add(new Params(bridge, failures));
|
||||
return states;
|
||||
return component.getCircumventionProvider().getBridges(false);
|
||||
}
|
||||
|
||||
private final static long TIMEOUT = SECONDS.toMillis(60);
|
||||
private final static int NUM_FAILURES_ALLOWED = 1;
|
||||
|
||||
private final static Logger LOG = getLogger(BridgeTest.class.getName());
|
||||
|
||||
@@ -89,13 +80,11 @@ public class BridgeTest extends BrambleTestCase {
|
||||
|
||||
private final File torDir = getTestDirectory();
|
||||
private final String bridge;
|
||||
private final AtomicInteger failures;
|
||||
|
||||
private UnixTorPluginFactory factory;
|
||||
|
||||
public BridgeTest(Params params) {
|
||||
bridge = params.bridge;
|
||||
failures = params.failures;
|
||||
public BridgeTest(String bridge) {
|
||||
this.bridge = bridge;
|
||||
}
|
||||
|
||||
@Before
|
||||
@@ -163,24 +152,10 @@ public class BridgeTest extends BrambleTestCase {
|
||||
clock.sleep(500);
|
||||
}
|
||||
if (plugin.getState() != ACTIVE) {
|
||||
LOG.warning("Could not connect to Tor within timeout");
|
||||
if (failures.incrementAndGet() > NUM_FAILURES_ALLOWED) {
|
||||
fail(failures.get() + " bridges are unreachable");
|
||||
}
|
||||
fail("Could not connect to Tor within timeout.");
|
||||
}
|
||||
} finally {
|
||||
plugin.stop();
|
||||
}
|
||||
}
|
||||
|
||||
private static class Params {
|
||||
|
||||
private final String bridge;
|
||||
private final AtomicInteger failures;
|
||||
|
||||
private Params(String bridge, AtomicInteger failures) {
|
||||
this.bridge = bridge;
|
||||
this.failures = failures;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ dependencyVerification {
|
||||
'com.squareup:javapoet:1.11.1:javapoet-1.11.1.jar:9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90',
|
||||
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
|
||||
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
||||
'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a',
|
||||
'junit:junit:4.13.1:junit-4.13.1.jar:c30719db974d6452793fe191b3638a5777005485bae145924044530ffa5f6122',
|
||||
'net.java.dev.jna:jna-platform:4.5.2:jna-platform-4.5.2.jar:f1d00c167d8921c6e23c626ef9f1c3ae0be473c95c68ffa012bc7ae55a87e2d6',
|
||||
'net.java.dev.jna:jna:4.5.2:jna-4.5.2.jar:0c8eb7acf67261656d79005191debaba3b6bf5dd60a43735a245429381dbecff',
|
||||
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
|
||||
|
||||
@@ -26,8 +26,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 30
|
||||
versionCode 10304
|
||||
versionName "1.3.4"
|
||||
versionCode 10302
|
||||
versionName "1.3.2"
|
||||
applicationId "org.briarproject.briar.android"
|
||||
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
@@ -133,7 +133,7 @@ dependencies {
|
||||
testImplementation project(path: ':bramble-core', configuration: 'testOutput')
|
||||
testImplementation 'androidx.test:runner:1.3.0'
|
||||
testImplementation 'androidx.test.ext:junit:1.1.2'
|
||||
testImplementation 'androidx.fragment:fragment-testing:1.2.5'
|
||||
testImplementation 'androidx.fragment:fragment-testing:1.3.3'
|
||||
testImplementation "androidx.arch.core:core-testing:2.1.0"
|
||||
testImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
|
||||
testImplementation 'org.robolectric:robolectric:4.3.1'
|
||||
|
||||
@@ -104,7 +104,8 @@
|
||||
|
||||
<activity
|
||||
android:name="org.briarproject.briar.android.account.SetupActivity"
|
||||
android:label="@string/setup_title" />
|
||||
android:label="@string/setup_title"
|
||||
android:windowSoftInputMode="adjustResize|stateAlwaysVisible" />
|
||||
|
||||
<activity
|
||||
android:name="org.briarproject.briar.android.splash.SplashScreenActivity"
|
||||
@@ -321,6 +322,25 @@
|
||||
android:value="org.briarproject.briar.android.blog.BlogActivity" />
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name="org.briarproject.briar.android.blog.RssFeedImportActivity"
|
||||
android:label="@string/blogs_rss_feeds_import"
|
||||
android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
|
||||
android:windowSoftInputMode="adjustResize|stateAlwaysVisible">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name="org.briarproject.briar.android.blog.RssFeedManageActivity"
|
||||
android:label="@string/blogs_rss_feeds_manage"
|
||||
android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name="org.briarproject.briar.android.contact.add.nearby.AddNearbyContactActivity"
|
||||
android:label="@string/add_contact_title"
|
||||
@@ -427,15 +447,6 @@
|
||||
android:theme="@style/BriarTheme"
|
||||
android:windowSoftInputMode="adjustResize|stateHidden" />
|
||||
|
||||
<activity
|
||||
android:name="org.briarproject.briar.android.blog.RssFeedActivity"
|
||||
android:label="@string/blogs_rss_feeds"
|
||||
android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity">
|
||||
<meta-data
|
||||
android:name="android.support.PARENT_ACTIVITY"
|
||||
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".android.contact.add.remote.PendingContactListActivity"
|
||||
android:label="@string/pending_contact_requests"
|
||||
|
||||
@@ -32,7 +32,6 @@ public class DozeFragment extends SetupFragment
|
||||
private DozeView dozeView;
|
||||
private HuaweiProtectedAppsView huaweiProtectedAppsView;
|
||||
private HuaweiAppLaunchView huaweiAppLaunchView;
|
||||
private XiaomiView xiaomiView;
|
||||
private Button next;
|
||||
private boolean secondAttempt = false;
|
||||
|
||||
@@ -54,8 +53,6 @@ public class DozeFragment extends SetupFragment
|
||||
huaweiProtectedAppsView.setOnCheckedChangedListener(this);
|
||||
huaweiAppLaunchView = v.findViewById(R.id.huaweiAppLaunchView);
|
||||
huaweiAppLaunchView.setOnCheckedChangedListener(this);
|
||||
xiaomiView = v.findViewById(R.id.xiaomiView);
|
||||
xiaomiView.setOnCheckedChangedListener(this);
|
||||
next = v.findViewById(R.id.next);
|
||||
ProgressBar progressBar = v.findViewById(R.id.progress);
|
||||
|
||||
@@ -101,8 +98,7 @@ public class DozeFragment extends SetupFragment
|
||||
public void onCheckedChanged() {
|
||||
next.setEnabled(dozeView.isChecked() &&
|
||||
huaweiProtectedAppsView.isChecked() &&
|
||||
huaweiAppLaunchView.isChecked() &&
|
||||
xiaomiView.isChecked());
|
||||
huaweiAppLaunchView.isChecked());
|
||||
}
|
||||
|
||||
@SuppressLint("BatteryLife")
|
||||
|
||||
@@ -10,7 +10,6 @@ class DozeHelperImpl implements DozeHelper {
|
||||
Context appContext = context.getApplicationContext();
|
||||
return needsDozeWhitelisting(appContext) ||
|
||||
HuaweiProtectedAppsView.needsToBeShown(appContext) ||
|
||||
HuaweiAppLaunchView.needsToBeShown(appContext) ||
|
||||
XiaomiView.isXiaomiOrRedmiDevice();
|
||||
HuaweiAppLaunchView.needsToBeShown(appContext);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ public class SetPasswordFragment extends SetupFragment {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
IBinder token = passwordEntry.getWindowToken();
|
||||
Object o = requireContext().getSystemService(INPUT_METHOD_SERVICE);
|
||||
Object o = getContext().getSystemService(INPUT_METHOD_SERVICE);
|
||||
((InputMethodManager) o).hideSoftInputFromWindow(token, 0);
|
||||
viewModel.setPassword(passwordEntry.getText().toString());
|
||||
}
|
||||
|
||||
@@ -26,8 +26,6 @@ import static org.briarproject.briar.android.account.SetupViewModel.State.CREATE
|
||||
import static org.briarproject.briar.android.account.SetupViewModel.State.DOZE;
|
||||
import static org.briarproject.briar.android.account.SetupViewModel.State.FAILED;
|
||||
import static org.briarproject.briar.android.account.SetupViewModel.State.SET_PASSWORD;
|
||||
import static org.briarproject.briar.android.util.UiUtils.setInputStateAlwaysVisible;
|
||||
import static org.briarproject.briar.android.util.UiUtils.setInputStateHidden;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
@@ -57,13 +55,10 @@ public class SetupActivity extends BaseActivity
|
||||
|
||||
private void onStateChanged(SetupViewModel.State state) {
|
||||
if (state == AUTHOR_NAME) {
|
||||
setInputStateAlwaysVisible(this);
|
||||
showInitialFragment(AuthorNameFragment.newInstance());
|
||||
} else if (state == SET_PASSWORD) {
|
||||
setInputStateAlwaysVisible(this);
|
||||
showPasswordFragment();
|
||||
} else if (state == DOZE) {
|
||||
setInputStateHidden(this);
|
||||
showDozeFragment();
|
||||
} else if (state == CREATED || state == FAILED) {
|
||||
// TODO: Show an error if failed
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
package org.briarproject.briar.android.account;
|
||||
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.briar.R;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.annotation.UiThread;
|
||||
|
||||
import static android.os.Build.BRAND;
|
||||
import static org.briarproject.bramble.util.AndroidUtils.getSystemProperty;
|
||||
import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty;
|
||||
import static org.briarproject.briar.android.util.UiUtils.showOnboardingDialog;
|
||||
|
||||
@UiThread
|
||||
@NotNullByDefault
|
||||
class XiaomiView extends PowerView {
|
||||
|
||||
public XiaomiView(Context context) {
|
||||
this(context, null);
|
||||
}
|
||||
|
||||
public XiaomiView(Context context, @Nullable AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public XiaomiView(Context context, @Nullable AttributeSet attrs,
|
||||
int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
setText(R.string.setup_xiaomi_text);
|
||||
setButtonText(R.string.setup_xiaomi_button);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsToBeShown() {
|
||||
return isXiaomiOrRedmiDevice();
|
||||
}
|
||||
|
||||
public static boolean isXiaomiOrRedmiDevice() {
|
||||
return "Xiaomi".equalsIgnoreCase(BRAND) ||
|
||||
"Redmi".equalsIgnoreCase(BRAND);
|
||||
}
|
||||
|
||||
@Override
|
||||
@StringRes
|
||||
protected int getHelpText() {
|
||||
return R.string.setup_xiaomi_help;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onButtonClick() {
|
||||
int bodyRes = isMiuiTenOrLater()
|
||||
? R.string.setup_xiaomi_dialog_body_new
|
||||
: R.string.setup_xiaomi_dialog_body_old;
|
||||
showOnboardingDialog(getContext(), getContext().getString(bodyRes));
|
||||
setChecked(true);
|
||||
}
|
||||
|
||||
private boolean isMiuiTenOrLater() {
|
||||
String version = getSystemProperty("ro.miui.ui.version.name");
|
||||
if (isNullOrEmpty(version)) return false;
|
||||
version = version.replaceAll("[^\\d]", "");
|
||||
try {
|
||||
return Integer.parseInt(version) >= 10;
|
||||
} catch (NumberFormatException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,11 +13,8 @@ import org.briarproject.briar.android.blog.BlogPostFragment;
|
||||
import org.briarproject.briar.android.blog.FeedFragment;
|
||||
import org.briarproject.briar.android.blog.ReblogActivity;
|
||||
import org.briarproject.briar.android.blog.ReblogFragment;
|
||||
import org.briarproject.briar.android.blog.RssFeedActivity;
|
||||
import org.briarproject.briar.android.blog.RssFeedDeleteFeedDialogFragment;
|
||||
import org.briarproject.briar.android.blog.RssFeedImportFailedDialogFragment;
|
||||
import org.briarproject.briar.android.blog.RssFeedImportFragment;
|
||||
import org.briarproject.briar.android.blog.RssFeedManageFragment;
|
||||
import org.briarproject.briar.android.blog.RssFeedImportActivity;
|
||||
import org.briarproject.briar.android.blog.RssFeedManageActivity;
|
||||
import org.briarproject.briar.android.blog.WriteBlogPostActivity;
|
||||
import org.briarproject.briar.android.contact.ContactListFragment;
|
||||
import org.briarproject.briar.android.contact.add.nearby.AddNearbyContactActivity;
|
||||
@@ -164,7 +161,9 @@ public interface ActivityComponent {
|
||||
|
||||
void inject(IntroductionActivity activity);
|
||||
|
||||
void inject(RssFeedActivity activity);
|
||||
void inject(RssFeedImportActivity activity);
|
||||
|
||||
void inject(RssFeedManageActivity activity);
|
||||
|
||||
void inject(StartupFailureActivity activity);
|
||||
|
||||
@@ -234,12 +233,4 @@ public interface ActivityComponent {
|
||||
|
||||
void inject(
|
||||
BluetoothConnecterDialogFragment bluetoothConnecterDialogFragment);
|
||||
|
||||
void inject(RssFeedImportFragment fragment);
|
||||
|
||||
void inject(RssFeedManageFragment fragment);
|
||||
|
||||
void inject(RssFeedImportFailedDialogFragment fragment);
|
||||
|
||||
void inject(RssFeedDeleteFeedDialogFragment fragment);
|
||||
}
|
||||
|
||||
@@ -20,8 +20,4 @@ public interface BlogModule {
|
||||
@ViewModelKey(BlogViewModel.class)
|
||||
ViewModel bindBlogViewModel(BlogViewModel blogViewModel);
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ViewModelKey(RssFeedViewModel.class)
|
||||
ViewModel bindRssFeedViewModel(RssFeedViewModel rssFeedViewModel);
|
||||
}
|
||||
|
||||
@@ -106,11 +106,9 @@ public class FeedFragment extends BaseFragment
|
||||
adapter.submitList(update.getItems(), () -> {
|
||||
Boolean wasLocal = update.getPostAddedWasLocal();
|
||||
if (wasLocal != null && wasLocal) {
|
||||
showSnackBar(R.string.blogs_blog_post_created, true);
|
||||
// automatically scroll to our new post
|
||||
list.smoothScrollToPosition(0);
|
||||
showSnackBar(R.string.blogs_blog_post_created);
|
||||
} else if (wasLocal != null) {
|
||||
showSnackBar(R.string.blogs_blog_post_received, false);
|
||||
showSnackBar(R.string.blogs_blog_post_received);
|
||||
}
|
||||
viewModel.resetLocalUpdate();
|
||||
list.showData();
|
||||
@@ -133,8 +131,15 @@ public class FeedFragment extends BaseFragment
|
||||
i.putExtra(GROUP_ID, personalBlog.getId().getBytes());
|
||||
startActivity(i);
|
||||
return true;
|
||||
} else if (itemId == R.id.action_rss_feeds) {
|
||||
Intent i = new Intent(getActivity(), RssFeedActivity.class);
|
||||
} else if (itemId == R.id.action_rss_feeds_import) {
|
||||
Intent i = new Intent(getActivity(), RssFeedImportActivity.class);
|
||||
startActivity(i);
|
||||
return true;
|
||||
} else if (itemId == R.id.action_rss_feeds_manage) {
|
||||
Blog personalBlog = viewModel.getPersonalBlog().getValue();
|
||||
if (personalBlog == null) return false;
|
||||
Intent i = new Intent(getActivity(), RssFeedManageActivity.class);
|
||||
i.putExtra(GROUP_ID, personalBlog.getId().getBytes());
|
||||
startActivity(i);
|
||||
return true;
|
||||
}
|
||||
@@ -172,12 +177,12 @@ public class FeedFragment extends BaseFragment
|
||||
return i;
|
||||
}
|
||||
|
||||
private void showSnackBar(int stringRes, boolean isLocal) {
|
||||
private void showSnackBar(int stringRes) {
|
||||
int firstVisible =
|
||||
layoutManager.findFirstCompletelyVisibleItemPosition();
|
||||
int lastVisible = layoutManager.findLastCompletelyVisibleItemPosition();
|
||||
int count = adapter.getItemCount();
|
||||
boolean scroll = !isLocal && count > (lastVisible - firstVisible + 1);
|
||||
boolean scroll = count > (lastVisible - firstVisible + 1);
|
||||
|
||||
BriarSnackbarBuilder sb = new BriarSnackbarBuilder();
|
||||
if (scroll) {
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
package org.briarproject.briar.android.blog;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||
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.BaseFragment.BaseFragmentListener;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import static org.briarproject.briar.android.blog.RssFeedViewModel.ImportResult.EXISTS;
|
||||
import static org.briarproject.briar.android.blog.RssFeedViewModel.ImportResult.FAILED;
|
||||
import static org.briarproject.briar.android.blog.RssFeedViewModel.ImportResult.IMPORTED;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
public class RssFeedActivity extends BriarActivity
|
||||
implements BaseFragmentListener {
|
||||
|
||||
@Inject
|
||||
ViewModelProvider.Factory viewModelFactory;
|
||||
private RssFeedViewModel viewModel;
|
||||
|
||||
@Override
|
||||
public void injectActivity(ActivityComponent component) {
|
||||
component.inject(this);
|
||||
|
||||
viewModel = new ViewModelProvider(this, viewModelFactory)
|
||||
.get(RssFeedViewModel.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.activity_fragment_container);
|
||||
|
||||
if (savedInstanceState == null) {
|
||||
showInitialFragment(RssFeedManageFragment.newInstance());
|
||||
}
|
||||
|
||||
viewModel.getImportResult().observeEvent(this, this::onImportResult);
|
||||
}
|
||||
|
||||
private void onImportResult(RssFeedViewModel.ImportResult result) {
|
||||
if (result == IMPORTED) {
|
||||
FragmentManager fm = getSupportFragmentManager();
|
||||
if (fm.findFragmentByTag(RssFeedImportFragment.TAG) != null) {
|
||||
onBackPressed();
|
||||
}
|
||||
} else if (result == FAILED) {
|
||||
RssFeedImportFailedDialogFragment dialog =
|
||||
RssFeedImportFailedDialogFragment.newInstance();
|
||||
dialog.show(getSupportFragmentManager(),
|
||||
RssFeedImportFailedDialogFragment.TAG);
|
||||
} else if (result == EXISTS) {
|
||||
Toast.makeText(this, R.string.blogs_rss_feeds_import_exists,
|
||||
Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,54 +7,91 @@ import android.view.ViewGroup;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.android.util.BriarAdapter;
|
||||
import org.briarproject.briar.android.util.UiUtils;
|
||||
import org.briarproject.briar.api.feed.Feed;
|
||||
|
||||
import androidx.recyclerview.widget.DiffUtil;
|
||||
import androidx.recyclerview.widget.ListAdapter;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import static android.view.View.GONE;
|
||||
import static android.view.View.VISIBLE;
|
||||
import static org.briarproject.briar.android.util.UiUtils.formatDate;
|
||||
|
||||
@NotNullByDefault
|
||||
class RssFeedAdapter extends ListAdapter<Feed, RssFeedAdapter.FeedViewHolder> {
|
||||
class RssFeedAdapter extends BriarAdapter<Feed, RssFeedAdapter.FeedViewHolder> {
|
||||
|
||||
private final RssFeedListener listener;
|
||||
|
||||
RssFeedAdapter(RssFeedListener listener) {
|
||||
super(new DiffUtil.ItemCallback<Feed>() {
|
||||
@Override
|
||||
public boolean areItemsTheSame(Feed a, Feed b) {
|
||||
return a.getUrl().equals(b.getUrl()) &&
|
||||
a.getBlogId().equals(b.getBlogId()) &&
|
||||
a.getAdded() == b.getAdded();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areContentsTheSame(Feed a, Feed b) {
|
||||
return a.getUpdated() == b.getUpdated();
|
||||
}
|
||||
});
|
||||
RssFeedAdapter(Context ctx, RssFeedListener listener) {
|
||||
super(ctx, Feed.class);
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FeedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
View v = LayoutInflater.from(parent.getContext()).inflate(
|
||||
View v = LayoutInflater.from(ctx).inflate(
|
||||
R.layout.list_item_rss_feed, parent, false);
|
||||
return new FeedViewHolder(v);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(FeedViewHolder ui, int position) {
|
||||
ui.bindItem(getItem(position));
|
||||
Feed item = getItemAt(position);
|
||||
if (item == null) return;
|
||||
|
||||
// Feed Title
|
||||
ui.title.setText(item.getTitle());
|
||||
|
||||
// Delete Button
|
||||
ui.delete.setOnClickListener(v -> listener.onDeleteClick(item));
|
||||
|
||||
// Author
|
||||
if (item.getRssAuthor() != null) {
|
||||
ui.author.setText(item.getRssAuthor());
|
||||
ui.author.setVisibility(VISIBLE);
|
||||
ui.authorLabel.setVisibility(VISIBLE);
|
||||
} else {
|
||||
ui.author.setVisibility(GONE);
|
||||
ui.authorLabel.setVisibility(GONE);
|
||||
}
|
||||
|
||||
// Imported and Last Updated
|
||||
ui.imported.setText(UiUtils.formatDate(ctx, item.getAdded()));
|
||||
ui.updated.setText(UiUtils.formatDate(ctx, item.getUpdated()));
|
||||
|
||||
// Description
|
||||
if (item.getDescription() != null) {
|
||||
ui.description.setText(item.getDescription());
|
||||
ui.description.setVisibility(VISIBLE);
|
||||
} else {
|
||||
ui.description.setVisibility(GONE);
|
||||
}
|
||||
|
||||
// Open feed's blog when clicked
|
||||
ui.layout.setOnClickListener(v -> listener.onFeedClick(item));
|
||||
}
|
||||
|
||||
class FeedViewHolder extends RecyclerView.ViewHolder {
|
||||
private final Context ctx;
|
||||
@Override
|
||||
public int compare(Feed a, Feed b) {
|
||||
if (a == b) return 0;
|
||||
long aTime = a.getAdded(), bTime = b.getAdded();
|
||||
if (aTime > bTime) return -1;
|
||||
if (aTime < bTime) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areContentsTheSame(Feed a, Feed b) {
|
||||
return a.getUpdated() == b.getUpdated();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areItemsTheSame(Feed a, Feed b) {
|
||||
return a.getUrl().equals(b.getUrl()) &&
|
||||
a.getBlogId().equals(b.getBlogId()) &&
|
||||
a.getAdded() == b.getAdded();
|
||||
}
|
||||
|
||||
static class FeedViewHolder extends RecyclerView.ViewHolder {
|
||||
private final View layout;
|
||||
private final TextView title;
|
||||
private final ImageButton delete;
|
||||
@@ -67,7 +104,6 @@ class RssFeedAdapter extends ListAdapter<Feed, RssFeedAdapter.FeedViewHolder> {
|
||||
private FeedViewHolder(View v) {
|
||||
super(v);
|
||||
|
||||
ctx = v.getContext();
|
||||
layout = v;
|
||||
title = v.findViewById(R.id.titleView);
|
||||
delete = v.findViewById(R.id.deleteButton);
|
||||
@@ -77,44 +113,10 @@ class RssFeedAdapter extends ListAdapter<Feed, RssFeedAdapter.FeedViewHolder> {
|
||||
authorLabel = v.findViewById(R.id.author);
|
||||
description = v.findViewById(R.id.descriptionView);
|
||||
}
|
||||
|
||||
private void bindItem(Feed item) {
|
||||
// Feed Title
|
||||
title.setText(item.getTitle());
|
||||
|
||||
// Delete Button
|
||||
delete.setOnClickListener(v -> listener.onDeleteClick(item));
|
||||
|
||||
// Author
|
||||
if (item.getRssAuthor() != null) {
|
||||
author.setText(item.getRssAuthor());
|
||||
author.setVisibility(VISIBLE);
|
||||
authorLabel.setVisibility(VISIBLE);
|
||||
} else {
|
||||
author.setVisibility(GONE);
|
||||
authorLabel.setVisibility(GONE);
|
||||
}
|
||||
|
||||
// Imported and Last Updated
|
||||
imported.setText(formatDate(ctx, item.getAdded()));
|
||||
updated.setText(formatDate(ctx, item.getUpdated()));
|
||||
|
||||
// Description
|
||||
if (item.getDescription() != null) {
|
||||
description.setText(item.getDescription());
|
||||
description.setVisibility(VISIBLE);
|
||||
} else {
|
||||
description.setVisibility(GONE);
|
||||
}
|
||||
|
||||
// Open feed's blog when clicked
|
||||
layout.setOnClickListener(v -> listener.onFeedClick(item));
|
||||
}
|
||||
}
|
||||
|
||||
interface RssFeedListener {
|
||||
void onFeedClick(Feed feed);
|
||||
|
||||
void onDeleteClick(Feed feed);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
package org.briarproject.briar.android.blog;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||
import org.briarproject.bramble.api.sync.GroupId;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.android.activity.BaseActivity;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
public class RssFeedDeleteFeedDialogFragment extends DialogFragment {
|
||||
final static String TAG = RssFeedDeleteFeedDialogFragment.class.getName();
|
||||
|
||||
@Inject
|
||||
ViewModelProvider.Factory viewModelFactory;
|
||||
private RssFeedViewModel viewModel;
|
||||
|
||||
static RssFeedDeleteFeedDialogFragment newInstance(GroupId groupId) {
|
||||
Bundle args = new Bundle();
|
||||
args.putByteArray(GROUP_ID, groupId.getBytes());
|
||||
RssFeedDeleteFeedDialogFragment f =
|
||||
new RssFeedDeleteFeedDialogFragment();
|
||||
f.setArguments(args);
|
||||
return f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Context ctx) {
|
||||
super.onAttach(ctx);
|
||||
((BaseActivity) requireActivity()).getActivityComponent().inject(this);
|
||||
|
||||
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
|
||||
.get(RssFeedViewModel.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
|
||||
GroupId groupId = new GroupId(
|
||||
requireNonNull(requireArguments().getByteArray(GROUP_ID)));
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity(),
|
||||
R.style.BriarDialogTheme);
|
||||
builder.setTitle(getString(R.string.blogs_rss_remove_feed));
|
||||
builder.setMessage(
|
||||
getString(R.string.blogs_rss_remove_feed_dialog_message));
|
||||
builder.setPositiveButton(R.string.cancel, null);
|
||||
builder.setNegativeButton(R.string.blogs_rss_remove_feed_ok,
|
||||
(dialog, which) -> viewModel.removeFeed(groupId));
|
||||
return builder.create();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,170 @@
|
||||
package org.briarproject.briar.android.blog;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
import android.util.Patterns;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ProgressBar;
|
||||
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||
import org.briarproject.briar.android.activity.BriarActivity;
|
||||
import org.briarproject.briar.api.feed.FeedManager;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import static android.view.View.GONE;
|
||||
import static android.view.View.VISIBLE;
|
||||
import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.briar.android.util.UiUtils.hideSoftKeyboard;
|
||||
|
||||
public class RssFeedImportActivity extends BriarActivity {
|
||||
|
||||
private static final Logger LOG =
|
||||
Logger.getLogger(RssFeedImportActivity.class.getName());
|
||||
|
||||
private EditText urlInput;
|
||||
private Button importButton;
|
||||
private ProgressBar progressBar;
|
||||
|
||||
@Inject
|
||||
@IoExecutor
|
||||
Executor ioExecutor;
|
||||
|
||||
@Inject
|
||||
@SuppressWarnings("WeakerAccess")
|
||||
volatile FeedManager feedManager;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.activity_rss_feed_import);
|
||||
|
||||
urlInput = findViewById(R.id.urlInput);
|
||||
urlInput.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count,
|
||||
int after) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence s, int start, int before,
|
||||
int count) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
enableOrDisableImportButton();
|
||||
}
|
||||
});
|
||||
urlInput.setOnEditorActionListener((v, actionId, event) -> {
|
||||
if (actionId == IME_ACTION_DONE && importButton.isEnabled() &&
|
||||
importButton.getVisibility() == VISIBLE) {
|
||||
publish();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
importButton = findViewById(R.id.importButton);
|
||||
importButton.setOnClickListener(v -> publish());
|
||||
|
||||
progressBar = findViewById(R.id.progressBar);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
return super.onCreateOptionsMenu(menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectActivity(ActivityComponent component) {
|
||||
component.inject(this);
|
||||
}
|
||||
|
||||
private void enableOrDisableImportButton() {
|
||||
String url = urlInput.getText().toString();
|
||||
importButton.setEnabled(validateAndNormaliseUrl(url) != null);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private String validateAndNormaliseUrl(String url) {
|
||||
if (!Patterns.WEB_URL.matcher(url).matches()) return null;
|
||||
try {
|
||||
return new URL(url).toString();
|
||||
} catch (MalformedURLException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void publish() {
|
||||
// hide import button, show progress bar
|
||||
importButton.setVisibility(GONE);
|
||||
progressBar.setVisibility(VISIBLE);
|
||||
hideSoftKeyboard(urlInput);
|
||||
|
||||
String url = validateAndNormaliseUrl(urlInput.getText().toString());
|
||||
if (url == null) throw new AssertionError();
|
||||
importFeed(url);
|
||||
}
|
||||
|
||||
private void importFeed(String url) {
|
||||
ioExecutor.execute(() -> {
|
||||
try {
|
||||
feedManager.addFeed(url);
|
||||
feedImported();
|
||||
} catch (DbException | IOException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
importFailed();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void feedImported() {
|
||||
runOnUiThreadUnlessDestroyed(this::supportFinishAfterTransition);
|
||||
}
|
||||
|
||||
private void importFailed() {
|
||||
runOnUiThreadUnlessDestroyed(() -> {
|
||||
// hide progress bar, show publish button
|
||||
progressBar.setVisibility(GONE);
|
||||
importButton.setVisibility(VISIBLE);
|
||||
|
||||
// show error dialog
|
||||
AlertDialog.Builder builder =
|
||||
new AlertDialog.Builder(RssFeedImportActivity.this,
|
||||
R.style.BriarDialogTheme);
|
||||
builder.setMessage(R.string.blogs_rss_feeds_import_error);
|
||||
builder.setNegativeButton(R.string.cancel, null);
|
||||
builder.setPositiveButton(R.string.try_again_button,
|
||||
(dialog, which) -> publish());
|
||||
AlertDialog dialog = builder.create();
|
||||
dialog.show();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
package org.briarproject.briar.android.blog;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.android.activity.BaseActivity;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
public class RssFeedImportFailedDialogFragment extends DialogFragment {
|
||||
final static String TAG = RssFeedImportFailedDialogFragment.class.getName();
|
||||
|
||||
@Inject
|
||||
ViewModelProvider.Factory viewModelFactory;
|
||||
private RssFeedViewModel viewModel;
|
||||
|
||||
static RssFeedImportFailedDialogFragment newInstance() {
|
||||
return new RssFeedImportFailedDialogFragment();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Context ctx) {
|
||||
super.onAttach(ctx);
|
||||
((BaseActivity) requireActivity()).getActivityComponent().inject(this);
|
||||
|
||||
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
|
||||
.get(RssFeedViewModel.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
|
||||
AlertDialog.Builder builder =
|
||||
new AlertDialog.Builder(requireActivity(),
|
||||
R.style.BriarDialogTheme);
|
||||
builder.setMessage(R.string.blogs_rss_feeds_import_error);
|
||||
builder.setNegativeButton(R.string.cancel, null);
|
||||
builder.setPositiveButton(R.string.try_again_button,
|
||||
(dialog, which) -> viewModel.retryImportFeed());
|
||||
|
||||
return builder.create();
|
||||
}
|
||||
}
|
||||
@@ -1,124 +0,0 @@
|
||||
package org.briarproject.briar.android.blog;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ProgressBar;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||
import org.briarproject.briar.android.fragment.BaseFragment;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import static android.view.View.GONE;
|
||||
import static android.view.View.VISIBLE;
|
||||
import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
|
||||
import static org.briarproject.briar.android.util.UiUtils.hideSoftKeyboard;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
public class RssFeedImportFragment extends BaseFragment {
|
||||
public static final String TAG = RssFeedImportFragment.class.getName();
|
||||
|
||||
@Inject
|
||||
ViewModelProvider.Factory viewModelFactory;
|
||||
private RssFeedViewModel viewModel;
|
||||
|
||||
private EditText urlInput;
|
||||
private Button importButton;
|
||||
private ProgressBar progressBar;
|
||||
|
||||
@Override
|
||||
public void injectFragment(ActivityComponent component) {
|
||||
component.inject(this);
|
||||
|
||||
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
|
||||
.get(RssFeedViewModel.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater,
|
||||
@Nullable ViewGroup container,
|
||||
@Nullable Bundle savedInstanceState) {
|
||||
requireActivity().setTitle(getString(R.string.blogs_rss_feeds_import));
|
||||
View v = inflater.inflate(R.layout.fragment_rss_feed_import,
|
||||
container, false);
|
||||
|
||||
urlInput = v.findViewById(R.id.urlInput);
|
||||
urlInput.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count,
|
||||
int after) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence s, int start, int before,
|
||||
int count) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
enableOrDisableImportButton();
|
||||
}
|
||||
});
|
||||
urlInput.setOnEditorActionListener((view, actionId, event) -> {
|
||||
if (actionId == IME_ACTION_DONE && importButton.isEnabled() &&
|
||||
importButton.getVisibility() == VISIBLE) {
|
||||
publish();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
importButton = v.findViewById(R.id.importButton);
|
||||
importButton.setOnClickListener(view -> publish());
|
||||
|
||||
progressBar = v.findViewById(R.id.progressBar);
|
||||
|
||||
viewModel.getIsImporting().observe(getViewLifecycleOwner(),
|
||||
this::onIsImporting);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUniqueTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
private void enableOrDisableImportButton() {
|
||||
String url = urlInput.getText().toString();
|
||||
importButton.setEnabled(viewModel.validateAndNormaliseUrl(url) != null);
|
||||
}
|
||||
|
||||
private void publish() {
|
||||
String url = viewModel
|
||||
.validateAndNormaliseUrl(urlInput.getText().toString());
|
||||
if (url == null) throw new AssertionError();
|
||||
viewModel.importFeed(url);
|
||||
}
|
||||
|
||||
private void onIsImporting(Boolean importing) {
|
||||
if (importing) {
|
||||
// show progress bar, hide import button
|
||||
importButton.setVisibility(GONE);
|
||||
progressBar.setVisibility(VISIBLE);
|
||||
hideSoftKeyboard(urlInput);
|
||||
} else {
|
||||
// show publish button, hide progress bar
|
||||
importButton.setVisibility(VISIBLE);
|
||||
progressBar.setVisibility(GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
package org.briarproject.briar.android.blog;
|
||||
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||
import org.briarproject.briar.android.activity.BriarActivity;
|
||||
import org.briarproject.briar.android.blog.RssFeedAdapter.RssFeedListener;
|
||||
import org.briarproject.briar.android.view.BriarRecyclerView;
|
||||
import org.briarproject.briar.api.feed.Feed;
|
||||
import org.briarproject.briar.api.feed.FeedManager;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
|
||||
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
|
||||
import static com.google.android.material.snackbar.Snackbar.LENGTH_LONG;
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
|
||||
public class RssFeedManageActivity extends BriarActivity
|
||||
implements RssFeedListener {
|
||||
|
||||
private static final Logger LOG =
|
||||
Logger.getLogger(RssFeedManageActivity.class.getName());
|
||||
|
||||
private BriarRecyclerView list;
|
||||
private RssFeedAdapter adapter;
|
||||
|
||||
@Inject
|
||||
@SuppressWarnings("WeakerAccess")
|
||||
volatile FeedManager feedManager;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.activity_rss_feed_manage);
|
||||
|
||||
adapter = new RssFeedAdapter(this, this);
|
||||
|
||||
list = findViewById(R.id.feedList);
|
||||
list.setLayoutManager(new LinearLayoutManager(this));
|
||||
list.setAdapter(adapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
loadFeeds();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
super.onStop();
|
||||
adapter.clear();
|
||||
list.showProgressBar();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
MenuInflater inflater = getMenuInflater();
|
||||
inflater.inflate(R.menu.rss_feed_manage_actions, menu);
|
||||
return super.onCreateOptionsMenu(menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == android.R.id.home) {
|
||||
onBackPressed();
|
||||
return true;
|
||||
} else if (item.getItemId() == R.id.action_rss_feeds_import) {
|
||||
Intent i = new Intent(this, RssFeedImportActivity.class);
|
||||
startActivity(i);
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectActivity(ActivityComponent component) {
|
||||
component.inject(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFeedClick(Feed feed) {
|
||||
Intent i = new Intent(this, BlogActivity.class);
|
||||
i.putExtra(GROUP_ID, feed.getBlogId().getBytes());
|
||||
i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
|
||||
startActivity(i);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeleteClick(Feed feed) {
|
||||
DialogInterface.OnClickListener okListener =
|
||||
(dialog, which) -> deleteFeed(feed);
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this,
|
||||
R.style.BriarDialogTheme);
|
||||
builder.setTitle(getString(R.string.blogs_rss_remove_feed));
|
||||
builder.setMessage(
|
||||
getString(R.string.blogs_rss_remove_feed_dialog_message));
|
||||
builder.setPositiveButton(R.string.cancel, null);
|
||||
builder.setNegativeButton(R.string.blogs_rss_remove_feed_ok,
|
||||
okListener);
|
||||
builder.show();
|
||||
}
|
||||
|
||||
private void loadFeeds() {
|
||||
int revision = adapter.getRevision();
|
||||
runOnDbThread(() -> {
|
||||
try {
|
||||
displayFeeds(revision, feedManager.getFeeds());
|
||||
} catch (DbException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
onLoadError();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void displayFeeds(int revision, List<Feed> feeds) {
|
||||
runOnUiThreadUnlessDestroyed(() -> {
|
||||
if (revision == adapter.getRevision()) {
|
||||
adapter.incrementRevision();
|
||||
if (feeds.isEmpty()) list.showData();
|
||||
else adapter.addAll(feeds);
|
||||
} else {
|
||||
LOG.info("Concurrent update, reloading");
|
||||
loadFeeds();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void deleteFeed(Feed feed) {
|
||||
runOnDbThread(() -> {
|
||||
try {
|
||||
feedManager.removeFeed(feed);
|
||||
onFeedDeleted(feed);
|
||||
} catch (DbException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
onDeleteError();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void onLoadError() {
|
||||
runOnUiThreadUnlessDestroyed(() -> {
|
||||
list.setEmptyText(R.string.blogs_rss_feeds_manage_error);
|
||||
list.showData();
|
||||
});
|
||||
}
|
||||
|
||||
private void onFeedDeleted(Feed feed) {
|
||||
runOnUiThreadUnlessDestroyed(() -> {
|
||||
adapter.incrementRevision();
|
||||
adapter.remove(feed);
|
||||
});
|
||||
}
|
||||
|
||||
private void onDeleteError() {
|
||||
runOnUiThreadUnlessDestroyed(() -> Snackbar.make(list,
|
||||
R.string.blogs_rss_feeds_manage_delete_error,
|
||||
LENGTH_LONG).show());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,123 +0,0 @@
|
||||
package org.briarproject.briar.android.blog;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||
import org.briarproject.briar.android.fragment.BaseFragment;
|
||||
import org.briarproject.briar.android.view.BriarRecyclerView;
|
||||
import org.briarproject.briar.api.feed.Feed;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
|
||||
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
|
||||
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull;
|
||||
import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
|
||||
import static org.briarproject.briar.android.blog.RssFeedAdapter.RssFeedListener;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
public class RssFeedManageFragment extends BaseFragment
|
||||
implements RssFeedListener {
|
||||
public static final String TAG = RssFeedManageFragment.class.getName();
|
||||
|
||||
@Inject
|
||||
ViewModelProvider.Factory viewModelFactory;
|
||||
private RssFeedViewModel viewModel;
|
||||
|
||||
private BriarRecyclerView list;
|
||||
private final RssFeedAdapter adapter = new RssFeedAdapter(this);
|
||||
|
||||
public static RssFeedManageFragment newInstance() {
|
||||
return new RssFeedManageFragment();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectFragment(ActivityComponent component) {
|
||||
component.inject(this);
|
||||
|
||||
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
|
||||
.get(RssFeedViewModel.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater,
|
||||
@Nullable ViewGroup container,
|
||||
@Nullable Bundle savedInstanceState) {
|
||||
requireActivity().setTitle(R.string.blogs_rss_feeds);
|
||||
View v = inflater.inflate(R.layout.fragment_rss_feed_manage,
|
||||
container, false);
|
||||
|
||||
list = v.findViewById(R.id.feedList);
|
||||
list.setLayoutManager(new LinearLayoutManager(getActivity()));
|
||||
list.setAdapter(adapter);
|
||||
|
||||
viewModel.getFeeds().observe(getViewLifecycleOwner(), result -> result
|
||||
.onError(e -> {
|
||||
list.setEmptyText(R.string.blogs_rss_feeds_manage_error);
|
||||
list.showData();
|
||||
})
|
||||
.onSuccess(feeds -> {
|
||||
adapter.submitList(feeds);
|
||||
if (requireNonNull(feeds).size() == 0) {
|
||||
list.showData();
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUniqueTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
inflater.inflate(R.menu.rss_feed_manage_actions, menu);
|
||||
super.onCreateOptionsMenu(menu, inflater);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == android.R.id.home) {
|
||||
requireActivity().onBackPressed();
|
||||
return true;
|
||||
} else if (item.getItemId() == R.id.action_rss_feeds_import) {
|
||||
showNextFragment(new RssFeedImportFragment());
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFeedClick(Feed feed) {
|
||||
Intent i = new Intent(getActivity(), BlogActivity.class);
|
||||
i.putExtra(GROUP_ID, feed.getBlogId().getBytes());
|
||||
i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
|
||||
startActivity(i);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeleteClick(Feed feed) {
|
||||
RssFeedDeleteFeedDialogFragment dialog =
|
||||
RssFeedDeleteFeedDialogFragment.newInstance(feed.getBlogId());
|
||||
dialog.show(getParentFragmentManager(),
|
||||
RssFeedDeleteFeedDialogFragment.TAG);
|
||||
}
|
||||
}
|
||||
@@ -1,180 +0,0 @@
|
||||
package org.briarproject.briar.android.blog;
|
||||
|
||||
import android.app.Application;
|
||||
import android.util.Patterns;
|
||||
|
||||
import org.briarproject.bramble.api.db.DatabaseExecutor;
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.db.Transaction;
|
||||
import org.briarproject.bramble.api.db.TransactionManager;
|
||||
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
||||
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.bramble.api.sync.GroupId;
|
||||
import org.briarproject.bramble.api.system.AndroidExecutor;
|
||||
import org.briarproject.briar.android.viewmodel.DbViewModel;
|
||||
import org.briarproject.briar.android.viewmodel.LiveEvent;
|
||||
import org.briarproject.briar.android.viewmodel.LiveResult;
|
||||
import org.briarproject.briar.android.viewmodel.MutableLiveEvent;
|
||||
import org.briarproject.briar.api.feed.Feed;
|
||||
import org.briarproject.briar.api.feed.FeedManager;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static org.briarproject.bramble.util.LogUtils.logDuration;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.bramble.util.LogUtils.now;
|
||||
import static org.briarproject.briar.android.blog.RssFeedViewModel.ImportResult.EXISTS;
|
||||
import static org.briarproject.briar.android.blog.RssFeedViewModel.ImportResult.FAILED;
|
||||
import static org.briarproject.briar.android.blog.RssFeedViewModel.ImportResult.IMPORTED;
|
||||
|
||||
@NotNullByDefault
|
||||
class RssFeedViewModel extends DbViewModel {
|
||||
enum ImportResult {IMPORTED, FAILED, EXISTS}
|
||||
|
||||
private static final Logger LOG =
|
||||
getLogger(RssFeedViewModel.class.getName());
|
||||
|
||||
private final FeedManager feedManager;
|
||||
private final Executor ioExecutor;
|
||||
private final Executor dbExecutor;
|
||||
|
||||
private final MutableLiveData<LiveResult<List<Feed>>> feeds =
|
||||
new MutableLiveData<>();
|
||||
|
||||
@Nullable
|
||||
private volatile String urlFailedImport = null;
|
||||
private final MutableLiveData<Boolean> isImporting =
|
||||
new MutableLiveData<>(false);
|
||||
private final MutableLiveEvent<ImportResult> importResult =
|
||||
new MutableLiveEvent<>();
|
||||
|
||||
@Inject
|
||||
RssFeedViewModel(Application app,
|
||||
FeedManager feedManager,
|
||||
@IoExecutor Executor ioExecutor,
|
||||
@DatabaseExecutor Executor dbExecutor,
|
||||
LifecycleManager lifecycleManager,
|
||||
TransactionManager db,
|
||||
AndroidExecutor androidExecutor) {
|
||||
super(app, dbExecutor, lifecycleManager, db, androidExecutor);
|
||||
this.feedManager = feedManager;
|
||||
this.ioExecutor = ioExecutor;
|
||||
this.dbExecutor = dbExecutor;
|
||||
|
||||
loadFeeds();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
String validateAndNormaliseUrl(String url) {
|
||||
if (!Patterns.WEB_URL.matcher(url).matches()) return null;
|
||||
try {
|
||||
return new URL(url).toString();
|
||||
} catch (MalformedURLException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
LiveData<LiveResult<List<Feed>>> getFeeds() {
|
||||
return feeds;
|
||||
}
|
||||
|
||||
private void loadFeeds() {
|
||||
loadFromDb(this::loadFeeds, feeds::setValue);
|
||||
}
|
||||
|
||||
@DatabaseExecutor
|
||||
private List<Feed> loadFeeds(Transaction txn) throws DbException {
|
||||
long start = now();
|
||||
List<Feed> feeds = feedManager.getFeeds(txn);
|
||||
Collections.sort(feeds);
|
||||
logDuration(LOG, "Loading feeds", start);
|
||||
return feeds;
|
||||
}
|
||||
|
||||
void removeFeed(GroupId groupId) {
|
||||
dbExecutor.execute(() -> {
|
||||
List<Feed> updated = removeListItems(getList(feeds), feed -> {
|
||||
if (feed.getBlogId().equals(groupId)) {
|
||||
try {
|
||||
feedManager.removeFeed(feed);
|
||||
return true;
|
||||
} catch (DbException e) {
|
||||
handleException(e);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
if (updated != null) {
|
||||
feeds.postValue(new LiveResult<>(updated));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
LiveEvent<ImportResult> getImportResult() {
|
||||
return importResult;
|
||||
}
|
||||
|
||||
LiveData<Boolean> getIsImporting() {
|
||||
return isImporting;
|
||||
}
|
||||
|
||||
void importFeed(String url) {
|
||||
isImporting.setValue(true);
|
||||
urlFailedImport = null;
|
||||
ioExecutor.execute(() -> {
|
||||
try {
|
||||
if (exists(url)) {
|
||||
importResult.postEvent(EXISTS);
|
||||
return;
|
||||
}
|
||||
Feed feed = feedManager.addFeed(url);
|
||||
List<Feed> updated = addListItem(getList(feeds), feed);
|
||||
if (updated != null) {
|
||||
Collections.sort(updated);
|
||||
feeds.postValue(new LiveResult<>(updated));
|
||||
}
|
||||
importResult.postEvent(IMPORTED);
|
||||
} catch (DbException | IOException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
urlFailedImport = url;
|
||||
importResult.postEvent(FAILED);
|
||||
} finally {
|
||||
isImporting.postValue(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void retryImportFeed() {
|
||||
if (urlFailedImport == null) {
|
||||
throw new AssertionError();
|
||||
}
|
||||
importFeed(urlFailedImport);
|
||||
}
|
||||
|
||||
private boolean exists(String url) {
|
||||
List<Feed> list = getList(feeds);
|
||||
if (list != null) {
|
||||
for (Feed feed : list) {
|
||||
if (url.equals(feed.getUrl())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -176,7 +176,6 @@ class BluetoothConnecter implements EventListener {
|
||||
connect();
|
||||
}
|
||||
|
||||
@UiThread
|
||||
@Override
|
||||
public void eventOccurred(@NonNull Event e) {
|
||||
if (e instanceof ConnectionOpenedEvent) {
|
||||
@@ -193,51 +192,47 @@ class BluetoothConnecter implements EventListener {
|
||||
}
|
||||
|
||||
private void connect() {
|
||||
bluetoothPlugin.disablePolling();
|
||||
pluginManager.setPluginEnabled(ID, true);
|
||||
|
||||
ioExecutor.execute(() -> {
|
||||
if (!waitForBluetoothActive()) {
|
||||
showToast(R.string.bt_plugin_status_inactive);
|
||||
LOG.warning("Bluetooth plugin didn't become active");
|
||||
return;
|
||||
}
|
||||
showToast(R.string.toast_connect_via_bluetooth_start);
|
||||
eventBus.addListener(this);
|
||||
try {
|
||||
if (!waitForBluetoothActive()) {
|
||||
showToast(R.string.bt_plugin_status_inactive);
|
||||
LOG.warning("Bluetooth plugin didn't become active");
|
||||
String uuid = null;
|
||||
try {
|
||||
uuid = transportPropertyManager
|
||||
.getRemoteProperties(contactId, ID).get(PROP_UUID);
|
||||
} catch (DbException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
}
|
||||
if (isNullOrEmpty(uuid)) {
|
||||
LOG.warning("PROP_UUID missing for contact");
|
||||
return;
|
||||
}
|
||||
showToast(R.string.toast_connect_via_bluetooth_start);
|
||||
eventBus.addListener(this);
|
||||
try {
|
||||
String uuid = null;
|
||||
try {
|
||||
uuid = transportPropertyManager
|
||||
.getRemoteProperties(contactId, ID)
|
||||
.get(PROP_UUID);
|
||||
} catch (DbException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
}
|
||||
if (isNullOrEmpty(uuid)) {
|
||||
LOG.warning("PROP_UUID missing for contact");
|
||||
return;
|
||||
}
|
||||
DuplexTransportConnection conn = bluetoothPlugin
|
||||
.discoverAndConnectForSetup(uuid);
|
||||
if (conn == null) {
|
||||
waitAfterConnectionFailed();
|
||||
DuplexTransportConnection conn = bluetoothPlugin
|
||||
.discoverAndConnectForSetup(uuid);
|
||||
if (conn == null) {
|
||||
if (!isConnectedViaBluetooth(contactId)) {
|
||||
LOG.warning("Failed to connect");
|
||||
showToast(R.string.toast_connect_via_bluetooth_error);
|
||||
} else {
|
||||
LOG.info("Could connect, handling connection");
|
||||
connectionManager
|
||||
.manageOutgoingConnection(contactId, ID, conn);
|
||||
showToast(R.string.toast_connect_via_bluetooth_success);
|
||||
LOG.info("Failed to connect, but contact connected");
|
||||
}
|
||||
} finally {
|
||||
eventBus.removeListener(this);
|
||||
return;
|
||||
}
|
||||
connectionManager.manageOutgoingConnection(contactId, ID, conn);
|
||||
showToast(R.string.toast_connect_via_bluetooth_success);
|
||||
} finally {
|
||||
bluetoothPlugin.enablePolling();
|
||||
eventBus.removeListener(this);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@IoExecutor
|
||||
private boolean waitForBluetoothActive() {
|
||||
long left = BT_ACTIVE_TIMEOUT;
|
||||
final long sleep = 250;
|
||||
@@ -255,31 +250,6 @@ class BluetoothConnecter implements EventListener {
|
||||
return (bluetoothPlugin.getState() == ACTIVE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for an incoming connection before showing an error Toast.
|
||||
*/
|
||||
@IoExecutor
|
||||
private void waitAfterConnectionFailed() {
|
||||
long left = BT_ACTIVE_TIMEOUT;
|
||||
final long sleep = 250;
|
||||
try {
|
||||
while (left > 0) {
|
||||
if (isConnectedViaBluetooth(contactId)) {
|
||||
LOG.info("Failed to connect, but contact connected");
|
||||
// no Toast needed here, as it gets shown when
|
||||
// ConnectionOpenedEvent is received
|
||||
return;
|
||||
}
|
||||
Thread.sleep(sleep);
|
||||
left -= sleep;
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
LOG.warning("Failed to connect");
|
||||
showToast(R.string.toast_connect_via_bluetooth_error);
|
||||
}
|
||||
|
||||
private void showToast(@StringRes int res) {
|
||||
androidExecutor.runOnUiThread(() ->
|
||||
Toast.makeText(app, res, Toast.LENGTH_LONG).show()
|
||||
|
||||
@@ -142,7 +142,6 @@ class ConversationAdapter
|
||||
}
|
||||
items.beginBatchedUpdates();
|
||||
for (ConversationItem item : toRemove) items.remove(item);
|
||||
updateTimersInBatch();
|
||||
items.endBatchedUpdates();
|
||||
}
|
||||
|
||||
|
||||
@@ -96,16 +96,6 @@ public class TestDataActivity extends BriarActivity {
|
||||
forumPostsSeekBar.setOnSeekBarChangeListener(
|
||||
new OnSeekBarChangeUpdateProgress(forumPostsTextView));
|
||||
|
||||
findViewById(R.id.buttonZeroValues).setOnClickListener(
|
||||
v -> {
|
||||
contactsSeekBar.setProgress(0);
|
||||
messagesSeekBar.setProgress(0);
|
||||
avatarsSeekBar.setProgress(0);
|
||||
blogPostsSeekBar.setProgress(0);
|
||||
forumsSeekBar.setProgress(0);
|
||||
forumPostsSeekBar.setProgress(0);
|
||||
});
|
||||
|
||||
findViewById(R.id.buttonCreateTestData).setOnClickListener(
|
||||
v -> createTestData());
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package org.briarproject.briar.android.util;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Activity;
|
||||
import android.app.KeyguardManager;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Context;
|
||||
@@ -91,9 +90,6 @@ import static android.text.format.DateUtils.WEEK_IN_MILLIS;
|
||||
import static android.text.format.DateUtils.YEAR_IN_MILLIS;
|
||||
import static android.view.KeyEvent.ACTION_DOWN;
|
||||
import static android.view.KeyEvent.KEYCODE_ENTER;
|
||||
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
|
||||
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE;
|
||||
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN;
|
||||
import static android.view.inputmethod.EditorInfo.IME_NULL;
|
||||
import static android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT;
|
||||
import static android.widget.Toast.LENGTH_LONG;
|
||||
@@ -541,14 +537,4 @@ public class UiUtils {
|
||||
Toast.makeText(context, msg, LENGTH_LONG).show();
|
||||
});
|
||||
}
|
||||
|
||||
public static void setInputStateAlwaysVisible(Activity activity) {
|
||||
activity.getWindow().setSoftInputMode(SOFT_INPUT_ADJUST_RESIZE |
|
||||
SOFT_INPUT_STATE_ALWAYS_VISIBLE);
|
||||
}
|
||||
|
||||
public static void setInputStateHidden(Activity activity) {
|
||||
activity.getWindow().setSoftInputMode(SOFT_INPUT_ADJUST_RESIZE |
|
||||
SOFT_INPUT_STATE_HIDDEN);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:padding="@dimen/margin_medium">
|
||||
android:padding="@dimen/margin_medium"
|
||||
tools:context=".android.blog.RssFeedImportActivity">
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:layout_width="match_parent"
|
||||
@@ -191,19 +191,6 @@
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/textViewForumMessages" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/buttonZeroValues"
|
||||
style="@style/BriarButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="15dp"
|
||||
android:textSize="@dimen/text_size_tiny"
|
||||
android:text="Zero values"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/seekBarForumMessages"
|
||||
app:layout_constraintVertical_bias="1.0" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/buttonCreateTestData"
|
||||
style="@style/BriarButton"
|
||||
@@ -214,7 +201,7 @@
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/buttonZeroValues"
|
||||
app:layout_constraintTop_toBottomOf="@+id/seekBarForumMessages"
|
||||
app:layout_constraintVertical_bias="1.0" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<org.briarproject.briar.android.view.BriarRecyclerView 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:id="@+id/feedList"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:emptyText="@string/blogs_rss_feeds_manage_empty_state"
|
||||
app:scrollToEnd="false"
|
||||
tools:listitem="@layout/list_item_rss_feed" />
|
||||
@@ -38,15 +38,6 @@
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/huaweiProtectedAppsView" />
|
||||
|
||||
<org.briarproject.briar.android.account.XiaomiView
|
||||
android:id="@+id/xiaomiView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="@dimen/margin_large"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/huaweiAppLaunchView" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/next"
|
||||
style="@style/BriarButton"
|
||||
@@ -57,7 +48,7 @@
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/xiaomiView"
|
||||
app:layout_constraintTop_toBottomOf="@+id/huaweiAppLaunchView"
|
||||
app:layout_constraintVertical_bias="1.0"
|
||||
tools:enabled="true" />
|
||||
|
||||
|
||||
@@ -10,8 +10,13 @@
|
||||
app:showAsAction="always"/>
|
||||
|
||||
<item
|
||||
android:id="@+id/action_rss_feeds"
|
||||
android:title="@string/blogs_rss_feeds"
|
||||
android:id="@+id/action_rss_feeds_import"
|
||||
android:title="@string/blogs_rss_feeds_import"
|
||||
app:showAsAction="never"/>
|
||||
|
||||
<item
|
||||
android:id="@+id/action_rss_feeds_manage"
|
||||
android:title="@string/blogs_rss_feeds_manage"
|
||||
app:showAsAction="never"/>
|
||||
|
||||
</menu>
|
||||
@@ -22,7 +22,6 @@
|
||||
<string name="setup_huawei_text">الرجاء الضغط على الزر في الأسفل والتأكد من أن Briar (براير) محمى في شاشة \"التطبيقات المحمية\".</string>
|
||||
<string name="setup_huawei_button">حماية Briar (براير)</string>
|
||||
<string name="setup_huawei_help">إذا لم يتم إضافة Briar (براير) في قائمة التطبيقات المحمية، فلن يتمكن من العمل في الخلفية.</string>
|
||||
<string name="setup_xiaomi_button">حماية Briar (براير)</string>
|
||||
<string name="warning_dozed">%s لم يتمكن من الاشتغال في الخلفية</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">كلمة السّر</string>
|
||||
@@ -462,12 +461,14 @@
|
||||
<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_manage">إدارة تحديثات 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>
|
||||
<string name="blogs_rss_remove_feed">ازالة الخلاصة</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">هل أنت متأكد/ة من رغبتك في حذف هذه الخلاصة؟\n\nالمنشورات ستحذف من جهازك وليس من أجهزة الآخرين.\n\nأي جهة اتصال قمت/ي بمشاركة هذه الخلاصة معها قد لا تتمكن من استلام التحديثات.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">حذف</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">لا يمكن حذف الخلاصة!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">لا خلاصات RSS للعرض\n\nالرجاء لمس علامة + لإستيراد خلاصة.</string>
|
||||
<string name="blogs_rss_feeds_manage_error">حدث خطأ في جلب خلاصاتك. الرجاء المحاولة لاحقًا.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -348,11 +348,13 @@
|
||||
<string name="blogs_rss_feeds_import_button">İdxal</string>
|
||||
<string name="blogs_rss_feeds_import_hint">RSS kanalın linkini daxil edin</string>
|
||||
<string name="blogs_rss_feeds_import_error">Üzr istəyirik! Feed-inizdə idxal bir xəta baş verdi.</string>
|
||||
<string name="blogs_rss_feeds_manage">RSS Feeds idarəetmə</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">İdxal olundu:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Müəllif:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Son yeniləmə:</string>
|
||||
<string name="blogs_rss_remove_feed">Feed\'i sil</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Sil</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Feed silinmədi</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Xeyr RSS əks etdirmir\n\nİdxal etmək üçün + düyməsinə toxunun</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Kanal yükləmədə bir problem var. Zəhmət olmasa bir az sonra yenə cəhd edin.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -238,11 +238,13 @@
|
||||
<string name="blogs_rss_feeds_import_button">Внасяне</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Въведете URL адреса на RSS емисията</string>
|
||||
<string name="blogs_rss_feeds_import_error">Възникна грешка при внасянето на емисия.</string>
|
||||
<string name="blogs_rss_feeds_manage">Управление на 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>
|
||||
<string name="blogs_rss_remove_feed">Премахване на емисия</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Премахване</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Емисията не можа да бъде изтрита!</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Възникна проблем при зареждането на емисиите ви. Моля, опитайте пак по-късно.</string>
|
||||
<!--Settings Display-->
|
||||
<!--Settings Network-->
|
||||
|
||||
@@ -332,12 +332,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Uvezi</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Unesi URL od RSS kanala</string>
|
||||
<string name="blogs_rss_feeds_import_error">Žao nam je! Došlo je do greške pri unosu vašeg kanala.</string>
|
||||
<string name="blogs_rss_feeds_manage">Upravljanje RSS kanalima</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Uvezeno:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autor:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Zadnje ažuriranje:</string>
|
||||
<string name="blogs_rss_remove_feed">Uklonite kanal</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Jeste li sigurni da želite da uklonite kanal?\n\nPostovi će biti uklonjeni sa vašeg uređaja ali ne is uređaja drugih ljudi.\n\nKontakti kojima ste podijelili ovaj blog će možda prestati da dobijaju novosti.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Ukloni</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Kanal nije bilo moguće ukloniti!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Nema RSS kanala za prikazivanje\n\nDotaknite + ikonu da uvezete kanal</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Došlo je do problema pri učitavanju vaših kanala. Probajte opet kasnije.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
<string name="setup_huawei_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="setup_huawei_button">Protegeix Briar</string>
|
||||
<string name="setup_huawei_help">Si no afegiu Briar a la llista d\'aplicacions protegides, s\'evitarà que Briar s\'executi en segon pla.</string>
|
||||
<string name="setup_xiaomi_button">Protegeix Briar</string>
|
||||
<string name="warning_dozed">%s no s\'ha pogut executar en segon pla</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Contrasenya</string>
|
||||
@@ -422,12 +421,14 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="blogs_rss_feeds_import_button">Subscriu-me</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Escriviu l\'URL del canal de notícies RSS</string>
|
||||
<string name="blogs_rss_feeds_import_error">Ens sap greu! S\'ha produït un error en subscriure-us al vostre canal de notícies.</string>
|
||||
<string name="blogs_rss_feeds_manage">Gestiona els canals de notícies RSS</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importat:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autor:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Darrera actualització:</string>
|
||||
<string name="blogs_rss_remove_feed">Suprimeix la subscripció al canal de notícies</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Segur que voleu suprimir la subscripció a aquest canal de notícies?\n\nLes notícies d\'aquest canal s\'eliminaran del vostre dispositiu però no del d\'altres persones.\n\nEls contactes amb els que hàgeu compartit aquest canal poden deixar de rebre les actualitzacions.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Suprimeix la subscripció</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">La subscripció al canal de notícies no s\'ha pogut suprimir.</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">No hi ha cap notícia per mostrar\n\nFeu un toc sobre la icona + per subscriure-us a un canal de notícies</string>
|
||||
<string name="blogs_rss_feeds_manage_error">S\'ha produït un problema en actualitzar els vostres canals de notícies. Torneu-ho a provar més endavant.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -302,11 +302,13 @@
|
||||
<string name="blogs_rss_feeds_import_button">Import</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Zadejte URL adresu RSS kanálu</string>
|
||||
<string name="blogs_rss_feeds_import_error">Omlouváme se! Vyskytla se chyba při importu vašeho kanálu.</string>
|
||||
<string name="blogs_rss_feeds_manage">Správa RSS kanálů</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importováno:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autor:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Naposledy aktualizováno:</string>
|
||||
<string name="blogs_rss_remove_feed">Odstranit kanál</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Odstranit</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Kanál nemohl být odstraněn !</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Žádné RSS kanály k zobrazení\n\nKlikněte na ikonu + pro nahrání příspěvků</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Vyskytl se problém s načtením vašeho kanálu příspěvků. Zkuste to prosím později.</string>
|
||||
<!--Settings Display-->
|
||||
|
||||
@@ -25,11 +25,6 @@
|
||||
<string name="setup_huawei_app_launch_text">Bitte tippe auf die Schaltfläche unten, öffne den Bereich \"App-Start\" und stelle sicher, dass Briar auf \"Manuell verwalten\" eingestellt ist.</string>
|
||||
<string name="setup_huawei_app_launch_button">Akkueinstellungen öffnen</string>
|
||||
<string name="setup_huawei_app_launch_help">Wenn Briar im Bereich \"App-Start\" nicht auf \"Manuell verwalten\" eingestellt ist, kann es nicht im Hintergrund ausgeführt werden.</string>
|
||||
<string name="setup_xiaomi_text">Um im Hintergrund zu laufen, muss Briar in der Liste der zuletzt verwendeten Apps gesperrt werden.</string>
|
||||
<string name="setup_xiaomi_button">Briar schützen</string>
|
||||
<string name="setup_xiaomi_help">Wenn Briar nicht in der Liste der zuletzt verwendeten Apps gesperrt ist, kann es nicht im Hintergrund ausgeführt werden.</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">1. Öffne die Liste der zuletzt verwendeten Apps (auch \'App Switcher\' genannt)\n\n2. Wische auf dem Bild von Briar nach unten, um das Vorhängeschlosssymbol anzuzeigen\n\n3. Wenn das Vorhängeschloss nicht gesperrt ist, tippe darauf, um es zu sperren</string>
|
||||
<string name="setup_xiaomi_dialog_body_new">1. Öffne die Liste der zuletzt verwendeten Apps (auch \'App Switcher\' genannt)\n\n2. Halte das Bild von Briar gedrückt, bis die Schaltfläche für das Vorhängeschloss angezeigt wird\n\n3. Wenn das Vorhängeschloss nicht gesperrt ist, tippe darauf, um es zu sperren</string>
|
||||
<string name="warning_dozed">%s konnte nicht im Hintergrund ausgeführt werden</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Passwort</string>
|
||||
@@ -146,7 +141,7 @@
|
||||
<string name="fix">Behoben</string>
|
||||
<string name="help">Hilfe</string>
|
||||
<string name="sorry">Entschuldigung</string>
|
||||
<string name="error_start_activity">Nicht verfügbar für dein System</string>
|
||||
<string name="error_start_activity">Nicht Verfügbar für dein System</string>
|
||||
<string name="status_heading">Status:</string>
|
||||
<!--Contacts and Private Conversations-->
|
||||
<string name="no_contacts">Keine Kontakte vorhanden</string>
|
||||
@@ -167,7 +162,6 @@
|
||||
<string name="menu_item_connect_via_bluetooth">Über Bluetooth verbinden</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">Über Bluetooth verbinden</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">Dein Kontakt muss in der Nähe sein, damit dies funktioniert.\n\nDu und dein Kontakt sollten beide gleichzeitig \"Start\" drücken.</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">Versucht bereits, eine Verbindung über Bluetooth herzustellen</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">Kann ohne Bluetooth nicht fortgesetzt werden</string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">Kann ohne Standortberechtigung nicht fortgesetzt werden</string>
|
||||
<string name="toast_connect_via_bluetooth_start">Verbinde über Bluetooth…</string>
|
||||
@@ -353,8 +347,8 @@
|
||||
<string name="groups_dissolved_dialog_message">Der Ersteller dieser Gruppe hat diese aufgelöst.\n\nEs können keine weiteren Nachrichten mehr in dieser Gruppe geschrieben werden und möglicherweise wurden noch nicht alle Nachrichten empfangen.</string>
|
||||
<!--Private Group Invitations-->
|
||||
<string name="groups_invitations_title">Gruppeneinladungen</string>
|
||||
<string name="groups_invitations_invitation_sent">Du hast %1$s eingeladen, der Gruppe \"%2$s\" beizutreten.</string>
|
||||
<string name="groups_invitations_invitation_received">%1$s hat dich eingeladen, der Gruppe \"%2$s\" beizutreten.</string>
|
||||
<string name="groups_invitations_invitation_sent">%1$s wurde in die Gruppe \"%2$s\" eingeladen.</string>
|
||||
<string name="groups_invitations_invitation_received">%1$s hat dich eingeladen der Gruppe \"%2$s\" beizutreten.</string>
|
||||
<string name="groups_invitations_joined">Gruppe beigetreten</string>
|
||||
<string name="groups_invitations_declined">Gruppeneinladung abgelehnt</string>
|
||||
<plurals name="groups_invitations_open">
|
||||
@@ -463,14 +457,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Importieren</string>
|
||||
<string name="blogs_rss_feeds_import_hint">URL des RSS-Feeds eingeben</string>
|
||||
<string name="blogs_rss_feeds_import_error">Es tut uns Leid! Es gab einen Fehler beim Importieren deines Feeds.</string>
|
||||
<string name="blogs_rss_feeds_import_exists">Dieser Feed ist bereits importiert.</string>
|
||||
<string name="blogs_rss_feeds">RSS-Feeds</string>
|
||||
<string name="blogs_rss_feeds_manage">RSS-Feeds verwalten</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importiert:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autor:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Letzte Aktualisierung:</string>
|
||||
<string name="blogs_rss_remove_feed">Feed entfernen</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Bist du sicher, dass du diesen Feed löschen willst?\n\nBeiträge werden von deinem Gerät entfernt, aber nicht von den Geräten anderer Personen.\n\nAlle Kontakte, für die du diesen Feed freigegeben hast, können keine Updates mehr erhalten.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Aufheben</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Der Feed konnte nicht gelöscht werden!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Keine RSS-Feeds vorhanden\n\nTippe auf das + Symbol, um einen Feed zu importieren</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Es gab ein Problem beim Laden deiner Feeds. Bitte versuche es später erneut.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -25,11 +25,6 @@
|
||||
<string name="setup_huawei_app_launch_text">Por favor, pulsa el botón de abajo, abre la pantalla \"lanzamiento de aplicación\" y asegúrate de que Briar esté configurado como \"Gestionar manualmente\".</string>
|
||||
<string name="setup_huawei_app_launch_button">Abrir Ajustes de Batería</string>
|
||||
<string name="setup_huawei_app_launch_help">Si Briar no está configurado como \"Gestionar manualmente\" en la pantalla \"lanzamiento de aplicación\", no será capaz de ejecutarse en segundo plano.</string>
|
||||
<string name="setup_xiaomi_text">Para ejecutarse en segundo plano, Briar necesita estar bloqueado en la lista de aplicaciones recientes.</string>
|
||||
<string name="setup_xiaomi_button">Proteger Briar</string>
|
||||
<string name="setup_xiaomi_help">Si Briar no está bloqueado en la lista de aplicaciones recientes, no podrá ejecutarse en segundo plano.</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">1. Abre la lista de aplicaciones recientes (también llamada selectora de aplicaciones)\n\n2. Desliza hacia abajo sobre la imagen de Briar para mostrar el ícono de un candado\n\n3. Si el candado no está bloqueado, púlsalo para hacerlo</string>
|
||||
<string name="setup_xiaomi_dialog_body_new">1. Abre la lista de aplicaciones recientes (también llamada selectora de aplicaciones)\n\n2. Presiona y mantén la imagen de Briar hasta que aparezca el botón de un candado\n\n3. Si el candado no está bloqueado, púlsalo para hacerlo</string>
|
||||
<string name="warning_dozed">%s no pudo ejecutarse en segundo plano</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Contraseña</string>
|
||||
@@ -167,7 +162,6 @@
|
||||
<string name="menu_item_connect_via_bluetooth">Conectar mediante Bluetooth</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">Conectar mediante Bluetooth</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">Tu contacto necesita estar cerca para que esto funcione.\n\nTú y tu contacto deberían presionar \"Iniciar\" ambos al mismo tiempo.</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">Ya se está intentando conectar mediante Bluetooth</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">No se puede continuar sin Bluetooth</string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">No se puede continuar sin permiso de ubicación</string>
|
||||
<string name="toast_connect_via_bluetooth_start">Conectar mediante Bluetooth...</string>
|
||||
@@ -463,14 +457,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Importar</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Introduce la URL del canal RSS</string>
|
||||
<string name="blogs_rss_feeds_import_error">¡Lo sentimos! Hubo un error importando tu canal.</string>
|
||||
<string name="blogs_rss_feeds_import_exists">Ese canal ya está importado.</string>
|
||||
<string name="blogs_rss_feeds">Canales RSS</string>
|
||||
<string name="blogs_rss_feeds_manage">Administrar canales RSS</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importado:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autor:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Última actualización:</string>
|
||||
<string name="blogs_rss_remove_feed">Eliminar canal RSS</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">¿Estás seguro de que quieres quitar este canal RSS?\n\nLos mensajes se eliminarán de tu dispositivo, pero no de los dispositivos de otras personas.\n\nEs posible que los contactos con los que hayas compartido este canal dejen de recibir actualizaciones.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Eliminar</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">¡El canal no pudo ser eliminado!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">No hay canales RSS que mostrar\n\nGolpea el icono + para importar uno</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Hubo un problema cargando tus canales RSS. Por favor, prueba más tarde.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
<string name="setup_huawei_text">Sakatu beheko botoia eta ziurtatu Briar babestuta dagoela \"Babestutako aplikazioak\" pantailan.</string>
|
||||
<string name="setup_huawei_button">Babestu Briar</string>
|
||||
<string name="setup_huawei_help">Briar ez bada babestutako aplikazioen zerrendara gehitzen, ezin izango du bigarren planoan ibili.</string>
|
||||
<string name="setup_xiaomi_button">Babestu Briar</string>
|
||||
<string name="warning_dozed">%s ezin izan da bigarren planoan exekutatu</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Pasahitza</string>
|
||||
@@ -396,13 +395,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Inportatu</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Sartu RSS jarioaren URLa</string>
|
||||
<string name="blogs_rss_feeds_import_error">Sentitzen dugu! Zure jarioa inportatzean errore bat gertatu da.</string>
|
||||
<string name="blogs_rss_feeds">RSS iturriak</string>
|
||||
<string name="blogs_rss_feeds_manage">Kudeatu RSS jarioak</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Inportatuta:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Egilea:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Azken eguneratzea:</string>
|
||||
<string name="blogs_rss_remove_feed">Kendu jarioa</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Ziur zaude jario hau kendu nahi duzula?\n\nSarrerak zure gailutik kenduko dira baina ez besteen gailuetatik.\n\nJario hau beste inorekin partekatu baduzu agian eguneratzeak jasotzeari utziko diote.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Kendu</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Ezin izan da jarioa ezabatu!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Ez dago erakusteko RSS jariorik\n\nSakatu + ikonoa jario bat inportatzeko</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Arazo bat egon da zure jarioak kargatzean. Saiatu berriro geroago.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -24,10 +24,6 @@
|
||||
<string name="setup_huawei_text">لطفا روی دکمه زیر کلیک کنید و مطمئن شوید که از Briar (برایر) در صفحه \"برنامه های محافظت شده\" محافظت می شود.</string>
|
||||
<string name="setup_huawei_button">حفاظت از Briar (برایر)</string>
|
||||
<string name="setup_huawei_help">اگر Briar (برایر) به فهرست برنامه های محافظت شده اضافه نشده، نمی تواند در پس زمینه مشغول به کار باشد.</string>
|
||||
<string name="setup_huawei_app_launch_text">لطفا روی دکمه زیر زده، صفحهی \"راه اندازی برنامه\" را باز کرده و از این که برایر (Briar) بر روی \"مدیریت دستی\" تنظیم شده باشد، اطمینان حاصل کنید.</string>
|
||||
<string name="setup_huawei_app_launch_button">باز کردن تنظیمات باتری</string>
|
||||
<string name="setup_huawei_app_launch_help">اگر در صفحه \"راه اندازی برنامه\"، برایر (Briar) بر روی گزینه \"مدیریت دستی\" تنظیم نشده باشد، برنامه قادر به فعالیت در پسزمینه نخواهد بود.</string>
|
||||
<string name="setup_xiaomi_button">حفاظت از Briar (برایر)</string>
|
||||
<string name="warning_dozed">ناتوانی %s برای اجراء در پس زمینه</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">گذرواژه</string>
|
||||
@@ -169,7 +165,6 @@
|
||||
<string name="menu_item_connect_via_bluetooth">اتصال از طریق بلوتوث</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">اتصال از طریق بلوتوث</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">برای امکان این عملکرد، مخاطب شما باید نزدیک باشد. \n\n شما و مخاطبتان باید همزمان گزینهی \"شروع\" را بفشارید.</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">در حال تلاش برای اتصال از طریق بلوتوث</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">امکان ادامه بدون بلوتوث وجود ندارد</string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">امکان ادامه بدون اجازه مکانیابی وجود ندارد</string>
|
||||
<string name="toast_connect_via_bluetooth_start">در حال اتصال از طریق بلوتوث</string>
|
||||
@@ -493,7 +488,7 @@
|
||||
<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">خوراک های RSS</string>
|
||||
<string name="blogs_rss_feeds_manage">مدیریت خوراک های 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>
|
||||
@@ -504,6 +499,7 @@
|
||||
|
||||
هر مخاطبی که با آن این خوراک را به اشتراک گذاشته اید ممکن است دیگر آپدیت دریافت نکند.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">حذف</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">خوراک نمی تواند پاک شود!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">هیچ خوراک RSS برای نمایش وجود ندارد
|
||||
|
||||
برای وارد کردن خوراک روی آیکون + ضربه بزنید</string>
|
||||
|
||||
@@ -314,12 +314,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Tuo</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Syötä RSS syötteen URL osoite</string>
|
||||
<string name="blogs_rss_feeds_import_error">Pahoittelemme! Syötteen noutamisessa tapahtui virhe.</string>
|
||||
<string name="blogs_rss_feeds_manage">Muokkaa RSS syötteitä</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Tuotu:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Tekijä:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Viimeksi päivitetty:</string>
|
||||
<string name="blogs_rss_remove_feed">Poista syöte</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Oletko varma, että haluat poistaa tämän syötteen?\n\nKirjoitukset poistuvat sinun laitteelta, mutta ei muiden laitteilta.\n\nKäyttäjät joiden kanssa olet jakanut tämän syötteen eivät välttämättä saa uusia päivityksiä.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Poista</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Syötteen poistaminen epäonnistui!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Ei RSS syötteitä\n\nNapauta + nappia lisätäksesi syötteen</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Syötteiden lataamisessa tapahtui virhe. Yritä myöhemmin uudelleen.</string>
|
||||
<!--Settings Display-->
|
||||
|
||||
@@ -22,14 +22,6 @@
|
||||
<string name="setup_huawei_text">Veuillez toucher le bouton ci-dessous et vous assurer que Briar est protégée dans l’écran « Applis protégées ».</string>
|
||||
<string name="setup_huawei_button">Protéger Briar</string>
|
||||
<string name="setup_huawei_help">Si Briar n’est pas ajoutée à la liste des applis protégées, elle ne pourra pas fonctionner en arrière-plan.</string>
|
||||
<string name="setup_huawei_app_launch_text">Veuillez toucher le bouton ci-dessous, ouvrir l’écran « Lancement des applis » et vous assurer que « Gérer manuellement » est défini pour Briar.</string>
|
||||
<string name="setup_huawei_app_launch_button">Ouvrez les paramètres de la pile</string>
|
||||
<string name="setup_huawei_app_launch_help">Si « Gérer manuellement » n’est pas défini pour Briar dans l’écran « Lancement des applis », l’appli ne pourra pas fonctionner en arrière-plan.</string>
|
||||
<string name="setup_xiaomi_text">Pour fonctionner en arrière-plan, Briar doit être verrouillée à la liste des applis récentes.</string>
|
||||
<string name="setup_xiaomi_button">Protéger Briar</string>
|
||||
<string name="setup_xiaomi_help">Si Briar n’est pas verrouillée à la liste des applis récentes, elle ne pourra pas fonctionner en arrière-plan.</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">1. Ouvrez la liste des applis récentes (aussi appelé sélecteur d’appli)\n\n2. Balayez l’image de Briar vers le bas pour afficher l’icône de verrou\n\n3. Si le verrou n’est pas verrouillé, touchez pour le verrouiller</string>
|
||||
<string name="setup_xiaomi_dialog_body_new">1. Ouvrez la liste des applis récentes (aussi appelé sélecteur d’appli)\n\n2. Touchez et maintenez l’image de Briar jusqu’à l’apparition du verrou\n\n3. Si le verrou n’est pas verrouillé, touchez pour le verrouiller</string>
|
||||
<string name="warning_dozed">%s n’a pas pu fonctionner en arrière-plan</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Mot de passe</string>
|
||||
@@ -167,7 +159,6 @@
|
||||
<string name="menu_item_connect_via_bluetooth">Se connecter par Bluetooth</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">Se connecter par Bluetooth</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">Afin que cela fonctionne, votre contact doit être à proximité.\n\nVotre contact et vous devriez appuyer ensemble sur « Commencer ».</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">Tentative de connexion par Bluetooth déjà en cours</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">Impossible de poursuivre sans le Bluetooth</string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">Impossible de poursuivre sans la permission de position</string>
|
||||
<string name="toast_connect_via_bluetooth_start">Connexion par Bluetooth…</string>
|
||||
@@ -178,7 +169,6 @@
|
||||
<!--The placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_you_disabled">Vos messages ne disparaîtront pas. %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">Les messages de %1$s disparaîtront après %2$s. %3$s</string>
|
||||
<plurals name="duration_minutes">
|
||||
<item quantity="one">%d minute</item>
|
||||
<item quantity="other">%d minutes</item>
|
||||
@@ -463,14 +453,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Importer</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Saisir l’URL du fil RSS</string>
|
||||
<string name="blogs_rss_feeds_import_error">Nous sommes désolés ! Une erreur est survenue lors de l’importation de votre fil.</string>
|
||||
<string name="blogs_rss_feeds_import_exists">Ce fil est déjà importé.</string>
|
||||
<string name="blogs_rss_feeds">Fils RSS</string>
|
||||
<string name="blogs_rss_feeds_manage">Gérer les fils RSS</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importés :</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Auteur :</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Dernière mise à jour :</string>
|
||||
<string name="blogs_rss_remove_feed">Supprimer le fil</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Voulez-vous vraiment supprimer ce fil ?\nLes billets seront supprimés de votre appareil mais pas des appareils d’autrui.\n\nLes contacts avec qui vous avez partagé ce fil pourraient ne plus en recevoir les mises à jour.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Supprimer</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Impossible de supprimer le fil !</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Aucun fil RSS à afficher\n\nTouchez l’icône + pour importer un fil</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Un problème est survenu lors du chargement de vos fils. Veuillez réessayer plus tard.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
@@ -567,17 +557,8 @@
|
||||
<string name="cannot_load_ringtone">Impossible de charger la sonnerie</string>
|
||||
<!--Conversation Settings-->
|
||||
<string name="disappearing_messages_title">Messages éphémères</string>
|
||||
<string name="disappearing_messages_explanation_long">L’activation de ce paramètre fera disparaître
|
||||
les messages de cette conversation automatiquement après 7\u00A0jours.
|
||||
\n\nPour l’exemplaire de l’expéditeur du message, le compte à rebours commence une fois qu’il a été remis.
|
||||
Pour le destinataire, le compte à rebours commence une fois que le
|
||||
message a été lu.
|
||||
\n\nLes messages éphémères sont marqués par une icône de bombe.
|
||||
\n\nSoyez conscient que les destinataires peuvent toujours faire des
|
||||
copies des messages que vous envoyez.
|
||||
\n\nSi vous changez ce paramètre, il sera appliqué à vos nouveaux messages immédiatement
|
||||
et aux messages de votre contact une fois que ce contact recevra votre prochain message.
|
||||
Votre contact peut aussi changer ce paramètre pour vous deux.</string>
|
||||
<string name="disappearing_messages_explanation_long">dsvkjfjhgvfdkjhgv dfkjgh fkjhsgkjfdkj fhfgfhg
|
||||
</string>
|
||||
<string name="learn_more">En apprendre davantage</string>
|
||||
<string name="disappearing_messages_summary">Faire disparaître automatiquement les futurs messages de cette conversation après 7 jours.</string>
|
||||
<!--Settings Feedback-->
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
<string name="setup_huawei_text">Por favor toca o botón inferior e asegúrate de que Briar está protexida na pantalla \"Apps Protexidas\"</string>
|
||||
<string name="setup_huawei_button">Protexer Briar</string>
|
||||
<string name="setup_huawei_help">Se Briar non se engade ao listado de apps protexidas, non poderá funcionar en segundo plano.</string>
|
||||
<string name="setup_xiaomi_button">Protexer Briar</string>
|
||||
<string name="warning_dozed">%s non foi quen de funcionar en segundo plano</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Contrasinal</string>
|
||||
@@ -455,13 +454,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Importar</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Escribe o URL da fonte RSS</string>
|
||||
<string name="blogs_rss_feeds_import_error">Lamentámolo! Algo fallou ao importar a fonte.</string>
|
||||
<string name="blogs_rss_feeds">Fontes RSS</string>
|
||||
<string name="blogs_rss_feeds_manage">Xestionar Fontes RSS</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importado:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autor/a:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Última actualización:</string>
|
||||
<string name="blogs_rss_remove_feed">Eliminar fonte</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Tes a certeza de querer eliminar esta fonte?\n\nAs entradas eliminaranse do teu dispositivo pero non dos dispositivos doutras persoas\n\nTodas as persoas coas que compartiches esta fonte poderían deixar de recibir actualizacións.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Eliminar</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Non se puido eliminar a fonte!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Sen fontes RSS que mostrar\n\nToque na icona + para importar unha fonte</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Aconteceu un problema ao cargar as túas fontes. Por favor, inténtao máis tarde.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
<string name="setup_huawei_text">נא להקיש על הכפתור למטה וולוודא כי Briar מוגן במסך \"יישומים מוגנים\".</string>
|
||||
<string name="setup_huawei_button">הגן על Briar</string>
|
||||
<string name="setup_huawei_help">אם Briar אינו מוסף אל רשימת היישומים המוגנים, הוא לא יוכל לרוץ ברקע.</string>
|
||||
<string name="setup_xiaomi_button">הגן על Briar</string>
|
||||
<string name="warning_dozed">%s לא היה יכול לרוץ ברקע</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">סיסמה</string>
|
||||
@@ -445,13 +444,14 @@
|
||||
<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">הזנות RSS</string>
|
||||
<string name="blogs_rss_feeds_manage">נהל הזנות 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>
|
||||
<string name="blogs_rss_remove_feed">הסר הזנה</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">האם אכן ברצונך להסיר הזנה זו?\n\nרשומות יוסרו ממכשירך אבל לא ממכשירים של אנשים אחרים.\n\nאנשי קשר כלשהם ששיתפת איתם הזנה זו עלולים להפסיק לקבל עדכונים.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">הסר</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">ההזנה לא יכלה להימחק!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">אין הזנות RSS להראות\n\nהקש על הצלמית + כדי לייבא הזנה</string>
|
||||
<string name="blogs_rss_feeds_manage_error">הייתה בעיה בטעינת ההזנות שלך. אנא נסה שוב מאוחר יותר.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -378,12 +378,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">आयात</string>
|
||||
<string name="blogs_rss_feeds_import_hint">आरएसएस फ़ीड का यूआरएल दर्ज करें</string>
|
||||
<string name="blogs_rss_feeds_import_error">हमें खेद है! आपकी फ़ीड आयात करने में एक त्रुटि हुई</string>
|
||||
<string name="blogs_rss_feeds_manage">आरएसएस फ़ीड प्रबंधित करें</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>
|
||||
<string name="blogs_rss_remove_feed">फ़ीड निकालें</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">क्या आप वाकई इस फीड को हटाना चाहते हैं? \ N \ n पोस्ट आपके डिवाइस से हटा दिए जाएंगे, लेकिन अन्य लोगों के डिवाइस से नहीं। \ N \ n आपके द्वारा इस फ़ीड को साझा करने वाले किसी भी संपर्क को अपडेट प्राप्त करना बंद हो सकता है।</string>
|
||||
<string name="blogs_rss_remove_feed_ok">हटाना</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">फीड हटाया नहीं जा सका!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">कोई आरएसएस फ़ीड दिखाने के लिए फ़ीड नहीं करता \ n \ n फ़ीड आयात करने के लिए + आइकन टैप करें</string>
|
||||
<string name="blogs_rss_feeds_manage_error">आपकी फ़ीड लोड करने में एक समस्या थी बाद में पुन: प्रयास करें।</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,14 +22,6 @@
|
||||
<string name="setup_huawei_text">Kérjük érintse meg a gombot alább és ellenőrizze, hogy a Briar védett, a \"Védett alkalmazások\" képernyőn.</string>
|
||||
<string name="setup_huawei_button">A Briar védelme</string>
|
||||
<string name="setup_huawei_help">Ha Briar nincs hozzáadva a védett alkalmazások listájához, akkor nem képes futni a háttérben.</string>
|
||||
<string name="setup_huawei_app_launch_text">Kérjük érintsd meg a gombot alább, hogy megnyitsd az \"App indítás\" képernyőt és ellenőrizd, hogy a Briar beállított \"Kézi kezelés\"-re.</string>
|
||||
<string name="setup_huawei_app_launch_button">Az akkumulátor beállítások megnyitása</string>
|
||||
<string name="setup_huawei_app_launch_help">Ha a Briar nincs beállítva \"Kézi kezelés\"-re az \"App indítás\" képernyőn, nem fog tudni futni a háttérben.</string>
|
||||
<string name="setup_xiaomi_text">Ahhoz, hogy a háttérben fusson, a Briar-t rögzíteni kell a legutóbbi appok listáján.</string>
|
||||
<string name="setup_xiaomi_button">A Briar védelme</string>
|
||||
<string name="setup_xiaomi_help">Ha Briar nincs rögzítve a legutóbbi appok listájában, akkor nem képes futni a háttérben.</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">1. Nyissa meg a legutolsó appok listáját (másnéven az app váltót)\n\n2. Görgessen le a Briar képén, hogy megjelenjen a lakat ikon\n\n3. Ha a lakat nem zárt, érintse meg a lezárásához</string>
|
||||
<string name="setup_xiaomi_dialog_body_new">1. Nyissa meg a legutolsó appok listáját (másnéven az app váltót)\n\n2. Nyomja meg és tartsa nyomva a Briar képét, hogy megjelenjen a lakat ikon\n\n3. Ha a lakat nem zárt, érintse meg a lezárásához</string>
|
||||
<string name="warning_dozed">%s nem tud futni a háttérben</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Jelszó</string>
|
||||
@@ -167,7 +159,6 @@
|
||||
<string name="menu_item_connect_via_bluetooth">Csatlakozás bluetooth-on keresztül</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">Csatlakozás bluetooth-on keresztül</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">A kapcsolatai közel kell legyenek, hogy ez működjön.\n\n Ön és a kapcsolata egyaránt meg kell nyomja a \"Start\" gombot egyidőben.</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">Már próbálkozik csatlakozni Bluetooth-on</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">Nem folytatható Bluetooth nélkül</string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">Nem folytatható hely engedélyek nélkül</string>
|
||||
<string name="toast_connect_via_bluetooth_start">Csatlakozás Bluetooth-on...</string>
|
||||
@@ -470,8 +461,7 @@ Kapcsolatai, akivel megosztotta ezt a blogot, lehet nem kapnak többé frissít
|
||||
<string name="blogs_rss_feeds_import_button">Importálás</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Adja meg az RSS feed URL címét</string>
|
||||
<string name="blogs_rss_feeds_import_error">Elnézését kérjük! Probléma akadt a feed-je importálásával.</string>
|
||||
<string name="blogs_rss_feeds_import_exists">Ez a feed már importálva van.</string>
|
||||
<string name="blogs_rss_feeds">RSS Feed-ek</string>
|
||||
<string name="blogs_rss_feeds_manage">RSS feed-ek kezelés</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importálva:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Szerző:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Utolsó frissítés:</string>
|
||||
@@ -479,6 +469,7 @@ Kapcsolatai, akivel megosztotta ezt a blogot, lehet nem kapnak többé frissít
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Biztosan eltávolítja ezt a feed-et?
|
||||
\n\nA bejegyzések törlődni fognak az Ön eszközéről, de nem a többi ember eszközéről.\n\nKapcsolatai, akivel megosztotta ezt a feed-et, lehet nem kapnak többé frissítést.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Eltávolít</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">A feed nem törölhető!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Nincs megjelenítendő</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Hiba történt a feed-jei betöltésével. Kérjük próbálja újra később.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,10 +22,6 @@
|
||||
<string name="setup_huawei_text">Ýttu á hnappinn hér fyrir neðan og gakktu úr skugga um að Briar sé varið á skjánum \"Varin forrit\".</string>
|
||||
<string name="setup_huawei_button">Verja Briar</string>
|
||||
<string name="setup_huawei_help">Ef Briar er ekki bætt á listann yfir varin forrit, getur það ekki keyrt í bakgrunni.</string>
|
||||
<string name="setup_huawei_app_launch_text">Ýttu á hnappinn hér fyrir neðan, opnaðu \"Ræsing forrits\" skjáinn og gakktu úr skugga um að Briar sé stillt á \"Stýra handvirkt\".</string>
|
||||
<string name="setup_huawei_app_launch_button">Opna rafhlöðustillingar</string>
|
||||
<string name="setup_huawei_app_launch_help">Ef Briar er ekki stillt á \"Stýra handvirkt\" í \"Ræsing forrits\" skjánum, mun það ekki geta keyrt í bakgrunni.</string>
|
||||
<string name="setup_xiaomi_button">Verja Briar</string>
|
||||
<string name="warning_dozed">%s gat ekki keyrt í bakgrunni</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Lykilorð</string>
|
||||
@@ -163,7 +159,6 @@
|
||||
<string name="menu_item_connect_via_bluetooth">Tengjast í gegnum Bluetooth</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">Tengjast í gegnum Bluetooth</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">Tengiliðurinn þinn þarf að vera nálægt til að þetta virki.\n\nÞú og tengiliðurinn ættuð bæði að ýta á \"Byrja\" á sama tíma.</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">Þegar að reyna að tengjast í gegnum Bluetooth</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">Get ekki haldið áfram án Bluetooth</string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">Get ekki haldið áfram án heimildar til að nota staðsetningu</string>
|
||||
<string name="toast_connect_via_bluetooth_start">Tengist í gegnum Bluetooth…</string>
|
||||
@@ -459,14 +454,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Flytja inn</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Settu inn slóðina á RSS-streymið</string>
|
||||
<string name="blogs_rss_feeds_import_error">Því miður! Það kom upp villa við að flytja inn streymið.</string>
|
||||
<string name="blogs_rss_feeds_import_exists">Þegar er búið að flytja inn þetta streymi.</string>
|
||||
<string name="blogs_rss_feeds">RSS-fréttastreymi</string>
|
||||
<string name="blogs_rss_feeds_manage">Sýsla með RSS-streymi</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Flutt inn:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Höfundur:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Síðast uppfært:</string>
|
||||
<string name="blogs_rss_remove_feed">Fjarlægja streymi</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Ertu viss um að þú viljir fjarlægja þetta streymi?\n\nFærslur verða fjarlægðar af tækinu þínu en ekki tækjum annars fólks.\n\nAllir tengiliðir sem þú hefur deilt þessu streymi með gætu hætt að fá uppfærslur.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Fjarlægja</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Ekki var hægt að eyða streyminu!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Engin RSS-streymi til að birta\n\nÝttu á + táknið til að flytja inn streymi</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Vandamál hefur komið upp með að hlaða inn streymunum þínum. Reyndu aftur síðar.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,14 +22,6 @@
|
||||
<string name="setup_huawei_text">Premi il pulsante qua sotto e assicurati che Briar sia protetto nella schermata \"App protette\"</string>
|
||||
<string name="setup_huawei_button">Proteggi Briar</string>
|
||||
<string name="setup_huawei_help">Se Briar non viene aggiunto nell\'elenco di app protette, non potrà funzionare in background.</string>
|
||||
<string name="setup_huawei_app_launch_text">Tocca il pulsante sotto, apri la schermata \"Esecuzione app\" e assicurati che Briar sia su \"Gestisci manualmente\".</string>
|
||||
<string name="setup_huawei_app_launch_button">Apri impostazioni batteria</string>
|
||||
<string name="setup_huawei_app_launch_help">Se Briar non è su \"Gestisci manualmente\" nella schermata \"Esecuzione app\", non potrà funzionare in secondo piano.</string>
|
||||
<string name="setup_xiaomi_text">Per funzionare in secondo piano, Briar deve essere fissato nella lista di app recenti.</string>
|
||||
<string name="setup_xiaomi_button">Proteggi Briar</string>
|
||||
<string name="setup_xiaomi_help">Se Briar non è fissato nella lista di app recenti, non potrà funzionare in secondo piano.</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">1. Apri la lista di app recenti (chiamata anche app switcher)\n\n2. Scorri fino alla schermata di Briar per mostrare l\'icona del lucchetto\n\n3. Se il lucchetto non è chiuso, toccalo per chiuderlo</string>
|
||||
<string name="setup_xiaomi_dialog_body_new">1. Apri la lista di app recenti (chiamata anche app switcher)\n\n2. Tieni premuta la schermata di Briar finché non compare l\'icona del lucchetto\n\n3. Se il lucchetto non è chiuso, toccalo per chiuderlo</string>
|
||||
<string name="warning_dozed">%s non ha potuto funzionare in background</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Password</string>
|
||||
@@ -138,7 +130,7 @@
|
||||
<string name="allow">Abilita</string>
|
||||
<string name="open">Apri</string>
|
||||
<string name="change">Cambia</string>
|
||||
<string name="start">Inizia</string>
|
||||
<string name="start">Avvia</string>
|
||||
<string name="no_data">Nessun dato</string>
|
||||
<string name="ellipsis">...</string>
|
||||
<string name="text_too_long">Il testo inserito è troppo lungo</string>
|
||||
@@ -154,8 +146,6 @@
|
||||
<string name="date_no_private_messages">Nessun messaggio.</string>
|
||||
<string name="no_private_messages">Nessun messaggio da mostrare</string>
|
||||
<string name="message_hint">Nuovo messaggio</string>
|
||||
<string name="message_hint_auto_delete">Nuovo messaggio dissolvente</string>
|
||||
<string name="message_error">Errore nell\'invio del messaggio</string>
|
||||
<string name="image_caption_hint">Aggiungi una didascalia (facoltativo)</string>
|
||||
<string name="image_attach">Allega immagine</string>
|
||||
<string name="image_attach_error">Impossibile allegare l\'immagine/i</string>
|
||||
@@ -163,41 +153,12 @@
|
||||
<string name="image_attach_error_invalid_mime_type">Formato immagine non supportato: %s</string>
|
||||
<string name="set_contact_alias">Cambia il nome del contatto</string>
|
||||
<string name="set_contact_alias_hint">Nome contatto</string>
|
||||
<string name="menu_item_disappearing_messages">Messaggi dissolventi</string>
|
||||
<string name="menu_item_connect_via_bluetooth">Connessione attraverso Bluetooth</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">Connessione attraverso Bluetooth</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">Per funzionare, il tuo contatto deve essere nelle vicinanze.\n\nDovreste entrambi premere \"Inizia\" nello stesso momento.</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">Si sta già tentanto di connettersi via Bluetooth</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">Impossibile continuare senza Bluetooth</string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">Impossibile continuare senza l\'autorizzazione per la geolocalizzazione</string>
|
||||
<string name="toast_connect_via_bluetooth_start">Connessione via Bluetooth…</string>
|
||||
<string name="toast_connect_via_bluetooth_success">Connessione via Bluetooth riuscita</string>
|
||||
<string name="toast_connect_via_bluetooth_error">Connessione via Bluetooth fallita</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">I tuoi messaggi spariranno dopo %1$s. %2$s</string>
|
||||
<!--The placeholder at the end will add "Tap to learn more."-->
|
||||
<string name="auto_delete_msg_you_disabled">I tuoi messaggi non spariranno. %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">I messaggi di %1$s spariranno dopo %2$s. %3$s</string>
|
||||
<plurals name="duration_minutes">
|
||||
<item quantity="one">%d minuto</item>
|
||||
<item quantity="other">%d minuti</item>
|
||||
</plurals>
|
||||
<plurals name="duration_hours">
|
||||
<item quantity="one">%d ora</item>
|
||||
<item quantity="other">%d ore</item>
|
||||
</plurals>
|
||||
<plurals name="duration_days">
|
||||
<item quantity="one">%d giorno</item>
|
||||
<item quantity="other">%d giorni</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">I messaggi di %1$s non spariranno. %2$s</string>
|
||||
<string name="tap_to_learn_more">Tocca per saperne di più.</string>
|
||||
<string name="auto_delete_changed_warning_title">Messaggi dissolventi cambiati</string>
|
||||
<string name="auto_delete_changed_warning_message_enabled">Dato che hai iniziato a comporre il messaggio, i messaggi dissolventi sono stati attivati.</string>
|
||||
<string name="auto_delete_changed_warning_message_disabled">Dato che hai iniziato a comporre il messaggio, i messaggi dissolventi sono stati disattivati.</string>
|
||||
<string name="auto_delete_changed_warning_send">Invia comunque</string>
|
||||
<string name="delete_all_messages">Elimina tutti i messaggi</string>
|
||||
<string name="dialog_title_delete_all_messages">Conferma l\'eliminazione dei messaggi</string>
|
||||
<string name="dialog_message_delete_all_messages">Sei sicuro di voler eliminare tutti i messaggi?</string>
|
||||
@@ -316,7 +277,6 @@
|
||||
<string name="introduction_response_accepted_sent">Hai accettato l\'introduzione a %1$s.</string>
|
||||
<string name="introduction_response_accepted_sent_info">Prima che %1$s venga aggiunto ai tuoi contatti, dovranno anche loro accettare l\'introduzione. Questo potrebbe richiedere un po\' di tempo.</string>
|
||||
<string name="introduction_response_declined_sent">Hai declinato l\'introduzione a %1$s.</string>
|
||||
<string name="introduction_response_declined_auto">L\'introduzione a %1$s è stata rifiutata automaticamente.</string>
|
||||
<string name="introduction_response_accepted_received">%1$s ha accettato l\'introduzione a %2$s.</string>
|
||||
<string name="introduction_response_declined_received">%1$s ha declinato l\'introduzione a %2$s.</string>
|
||||
<string name="introduction_response_declined_received_by_introducee">%1$s dice che %2$s ha declinato l\'introduzione.</string>
|
||||
@@ -363,7 +323,6 @@
|
||||
</plurals>
|
||||
<string name="groups_invitations_response_accepted_sent">Hai accettato l\'invito al gruppo da %s.</string>
|
||||
<string name="groups_invitations_response_declined_sent">Hai rifiutato l\'invito al gruppo da %s.</string>
|
||||
<string name="groups_invitations_response_declined_auto">L\'invito di %s al gruppo è stato rifiutato automaticamente.</string>
|
||||
<string name="groups_invitations_response_accepted_received">%s ha accettato l\'invito al gruppo.</string>
|
||||
<string name="groups_invitations_response_declined_received">%s ha rifiutato l\'invito al gruppo.</string>
|
||||
<string name="sharing_status_groups">Solo il creatore può invitare nuovi membri nel gruppo. Sotto ci sono i membri correnti del gruppo.</string>
|
||||
@@ -414,7 +373,6 @@
|
||||
<string name="forum_invitation_already_sharing">Già in condivisione</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>
|
||||
<string name="forum_invitation_response_accepted_received">%s ha accettato il tuo invito al forum.</string>
|
||||
<string name="forum_invitation_response_declined_received">%s ha declinato il tuo invito al forum.</string>
|
||||
<string name="sharing_status">Stato Condivisione</string>
|
||||
@@ -449,7 +407,6 @@
|
||||
<string name="blogs_sharing_snackbar">Blog condiviso con i contatti selezionati</string>
|
||||
<string name="blogs_sharing_response_accepted_sent">Hai accettato l\'invito al blog da %s.</string>
|
||||
<string name="blogs_sharing_response_declined_sent">Hai declinato l\'invito al blog da %s.</string>
|
||||
<string name="blogs_sharing_response_declined_auto">L\'invito di %s al blog è stato rifiutato automaticamente.</string>
|
||||
<string name="blogs_sharing_response_accepted_received">%s ha accettato l\'invito al blog.</string>
|
||||
<string name="blogs_sharing_response_declined_received">%s ha declinato l\'invito al blog.</string>
|
||||
<string name="blogs_sharing_invitation_received">%1$s ha condiviso il blog \"%2$s\" con te.</string>
|
||||
@@ -463,14 +420,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Importa</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Inserire l\'URL dell\'RSS feed</string>
|
||||
<string name="blogs_rss_feeds_import_error">Ci dispiace! C\'è stato un errore nell\'importazione del tuo feed.</string>
|
||||
<string name="blogs_rss_feeds_import_exists">Quel flusso è già importato.</string>
|
||||
<string name="blogs_rss_feeds">Flussi RSS</string>
|
||||
<string name="blogs_rss_feeds_manage">Gestisci gli RSS Feed</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importato:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autore:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Ultimo Aggiornamento:</string>
|
||||
<string name="blogs_rss_remove_feed">Rimuovi feed</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Sei sicuro di voler rimuovere questo feed?\n\nI post saranno rimossi dal tuo dispositivo ma non dai dispositivi delle altre persone.\n\nTutti i contatti con cui hai condiviso questo feed potrebbero smettere di ricevere aggiornamenti.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Rimuovi</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Non è stato possibile cancellare il feed!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Nessun feed RSS da mostrare\n\nClicca l\'icona + per importare un feed</string>
|
||||
<string name="blogs_rss_feeds_manage_error">C\'è stato un problema nel caricare i tuoi feeds. Per favore riprova fra poco.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
@@ -566,18 +523,7 @@
|
||||
<string name="choose_ringtone_title">Scegli suoneria</string>
|
||||
<string name="cannot_load_ringtone">Impossibile caricare la suoneria</string>
|
||||
<!--Conversation Settings-->
|
||||
<string name="disappearing_messages_title">Messaggi dissolventi</string>
|
||||
<string name="disappearing_messages_explanation_long">L\'attivazione di questa impostazione farà sparire
|
||||
automaticamente i nuovi messaggi di questa conversazione dopo 7\u00A0giorni.
|
||||
\n\nIl conto alla rovescia per la copia del messaggio del mittente inizia dopo la sua consegna.
|
||||
Il conto alla rovescia per il destinatario inizia dopo la lettura del messaggio.
|
||||
\n\nI messaggi che spariranno sono contrassegnati da un\'icona di una bomba.
|
||||
\n\nTieni presente che i destinatari possono comunque fare copie dei messaggi che invii.
|
||||
\n\nSe cambi questa impostazione, verrà applicata ai tuoi nuovi messaggi immediatamente e ai messaggi
|
||||
del tuo contatto una volta che riceve il tuo prossimo messaggio.
|
||||
Anche il tuo contatto può cambiare questa impostazioni per entrambe le parti.</string>
|
||||
<string name="learn_more">Per saperne di più</string>
|
||||
<string name="disappearing_messages_summary">Fai sparire automaticamente i messaggi futuri di questa conversazione dopo 7\u00A0giorni.</string>
|
||||
<!--Settings Feedback-->
|
||||
<string name="send_feedback">Invia feedback</string>
|
||||
<!--Link Warning-->
|
||||
@@ -631,9 +577,6 @@
|
||||
<string name="permission_camera_location_request_body">Per scansionare il codice QR, Briar ha bisogno di accedere alla fotocamera.\n\nPer trovare dispositivi Bluetooth, Briar ha bisogno di accedere alla tua posizione.\n\nBriar non memorizza la tua posizione, nè la condivide con terzi.</string>
|
||||
<string name="permission_camera_denied_body">Hai negato l\'accesso alla fotocamera, ma questa serve per aggiungere i contatti.\n\nConsidera la possibilità di concedere l\'accesso.</string>
|
||||
<string name="permission_location_denied_body">Hai negato l\'accesso alla tua posizione, ma Briar ha bisogno di questa autorizzazione per trovare i dispositivi Bluetooth.\n\nConsidera la possibilità di concedere l\'accesso.</string>
|
||||
<string name="permission_location_setting_title">Impostazioni di posizione</string>
|
||||
<string name="permission_location_setting_body">La geolocalizzazione del tuo dispositivo deve essere attiva per trovare altri dispositivi via Bluetooth. Attivala per continuare. Puoi disattivarla di nuovo in seguito.</string>
|
||||
<string name="permission_location_setting_button">Attiva geolocalizzazione</string>
|
||||
<string name="qr_code">Codice QR</string>
|
||||
<string name="show_qr_code_fullscreen">Mostra codice QR a tutto schermo</string>
|
||||
<!--App Locking-->
|
||||
|
||||
@@ -22,14 +22,10 @@
|
||||
<string name="setup_huawei_text">下のボタンをタップして、「保護されたアプリ」画面でBriarが保護されていることを確認してください。</string>
|
||||
<string name="setup_huawei_button">Briarを保護</string>
|
||||
<string name="setup_huawei_help">Briarが保護されたアプリのリストに追加されていない場合、Briarはバックグラウンドで実行することができません。</string>
|
||||
<string name="setup_huawei_app_launch_button">バッテリー設定を開く</string>
|
||||
<string name="setup_xiaomi_button">Briarを保護</string>
|
||||
<string name="warning_dozed">%sはバックグラウンドで実行することができませんでした</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>
|
||||
@@ -45,9 +41,7 @@
|
||||
<item quantity="other">これは、Briarのテストバージョンです。 アカウントは%d日で期限切れになり、更新できません。</item>
|
||||
</plurals>
|
||||
<string name="expiry_date_reached">このソフトの有効期限が切れました。テストに参加してくださりありがとうございます!</string>
|
||||
<string name="download_briar">Briarの使用を続けるならば、最新リリースをダウンロードしてください。</string>
|
||||
<string name="create_new_account">新しいアカウントを作成する必要があります。同じニックネームも使用できます。</string>
|
||||
<string name="download_briar_button">最新版をダウンロード</string>
|
||||
<string name="startup_open_database">データベースの復号化中…</string>
|
||||
<string name="startup_migrate_database">データベースをアップグレード中…</string>
|
||||
<string name="startup_compact_database">データベースの圧縮中…</string>
|
||||
@@ -62,36 +56,12 @@
|
||||
<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">Bluetooth</string>
|
||||
<string name="bt_device_status_on">携帯電話のBluetoothはオンにされました</string>
|
||||
<string name="bt_device_status_off">携帯電話のBluetoothはオフにされました</string>
|
||||
<string name="bt_plugin_status_enabling">BriarはBluetoothに接続中</string>
|
||||
<string name="bt_plugin_status_active">BriarはBluetoothに接続しました</string>
|
||||
<string name="bt_plugin_status_inactive">BriarはBluetoothに接続不可能</string>
|
||||
<string name="bt_plugin_status_disabled">BriarはBluetoothを使用しないように設定されました</string>
|
||||
<!--Notifications-->
|
||||
<string name="reminder_notification_title">Briarからサインアウト</string>
|
||||
<string name="reminder_notification_text">タップして再ログインします。</string>
|
||||
@@ -127,15 +97,14 @@
|
||||
<string name="allow">許可</string>
|
||||
<string name="open">開く</string>
|
||||
<string name="change">変更</string>
|
||||
<string name="start">開始</string>
|
||||
<string name="start">スタート</string>
|
||||
<string name="no_data">データなし</string>
|
||||
<string name="ellipsis">...</string>
|
||||
<string name="text_too_long">入力された文章が長すぎます。</string>
|
||||
<string name="show_onboarding">ヘルプダイアログを表示</string>
|
||||
<string name="fix">修復する</string>
|
||||
<string name="help">ヘルプ</string>
|
||||
<string name="sorry">申し訳ありません</string>
|
||||
<string name="error_start_activity">あなたのシステム上で利用不可能</string>
|
||||
<string name="sorry">すみません</string>
|
||||
<string name="status_heading">状態</string>
|
||||
<!--Contacts and Private Conversations-->
|
||||
<string name="no_contacts">表示する連絡先がありません</string>
|
||||
@@ -143,8 +112,6 @@
|
||||
<string name="date_no_private_messages">メッセージがありません。</string>
|
||||
<string name="no_private_messages">表示するメッセージがありません</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>
|
||||
@@ -152,41 +119,12 @@
|
||||
<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>
|
||||
<string name="menu_item_connect_via_bluetooth">Bluetooth経由で接続する</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">Bluetooth経由で接続する</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">この機能を利用するには、あなたの連絡先が近くにある必要があります。\n\nあなたとあなたの連絡先が同時に\"開始\"を押してください。</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">Bluetooth経由の接続を既に試行中です</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">Bluetoothなくして続行不可能</string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">位置情報の権限なくして続行不可能</string>
|
||||
<string name="toast_connect_via_bluetooth_start">Bluetooth経由で接続中…</string>
|
||||
<string name="toast_connect_via_bluetooth_success">Bluetooth経由で接続に成功</string>
|
||||
<string name="toast_connect_via_bluetooth_error">Bluetooth経由で接続不可能</string>
|
||||
<!--The first placeholder will show a duration like "7 days". The second placeholder at the end will add "Tap to learn more."-->
|
||||
<!--The placeholder at the end will add "Tap to learn more."-->
|
||||
<!--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."-->
|
||||
<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="tap_to_learn_more">タップすると詳細が表示されます。</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>
|
||||
@@ -202,7 +140,6 @@
|
||||
<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>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">近くの人を連絡先に追加する</string>
|
||||
<string name="face_to_face">連絡先として追加したい人と会う必要があります。\n\nこれにより、だれかがあなたになりすましたり、メッセージを読んだりするのを防ぐことができます。</string>
|
||||
@@ -263,7 +200,6 @@
|
||||
<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>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
@@ -294,7 +230,6 @@
|
||||
<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>
|
||||
@@ -339,7 +274,6 @@
|
||||
</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>
|
||||
@@ -389,7 +323,6 @@
|
||||
<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>
|
||||
@@ -405,7 +338,7 @@
|
||||
<string name="blogs_write_blog_post">ブログに投稿する</string>
|
||||
<string name="blogs_write_blog_post_body_hint">ブログの投稿内容を入力してください</string>
|
||||
<string name="blogs_publish_blog_post">公開</string>
|
||||
<string name="blogs_blog_post_created">ブログ投稿が作成されました</string>
|
||||
<string name="blogs_blog_post_created">ブログポストが作成されました</string>
|
||||
<string name="blogs_blog_post_received">新しいブログの投稿を受け取りました</string>
|
||||
<string name="blogs_blog_post_scroll_to">スクロール:</string>
|
||||
<string name="blogs_feed_empty_state">表示する投稿がありません</string>
|
||||
@@ -423,7 +356,6 @@
|
||||
<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>
|
||||
@@ -437,21 +369,19 @@
|
||||
<string name="blogs_rss_feeds_import_button">インポート</string>
|
||||
<string name="blogs_rss_feeds_import_hint">RSSフィードのURLを入力してください</string>
|
||||
<string name="blogs_rss_feeds_import_error">申し訳ありません! フィードのインポート中にエラーが発生しました。</string>
|
||||
<string name="blogs_rss_feeds_manage">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>
|
||||
<string name="blogs_rss_remove_feed">フィードを削除</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">このフィードを削除してもよろしいですか?\n\n投稿はデバイスから削除されますが、他の人のデバイスからは削除されません。\n\nこのフィードを共有した人は更新の受信を停止されます。</string>
|
||||
<string name="blogs_rss_remove_feed_ok">解除</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">フィードを削除できませんでした!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">表示するRSSフィードはありません\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_title">言語 & 領域</string>
|
||||
<string name="pref_language_changed">この設定は、Briarを再起動すると有効になります。 サインアウトしてBriarを再起動してください。</string>
|
||||
<string name="pref_language_default">システムのデフォルト</string>
|
||||
<string name="display_settings_title">表示</string>
|
||||
@@ -462,19 +392,10 @@
|
||||
<string name="pref_theme_system">システムのデフォルト</string>
|
||||
<!--Settings Connections-->
|
||||
<string name="network_settings_title">接続</string>
|
||||
<string name="bluetooth_setting">Bluetooth経由で連絡先に接続</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>
|
||||
@@ -528,7 +449,7 @@
|
||||
<string name="notify_forum_posts_setting_title">フォーラム投稿</string>
|
||||
<string name="notify_forum_posts_setting_summary">フォーラム投稿のアラートを表示する</string>
|
||||
<string name="notify_forum_posts_setting_summary_26">フォーラム投稿のアラートを設定する</string>
|
||||
<string name="notify_blog_posts_setting_title">ブログ投稿</string>
|
||||
<string name="notify_blog_posts_setting_title">ブログポスト</string>
|
||||
<string name="notify_blog_posts_setting_summary">ブログ投稿のアラートを表示する</string>
|
||||
<string name="notify_blog_posts_setting_summary_26">ブログ投稿のアラートを設定する</string>
|
||||
<string name="notify_vibration_setting">バイブレーション</string>
|
||||
@@ -538,7 +459,6 @@
|
||||
<string name="choose_ringtone_title">着信音を選択</string>
|
||||
<string name="cannot_load_ringtone">着信音を読み込めません</string>
|
||||
<!--Conversation Settings-->
|
||||
<string name="disappearing_messages_title">消えたメッセージ</string>
|
||||
<string name="learn_more">詳細情報</string>
|
||||
<!--Settings Feedback-->
|
||||
<string name="send_feedback">フィードバックを送信</string>
|
||||
@@ -559,27 +479,18 @@
|
||||
<string name="optional_contact_email">あなたのメールアドレス(任意)</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_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">レポートを保存しました。 次回、Briarにログインしたときに送信されます。</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は、別のアプリが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">これらのアプリがBriarの画面上に描画できるようにする</string>
|
||||
<!--Permission Requests-->
|
||||
<string name="permission_camera_title">カメラへのアクセス許可</string>
|
||||
@@ -599,7 +510,6 @@
|
||||
<string name="lock_is_locked">Briarはロックされています</string>
|
||||
<string name="lock_tap_to_unlock">タップしてロック解除</string>
|
||||
<!--Connections Screen-->
|
||||
<string name="transports_help_text">Briarは、インターネット、Wi-Fi、Bluetoothを介して連絡先に接続することができます。\n\nすべてのインターネット接続は、プライバシー保護のためにTorネットワークを経由します。\n\n複数の方法で連絡が取れる場合、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>
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
<string name="setup_huawei_text">밑의 버튼을 눌러 Briar를 \"보호된 앱\" 스크린에서 보호되게 해 주세요.</string>
|
||||
<string name="setup_huawei_button">Briar 보호하기</string>
|
||||
<string name="setup_huawei_help">Briar를 보호된 앱 목록에 추가하지 않는다면, 백그라운드에서 실행될 수 없습니다.</string>
|
||||
<string name="setup_xiaomi_button">Briar 보호하기</string>
|
||||
<string name="warning_dozed">%s가 백그라운드에서 실행될 수 없었습니다</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">비밀번호</string>
|
||||
@@ -411,12 +410,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">가져오기</string>
|
||||
<string name="blogs_rss_feeds_import_hint">RSS 피드 URL을 입력하세요</string>
|
||||
<string name="blogs_rss_feeds_import_error">죄송합니다! 피드를 불러오는 과정에서 문제가 있었습니다.</string>
|
||||
<string name="blogs_rss_feeds_manage">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>
|
||||
<string name="blogs_rss_remove_feed">피드 제거하기</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">정말로 이 피드를 제거하시겠어요?\n\n기기에서 게시물은 제거되지만 다른 사람의 기기에서는 제거되지 않습니다.\n\n이 피드를 공유하던 지인이 업데이트를 받지 못하게 될 수 있습니다. </string>
|
||||
<string name="blogs_rss_remove_feed_ok">제거하기</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">피드를 삭제할 수 없었습니다!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">보여드릴 RSS 피드가 없습니다\n\n+ 상징을 눌러 피드를 불러오세요</string>
|
||||
<string name="blogs_rss_feeds_manage_error">피드를 불러오는 과정에서 문제가 있었습니다. 나중에 다시 시도해 주세요.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,14 +22,7 @@
|
||||
<string name="setup_huawei_text">Bakstelėkite žemiau esantį mygtuką ir įsitikinkite, kad \"Apsaugotų programėlių\" rodinyje Briar yra apsaugota.</string>
|
||||
<string name="setup_huawei_button">Apsaugoti Briar</string>
|
||||
<string name="setup_huawei_help">Jei Briar nebus pridėta į apsaugotų programėlių sąrašą, ji negalės veikti fone.</string>
|
||||
<string name="setup_huawei_app_launch_text">Bakstelėkite mygtuką žemiau, atverkite langą „Programų paleidimas (angl. App launch)“ ir įsitikinkite, kad Briar yra nustatyta į „Tvarkyti rankiniu būdu (angl. Manage manually)“.</string>
|
||||
<string name="setup_huawei_app_launch_button">Atverti akumuliatoriaus nustatymus</string>
|
||||
<string name="setup_huawei_app_launch_help">Jeigu „Programų paleidimo (angl. App launch)“ lange Briar nėra nustatyta į „Tvarkyti rankiniu būdu (angl. Manage manually)“, tuomet programėlė negalės veikti fone.</string>
|
||||
<string name="setup_xiaomi_text">Tam, kad galėtų veikti fone, Briar turi būti prirakinta prie paskiausiųjų programėlių sąrašo.</string>
|
||||
<string name="setup_xiaomi_button">Apsaugoti Briar</string>
|
||||
<string name="setup_xiaomi_help">Jei Briar nebus prirakinta prie paskiausiųjų programėlių sąrašo, ji negalės veikti fone.</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">1. Atverkite paskiausiųjų programėlių sąrašą (dar vadinamą programėlių perjungikliu)\n\n2. Ant Briar paveiksliuko perbraukite žemyn, kad būtų rodoma pakabinamos spynos piktograma\n\n3. Jei pakabinama spyna neužrakinta, bakstelėkite, kad ją užrakintumėte</string>
|
||||
<string name="setup_xiaomi_dialog_body_new">1. 1. Atverkite paskiausiųjų programėlių sąrašą (dar vadinamą programėlių perjungikliu)\n\n2. Paspauskite ir laikykite ant Briar paveiksliuko tol, kol atsiras pakabinamos spynos mygtukas\n\n3. Jei pakabinama spyna neužrakinta, bakstelėkite, kad ją užrakintumėte</string>
|
||||
<string name="warning_dozed">%s nepavyko pasileisti fone</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Slaptažodis</string>
|
||||
@@ -177,7 +170,6 @@
|
||||
<string name="menu_item_connect_via_bluetooth">Prisijungti per Bluetooth</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">Prisijungti per Bluetooth</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">Norint, kad tai suveiktų, jūsų adresatas privalo būti šalia jūsų.\n\nJūs ir jūsų adresatas abu vienu metu turėtumėte paspausti „Pradėti“.</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">Jau bandoma prisijungti per Bluetooth</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">Nepavyksta tęsti be Bluetooth</string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">Nepavyksta tęsti be įrenginio vietovės leidimo</string>
|
||||
<string name="toast_connect_via_bluetooth_start">Jungiamasi per Bluetooth…</string>
|
||||
@@ -489,14 +481,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Importuoti</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Įveskite RSS kanalo URL</string>
|
||||
<string name="blogs_rss_feeds_import_error">Atleiskite! Importuojant jūsų kanalą, įvyko klaida.</string>
|
||||
<string name="blogs_rss_feeds_import_exists">Tas kanalas jau yra importuotas.</string>
|
||||
<string name="blogs_rss_feeds">RSS kanalai</string>
|
||||
<string name="blogs_rss_feeds_manage">Tvarkyti RSS kanalus</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importuota:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autorius:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Paskutinį kartą atnaujinta:</string>
|
||||
<string name="blogs_rss_remove_feed">Šalinti kanalą</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Ar tikrai norite pašalinti šį kanalą?\n\nĮrašai bus pašalinti iš jūsų įrenginio, tačiau liks kitų žmonių įrenginiuose.\n\nBet kokie adresatai, su kuriais bendrinote šį kanalą, gali nustoti gauti atnaujinimus.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Šalinti</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Nepavyko ištrinti kanalo!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Nėra rodytinų RSS kanalų\n\nNorėdami importuoti kanalą, bakstelėkite + piktogramą</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Įkeliant jūsų kanalus, atsirado problemų. Vėliau bandykite dar kartą.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
<string name="setup_huawei_text">Допрете го копчето подолу и осигурајте се дека Briar е заштитен во \"Protected Apps\" / мак. \"Заштитени апликации\" екранот.</string>
|
||||
<string name="setup_huawei_button">Заштити го Briar</string>
|
||||
<string name="setup_huawei_help">Ако Briar не е додаден на листата со заштитени апликации, ќе биде оневозможен да работи во позадина.</string>
|
||||
<string name="setup_xiaomi_button">Заштити го Briar</string>
|
||||
<string name="warning_dozed">%s беше оневозможен да работи во позадина</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Лозинка</string>
|
||||
@@ -420,12 +419,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Увези</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Внеси URL на RSS тековник</string>
|
||||
<string name="blogs_rss_feeds_import_error">Жал ни е! Настана гршка при увезувањето на вашиот тековник.</string>
|
||||
<string name="blogs_rss_feeds_manage">Уредување на 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>
|
||||
<string name="blogs_rss_remove_feed">Отстрани тековник</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Дали сте сигурни дека сакате да го отстраните овој тековник?\n\nОбјавите ќе бидат отстранети од вашиот уред но не и од уредите на другите луѓе.\n\nБило кои од контактите со кои сте го споделиле овој тековник може да престанат да добиваат ажурирања.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Отстрани</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Тековникот не може да биде избришан!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Нема RSS тековници за прикажување\n\nДопрете ја + иконата за да увезете тековник</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Настана проблем при вчитувањето на вашите тековници. Ве молиме обидете се повторно подоцна.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,14 +22,6 @@
|
||||
<string name="setup_huawei_text">အောက်ပါခလုတ်ကိုနှိပ်၍ \"ကာကွယ်မှုပေးထားသောအက်ပ်များ\" စခရင်တွင် Briar ကို ကာကွယ်ထားကြောင်း သေချာစေပါ။</string>
|
||||
<string name="setup_huawei_button">Briar ကို ကာကွယ်မည်</string>
|
||||
<string name="setup_huawei_help">ကာကွယ်မှုပေးထားသောအက်ပ်များစာရင်းတွင် ထည့်မထားလျှင် Briar ကို နောက်ကွယ်တွင် ဖွင့်ထားနိုင်မည်မဟုတ်ပါ။</string>
|
||||
<string name="setup_huawei_app_launch_text">အောက်က ခလုတ်ကို နှိပ်၍ \"အပ္ပလီကေးရှင်း ဖွင့်ရန်\" စကင်ရင်ကို ဖွင့်ပါ၊ ပြီးလျှင် Briar ကို \"ကိုယ်တိုင်စီမံမယ်\" လို့ သတ်မှတ်ပါ။</string>
|
||||
<string name="setup_huawei_app_launch_button">ဘက်ထရီအပြင်အဆင်များကို ဖွင့်ပါ</string>
|
||||
<string name="setup_huawei_app_launch_help">Briar ကို \"အပ္ပလီကေးရှင်း ဖွင့်ရန်\" စကင်ရင်ပေါ်တွင် \"ကိုယ်တိုင်စီမံမယ်\" လို့မသတ်မှတ်ထားလျှင် နောက်ခံတွင် ၎င်းကို လည်ပတ်၍ မရနိုင်ပါ။</string>
|
||||
<string name="setup_xiaomi_text">နောက်ခံတွင်အလုပ်လုပ်စေရန် လတ်တလောအက်ပလီကေးရှင်းများစာရင်းတွင် Briar အား သော့ခတ်ထားရန် လိုအပ်သည်။</string>
|
||||
<string name="setup_xiaomi_button">Briar ကို ကာကွယ်ပါ</string>
|
||||
<string name="setup_xiaomi_help">အကယ်၍ Briar ကို သော့မခတ်ထားပါက၊ ထိုအက်ပလီကေးရှင်းသည် နောက်ခံတွင် အလုပ်လုပ်နေနိုင်မည် မဟုတ်ပါ။</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">၁။ လတ်တလောအက်ပ်များစာရင်းကိုဖွင့်ပါ (ဒါ့အပြင် app switcher လို့လည်းခေါ်ပါသည်) \n\n2. သော့ခလောက်အိုင်ကွန်ကို \n\n3. ပြသရန် Briar ၏ပုံကို အောက်ကိုတွန်းပါ။ </string>
|
||||
<string name="setup_xiaomi_dialog_body_new">၁။ လတ်တလော အက်ပလီကေးရှင်းများစာရင်း (ဒါ့အပြင် အက်ပလီကေးရှင်းခလုတ်ဟုလည်းခေါ်သည်) ကိုလည်းဖွင့်ပါ \n\n2 ။ အဆိုပါသော့ခလောက်ခလုတ်မှ \n\n3 ပေါ်လာသည်အထိ Briar ၏ ပုံကို နှိပ်၍ ဖိထားပါ။ အကယ်၍ သော့ခလောက်သည် သော့ခတ်ထားခြင်းမရှိပါက ၎င်းကိုသော့ခတ်ရန် ပွတ်ဆွဲပါ။ </string>
|
||||
<string name="warning_dozed">%s ကို နောက်ကွယ်တွင် မဖွင့်ထားနိုင်ပါ</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">စကားဝှက်</string>
|
||||
@@ -162,7 +154,6 @@
|
||||
<string name="menu_item_connect_via_bluetooth">ဘလူးတုသ် နှင့် ချိတ်မယ်</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">ဘလူးတုသ် နှင့် ချိတ်မယ်</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">လုပ်ဆောင်ချက် အောင်မြင်နိုင်ရန် သင်၏ အဆက်အသွယ်သည် အနီးအနားတွင်ရှိရပါမည်။ \n\n သင် နှင့် သင်၏ အဆက်အသွယ် နှစ်ဦးစလုံးသည် \"စတင်ရန်\" ကို တစ်ပြိုင်တည်း နှိပ်ရပါမည်။</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">ဘလူးတုသ် နှင့် ချိတ်ဆက်ရန် ကြိုးစားနေပါသည်</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">ဘလူးတုသ် မပါဘဲ ဆက်လက်မလုပ်ဆောင်နိုင်ပါ</string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">တည်နေရာသုံးခွင့် မပါဘဲ ဆက်လက်မလုပ်ဆောင်နိုင်ပါ</string>
|
||||
<string name="toast_connect_via_bluetooth_start">ဘလူးတုသ် နှင့် ချိတ်ဆက်နေသည်...</string>
|
||||
@@ -365,7 +356,7 @@
|
||||
<string name="groups_reveal_invisible">အဆက်အသွယ်နှင့် ဆက်သွယ်မှုကို အဖွဲ့မှ မတွေ့မြင်နိုင်ပါ</string>
|
||||
<!--Forums-->
|
||||
<string name="no_forums">ပြသစရာဖိုရမ် မရှိပါ</string>
|
||||
<string name="no_forums_action">+ (အပေါင်းအိုင်ကွန်) အား နှိပ်၍ ဆွေးနွေးမှုဖိုရမ် ဖန်တီးပါ သို့မဟုတ် သင့် အဆက်အသွယ်များကို ဆွေးနွေးမှုဖိုရမ်များကို သင့်ဆီသို့ ဝေမျှရန် တောင်းဆိုပါ </string>
|
||||
<string name="no_forums_action">+ (အပေါင်းအိုင်ကွန်) အား နှိပ်၍ ဆွေးနွေးမှုဖိုရမ် ဖန်တီးပါ သို့မဟုတ် သင့် အဆက်အသွယ်များကို ဆွေးနွေးမှုဖိုရမ်များကို သင့်စီသို့ ဝေမျှရန် တောင်းဆိုပါ</string>
|
||||
<string name="create_forum_title">ဖိုရမ် ဖန်တီးမယ်</string>
|
||||
<string name="choose_forum_hint">သင့် ဆွေးနွေးမှုဖိုရမ်အတွက် အမည်ရွေးပါ</string>
|
||||
<string name="create_forum_button">ဖိုရမ်ဖန်တီးရန်</string>
|
||||
@@ -450,14 +441,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">တင်သွင်းမယ်</string>
|
||||
<string name="blogs_rss_feeds_import_hint">RSS သတင်းပို့စ်အလွှာ၏ URL ရိုက်ထည့်ပေးပါ</string>
|
||||
<string name="blogs_rss_feeds_import_error">ဝမ်းနည်းပါသည်! သင့် သတင်းပို့စ်အလွှာအား တင်သွင်းရာတွင် ပျက်ကွက်မှု ဖြစ်ခဲ့ပါသည်။</string>
|
||||
<string name="blogs_rss_feeds_import_exists">Feed ကို တင်ပို့ပြီး ဖြစ်သည်။</string>
|
||||
<string name="blogs_rss_feeds">RSS သတင်းလွှာများ</string>
|
||||
<string name="blogs_rss_feeds_manage">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>
|
||||
<string name="blogs_rss_remove_feed">သတင်းပို့စ်အလွှာ ဖယ်ရှားမယ်</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">ဤသတင်းပို့စ်အလွှာကို ဖယ်ရှားချင်တာ သေချာပါသလား? \n\n ပို့စ်များကို သင့်ကိရိယာမှ ဖယ်ရှားလိုက်မည်ဖြစ်သော်လည်း အခြားသူများ၏ကိရိယာများမှမူ ဖယ်ရှားလိုက်မည်မဟုတ်ပါ။ \n\n သင်မှ ဤသတင်းပို့စ်အလွှာကို မျှဝေထားသည့် သင့်အဆက်အသွယ်များအနေဖြင့် သတင်းအသစ်များရရှိမှု ရပ်တန့်သွားနိုင်ပါသည်။</string>
|
||||
<string name="blogs_rss_remove_feed_ok">ဖယ်ရှားမယ်</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">သတင်းပို့စ်အလွှာကို ဖယ်ရှား၍မရပါ!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">RSS သတင်းပို့စ်အလွှာများပြရန် မရှိပါ \n\n + (အပေါင်းအိုင်ကွန်) အားနှိပ်၍ သတင်းအလွှာ တင်သွင်းပါ</string>
|
||||
<string name="blogs_rss_feeds_manage_error">သင့် သတင်းပို့စ်အလွှာကို တင်သွင်းရာတွင် အခက်အခဲတွေ့ကြုံခဲ့ပါသည်။ နောင်မှ ပြန်စမ်းကြည့်ပေးပါ။</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -259,11 +259,13 @@
|
||||
<string name="blogs_rss_feeds_import_button">Importer</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Skriv inn nettadresse for RSS-strøm</string>
|
||||
<string name="blogs_rss_feeds_import_error">Vi beklager! Feil under importering av strøm.</string>
|
||||
<string name="blogs_rss_feeds_manage">Behandle RSS-strømmer</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importert:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Forfatter:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Sist oppdatert:</string>
|
||||
<string name="blogs_rss_remove_feed">Fjern strøm</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Fjern</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Strømmen kunne ikke fjernes!</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Feil ved lasting av dine strømmer. Prøv igjen senere.</string>
|
||||
<!--Settings Display-->
|
||||
<string name="display_settings_title">Vis</string>
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
<string name="setup_huawei_text">Tik alsjeblieft op de knop hieronder en ga nadat Briar is beschermd naar het scherm \"Beveiligde apps\".</string>
|
||||
<string name="setup_huawei_button">Bescherm Briar</string>
|
||||
<string name="setup_huawei_help">Als Briar niet is toegevoegd aan de beschermde apps, is het niet mogelijk om het in de achtergrond uit te voeren.</string>
|
||||
<string name="setup_xiaomi_button">Bescherm Briar</string>
|
||||
<string name="warning_dozed">%s kon niet in de achtergrond worden uitgevoerd</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Wachtwoord</string>
|
||||
@@ -421,13 +420,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Importeer</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Voer de URL van de RSS-feed in</string>
|
||||
<string name="blogs_rss_feeds_import_error">Excuses! Er trad een fout op bij het importeren van je feed.</string>
|
||||
<string name="blogs_rss_feeds">RSS-feeds</string>
|
||||
<string name="blogs_rss_feeds_manage">Beheer RSS-feeds</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Geïmporteerd:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Auteur:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Laatst bijgewerkt:</string>
|
||||
<string name="blogs_rss_remove_feed">Verwijder feed</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Weet je zeker dat je deze feed wil verwijderen?\n\nPosts zullen van je apparaat worden verwijderd maar niet van apparaten van andere mensen.\n\nContacten met wie je deze feed hebt gedeeld zullen geen updates meer ontvangen.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Verwijderen</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">De feed kon niet worden verwijderd.</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Geen RSS-feeds om te tonen\n\nTik op het +-icoon om een feed te importeren</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Er was een probleem met het laden van je feeds. Probeer het alsjeblieft later nog een keer.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
<string name="setup_huawei_text">Mercé de tocar lo boton çai-jos per vos assegurar que Briar es protegit dins l’ecran « Aplicacions protegidas ».</string>
|
||||
<string name="setup_huawei_button">Projècte Briar</string>
|
||||
<string name="setup_huawei_help">Se Briar es pas ajustat a la lista de las aplicacion protegidas poirà pas s’executar en rèire plan.</string>
|
||||
<string name="setup_xiaomi_button">Projècte Briar</string>
|
||||
<string name="warning_dozed">%s a pas pogut s’executar en rèire plan</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Senhal</string>
|
||||
@@ -393,6 +392,7 @@ Volètz suprimir vòstre compte e ne crear un nòu ?\n
|
||||
<string name="blogs_rss_feeds_import_button">Importar</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Marcar l’URL del flux RSS</string>
|
||||
<string name="blogs_rss_feeds_import_error">Una error s’es produisida en importar lo flux</string>
|
||||
<string name="blogs_rss_feeds_manage">Gerir lo flux RSS</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importat :</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autor :</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Darrièra mesa a jorn :</string>
|
||||
@@ -402,6 +402,7 @@ levadas de vòstre aparelh mas pas dels aparelhs del monde.\n\nTotes los
|
||||
contactes qu’avètz partejat aqueste flux quitaràn benlèu de recebre las mesas
|
||||
a jorn.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Suprimir</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Impossible de suprimir lo flux !</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Cap de flux RSS de far veire.\n\nTocatz l’icòna + per n’importar un</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Error en cargar vòstres fluxes. Ensajatz mai tard.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
<string name="setup_huawei_text">Proszę dotknąć przycisku poniżej i upewnić się, że Briar jest na liście chronionych aplikacji.</string>
|
||||
<string name="setup_huawei_button">Chroń Briar</string>
|
||||
<string name="setup_huawei_help">Jeśli Briar nie będzie na liście chronionych aplikacji, nie będzie miał możliwości aby działać w tle.</string>
|
||||
<string name="setup_xiaomi_button">Chroń Briar</string>
|
||||
<string name="warning_dozed">%s nie był wstanie działać w tle</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Hasło</string>
|
||||
@@ -401,12 +400,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Zaimportuj</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Wprowadź adres URL do kanału RSS</string>
|
||||
<string name="blogs_rss_feeds_import_error">Przepraszamy! Wystąpił błąd podczas importowania twojego kanału RSS</string>
|
||||
<string name="blogs_rss_feeds_manage">Zarządzaj kanałami RSS</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Zaimportowane:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autor:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Ostatnio Zaktualizowane:</string>
|
||||
<string name="blogs_rss_remove_feed">Usuń kanał RSS</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Jesteś pewny, że chcesz usunąć ten kanał RSS?\n\nPosty będą usunięte z Twojego urządzenia, ale nie z urządzeń innych ludzi.\n\nWszystkie kontakty którym udostępniłeś ten kanał mogą przestać otrzymywać jego uaktualnienia</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Usuń</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Kanał nie mógł zostać usunięty!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Brak RSS do wyświetlenia\n\nDotknij ikonki + aby zaimportować kanał.</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Wystąpił problem podczas ładowania twoich kanałów RSS. Proszę spróbować ponownie później.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
<string name="setup_huawei_text">Toque no botão abaixo e verifique se o Briar está protegido na tela \"Aplicativos Protegidos\"</string>
|
||||
<string name="setup_huawei_button">Proteger o Briar</string>
|
||||
<string name="setup_huawei_help">Se o Briar não for adicionado à lista de aplicativos protegidos ele não poderá ser executado em segundo plano.</string>
|
||||
<string name="setup_xiaomi_button">Proteger o Briar</string>
|
||||
<string name="warning_dozed">%s não pôde ser executado em segundo plano</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Senha</string>
|
||||
@@ -421,13 +420,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Importar</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Entre a URL do feed RSS</string>
|
||||
<string name="blogs_rss_feeds_import_error">Nós lamentamos! Houve um erro ao importar seu Feed.</string>
|
||||
<string name="blogs_rss_feeds">Feeds RSS</string>
|
||||
<string name="blogs_rss_feeds_manage">Gerenciar Feeds RSS</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importado:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autor:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Última Atualização:</string>
|
||||
<string name="blogs_rss_remove_feed">Remover Feed</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Você tem certeza que deseja remover este feed?\n\nOs posts serão removidos do seus dispositivo mas não dos dispositivos de outras pessoas.\n\nContatos com quem você tenha compartilhado este feed vão parar de receber atualizações dele.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Remover</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">O Feed não pode ser deletado!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Nenhum feed RSS para ser exibido\n\nPressione o ícone + para importar um feed</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Houve um problema ao carregar seus Feeds. Por favor tente novamente.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,8 +22,6 @@
|
||||
<string name="setup_huawei_text">Vă rugăm să apăsați butonul de mai jos și să vă asigurați că Briar este marcat ca protejat în fereastra de \"Aplicații protejate\".</string>
|
||||
<string name="setup_huawei_button">Protejează Briar</string>
|
||||
<string name="setup_huawei_help">Dacă Briar nu este adăugat în lista de aplicații protejate, nu va fi capabil să ruleze în fundal.</string>
|
||||
<string name="setup_huawei_app_launch_button">Deschide setările de baterie</string>
|
||||
<string name="setup_xiaomi_button">Protejează Briar</string>
|
||||
<string name="warning_dozed">%s nu poate rula în fundal</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Parola</string>
|
||||
@@ -160,7 +158,6 @@
|
||||
<string name="image_attach_error_invalid_mime_type">Format de imagine incompatibil: %s</string>
|
||||
<string name="set_contact_alias">Schimbă nume contact</string>
|
||||
<string name="set_contact_alias_hint">Nume contact</string>
|
||||
<string name="menu_item_disappearing_messages">Mesaje ce dispar</string>
|
||||
<string name="menu_item_connect_via_bluetooth">Conectare prin Bluetooth</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">Conectare prin Bluetooth</string>
|
||||
<!--The first placeholder will show a duration like "7 days". The second placeholder at the end will add "Tap to learn more."-->
|
||||
@@ -182,8 +179,6 @@
|
||||
<item quantity="other">%d de zile</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="tap_to_learn_more">Atingeți pentru mai mult.</string>
|
||||
<string name="auto_delete_changed_warning_send">Trimite oricum</string>
|
||||
<string name="delete_all_messages">Șterge toate mesajele</string>
|
||||
<string name="dialog_title_delete_all_messages">Confirmare ștergere mesaj</string>
|
||||
<string name="dialog_message_delete_all_messages">Sigur doriți să ștergeți toate mesajele?</string>
|
||||
@@ -450,14 +445,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Importă</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Introduceți URL-ul fluxului RSS</string>
|
||||
<string name="blogs_rss_feeds_import_error">Ne pare rău! A apărut o eroare la importul fluxului dumneavoastră.</string>
|
||||
<string name="blogs_rss_feeds_import_exists">Acest flux este deja importat.</string>
|
||||
<string name="blogs_rss_feeds">Fluxuri RSS</string>
|
||||
<string name="blogs_rss_feeds_manage">Administrare fluxuri RSS</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importat:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autor:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Actualizat ultima dată:</string>
|
||||
<string name="blogs_rss_remove_feed">Șterge flux</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Sunteți siguri că doriți să eliminați acest flux?\n\nMesajele vor fi eliminate de pe dispozitiv, dar nu și de pe dispozitivele altor persoane.\n\nOrice persoană de contact către care ați distribuit acest flux s-ar putea sa nu mai primească actualizări.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Eliminare</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Fluxul nu a putut fi șters!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Nici un flux RSS de arătat\n\nAtingeți iconița + pentru a adăuga un flux</string>
|
||||
<string name="blogs_rss_feeds_manage_error">A apărut o eroare la încărcarea fluxurilor dumneavoastră. Vă rugăm să încercați din nou mai târziu.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
@@ -553,7 +548,6 @@
|
||||
<string name="choose_ringtone_title">Alegeți sunetul</string>
|
||||
<string name="cannot_load_ringtone">Nu se poate încărca sunetul</string>
|
||||
<!--Conversation Settings-->
|
||||
<string name="disappearing_messages_title">Mesaje ce dispar</string>
|
||||
<string name="learn_more">Află mai mult</string>
|
||||
<!--Settings Feedback-->
|
||||
<string name="send_feedback">Trimiteți feed-back</string>
|
||||
|
||||
@@ -22,14 +22,6 @@
|
||||
<string name="setup_huawei_text">Нажмите кнопку ниже и убедитесь, что Briar отображается на экране защищенных приложений.</string>
|
||||
<string name="setup_huawei_button">Защитить Briar</string>
|
||||
<string name="setup_huawei_help">Если Briar не будет добавлен в список защищенных приложений, он не сможет работать в фоновом режиме.</string>
|
||||
<string name="setup_huawei_app_launch_text">Пожалуйста, нажмите кнопку ниже, откройте экран \"Запуск приложения\" и убедитесь, что для Briar установлено значение \"Управлять вручную\".</string>
|
||||
<string name="setup_huawei_app_launch_button">Открыть настройки батареи</string>
|
||||
<string name="setup_huawei_app_launch_help">Если для Briar не установлено значение \"Управлять вручную\" на экране \"Запуск приложения\", он не сможет работать в фоновом режиме.</string>
|
||||
<string name="setup_xiaomi_text">Для работы в фоновом режиме Briar должен быть заблокирован в списке недавних приложений.</string>
|
||||
<string name="setup_xiaomi_button">Защитить Briar</string>
|
||||
<string name="setup_xiaomi_help">Если Briar не заблокирован в списке последних приложений, он не сможет работать в фоновом режиме.</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">1. Откройте список недавних приложений (также называемый переключателем приложений)\n\n2. Смахните вниз изображение Briar, чтобы появился значок замка\n\n3. Если замок не заблокирован, нажмите на него для блокировки.</string>
|
||||
<string name="setup_xiaomi_dialog_body_new">1. Откройте список недавних приложений (также называемый переключателем приложений)\n\n2. Нажмите и удерживайте изображение Briar, пока не появится кнопка с замком\n\n3. Если замок не заблокирован, нажмите на него для блокировки.</string>
|
||||
<string name="warning_dozed">%s не удалось выполнить в фоновом режиме</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Пароль</string>
|
||||
@@ -178,13 +170,6 @@
|
||||
<string name="menu_item_disappearing_messages">Исчезающие сообщения</string>
|
||||
<string name="menu_item_connect_via_bluetooth">Подключение через Bluetooth</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">Подключение через Bluetooth</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">Чтобы это сработало, ваш контакт должен находиться поблизости.\n\nВы и ваш собеседник должны одновременно нажать кнопку \"Начать\".</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">Пробуем подключиться через Bluetooth</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">Невозможно продолжить без Bluetooth</string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">Невозможно продолжить без доступа к местоположению</string>
|
||||
<string name="toast_connect_via_bluetooth_start">Подключение через Bluetooth...</string>
|
||||
<string name="toast_connect_via_bluetooth_success">Успешное подключение через Bluetooth</string>
|
||||
<string name="toast_connect_via_bluetooth_error">Не удалось подключиться через Bluetooth</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."-->
|
||||
@@ -491,14 +476,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Импорт</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Введите URL-адрес 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">Управление 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>
|
||||
<string name="blogs_rss_remove_feed">Удалить RSS-ленту</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Вы уверены, что хотите удалить эту ленту?\n\nПосты будут удалены только с вашего устройства.\n\nВсе контакты, с которыми вы поделились этой лентой, могут перестать получать обновления.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Удалить</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Не удалось удалить ленту!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Нет RSS-лент для отображения\n\nКоснитесь значка + для импорта ленты</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Ошибка при загрузке вашей ленты. Повторите попытку позже.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -25,12 +25,6 @@
|
||||
<string name="setup_huawei_app_launch_text">Ju lutemi, prekni butonin më poshtë, hapni skenën “Nisje aplikacioni” dhe sigurohuni se për Briar-in është zgjedhur “Administrojeni dorazi”.</string>
|
||||
<string name="setup_huawei_app_launch_button">Hapni Rregullime Baterie</string>
|
||||
<string name="setup_huawei_app_launch_help">Nëse për Briar-in s’është zgjedhur “Administroje Dorazi” te skena “Nisje Aplikacioni”, s’do të jetë në gjendje të xhirojë në prapaskenë.</string>
|
||||
<string name="setup_xiaomi_text">Për të xhiruar në prapaskenë, Briar-i lyp të jetë i kyçur te lista e aplikacioneve të përdorur së fundi.</string>
|
||||
<string name="setup_xiaomi_button">Mbroje Briar-in</string>
|
||||
<string name="setup_xiaomi_help">Nëse Briar-i s’është i kyçur te lista e aplikacioneve të përdorur së fundi, s’do të jetë në gjendje të xhirojë në prapaskenë.</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">1. Hapni listën e aplikacioneve përdorur së fundi (e quajtur edhe këmbyes aplikacionesh)\n\n2. Fërkojeni për poshtë te figura për Briar-in, që të shfaqet ikona e drynit\n\n3. Nëse dryni s’është o kyçur, prekeni që të kyçet</string>
|
||||
<string name="setup_xiaomi_dialog_body_new">1. Hapni listën e aplikacioneve përdorur së fundi (e quajtur edhe
|
||||
këmbyes aplikacionesh)\n\n2. Shtypni dhe mbajeni të shtypur figurën e Briar-it, deri sa të shfaqet butoni i drynit\n\n3. Nëse dryni s’është o kyçur, prekeni që të kyçet</string>
|
||||
<string name="warning_dozed">%s s\’qe në gjendje të xhirojë në prapaskenë</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Fjalëkalim</string>
|
||||
@@ -168,7 +162,6 @@ këmbyes aplikacionesh)\n\n2. Shtypni dhe mbajeni të shtypur figurën e Briar-i
|
||||
<string name="menu_item_connect_via_bluetooth">Lidhu përmes Bluetooth-i</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">Lidhu përmes Bluetooth-i</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">Është e nevojshme që kontakti juaj të jetë atypari, që kjo të funksionojë.\n\nJu dhe kontakti juaj duhet që të shtypin “Fillo” në të njëjtën kohë.</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">Po provohet tashmë të lidhet përmes Bluetooth-i</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">S’mund të vazhdohet pa Bluetooth</string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">S’mund të vazhdohet pa leje vendore</string>
|
||||
<string name="toast_connect_via_bluetooth_start">Po lidhet me Bluetooth…</string>
|
||||
@@ -464,14 +457,14 @@ këmbyes aplikacionesh)\n\n2. Shtypni dhe mbajeni të shtypur figurën e Briar-i
|
||||
<string name="blogs_rss_feeds_import_button">Importo</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Jepni URL-në e prurjes RSS</string>
|
||||
<string name="blogs_rss_feeds_import_error">Na ndjeni! Pati një gabim me importimin e prurjes tuaj.</string>
|
||||
<string name="blogs_rss_feeds_import_exists">Ajo prurje është importuar tashmë.</string>
|
||||
<string name="blogs_rss_feeds">Prurje RSS</string>
|
||||
<string name="blogs_rss_feeds_manage">Administroni Prurje RSS</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Të importuara:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autor:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Përditësuar Së Fundi:</string>
|
||||
<string name="blogs_rss_remove_feed">Hiqe Prurjen</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Jeni i sigurt se doni të hiqet kjo prurje?\n\nPostimet do të hiqen nga pajisja juaj, por jo nga pajisjet e personave të tjerë.\n\nÇfarëdo kontaktesh me të cilët e keni ndarë këtë prurje mund të reshtin së marri përditësime.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Hiqe</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">S\’u fshi dot prurja!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">S’ka prurje RSS për shfaqje\n\nPrekni ikonën + që të importohet një prurje</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Pati një problem me ngarkimin e prurjeve tuaja. Ju lutemi, riprovoni më vonë.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -340,6 +340,7 @@ Kontakti kojima ste podijelili ovaj blog će možda prestati da dobijaju novosti
|
||||
<string name="blogs_rss_feeds_import_button">Uvezi</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Unesi URL od RSS kanala</string>
|
||||
<string name="blogs_rss_feeds_import_error">Žao nam je! Došlo je do greške pri unosu vašeg kanala.</string>
|
||||
<string name="blogs_rss_feeds_manage">Rukujte RSS kanalima</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Uvezeno:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Autor:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Zadnje ažuriranje:</string>
|
||||
@@ -350,6 +351,7 @@ Postovi će biti uklonjeni sa vašeg uređaja ali ne is uređaja drugih ljudi.
|
||||
|
||||
Kontakti kojima ste podijelili ovaj blog će možda prestati da dobijaju novosti.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Ukloni</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Kanal nije bilo moguće ukloniti!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Nema RSS kanala za prikazivanje
|
||||
|
||||
Dotaknite + ikonu da uvezete kanal</string>
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
<string name="setup_huawei_text">Tryck på knappen längre ner för att lägga till Briar till listan över \"skyddade appar\".</string>
|
||||
<string name="setup_huawei_button">Skydda Briar</string>
|
||||
<string name="setup_huawei_help">Om Briar inte läggs till listan över skyddade appar kan det inte köras i bakgrunden.</string>
|
||||
<string name="setup_xiaomi_button">Skydda Briar</string>
|
||||
<string name="warning_dozed">%s kunde inte köras i bakgrunden</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Lösenord</string>
|
||||
@@ -421,13 +420,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Importera</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Skriv URL till RSS-flödet</string>
|
||||
<string name="blogs_rss_feeds_import_error">Tyvärr! Något gick fel när flödet skulle importeras.</string>
|
||||
<string name="blogs_rss_feeds">RSS-flöden</string>
|
||||
<string name="blogs_rss_feeds_manage">Hantera RSS-flöden</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Importerade:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Författare:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Senast uppdaterad:</string>
|
||||
<string name="blogs_rss_remove_feed">Ta bort flöde</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Är du säker på att du vill ta bort det här flödet?\n\nInlägg kommer att tas bort från din enhet, men inte från andras.\n\nKontakter som du har delat det här flödet med kommer kanske inte längre få uppdateringar från det.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">&Ta bort</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Flödet kunde ej tas bort!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Inga RSS-flöden\n\nTryck plus-ikonen (+) för att importera ett flöde</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Något gick fel när dina flöden skulle laddas. Försök ingen senare.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -26,7 +26,6 @@ Nenosiri zako haziendani </string>
|
||||
<string name="setup_huawei_button">Linda Briar </string>
|
||||
<string name="setup_huawei_help">
|
||||
Kama Briar haija wekwa kwenye orotha programu ulizi, haitaweza kufanya kazi kwenye nyuma ya mkongo</string>
|
||||
<string name="setup_xiaomi_button">Linda Briar </string>
|
||||
<string name="warning_dozed">%shaijawezekana kujiendesha kwa nyuma ya mkongo</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Nywila
|
||||
@@ -401,6 +400,7 @@ Umepoteza nenosiri.</string>
|
||||
<string name="blogs_rss_feeds_import_button">Ingiza</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Ingiza URL za RSS taarifa</string>
|
||||
<string name="blogs_rss_feeds_import_error">Samahani! Kulikuwa na hitilafu wakati wakuingiza taarifa </string>
|
||||
<string name="blogs_rss_feeds_manage">Simamia taarifa za RSS</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Zilizoingizwa</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Mwandishi:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">huwisho la mwisho
|
||||
@@ -408,6 +408,7 @@ Umepoteza nenosiri.</string>
|
||||
<string name="blogs_rss_remove_feed">Ondoa taarifa</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Unauhakika unataka kutoa hii taarifa?\n\nChapisho lako litaondolewa kwenye kifaa chako ila sio kwenye vifaa vya watu wengine.\n\nMawasiliano yoyote utliokwisha kuyaunganisha wanaweza wasiendelea kupata taarifa. </string>
|
||||
<string name="blogs_rss_remove_feed_ok">Ondoa</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Taharifa haziwezekani kuzifuta! </string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Hakuna RSS taharifa zaku onyesha\n\nBonyeza + ikoni kuleta taharifa </string>
|
||||
<string name="blogs_rss_feeds_manage_error">Kulikuwa na tatizo la kufungua taharifa . Tafathali jaribu baadae kidogo.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -22,14 +22,6 @@
|
||||
<string name="setup_huawei_text">Lütfen aşağıdaki düğmeye dokunun ve Briar\'ın \"Korunan Uygulamalar\" ekranında korunduğundan emin olun.</string>
|
||||
<string name="setup_huawei_button">Briar\'ı Koru</string>
|
||||
<string name="setup_huawei_help">Briar korunan uygulamalar listesine eklenmezse, arka planda çalışamaz.</string>
|
||||
<string name="setup_huawei_app_launch_text">Lütfen aşağıdaki düğmeye dokunun, \"Uygulama başlatma\" ekranını açın ve Briar için \"Manuel olarak yönet\" şeklinde ayarlanmış olduğundan emin olun.</string>
|
||||
<string name="setup_huawei_app_launch_button">Pil Ayarlarını Aç</string>
|
||||
<string name="setup_huawei_app_launch_help">Eğer Briar, \"Uygulama Başlatma\" ekranında \"Manuel olarak yönet\" olarak ayarlanmamışsa, arka planda çalışmayabilir.</string>
|
||||
<string name="setup_xiaomi_text">Briar\'ın arka planda çalışması için korunan uygulamalar listesine listesine eklenmesi gerekiyor.</string>
|
||||
<string name="setup_xiaomi_button">Briar\'ı Koru</string>
|
||||
<string name="setup_xiaomi_help">Briar korunan uygulamalar listesine eklenmezse, arka planda çalışamaz.</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">1. Geçmiş uygulamalar listesini açın (uygulama değiştirici de deniyor)\n\n2. Briar resmini kilit simgesini görene kadar aşağı kaydırın\n\n3. Eğer kilit simgesi seçili değilse, kilitlemek için dokunun</string>
|
||||
<string name="setup_xiaomi_dialog_body_new">1. Geçmiş uygulamalar listesini açın (uygulama değiştirici de deniyor)\n\n2. Kilit simgesini görene kadar Briar resmine tıklayın ve tutun\n\n3. Eğer kilit simgesi seçili değilse, kilitlemek için dokunun</string>
|
||||
<string name="warning_dozed">%s arka planda çalışamadı</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Parola</string>
|
||||
@@ -167,7 +159,6 @@
|
||||
<string name="menu_item_connect_via_bluetooth">Bluetooth ile Bağlan</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">Bluetooth ile Bağlan</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">Bunun çalışması için kişinin yakınlarda olması gerekiyor.\n\nSizin ve kişinin \"Başlat\" düğmesine aynı anda basması gerekiyor.</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">Zaten Bluetooth\'a bağlanmaya çalışıyor</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">Bluetooth olmadan devam edilemez</string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">Konum izni olmadan devam edilemez</string>
|
||||
<string name="toast_connect_via_bluetooth_start">Bluetooth ile bağlanılıyor…</string>
|
||||
@@ -463,14 +454,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">İçe Aktar</string>
|
||||
<string name="blogs_rss_feeds_import_hint">RSS beslemesi URL\'sini girin</string>
|
||||
<string name="blogs_rss_feeds_import_error">Üzgünüz! RSS beslemeniz içe aktarılırken bir hata oluştu.</string>
|
||||
<string name="blogs_rss_feeds_import_exists">Bu besleme zaten içe aktarılmış.</string>
|
||||
<string name="blogs_rss_feeds">RSS beslemeleri</string>
|
||||
<string name="blogs_rss_feeds_manage">RSS Beslemelerini Yönet</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">İçe Aktarıldı:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Yazar:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Son Güncelleme:</string>
|
||||
<string name="blogs_rss_remove_feed">Beslemeyi Kaldır</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Bu beslemeyi kaldırmak istediğinizden emin misiniz?\n\nGönderiler sizin aygıtınızdan değil, diğer insanların aygıtlarından kaldırılacaktır.\n\nBu beslemeyi paylaştığınız kişiler güncellemeleri alması durabilir.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Kaldır</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Besleme silinemedi!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Gösterilecek RSS beslemesi yok\n\nBir beslemeyi içe aktarmak için + simgesine dokunun</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Beslemeleriniz yüklenirken bir hata oluştu. Lütfen daha sonra tekrar deneyin.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -400,12 +400,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Імпортувати</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Введіть URL-посилання RSS-стрічки</string>
|
||||
<string name="blogs_rss_feeds_import_error">Нам шкода! Виникла помилка під час імпорту вашої стрічки.</string>
|
||||
<string name="blogs_rss_feeds_manage">Kерувати 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>
|
||||
<string name="blogs_rss_remove_feed">Видалити стрічку</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Ви впевнені, що хочете видалити цю стрічку?\n\nДописи буде видалено з вашого пристрою, але не з пристроїв інших осіб.\n\nБудь-хто з контактів, з якими ви поділилися цією стрічкою, можуть припинити отримувати оноволення.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Вилучити</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">Ця стрічка не може бути видалена!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">Немає RSS-стрічок до відображення\n\nНатисніть на символ \"+\", щоб імпортувати стрічку</string>
|
||||
<string name="blogs_rss_feeds_manage_error">Під час завантаження ваших стрічок виникла проблема. Будь ласка, спробуйте пізніше.</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -25,11 +25,6 @@
|
||||
<string name="setup_huawei_app_launch_text">轻按下方按钮,打开“App launch”界面,确保 Briar 被设置为“手动管理”。</string>
|
||||
<string name="setup_huawei_app_launch_button">打开电池设置</string>
|
||||
<string name="setup_huawei_app_launch_help">如果“App 启动”界面中 Briar 没有被设置为“手动管理”,则其将无法在后台运行。</string>
|
||||
<string name="setup_xiaomi_text">要在后台运行,需将 Briar 锁定在最近的应用列表中。</string>
|
||||
<string name="setup_xiaomi_button">保护 Briar</string>
|
||||
<string name="setup_xiaomi_help">如果未将 Briar 锁定到最近的应用列表,它将无法在后台运行。</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">1. 打开最近的应用列表(也称为应用切换器)\n\n2. 向下滑动Briar的图像,显示挂锁图标\n\n3.如果挂锁没有被锁上,轻敲以锁定它</string>
|
||||
<string name="setup_xiaomi_dialog_body_new">1. 打开最近的应用列表(也称为应用切换器)\n\n2. 按住Briar的图像,直到挂锁按钮出现\n\n3. 如果挂锁没有被锁上,轻敲以锁定它</string>
|
||||
<string name="warning_dozed">%s 无法在后台运行</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">密码</string>
|
||||
@@ -162,7 +157,6 @@
|
||||
<string name="menu_item_connect_via_bluetooth">通过蓝牙连接</string>
|
||||
<string name="dialog_title_connect_via_bluetooth">通过蓝牙连接</string>
|
||||
<string name="dialog_message_connect_via_bluetooth">你的联络人必须在附近才能起作用。\n\n你和你的联系人应该同时按“开始”。</string>
|
||||
<string name="toast_connect_via_bluetooth_already_discovering">已在尝试通过蓝牙进行连接</string>
|
||||
<string name="toast_connect_via_bluetooth_not_discoverable">没有蓝牙无法继续 </string>
|
||||
<string name="toast_connect_via_bluetooth_no_location_permission">没有位置权限不能继续 </string>
|
||||
<string name="toast_connect_via_bluetooth_start">正通过蓝牙连接 …</string>
|
||||
@@ -450,14 +444,14 @@
|
||||
<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">管理 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>
|
||||
<string name="blogs_rss_remove_feed">删除订阅源</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">确认要删除该订阅源吗?\n\n博文将从您的设备上移除,但仍将存在于其他人的设备。\n\n那些经过您的分享而订阅该源的联系人可能不会再收到更新。</string>
|
||||
<string name="blogs_rss_remove_feed_ok">删除</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">该订阅源无法被删除!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">尚无订阅源可供显示\n\n轻按 + 号导入一个订阅源</string>
|
||||
<string name="blogs_rss_feeds_manage_error">加载订阅源时出错。请稍候再试。</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -362,12 +362,14 @@
|
||||
<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_manage">管理 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>
|
||||
<string name="blogs_rss_remove_feed">刪除訂閱源</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">確認要刪除該訂閱源嗎?\n\n博文將從您的裝置上移除,但仍將存在於其他人的裝置。\n\n那些經過您的分享而訂閱該源的聯絡人可能不會再收到更新。</string>
|
||||
<string name="blogs_rss_remove_feed_ok">刪除</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">無法刪除這訂閱源!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">尚無訂閱源可供顯示\n\n輕按 + 號導入訂閱源</string>
|
||||
<string name="blogs_rss_feeds_manage_error">加載訂閱源時出錯。請稍候再試。</string>
|
||||
<!--Settings Profile Picture-->
|
||||
|
||||
@@ -30,11 +30,6 @@
|
||||
<string name="setup_huawei_app_launch_text">Please tap the button below, open the \"App launch\" screen and make sure Briar is set to \"Manage manually\".</string>
|
||||
<string name="setup_huawei_app_launch_button">Open Battery Settings</string>
|
||||
<string name="setup_huawei_app_launch_help">If Briar is not set to \"Manage manually\" in the \"App launch\" screen, it will not be able to run in the background.</string>
|
||||
<string name="setup_xiaomi_text">To run in the background, Briar needs to be locked to the recent apps list.</string>
|
||||
<string name="setup_xiaomi_button">Protect Briar</string>
|
||||
<string name="setup_xiaomi_help">If Briar is not locked to the recent apps list, it will be unable to run in the background.</string>
|
||||
<string name="setup_xiaomi_dialog_body_old">1. Open the recent apps list (also called the app switcher)\n\n2. Swipe down on the image of Briar to show the padlock icon\n\n3. If the padlock is not locked, tap to lock it</string>
|
||||
<string name="setup_xiaomi_dialog_body_new">1. Open the recent apps list (also called the app switcher)\n\n2. Press and hold the image of Briar until the padlock button appears\n\n3. If the padlock is not locked, tap to lock it</string>
|
||||
<string name="warning_dozed">%s was unable to run in the background</string>
|
||||
|
||||
<!-- Login -->
|
||||
@@ -491,14 +486,14 @@
|
||||
<string name="blogs_rss_feeds_import_button">Import</string>
|
||||
<string name="blogs_rss_feeds_import_hint">Enter the URL of the RSS feed</string>
|
||||
<string name="blogs_rss_feeds_import_error">We are sorry! There was an error importing your feed.</string>
|
||||
<string name="blogs_rss_feeds_import_exists">That feed is already imported.</string>
|
||||
<string name="blogs_rss_feeds">RSS Feeds</string>
|
||||
<string name="blogs_rss_feeds_manage">Manage RSS Feeds</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Imported:</string>
|
||||
<string name="blogs_rss_feeds_manage_author">Author:</string>
|
||||
<string name="blogs_rss_feeds_manage_updated">Last Updated:</string>
|
||||
<string name="blogs_rss_remove_feed">Remove Feed</string>
|
||||
<string name="blogs_rss_remove_feed_dialog_message">Are you sure that you want to remove this feed?\n\nPosts will be removed from your device but not from other people\'s devices.\n\nAny contacts you\'ve shared this feed with might stop receiving updates.</string>
|
||||
<string name="blogs_rss_remove_feed_ok">Remove</string>
|
||||
<string name="blogs_rss_feeds_manage_delete_error">The feed could not be deleted!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">No RSS feeds to show\n\nTap the + icon to import a feed</string>
|
||||
<string name="blogs_rss_feeds_manage_error">There was a problem loading your feeds. Please try again later.</string>
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
dependencyVerification {
|
||||
verify = [
|
||||
'androidx.activity:activity-ktx:1.1.0:activity-ktx-1.1.0.aar:1996c36d3d2d62db5020b8ec634b5f854b1a698960c3552e1a00c69221baeabe',
|
||||
'androidx.activity:activity-ktx:1.2.2:activity-ktx-1.2.2.aar:9829e13d6a6b045b03b21a330512e091dc76eb5b3ded0d88d1ab0509cf84a50e',
|
||||
'androidx.activity:activity:1.2.0:activity-1.2.0.aar:ac27a810554e47b2122bce1f338934e77b173a5a9267eb35f134b6d34f931bae',
|
||||
'androidx.activity:activity:1.2.2:activity-1.2.2.aar:e165fb20f006b77894d349572cc3acd2760baa8416ae4d33cb8de6a84dd6730c',
|
||||
'androidx.annotation:annotation-experimental:1.0.0:annotation-experimental-1.0.0.aar:b219d2b568e7e4ba534e09f8c2fd242343df6ccbdfbbe938846f5d740e6b0b11',
|
||||
'androidx.annotation:annotation:1.1.0:annotation-1.1.0.jar:d38d63edb30f1467818d50aaf05f8a692dea8b31392a049bfa991b159ad5b692',
|
||||
'androidx.appcompat:appcompat-resources:1.2.0:appcompat-resources-1.2.0.aar:c470297c03ff3de1c3d15dacf0be0cae63abc10b52f021dd07ae28daa3100fe5',
|
||||
@@ -22,29 +23,36 @@ dependencyVerification {
|
||||
'androidx.documentfile:documentfile:1.0.0:documentfile-1.0.0.aar:865a061ef2fad16522f8433536b8d47208c46ff7c7745197dfa1eeb481869487',
|
||||
'androidx.drawerlayout:drawerlayout:1.0.0:drawerlayout-1.0.0.aar:9402442cdc5a43cf62fb14f8cf98c63342d4d9d9b805c8033c6cf7e802749ac1',
|
||||
'androidx.exifinterface:exifinterface:1.3.1:exifinterface-1.3.1.aar:ef168daa6eb744c8395c22b49afa5235e6099868a0377175b6d5e3cdff8d7ffc',
|
||||
'androidx.fragment:fragment-ktx:1.2.5:fragment-ktx-1.2.5.aar:50f0f3b734f93829eeac7456b7cb13e5430741e555c535911a958ee4a8242bca',
|
||||
'androidx.fragment:fragment-testing:1.2.5:fragment-testing-1.2.5.aar:ef3cc3387115f9187665b283e313b13a2bb8826673380317057e2972351df09c',
|
||||
'androidx.fragment:fragment-ktx:1.3.3:fragment-ktx-1.3.3.aar:5f4aff678b7b70a67275abb66802e2e775c70a7be536c1dedf76335900263572',
|
||||
'androidx.fragment:fragment-testing:1.3.3:fragment-testing-1.3.3.aar:632a2aeb171a373227601a543ac147be8e6d55e38a88e8d130e9391965178c13',
|
||||
'androidx.fragment:fragment:1.3.0:fragment-1.3.0.aar:66db3ed2b11bb5e572a079b87cd3fae9bc5c33c373c71b25f1e3eac7607ab526',
|
||||
'androidx.fragment:fragment:1.3.3:fragment-1.3.3.aar:75ed0aeac5042955d06b73fe98a854a45af10ab4f2362293f9d56ef6684f402e',
|
||||
'androidx.interpolator:interpolator:1.0.0:interpolator-1.0.0.aar:33193135a64fe21fa2c35eec6688f1a76e512606c0fc83dc1b689e37add7732a',
|
||||
'androidx.legacy:legacy-support-core-utils:1.0.0:legacy-support-core-utils-1.0.0.aar:a7edcf01d5b52b3034073027bc4775b78a4764bb6202bb91d61c829add8dd1c7',
|
||||
'androidx.lifecycle:lifecycle-common:2.3.0:lifecycle-common-2.3.0.jar:15848fb56db32f4c7cdc72b324003183d52a4884d6bf09be708ac7f587d139b5',
|
||||
'androidx.lifecycle:lifecycle-common:2.3.1:lifecycle-common-2.3.1.jar:15848fb56db32f4c7cdc72b324003183d52a4884d6bf09be708ac7f587d139b5',
|
||||
'androidx.lifecycle:lifecycle-extensions:2.2.0:lifecycle-extensions-2.2.0.aar:648c8de1d10b025d524a2e46ac994fc3f6bf186826c09ec1a62d250bf1b877ae',
|
||||
'androidx.lifecycle:lifecycle-livedata-core-ktx:2.2.0:lifecycle-livedata-core-ktx-2.2.0.aar:5951f882e95b7e05ceb9adfca0fa2ebd511d63ea5a00da4eae6c6d0c1903da18',
|
||||
'androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.1:lifecycle-livedata-core-ktx-2.3.1.aar:6dd41c3c33daeb503fd87fbfff7043adb0be6c541a9c9e09bf531ca49520fddb',
|
||||
'androidx.lifecycle:lifecycle-livedata-core:2.3.0:lifecycle-livedata-core-2.3.0.aar:89f480888f2bb8eb62d9b7b1eb34be69b59ec84b24a1b0bdbeb49973478c6da3',
|
||||
'androidx.lifecycle:lifecycle-livedata-core:2.3.1:lifecycle-livedata-core-2.3.1.aar:e55d38c372460f0a03997ddc950c67227511340fd74f8634d99d29653cd81ab1',
|
||||
'androidx.lifecycle:lifecycle-livedata:2.2.0:lifecycle-livedata-2.2.0.aar:d83af94860aa9f64cbdc51f40796a7cf55b116f0e6efd752e845c0104c8b16f6',
|
||||
'androidx.lifecycle:lifecycle-process:2.2.0:lifecycle-process-2.2.0.aar:3a977e7778fc8418742d388409daaba7ea8fea8823d21ffb96e4c4236f715070',
|
||||
'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0:lifecycle-runtime-ktx-2.2.0.aar:c29fc87694e6ce116b61207221e53ed285862a6628055790b0bcf9ce45d8cc68',
|
||||
'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1:lifecycle-runtime-ktx-2.3.1.aar:7ad2987dd7f4075c0871a72cf07e9649d9cd790fc23dfab1972eca4710373873',
|
||||
'androidx.lifecycle:lifecycle-runtime:2.3.0:lifecycle-runtime-2.3.0.aar:94f528fd5fb123f75b6e65d07a6ef5cd6c0e69ac604d106aaa12705282456234',
|
||||
'androidx.lifecycle:lifecycle-runtime:2.3.1:lifecycle-runtime-2.3.1.aar:dd294f4a689c71ff877fd41f3b67a3a62f7760d44ce420e6130f1fc3569d8f00',
|
||||
'androidx.lifecycle:lifecycle-service:2.2.0:lifecycle-service-2.2.0.aar:ca2801ffc069555afed8eddd2292130f436956452bc8bbad30fb56f8e4e382a0',
|
||||
'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0:lifecycle-viewmodel-ktx-2.2.0.aar:f791001f2211947e56ad3d96d12c9ae93fc5589b88f08603f69a2265c9a7d702',
|
||||
'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1:lifecycle-viewmodel-ktx-2.3.1.aar:5fb3591b6a54eeb3e204be0125d48eb987b8ea45a5048140036865482ccf9de9',
|
||||
'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0:lifecycle-viewmodel-savedstate-2.3.0.aar:49f9532b5104cc1ee64900ed4f696d031d807fba726e0d5d6a52459e8fba4a1d',
|
||||
'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1:lifecycle-viewmodel-savedstate-2.3.1.aar:97137a8af6a31776a14e4866ab808c7c0a791b484bdbc788bbd83e66407564c0',
|
||||
'androidx.lifecycle:lifecycle-viewmodel:2.3.0:lifecycle-viewmodel-2.3.0.aar:cea8f26fa232037922b69af9cd1bde2df1211acc8b75253e425b7150a5fca59d',
|
||||
'androidx.lifecycle:lifecycle-viewmodel:2.3.1:lifecycle-viewmodel-2.3.1.aar:b6db4c274a12ff85a4747e1e6669c7e98aefa2571ace9d1f1a6fa6be417ce838',
|
||||
'androidx.loader:loader:1.0.0:loader-1.0.0.aar:11f735cb3b55c458d470bed9e25254375b518b4b1bad6926783a7026db0f5025',
|
||||
'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0:localbroadcastmanager-1.0.0.aar:e71c328ceef5c4a7d76f2d86df1b65d65fe2acf868b1a4efd84a3f34336186d8',
|
||||
'androidx.preference:preference:1.1.1:preference-1.1.1.aar:317dcbc38242aea2f6262c06d51b8a22827e98959967edd40f82600a15cb4bff',
|
||||
'androidx.print:print:1.0.0:print-1.0.0.aar:1d5c7f3135a1bba661fc373fd72e11eb0a4adbb3396787826dd8e4190d5d9edd',
|
||||
'androidx.recyclerview:recyclerview-selection:1.1.0-rc03:recyclerview-selection-1.1.0-rc03.aar:a548a0771c2c8ca8cf98f1f755b0eef4fac73d1697e6eeb1a6383f557e0eba13',
|
||||
'androidx.recyclerview:recyclerview:1.1.0:recyclerview-1.1.0.aar:f0d2b5a67d0a91ee1b1c73ef2b636a81f3563925ddd15a1d4e1c41ec28de7a4f',
|
||||
'androidx.savedstate:savedstate-ktx:1.1.0:savedstate-ktx-1.1.0.aar:e44d61347463b0fafeeb649cbcc3d7109b2eb5e11d1522e986105170cdebbf68',
|
||||
'androidx.savedstate:savedstate:1.1.0:savedstate-1.1.0.aar:d60bbe44c2c08083a17c5dc678a6d6b4d0a2d664858016ab5c049cbea90a63b7',
|
||||
'androidx.test.espresso:espresso-contrib:3.3.0:espresso-contrib-3.3.0.aar:f400cabdc181356acf6b210e4509dcb9649d9e2b6b6e218c60fcfc15e8a756d1',
|
||||
'androidx.test.espresso:espresso-core:3.3.0:espresso-core-3.3.0.aar:23ebf6014645e0c60aec7d1ed924d4d4c848ae8c3673b7d8d06b2ec6a56cafee',
|
||||
@@ -200,14 +208,14 @@ dependencyVerification {
|
||||
'org.hamcrest:hamcrest-integration:1.3:hamcrest-integration-1.3.jar:70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2',
|
||||
'org.hamcrest:hamcrest-library:1.3:hamcrest-library-1.3.jar:711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c',
|
||||
'org.jetbrains.kotlin:kotlin-reflect:1.3.72:kotlin-reflect-1.3.72.jar:a188d9367de1c4ee9479db630985c0597b20709c83161b1430d24edb27e38c40',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50:kotlin-stdlib-common-1.3.50.jar:8ce678e88e4ba018b66dacecf952471e4d7dfee156a8a819760a5a5ff29d323c',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-common:1.3.72:kotlin-stdlib-common-1.3.72.jar:5e7d1552863e480c1628b1cc39ce230ef829f5b7230106215a05acda5172203a',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-common:1.4.20:kotlin-stdlib-common-1.4.20.jar:a7112c9b3cefee418286c9c9372f7af992bd1e6e030691d52f60cb36dbec8320',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72:kotlin-stdlib-jdk7-1.3.72.jar:40566c0c08d414b9413ba556ff7f8a0b04b98b9f0f424d122dd2088510efccc4',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72:kotlin-stdlib-jdk8-1.3.72.jar:133da70cfc07b56094282eac5c59bccd59f167ee2ead22e5282876d8bc10bf95',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib:1.3.50:kotlin-stdlib-1.3.50.jar:e6f05746ee0366d0b52825a090fac474dcf44082c9083bbb205bd16976488d6c',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib:1.3.72:kotlin-stdlib-1.3.72.jar:3856a7349ebacd6d1be6802b2fed9c4dc2c5a564ea92b6b945ac988243d4b16b',
|
||||
'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0:kotlinx-coroutines-android-1.3.0.jar:c80aaadf041f044d324a19a73f88879dfd1e4d026b14e3230075ff9081942ae3',
|
||||
'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0:kotlinx-coroutines-core-1.3.0.jar:6f3a60fea2403b80385b399952aeb3a4cf0985a45b8da04b6f31825171901a1d',
|
||||
'org.jetbrains.kotlin:kotlin-stdlib:1.4.20:kotlin-stdlib-1.4.20.jar:b8ab1da5cdc89cb084d41e1f28f20a42bd431538642a5741c52bbfae3fa3e656',
|
||||
'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1:kotlinx-coroutines-android-1.4.1.jar:d4cadb673b2101f1ee5fbc147956ac78b1cfd9cc255fb53d3aeb88dff11d99ca',
|
||||
'org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.1:kotlinx-coroutines-core-jvm-1.4.1.jar:6d2f87764b6638f27aff12ed380db4b63c9d46ba55dc32683a650598fa5a3e22',
|
||||
'org.jetbrains.trove4j:trove4j:20160824:trove4j-20160824.jar:1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7',
|
||||
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
|
||||
'org.jmock:jmock-junit4:2.8.2:jmock-junit4-2.8.2.jar:f7ee4df4f7bd7b7f1cafad3b99eb74d579f109d5992ff625347352edb55e674c',
|
||||
|
||||
@@ -10,7 +10,7 @@ import javax.annotation.concurrent.Immutable;
|
||||
|
||||
@Immutable
|
||||
@NotNullByDefault
|
||||
public class Feed implements Comparable<Feed> {
|
||||
public class Feed {
|
||||
|
||||
private final String url;
|
||||
private final Blog blog;
|
||||
@@ -94,13 +94,4 @@ public class Feed implements Comparable<Feed> {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(Feed o) {
|
||||
if (this == o) return 0;
|
||||
long aTime = getAdded(), bTime = o.getAdded();
|
||||
if (aTime > bTime) return -1;
|
||||
if (aTime < bTime) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package org.briarproject.briar.api.feed;
|
||||
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.db.Transaction;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.bramble.api.sync.ClientId;
|
||||
|
||||
@@ -24,7 +23,7 @@ public interface FeedManager {
|
||||
/**
|
||||
* Adds an RSS feed as a new dedicated blog.
|
||||
*/
|
||||
Feed addFeed(String url) throws DbException, IOException;
|
||||
void addFeed(String url) throws DbException, IOException;
|
||||
|
||||
/**
|
||||
* Removes an RSS feed.
|
||||
@@ -36,8 +35,4 @@ public interface FeedManager {
|
||||
*/
|
||||
List<Feed> getFeeds() throws DbException;
|
||||
|
||||
/**
|
||||
* Returns a list of all added RSS feeds
|
||||
*/
|
||||
List<Feed> getFeeds(Transaction txn) throws DbException;
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ dependencies {
|
||||
testImplementation project(path: ':bramble-core', configuration: 'testOutput')
|
||||
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
|
||||
testImplementation 'net.jodah:concurrentunit:0.4.2'
|
||||
testImplementation 'junit:junit:4.12'
|
||||
testImplementation 'junit:junit:4.13.1'
|
||||
testImplementation "org.jmock:jmock:2.8.2"
|
||||
testImplementation "org.jmock:jmock-junit4:2.8.2"
|
||||
testImplementation "org.jmock:jmock-legacy:2.8.2"
|
||||
|
||||
@@ -166,7 +166,7 @@ class FeedManagerImpl implements FeedManager, EventListener, OpenDatabaseHook,
|
||||
}
|
||||
|
||||
@Override
|
||||
public Feed addFeed(String url) throws DbException, IOException {
|
||||
public void addFeed(String url) throws DbException, IOException {
|
||||
// fetch syndication feed to get its metadata
|
||||
SyndFeed f = fetchSyndFeed(url);
|
||||
|
||||
@@ -198,8 +198,6 @@ class FeedManagerImpl implements FeedManager, EventListener, OpenDatabaseHook,
|
||||
} finally {
|
||||
db.endTransaction(txn);
|
||||
}
|
||||
|
||||
return updatedFeed;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -234,11 +232,18 @@ class FeedManagerImpl implements FeedManager, EventListener, OpenDatabaseHook,
|
||||
|
||||
@Override
|
||||
public List<Feed> getFeeds() throws DbException {
|
||||
return db.transactionWithResult(true, this::getFeeds);
|
||||
List<Feed> feeds;
|
||||
Transaction txn = db.startTransaction(true);
|
||||
try {
|
||||
feeds = getFeeds(txn);
|
||||
db.commitTransaction(txn);
|
||||
} finally {
|
||||
db.endTransaction(txn);
|
||||
}
|
||||
return feeds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Feed> getFeeds(Transaction txn) throws DbException {
|
||||
private List<Feed> getFeeds(Transaction txn) throws DbException {
|
||||
List<Feed> feeds = new ArrayList<>();
|
||||
Group g = getLocalGroup();
|
||||
try {
|
||||
|
||||
@@ -17,7 +17,6 @@ import org.briarproject.bramble.api.sync.Message;
|
||||
import org.briarproject.bramble.api.system.Clock;
|
||||
import org.briarproject.bramble.api.system.TaskScheduler;
|
||||
import org.briarproject.bramble.test.BrambleMockTestCase;
|
||||
import org.briarproject.bramble.test.DbExpectations;
|
||||
import org.briarproject.bramble.test.ImmediateExecutor;
|
||||
import org.briarproject.briar.api.blog.Blog;
|
||||
import org.briarproject.briar.api.blog.BlogManager;
|
||||
@@ -146,14 +145,17 @@ public class FeedManagerImplTest extends BrambleMockTestCase {
|
||||
BdfDictionary feedsDict =
|
||||
BdfDictionary.of(new BdfEntry(KEY_FEEDS, feedList));
|
||||
expectGetLocalGroup();
|
||||
context.checking(new DbExpectations() {{
|
||||
oneOf(db).transactionWithResult(with(true), withDbCallable(txn));
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(db).startTransaction(true);
|
||||
will(returnValue(txn));
|
||||
oneOf(clientHelper).getGroupMetadataAsDictionary(txn, localGroupId);
|
||||
will(returnValue(feedsDict));
|
||||
if (feedList.size() == 1) {
|
||||
oneOf(feedFactory).createFeed(feedDict);
|
||||
will(returnValue(feed));
|
||||
}
|
||||
oneOf(db).commitTransaction(txn);
|
||||
oneOf(db).endTransaction(txn);
|
||||
}});
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ dependencyVerification {
|
||||
'com.squareup:javapoet:1.11.1:javapoet-1.11.1.jar:9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90',
|
||||
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
|
||||
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
|
||||
'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a',
|
||||
'junit:junit:4.13.1:junit-4.13.1.jar:c30719db974d6452793fe191b3638a5777005485bae145924044530ffa5f6122',
|
||||
'net.jodah:concurrentunit:0.4.2:concurrentunit-0.4.2.jar:5583078e1acf91734939e985bc9e7ee947b0e93a8eef679da6bb07bbeb47ced3',
|
||||
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
|
||||
'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d',
|
||||
|
||||
Reference in New Issue
Block a user