mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 10:49:06 +01:00
Compare commits
1 Commits
beta-1.1.9
...
remote-con
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d715701eaa |
@@ -11,8 +11,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdkVersion 14
|
||||
targetSdkVersion 26
|
||||
versionCode 10109
|
||||
versionName "1.1.9"
|
||||
versionCode 10107
|
||||
versionName "1.1.7"
|
||||
consumerProguardFiles 'proguard-rules.txt'
|
||||
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
lang_map = pt_BR: pt-rBR, nb_NO: nb, zh-Hans: zh-rCN, zh-Hant: zh-rTW
|
||||
lang_map = pt_BR: pt-rBR, nb_NO: nb, zh-Hans: zh-rCN
|
||||
|
||||
[briar.stringsxml-5]
|
||||
file_filter = src/main/res/values-<lang>/strings.xml
|
||||
|
||||
@@ -22,8 +22,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdkVersion 15
|
||||
targetSdkVersion 26
|
||||
versionCode 10109
|
||||
versionName "1.1.9"
|
||||
versionCode 10107
|
||||
versionName "1.1.7"
|
||||
applicationId "org.briarproject.briar.android"
|
||||
buildConfigField "String", "GitHash",
|
||||
"\"${getStdout(['git', 'rev-parse', '--short=7', 'HEAD'], 'No commit hash')}\""
|
||||
|
||||
@@ -5,10 +5,6 @@
|
||||
|
||||
# QR codes
|
||||
-keep class com.google.zxing.Result
|
||||
-keepclassmembers enum * {
|
||||
public static **[] values();
|
||||
public static ** valueOf(java.lang.String);
|
||||
}
|
||||
|
||||
# RSS libraries
|
||||
-keep,includedescriptorclasses class com.rometools.rome.feed.synd.impl.** { *; }
|
||||
|
||||
@@ -4,7 +4,6 @@ import org.briarproject.bramble.BrambleAndroidModule;
|
||||
import org.briarproject.bramble.BrambleCoreModule;
|
||||
import org.briarproject.bramble.account.BriarAccountModule;
|
||||
import org.briarproject.briar.BriarCoreModule;
|
||||
import org.briarproject.briar.android.attachment.AttachmentModule;
|
||||
import org.briarproject.briar.android.navdrawer.NavDrawerActivityTest;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
@@ -14,7 +13,6 @@ import dagger.Component;
|
||||
@Singleton
|
||||
@Component(modules = {
|
||||
AppModule.class,
|
||||
AttachmentModule.class,
|
||||
BriarCoreModule.class,
|
||||
BrambleAndroidModule.class,
|
||||
BriarAccountModule.class,
|
||||
|
||||
@@ -47,17 +47,15 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
);
|
||||
private final MessageId msgId = new MessageId(getRandomId());
|
||||
|
||||
private final ImageHelper imageHelper = new ImageHelperImpl();
|
||||
private final AttachmentRetriever retriever =
|
||||
new AttachmentRetrieverImpl(null, dimensions, imageHelper,
|
||||
new ImageSizeCalculator(imageHelper));
|
||||
new AttachmentRetriever(null, dimensions);
|
||||
|
||||
@Test
|
||||
public void testSmallJpegImage() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg");
|
||||
InputStream is = getUrlInputStream(smallKitten);
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertEquals(msgId, item.getMessageId());
|
||||
assertEquals(160, item.getWidth());
|
||||
assertEquals(240, item.getHeight());
|
||||
@@ -72,8 +70,8 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
public void testBigJpegImage() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg");
|
||||
InputStream is = getUrlInputStream(originalKitten);
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertEquals(msgId, item.getMessageId());
|
||||
assertEquals(1728, item.getWidth());
|
||||
assertEquals(2592, item.getHeight());
|
||||
@@ -88,8 +86,8 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
public void testSmallPngImage() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/png");
|
||||
InputStream is = getUrlInputStream(pngKitten);
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertEquals(msgId, item.getMessageId());
|
||||
assertEquals(737, item.getWidth());
|
||||
assertEquals(510, item.getHeight());
|
||||
@@ -104,8 +102,8 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
public void testUberGif() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg");
|
||||
InputStream is = getUrlInputStream(uberGif);
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertEquals(1, item.getWidth());
|
||||
assertEquals(1, item.getHeight());
|
||||
assertEquals(dimensions.minHeight, item.getThumbnailWidth());
|
||||
@@ -119,8 +117,8 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
public void testLottaPixels() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg");
|
||||
InputStream is = getUrlInputStream(lottaPixel);
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertEquals(64250, item.getWidth());
|
||||
assertEquals(64250, item.getHeight());
|
||||
assertEquals(dimensions.maxWidth, item.getThumbnailWidth());
|
||||
@@ -134,8 +132,8 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
public void testImageIoCrash() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg");
|
||||
InputStream is = getUrlInputStream(imageIoCrash);
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertEquals(1184, item.getWidth());
|
||||
assertEquals(448, item.getHeight());
|
||||
assertEquals(dimensions.maxWidth, item.getThumbnailWidth());
|
||||
@@ -149,8 +147,8 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
public void testGimpCrash() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg");
|
||||
InputStream is = getUrlInputStream(gimpCrash);
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertEquals(1, item.getWidth());
|
||||
assertEquals(1, item.getHeight());
|
||||
assertEquals(dimensions.minHeight, item.getThumbnailWidth());
|
||||
@@ -164,8 +162,8 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
public void testOptiPngAfl() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg");
|
||||
InputStream is = getUrlInputStream(optiPngAfl);
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertEquals(32, item.getWidth());
|
||||
assertEquals(32, item.getHeight());
|
||||
assertEquals(dimensions.minHeight, item.getThumbnailWidth());
|
||||
@@ -179,8 +177,8 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
public void testLibrawError() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg");
|
||||
InputStream is = getUrlInputStream(librawError);
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertTrue(item.hasError());
|
||||
}
|
||||
|
||||
@@ -188,8 +186,8 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
public void testSmallAnimatedGifMaxDimensions() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/gif");
|
||||
InputStream is = getAssetInputStream("animated.gif");
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertEquals(65535, item.getWidth());
|
||||
assertEquals(65535, item.getHeight());
|
||||
assertEquals(dimensions.maxWidth, item.getThumbnailWidth());
|
||||
@@ -203,8 +201,8 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
public void testSmallAnimatedGifHugeDimensions() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/gif");
|
||||
InputStream is = getAssetInputStream("animated2.gif");
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertEquals(10000, item.getWidth());
|
||||
assertEquals(10000, item.getHeight());
|
||||
assertEquals(dimensions.maxWidth, item.getThumbnailWidth());
|
||||
@@ -218,8 +216,8 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
public void testSmallGifLargeDimensions() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/gif");
|
||||
InputStream is = getAssetInputStream("error_large.gif");
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertEquals(16384, item.getWidth());
|
||||
assertEquals(16384, item.getHeight());
|
||||
assertEquals(dimensions.maxWidth, item.getThumbnailWidth());
|
||||
@@ -233,8 +231,8 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
public void testHighError() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg");
|
||||
InputStream is = getAssetInputStream("error_high.jpg");
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertEquals(1, item.getWidth());
|
||||
assertEquals(10000, item.getHeight());
|
||||
assertEquals(dimensions.minWidth, item.getThumbnailWidth());
|
||||
@@ -248,8 +246,8 @@ public class AttachmentRetrieverIntegrationTest {
|
||||
public void testWideError() throws Exception {
|
||||
AttachmentHeader h = new AttachmentHeader(msgId, "image/jpeg");
|
||||
InputStream is = getAssetInputStream("error_wide.jpg");
|
||||
Attachment a = new Attachment(h, is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, true);
|
||||
Attachment a = new Attachment(is);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, true);
|
||||
assertEquals(1920, item.getWidth());
|
||||
assertEquals(1, item.getHeight());
|
||||
assertEquals(dimensions.maxWidth, item.getThumbnailWidth());
|
||||
|
||||
@@ -30,7 +30,6 @@ import org.briarproject.bramble.api.system.LocationUtils;
|
||||
import org.briarproject.bramble.plugin.tor.CircumventionProvider;
|
||||
import org.briarproject.briar.BriarCoreEagerSingletons;
|
||||
import org.briarproject.briar.BriarCoreModule;
|
||||
import org.briarproject.briar.android.attachment.AttachmentModule;
|
||||
import org.briarproject.briar.android.conversation.glide.BriarModelLoader;
|
||||
import org.briarproject.briar.android.login.SignInReminderReceiver;
|
||||
import org.briarproject.briar.android.reporting.BriarReportSender;
|
||||
@@ -69,8 +68,7 @@ import dagger.Component;
|
||||
BriarCoreModule.class,
|
||||
BrambleAndroidModule.class,
|
||||
BriarAccountModule.class,
|
||||
AppModule.class,
|
||||
AttachmentModule.class
|
||||
AppModule.class
|
||||
})
|
||||
public interface AndroidComponent
|
||||
extends BrambleCoreEagerSingletons, BrambleAndroidEagerSingletons,
|
||||
|
||||
@@ -239,7 +239,7 @@ public class AppModule {
|
||||
|
||||
@Override
|
||||
public boolean shouldEnableImageAttachments() {
|
||||
return IS_DEBUG_BUILD;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -37,7 +37,6 @@ import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREG
|
||||
import static android.os.Build.VERSION.SDK_INT;
|
||||
import static java.util.logging.Level.FINE;
|
||||
import static java.util.logging.Level.INFO;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static org.acra.ReportField.ANDROID_VERSION;
|
||||
import static org.acra.ReportField.APP_VERSION_CODE;
|
||||
import static org.acra.ReportField.APP_VERSION_NAME;
|
||||
@@ -83,7 +82,7 @@ public class BriarApplicationImpl extends Application
|
||||
implements BriarApplication {
|
||||
|
||||
private static final Logger LOG =
|
||||
getLogger(BriarApplicationImpl.class.getName());
|
||||
Logger.getLogger(BriarApplicationImpl.class.getName());
|
||||
|
||||
private final CachingLogHandler logHandler = new CachingLogHandler();
|
||||
private final BackgroundMonitor backgroundMonitor = new BackgroundMonitor();
|
||||
@@ -109,16 +108,12 @@ public class BriarApplicationImpl extends Application
|
||||
|
||||
if (IS_DEBUG_BUILD) enableStrictMode();
|
||||
|
||||
Logger rootLogger = getLogger("");
|
||||
Handler[] handlers = rootLogger.getHandlers();
|
||||
// Disable the Android logger for release builds
|
||||
for (Handler handler : handlers) rootLogger.removeHandler(handler);
|
||||
if (IS_DEBUG_BUILD || IS_BETA_BUILD) {
|
||||
// We can't set the level of the Android logger at runtime, so
|
||||
// raise records to the logger's default level
|
||||
rootLogger.addHandler(new LevelRaisingHandler(FINE, INFO));
|
||||
// Restore the default handlers after the level raising handler
|
||||
for (Handler handler : handlers) rootLogger.addHandler(handler);
|
||||
Logger rootLogger = Logger.getLogger("");
|
||||
if (!IS_DEBUG_BUILD && !IS_BETA_BUILD) {
|
||||
// Remove default log handlers so system log is not used
|
||||
for (Handler handler : rootLogger.getHandlers()) {
|
||||
rootLogger.removeHandler(handler);
|
||||
}
|
||||
}
|
||||
rootLogger.addHandler(logHandler);
|
||||
rootLogger.setLevel(IS_DEBUG_BUILD || IS_BETA_BUILD ? FINE : INFO);
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
package org.briarproject.briar.android;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.util.logging.Handler;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.LogRecord;
|
||||
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
|
||||
/**
|
||||
* Log handler that raises all records at or above a given source level to a
|
||||
* given destination level. This affects the level seen by subsequent handlers.
|
||||
*/
|
||||
@Immutable
|
||||
@NotNullByDefault
|
||||
class LevelRaisingHandler extends Handler {
|
||||
|
||||
private final Level dest;
|
||||
private final int srcInt, destInt;
|
||||
|
||||
LevelRaisingHandler(Level src, Level dest) {
|
||||
this.dest = dest;
|
||||
srcInt = src.intValue();
|
||||
destInt = dest.intValue();
|
||||
if (srcInt > destInt) throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void publish(LogRecord record) {
|
||||
int recordInt = record.getLevel().intValue();
|
||||
if (recordInt >= srcInt && recordInt < destInt) record.setLevel(dest);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void flush() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,6 @@ package org.briarproject.briar.android.account;
|
||||
import android.os.Bundle;
|
||||
import android.support.design.widget.TextInputEditText;
|
||||
import android.support.design.widget.TextInputLayout;
|
||||
import android.text.Editable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -11,6 +10,7 @@ import android.widget.Button;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
|
||||
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
|
||||
import org.briarproject.bramble.util.StringUtils;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.android.activity.ActivityComponent;
|
||||
|
||||
@@ -20,7 +20,6 @@ import static android.view.inputmethod.EditorInfo.IME_ACTION_NEXT;
|
||||
import static android.view.inputmethod.EditorInfo.IME_ACTION_NONE;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
|
||||
import static org.briarproject.bramble.util.StringUtils.toUtf8;
|
||||
import static org.briarproject.briar.android.util.UiUtils.setError;
|
||||
import static org.briarproject.briar.android.util.UiUtils.showSoftKeyboard;
|
||||
|
||||
@@ -78,7 +77,7 @@ public class AuthorNameFragment extends SetupFragment {
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence authorName, int i, int i1, int i2) {
|
||||
int authorNameLength = toUtf8(authorName.toString().trim()).length;
|
||||
int authorNameLength = StringUtils.toUtf8(authorName.toString()).length;
|
||||
boolean error = authorNameLength > MAX_AUTHOR_NAME_LENGTH;
|
||||
setError(authorNameWrapper, getString(R.string.name_too_long), error);
|
||||
boolean enabled = authorNameLength > 0 && !error;
|
||||
@@ -90,11 +89,8 @@ public class AuthorNameFragment extends SetupFragment {
|
||||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
Editable text = authorNameInput.getText();
|
||||
if (text != null) {
|
||||
setupController.setAuthorName(text.toString().trim());
|
||||
setupController.showPasswordFragment();
|
||||
}
|
||||
setupController.setAuthorName(authorNameInput.getText().toString());
|
||||
setupController.showPasswordFragment();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package org.briarproject.briar.android.attachment;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory.Options;
|
||||
import android.net.Uri;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
@@ -14,17 +12,11 @@ import org.briarproject.briar.api.messaging.AttachmentHeader;
|
||||
import org.briarproject.briar.api.messaging.MessagingManager;
|
||||
import org.jsoup.UnsupportedMimeTypeException;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Collection;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import static android.graphics.Bitmap.CompressFormat.JPEG;
|
||||
import static android.graphics.BitmapFactory.decodeStream;
|
||||
import static java.util.logging.Level.INFO;
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static org.briarproject.bramble.util.IoUtils.tryToClose;
|
||||
@@ -32,7 +24,6 @@ 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.api.messaging.MessagingConstants.IMAGE_MIME_TYPES;
|
||||
import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_IMAGE_SIZE;
|
||||
|
||||
@NotNullByDefault
|
||||
class AttachmentCreationTask {
|
||||
@@ -40,11 +31,8 @@ class AttachmentCreationTask {
|
||||
private static Logger LOG =
|
||||
getLogger(AttachmentCreationTask.class.getName());
|
||||
|
||||
private static final int MAX_ATTACHMENT_DIMENSION = 1000;
|
||||
|
||||
private final MessagingManager messagingManager;
|
||||
private final ContentResolver contentResolver;
|
||||
private final ImageSizeCalculator imageSizeCalculator;
|
||||
private final GroupId groupId;
|
||||
private final Collection<Uri> uris;
|
||||
private final boolean needsSize;
|
||||
@@ -55,26 +43,24 @@ class AttachmentCreationTask {
|
||||
|
||||
AttachmentCreationTask(MessagingManager messagingManager,
|
||||
ContentResolver contentResolver,
|
||||
AttachmentCreator attachmentCreator,
|
||||
ImageSizeCalculator imageSizeCalculator,
|
||||
GroupId groupId, Collection<Uri> uris, boolean needsSize) {
|
||||
AttachmentCreator attachmentCreator, GroupId groupId,
|
||||
Collection<Uri> uris, boolean needsSize) {
|
||||
this.messagingManager = messagingManager;
|
||||
this.contentResolver = contentResolver;
|
||||
this.imageSizeCalculator = imageSizeCalculator;
|
||||
this.groupId = groupId;
|
||||
this.uris = uris;
|
||||
this.needsSize = needsSize;
|
||||
this.attachmentCreator = attachmentCreator;
|
||||
}
|
||||
|
||||
void cancel() {
|
||||
public void cancel() {
|
||||
canceled = true;
|
||||
attachmentCreator = null;
|
||||
}
|
||||
|
||||
@IoExecutor
|
||||
void storeAttachments() {
|
||||
for (Uri uri : uris) processUri(uri);
|
||||
public void storeAttachments() {
|
||||
for (Uri uri: uris) processUri(uri);
|
||||
AttachmentCreator attachmentCreator = this.attachmentCreator;
|
||||
if (!canceled && attachmentCreator != null)
|
||||
attachmentCreator.onAttachmentCreationFinished();
|
||||
@@ -112,8 +98,6 @@ class AttachmentCreationTask {
|
||||
}
|
||||
InputStream is = contentResolver.openInputStream(uri);
|
||||
if (is == null) throw new IOException();
|
||||
is = compressImage(is, contentType);
|
||||
contentType = "image/jpeg";
|
||||
long timestamp = System.currentTimeMillis();
|
||||
AttachmentHeader h = messagingManager
|
||||
.addLocalAttachment(groupId, timestamp, contentType, is);
|
||||
@@ -129,48 +113,4 @@ class AttachmentCreationTask {
|
||||
return false;
|
||||
}
|
||||
|
||||
private InputStream compressImage(InputStream is, String contentType)
|
||||
throws IOException {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
try {
|
||||
Bitmap bitmap = createBitmap(is, contentType);
|
||||
for (int quality = 100; quality >= 0; quality -= 10) {
|
||||
if (!bitmap.compress(JPEG, quality, out))
|
||||
throw new IOException();
|
||||
if (out.size() <= MAX_IMAGE_SIZE) {
|
||||
if (LOG.isLoggable(INFO)) {
|
||||
LOG.info("Compressed image to "
|
||||
+ out.size() + " bytes, quality " + quality);
|
||||
}
|
||||
return new ByteArrayInputStream(out.toByteArray());
|
||||
}
|
||||
out.reset();
|
||||
}
|
||||
throw new IOException();
|
||||
} finally {
|
||||
tryToClose(is, LOG, WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
private Bitmap createBitmap(InputStream is, String contentType)
|
||||
throws IOException {
|
||||
is = new BufferedInputStream(is);
|
||||
Size size = imageSizeCalculator.getSize(is, contentType);
|
||||
if (size.error) throw new IOException();
|
||||
if (LOG.isLoggable(INFO))
|
||||
LOG.info("Original image size: " + size.width + "x" + size.height);
|
||||
int dimension = Math.max(size.width, size.height);
|
||||
int inSampleSize = 1;
|
||||
while (dimension > MAX_ATTACHMENT_DIMENSION) {
|
||||
inSampleSize *= 2;
|
||||
dimension /= 2;
|
||||
}
|
||||
if (LOG.isLoggable(INFO))
|
||||
LOG.info("Scaling attachment by factor of " + inSampleSize);
|
||||
Options options = new Options();
|
||||
options.inSampleSize = inSampleSize;
|
||||
Bitmap bitmap = decodeStream(is, null, options);
|
||||
if (bitmap == null) throw new IOException();
|
||||
return bitmap;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,24 +1,82 @@
|
||||
package org.briarproject.briar.android.attachment;
|
||||
|
||||
|
||||
import android.app.Application;
|
||||
import android.arch.lifecycle.LiveData;
|
||||
import android.arch.lifecycle.MutableLiveData;
|
||||
import android.net.Uri;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.UiThread;
|
||||
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.bramble.api.sync.GroupId;
|
||||
import org.briarproject.bramble.api.sync.MessageId;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.api.messaging.Attachment;
|
||||
import org.briarproject.briar.api.messaging.AttachmentHeader;
|
||||
import org.briarproject.briar.api.messaging.FileTooBigException;
|
||||
import org.briarproject.briar.api.messaging.MessagingManager;
|
||||
import org.jsoup.UnsupportedMimeTypeException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.briar.android.util.UiUtils.observeForeverOnce;
|
||||
import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_IMAGE_SIZE;
|
||||
|
||||
@NotNullByDefault
|
||||
public interface AttachmentCreator {
|
||||
public class AttachmentCreator {
|
||||
|
||||
private static Logger LOG = getLogger(AttachmentCreator.class.getName());
|
||||
|
||||
private final Application app;
|
||||
@IoExecutor
|
||||
private final Executor ioExecutor;
|
||||
private final MessagingManager messagingManager;
|
||||
private final AttachmentRetriever retriever;
|
||||
|
||||
private final CopyOnWriteArrayList<Uri> uris = new CopyOnWriteArrayList<>();
|
||||
private final CopyOnWriteArrayList<AttachmentItemResult> itemResults =
|
||||
new CopyOnWriteArrayList<>();
|
||||
|
||||
private final MutableLiveData<AttachmentResult> result =
|
||||
new MutableLiveData<>();
|
||||
@Nullable
|
||||
private AttachmentCreationTask task;
|
||||
|
||||
public AttachmentCreator(Application app, @IoExecutor Executor ioExecutor,
|
||||
MessagingManager messagingManager, AttachmentRetriever retriever) {
|
||||
this.app = app;
|
||||
this.ioExecutor = ioExecutor;
|
||||
this.messagingManager = messagingManager;
|
||||
this.retriever = retriever;
|
||||
}
|
||||
|
||||
@UiThread
|
||||
LiveData<AttachmentResult> storeAttachments(LiveData<GroupId> groupId,
|
||||
Collection<Uri> newUris);
|
||||
public LiveData<AttachmentResult> storeAttachments(
|
||||
LiveData<GroupId> groupId, Collection<Uri> newUris) {
|
||||
if (task != null || !uris.isEmpty())
|
||||
throw new IllegalStateException();
|
||||
uris.addAll(newUris);
|
||||
observeForeverOnce(groupId, id -> {
|
||||
if (id == null) throw new IllegalStateException();
|
||||
boolean needsSize = uris.size() == 1;
|
||||
task = new AttachmentCreationTask(messagingManager,
|
||||
app.getContentResolver(), this, id, uris, needsSize);
|
||||
ioExecutor.execute(() -> task.storeAttachments());
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This should be only called after configuration changes.
|
||||
@@ -26,10 +84,68 @@ public interface AttachmentCreator {
|
||||
* They are already being created and returned by the existing LiveData.
|
||||
*/
|
||||
@UiThread
|
||||
LiveData<AttachmentResult> getLiveAttachments();
|
||||
public LiveData<AttachmentResult> getLiveAttachments() {
|
||||
if (task == null || uris.isEmpty())
|
||||
throw new IllegalStateException();
|
||||
// A task is already running. It will update the result LiveData.
|
||||
// So nothing more to do here.
|
||||
return result;
|
||||
}
|
||||
|
||||
@IoExecutor
|
||||
void onAttachmentHeaderReceived(Uri uri, AttachmentHeader h,
|
||||
boolean needsSize) {
|
||||
// get and cache AttachmentItem for ImagePreview
|
||||
try {
|
||||
Attachment a = retriever.getMessageAttachment(h);
|
||||
AttachmentItem item = retriever.getAttachmentItem(h, a, needsSize);
|
||||
if (item.hasError()) throw new IOException();
|
||||
AttachmentItemResult itemResult =
|
||||
new AttachmentItemResult(uri, item);
|
||||
itemResults.add(itemResult);
|
||||
result.postValue(getResult(false));
|
||||
} catch (IOException | DbException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
onAttachmentError(uri, e);
|
||||
}
|
||||
}
|
||||
|
||||
@IoExecutor
|
||||
void onAttachmentError(Uri uri, Throwable t) {
|
||||
// get error message
|
||||
String errorMsg;
|
||||
if (t instanceof UnsupportedMimeTypeException) {
|
||||
String mimeType = ((UnsupportedMimeTypeException) t).getMimeType();
|
||||
errorMsg = app.getString(
|
||||
R.string.image_attach_error_invalid_mime_type, mimeType);
|
||||
} else if (t instanceof FileTooBigException) {
|
||||
int mb = MAX_IMAGE_SIZE / 1024 / 1024;
|
||||
errorMsg = app.getString(R.string.image_attach_error_too_big, mb);
|
||||
} else {
|
||||
errorMsg = null; // generic error
|
||||
}
|
||||
AttachmentItemResult itemResult =
|
||||
new AttachmentItemResult(uri, errorMsg);
|
||||
itemResults.add(itemResult);
|
||||
result.postValue(getResult(false));
|
||||
// expect to receive a cancel from the UI
|
||||
}
|
||||
|
||||
@IoExecutor
|
||||
void onAttachmentCreationFinished() {
|
||||
result.postValue(getResult(true));
|
||||
}
|
||||
|
||||
@UiThread
|
||||
List<AttachmentHeader> getAttachmentHeadersForSending();
|
||||
public List<AttachmentHeader> getAttachmentHeadersForSending() {
|
||||
List<AttachmentHeader> headers = new ArrayList<>(itemResults.size());
|
||||
for (AttachmentItemResult itemResult : itemResults) {
|
||||
// check if we are trying to send attachment items with errors
|
||||
if (itemResult.getItem() == null) throw new IllegalStateException();
|
||||
headers.add(itemResult.getItem().getHeader());
|
||||
}
|
||||
return headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks the attachments as sent and adds the items to the cache for display
|
||||
@@ -37,24 +153,66 @@ public interface AttachmentCreator {
|
||||
* @param id The MessageId of the sent message.
|
||||
*/
|
||||
@UiThread
|
||||
void onAttachmentsSent(MessageId id);
|
||||
public void onAttachmentsSent(MessageId id) {
|
||||
List<AttachmentItem> items = new ArrayList<>(itemResults.size());
|
||||
for (AttachmentItemResult itemResult : itemResults) {
|
||||
// check if we are trying to send attachment items with errors
|
||||
if (itemResult.getItem() == null) throw new IllegalStateException();
|
||||
items.add(itemResult.getItem());
|
||||
}
|
||||
retriever.cachePut(id, items);
|
||||
resetState();
|
||||
}
|
||||
|
||||
/**
|
||||
* Needs to be called when created attachments will not be sent anymore.
|
||||
*/
|
||||
@UiThread
|
||||
void cancel();
|
||||
public void cancel() {
|
||||
if (task == null) throw new AssertionError();
|
||||
task.cancel();
|
||||
deleteUnsentAttachments();
|
||||
resetState();
|
||||
}
|
||||
|
||||
@UiThread
|
||||
void deleteUnsentAttachments();
|
||||
private void resetState() {
|
||||
task = null;
|
||||
uris.clear();
|
||||
itemResults.clear();
|
||||
result.setValue(null);
|
||||
}
|
||||
|
||||
@IoExecutor
|
||||
void onAttachmentHeaderReceived(Uri uri, AttachmentHeader h,
|
||||
boolean needsSize);
|
||||
@UiThread
|
||||
public void deleteUnsentAttachments() {
|
||||
// Make a copy for the IoExecutor as we clear the itemResults soon
|
||||
List<AttachmentHeader> headers = new ArrayList<>(itemResults.size());
|
||||
for (AttachmentItemResult itemResult : itemResults) {
|
||||
// check if we are trying to send attachment items with errors
|
||||
if (itemResult.getItem() != null)
|
||||
headers.add(itemResult.getItem().getHeader());
|
||||
}
|
||||
ioExecutor.execute(() -> {
|
||||
for (AttachmentHeader header : headers) {
|
||||
try {
|
||||
messagingManager.removeAttachment(header);
|
||||
} catch (DbException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@IoExecutor
|
||||
void onAttachmentError(Uri uri, Throwable t);
|
||||
private AttachmentResult getResult(boolean finished) {
|
||||
// Make a copy of the list,
|
||||
// because our copy will continue to change in the background.
|
||||
// (As it's a CopyOnWriteArrayList,
|
||||
// the code that receives the result can safely do simple things
|
||||
// like iterating over the list,
|
||||
// but anything that involves calling more than one list method
|
||||
// is still unsafe.)
|
||||
Collection<AttachmentItemResult> items = new ArrayList<>(itemResults);
|
||||
return new AttachmentResult(items, finished);
|
||||
}
|
||||
|
||||
@IoExecutor
|
||||
void onAttachmentCreationFinished();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,233 +0,0 @@
|
||||
package org.briarproject.briar.android.attachment;
|
||||
|
||||
|
||||
import android.app.Application;
|
||||
import android.arch.lifecycle.LiveData;
|
||||
import android.arch.lifecycle.MutableLiveData;
|
||||
import android.net.Uri;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.UiThread;
|
||||
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.bramble.api.sync.GroupId;
|
||||
import org.briarproject.bramble.api.sync.MessageId;
|
||||
import org.briarproject.briar.R;
|
||||
import org.briarproject.briar.api.messaging.Attachment;
|
||||
import org.briarproject.briar.api.messaging.AttachmentHeader;
|
||||
import org.briarproject.briar.api.messaging.FileTooBigException;
|
||||
import org.briarproject.briar.api.messaging.MessagingManager;
|
||||
import org.jsoup.UnsupportedMimeTypeException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.briar.android.util.UiUtils.observeForeverOnce;
|
||||
import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_IMAGE_SIZE;
|
||||
|
||||
@NotNullByDefault
|
||||
class AttachmentCreatorImpl implements AttachmentCreator {
|
||||
|
||||
private static Logger LOG =
|
||||
getLogger(AttachmentCreatorImpl.class.getName());
|
||||
|
||||
private final Application app;
|
||||
@IoExecutor
|
||||
private final Executor ioExecutor;
|
||||
private final MessagingManager messagingManager;
|
||||
private final AttachmentRetriever retriever;
|
||||
private final ImageSizeCalculator imageSizeCalculator;
|
||||
|
||||
private final CopyOnWriteArrayList<Uri> uris = new CopyOnWriteArrayList<>();
|
||||
private final CopyOnWriteArrayList<AttachmentItemResult> itemResults =
|
||||
new CopyOnWriteArrayList<>();
|
||||
|
||||
@Nullable
|
||||
private AttachmentCreationTask task;
|
||||
|
||||
@Nullable
|
||||
private volatile MutableLiveData<AttachmentResult> result;
|
||||
|
||||
@Inject
|
||||
AttachmentCreatorImpl(Application app, @IoExecutor Executor ioExecutor,
|
||||
MessagingManager messagingManager, AttachmentRetriever retriever,
|
||||
ImageSizeCalculator imageSizeCalculator) {
|
||||
this.app = app;
|
||||
this.ioExecutor = ioExecutor;
|
||||
this.messagingManager = messagingManager;
|
||||
this.retriever = retriever;
|
||||
this.imageSizeCalculator = imageSizeCalculator;
|
||||
}
|
||||
|
||||
@Override
|
||||
@UiThread
|
||||
public LiveData<AttachmentResult> storeAttachments(
|
||||
LiveData<GroupId> groupId, Collection<Uri> newUris) {
|
||||
if (task != null || result != null || !uris.isEmpty())
|
||||
throw new IllegalStateException();
|
||||
MutableLiveData<AttachmentResult> result = new MutableLiveData<>();
|
||||
this.result = result;
|
||||
uris.addAll(newUris);
|
||||
observeForeverOnce(groupId, id -> {
|
||||
if (id == null) throw new IllegalStateException();
|
||||
boolean needsSize = uris.size() == 1;
|
||||
task = new AttachmentCreationTask(messagingManager,
|
||||
app.getContentResolver(), this, imageSizeCalculator, id,
|
||||
uris, needsSize);
|
||||
ioExecutor.execute(() -> task.storeAttachments());
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
@UiThread
|
||||
public LiveData<AttachmentResult> getLiveAttachments() {
|
||||
MutableLiveData<AttachmentResult> result = this.result;
|
||||
if (task == null || result == null || uris.isEmpty())
|
||||
throw new IllegalStateException();
|
||||
// A task is already running. It will update the result LiveData.
|
||||
// So nothing more to do here.
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
@IoExecutor
|
||||
public void onAttachmentHeaderReceived(Uri uri, AttachmentHeader h,
|
||||
boolean needsSize) {
|
||||
// get and cache AttachmentItem for ImagePreview
|
||||
try {
|
||||
Attachment a = retriever.getMessageAttachment(h);
|
||||
AttachmentItem item = retriever.getAttachmentItem(a, needsSize);
|
||||
if (item.hasError()) throw new IOException();
|
||||
AttachmentItemResult itemResult =
|
||||
new AttachmentItemResult(uri, item);
|
||||
itemResults.add(itemResult);
|
||||
MutableLiveData<AttachmentResult> result = this.result;
|
||||
if (result != null) result.postValue(getResult(false));
|
||||
} catch (IOException | DbException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
onAttachmentError(uri, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@IoExecutor
|
||||
public void onAttachmentError(Uri uri, Throwable t) {
|
||||
// get error message
|
||||
String errorMsg;
|
||||
if (t instanceof UnsupportedMimeTypeException) {
|
||||
String mimeType = ((UnsupportedMimeTypeException) t).getMimeType();
|
||||
errorMsg = app.getString(
|
||||
R.string.image_attach_error_invalid_mime_type, mimeType);
|
||||
} else if (t instanceof FileTooBigException) {
|
||||
int mb = MAX_IMAGE_SIZE / 1024 / 1024;
|
||||
errorMsg = app.getString(R.string.image_attach_error_too_big, mb);
|
||||
} else {
|
||||
errorMsg = null; // generic error
|
||||
}
|
||||
AttachmentItemResult itemResult =
|
||||
new AttachmentItemResult(uri, errorMsg);
|
||||
itemResults.add(itemResult);
|
||||
MutableLiveData<AttachmentResult> result = this.result;
|
||||
if (result != null) result.postValue(getResult(false));
|
||||
// expect to receive a cancel from the UI
|
||||
}
|
||||
|
||||
@Override
|
||||
@IoExecutor
|
||||
public void onAttachmentCreationFinished() {
|
||||
MutableLiveData<AttachmentResult> result = this.result;
|
||||
if (result != null) result.postValue(getResult(true));
|
||||
}
|
||||
|
||||
@Override
|
||||
@UiThread
|
||||
public List<AttachmentHeader> getAttachmentHeadersForSending() {
|
||||
List<AttachmentHeader> headers = new ArrayList<>(itemResults.size());
|
||||
for (AttachmentItemResult itemResult : itemResults) {
|
||||
// check if we are trying to send attachment items with errors
|
||||
if (itemResult.getItem() == null) throw new IllegalStateException();
|
||||
headers.add(itemResult.getItem().getHeader());
|
||||
}
|
||||
return headers;
|
||||
}
|
||||
|
||||
@Override
|
||||
@UiThread
|
||||
public void onAttachmentsSent(MessageId id) {
|
||||
List<AttachmentItem> items = new ArrayList<>(itemResults.size());
|
||||
for (AttachmentItemResult itemResult : itemResults) {
|
||||
// check if we are trying to send attachment items with errors
|
||||
if (itemResult.getItem() == null) throw new IllegalStateException();
|
||||
items.add(itemResult.getItem());
|
||||
}
|
||||
retriever.cachePut(id, items);
|
||||
resetState();
|
||||
}
|
||||
|
||||
@Override
|
||||
@UiThread
|
||||
public void cancel() {
|
||||
if (task == null) throw new AssertionError();
|
||||
task.cancel();
|
||||
deleteUnsentAttachments();
|
||||
resetState();
|
||||
}
|
||||
|
||||
@UiThread
|
||||
private void resetState() {
|
||||
task = null;
|
||||
uris.clear();
|
||||
itemResults.clear();
|
||||
MutableLiveData<AttachmentResult> result = this.result;
|
||||
if (result != null) {
|
||||
result.setValue(null);
|
||||
this.result = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@UiThread
|
||||
public void deleteUnsentAttachments() {
|
||||
// Make a copy for the IoExecutor as we clear the itemResults soon
|
||||
List<AttachmentHeader> headers = new ArrayList<>(itemResults.size());
|
||||
for (AttachmentItemResult itemResult : itemResults) {
|
||||
// check if we are trying to send attachment items with errors
|
||||
if (itemResult.getItem() != null)
|
||||
headers.add(itemResult.getItem().getHeader());
|
||||
}
|
||||
ioExecutor.execute(() -> {
|
||||
for (AttachmentHeader header : headers) {
|
||||
try {
|
||||
messagingManager.removeAttachment(header);
|
||||
} catch (DbException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private AttachmentResult getResult(boolean finished) {
|
||||
// Make a copy of the list,
|
||||
// because our copy will continue to change in the background.
|
||||
// (As it's a CopyOnWriteArrayList,
|
||||
// the code that receives the result can safely do simple things
|
||||
// like iterating over the list,
|
||||
// but anything that involves calling more than one list method
|
||||
// is still unsafe.)
|
||||
Collection<AttachmentItemResult> items = new ArrayList<>(itemResults);
|
||||
return new AttachmentResult(items, finished);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -10,7 +10,7 @@ import javax.annotation.concurrent.Immutable;
|
||||
|
||||
@Immutable
|
||||
@NotNullByDefault
|
||||
class AttachmentDimensions {
|
||||
public class AttachmentDimensions {
|
||||
|
||||
final int defaultSize;
|
||||
final int minWidth, maxWidth;
|
||||
@@ -26,7 +26,7 @@ class AttachmentDimensions {
|
||||
this.maxHeight = maxHeight;
|
||||
}
|
||||
|
||||
static AttachmentDimensions getAttachmentDimensions(Resources res) {
|
||||
public static AttachmentDimensions getAttachmentDimensions(Resources res) {
|
||||
int defaultSize =
|
||||
res.getDimensionPixelSize(R.dimen.message_bubble_image_default);
|
||||
int minWidth = res.getDimensionPixelSize(
|
||||
|
||||
@@ -68,7 +68,7 @@ public class AttachmentItem implements Parcelable {
|
||||
header = new AttachmentHeader(messageId, mimeType);
|
||||
}
|
||||
|
||||
public AttachmentHeader getHeader() {
|
||||
AttachmentHeader getHeader() {
|
||||
return header;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,14 +4,12 @@ import android.arch.lifecycle.LiveData;
|
||||
import android.net.Uri;
|
||||
import android.support.annotation.UiThread;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.briar.api.messaging.AttachmentHeader;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@UiThread
|
||||
@NotNullByDefault
|
||||
public interface AttachmentManager {
|
||||
|
||||
LiveData<AttachmentResult> storeAttachments(Collection<Uri> uri,
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
package org.briarproject.briar.android.attachment;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import dagger.Module;
|
||||
import dagger.Provides;
|
||||
|
||||
import static org.briarproject.briar.android.attachment.AttachmentDimensions.getAttachmentDimensions;
|
||||
|
||||
@Module
|
||||
public class AttachmentModule {
|
||||
|
||||
@Provides
|
||||
ImageHelper provideImageHelper(ImageHelperImpl imageHelper) {
|
||||
return imageHelper;
|
||||
}
|
||||
|
||||
@Provides
|
||||
ImageSizeCalculator provideImageSizeCalculator(ImageHelper imageHelper) {
|
||||
return new ImageSizeCalculator(imageHelper);
|
||||
}
|
||||
|
||||
@Provides
|
||||
AttachmentDimensions provideAttachmentDimensions(Application app) {
|
||||
return getAttachmentDimensions(app.getResources());
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
AttachmentRetriever provideAttachmentRetriever(
|
||||
AttachmentRetrieverImpl attachmentRetriever) {
|
||||
return attachmentRetriever;
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
AttachmentCreator provideAttachmentCreator(
|
||||
AttachmentCreatorImpl attachmentCreator) {
|
||||
return attachmentCreator;
|
||||
}
|
||||
}
|
||||
@@ -1,29 +1,276 @@
|
||||
package org.briarproject.briar.android.attachment;
|
||||
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.graphics.BitmapFactory.Options;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.VisibleForTesting;
|
||||
import android.support.media.ExifInterface;
|
||||
import android.webkit.MimeTypeMap;
|
||||
|
||||
import com.bumptech.glide.util.MarkEnforcingInputStream;
|
||||
|
||||
import org.briarproject.bramble.api.Pair;
|
||||
import org.briarproject.bramble.api.db.DatabaseExecutor;
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.bramble.api.sync.MessageId;
|
||||
import org.briarproject.briar.android.attachment.ImageHelper.DecodeResult;
|
||||
import org.briarproject.briar.api.messaging.Attachment;
|
||||
import org.briarproject.briar.api.messaging.AttachmentHeader;
|
||||
import org.briarproject.briar.api.messaging.MessagingManager;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import static android.support.media.ExifInterface.ORIENTATION_ROTATE_270;
|
||||
import static android.support.media.ExifInterface.ORIENTATION_ROTATE_90;
|
||||
import static android.support.media.ExifInterface.ORIENTATION_TRANSPOSE;
|
||||
import static android.support.media.ExifInterface.ORIENTATION_TRANSVERSE;
|
||||
import static android.support.media.ExifInterface.TAG_IMAGE_LENGTH;
|
||||
import static android.support.media.ExifInterface.TAG_IMAGE_WIDTH;
|
||||
import static android.support.media.ExifInterface.TAG_ORIENTATION;
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static org.briarproject.bramble.util.IoUtils.tryToClose;
|
||||
import static org.briarproject.bramble.util.LogUtils.logDuration;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.bramble.util.LogUtils.now;
|
||||
|
||||
@NotNullByDefault
|
||||
public interface AttachmentRetriever {
|
||||
public class AttachmentRetriever {
|
||||
|
||||
void cachePut(MessageId messageId, List<AttachmentItem> attachments);
|
||||
private static final Logger LOG =
|
||||
getLogger(AttachmentRetriever.class.getName());
|
||||
private static final int READ_LIMIT = 1024 * 8192;
|
||||
|
||||
private final MessagingManager messagingManager;
|
||||
private final ImageHelper imageHelper;
|
||||
private final int defaultSize;
|
||||
private final int minWidth, maxWidth;
|
||||
private final int minHeight, maxHeight;
|
||||
|
||||
private final Map<MessageId, List<AttachmentItem>> attachmentCache =
|
||||
new ConcurrentHashMap<>();
|
||||
|
||||
@VisibleForTesting
|
||||
AttachmentRetriever(MessagingManager messagingManager,
|
||||
AttachmentDimensions dimensions, ImageHelper imageHelper) {
|
||||
this.messagingManager = messagingManager;
|
||||
this.imageHelper = imageHelper;
|
||||
defaultSize = dimensions.defaultSize;
|
||||
minWidth = dimensions.minWidth;
|
||||
maxWidth = dimensions.maxWidth;
|
||||
minHeight = dimensions.minHeight;
|
||||
maxHeight = dimensions.maxHeight;
|
||||
}
|
||||
|
||||
public AttachmentRetriever(MessagingManager messagingManager,
|
||||
AttachmentDimensions dimensions) {
|
||||
this(messagingManager, dimensions, new ImageHelper() {
|
||||
@Override
|
||||
public DecodeResult decodeStream(InputStream is) {
|
||||
Options options = new Options();
|
||||
options.inJustDecodeBounds = true;
|
||||
BitmapFactory.decodeStream(is, null, options);
|
||||
String mimeType = options.outMimeType;
|
||||
if (mimeType == null) mimeType = "";
|
||||
return new DecodeResult(options.outWidth, options.outHeight,
|
||||
mimeType);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String getExtensionFromMimeType(String mimeType) {
|
||||
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
|
||||
return mimeTypeMap.getExtensionFromMimeType(mimeType);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void cachePut(MessageId messageId, List<AttachmentItem> attachments) {
|
||||
attachmentCache.put(messageId, attachments);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
List<AttachmentItem> cacheGet(MessageId messageId);
|
||||
public List<AttachmentItem> cacheGet(MessageId messageId) {
|
||||
return attachmentCache.get(messageId);
|
||||
}
|
||||
|
||||
Attachment getMessageAttachment(AttachmentHeader h) throws DbException;
|
||||
@DatabaseExecutor
|
||||
public List<Pair<AttachmentHeader, Attachment>> getMessageAttachments(
|
||||
List<AttachmentHeader> headers) throws DbException {
|
||||
long start = now();
|
||||
List<Pair<AttachmentHeader, Attachment>> attachments =
|
||||
new ArrayList<>(headers.size());
|
||||
for (AttachmentHeader h : headers) {
|
||||
Attachment a = messagingManager.getAttachment(h.getMessageId());
|
||||
attachments.add(new Pair<>(h, a));
|
||||
}
|
||||
logDuration(LOG, "Loading attachments", start);
|
||||
return attachments;
|
||||
}
|
||||
|
||||
@DatabaseExecutor
|
||||
Attachment getMessageAttachment(AttachmentHeader h) throws DbException {
|
||||
return messagingManager.getAttachment(h.getMessageId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates {@link AttachmentItem}s from the passed headers and Attachments.
|
||||
* <p>
|
||||
* Note: This closes the {@link Attachment}'s {@link InputStream}.
|
||||
*/
|
||||
public List<AttachmentItem> getAttachmentItems(
|
||||
List<Pair<AttachmentHeader, Attachment>> attachments) {
|
||||
boolean needsSize = attachments.size() == 1;
|
||||
List<AttachmentItem> items = new ArrayList<>(attachments.size());
|
||||
for (Pair<AttachmentHeader, Attachment> a : attachments) {
|
||||
AttachmentItem item =
|
||||
getAttachmentItem(a.getFirst(), a.getSecond(), needsSize);
|
||||
items.add(item);
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an {@link AttachmentItem} from the {@link Attachment}'s
|
||||
* {@link InputStream} which will be closed when this method returns.
|
||||
*/
|
||||
AttachmentItem getAttachmentItem(Attachment a, boolean needsSize);
|
||||
AttachmentItem getAttachmentItem(AttachmentHeader h, Attachment a,
|
||||
boolean needsSize) {
|
||||
if (!needsSize) {
|
||||
String extension =
|
||||
imageHelper.getExtensionFromMimeType(h.getContentType());
|
||||
boolean hasError = false;
|
||||
if (extension == null) {
|
||||
extension = "";
|
||||
hasError = true;
|
||||
}
|
||||
return new AttachmentItem(h, 0, 0, extension, 0, 0, hasError);
|
||||
}
|
||||
|
||||
Size size = new Size();
|
||||
InputStream is = new MarkEnforcingInputStream(
|
||||
new BufferedInputStream(a.getStream()));
|
||||
is.mark(READ_LIMIT);
|
||||
try {
|
||||
// use exif to get size
|
||||
if (h.getContentType().equals("image/jpeg")) {
|
||||
size = getSizeFromExif(is);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
}
|
||||
try {
|
||||
// use BitmapFactory to get size
|
||||
if (size.error) {
|
||||
is.reset();
|
||||
// need to mark again to re-add read limit
|
||||
is.mark(READ_LIMIT);
|
||||
size = getSizeFromBitmap(is);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
} finally {
|
||||
tryToClose(is, LOG, WARNING);
|
||||
}
|
||||
|
||||
// calculate thumbnail size
|
||||
Size thumbnailSize = new Size(defaultSize, defaultSize, size.mimeType);
|
||||
if (!size.error) {
|
||||
thumbnailSize =
|
||||
getThumbnailSize(size.width, size.height, size.mimeType);
|
||||
}
|
||||
// get file extension
|
||||
String extension = imageHelper.getExtensionFromMimeType(size.mimeType);
|
||||
boolean hasError = extension == null || size.error;
|
||||
if (!h.getContentType().equals(size.mimeType)) {
|
||||
if (LOG.isLoggable(WARNING)) {
|
||||
LOG.warning("Header has different mime type (" +
|
||||
h.getContentType() + ") than image (" + size.mimeType +
|
||||
").");
|
||||
}
|
||||
hasError = true;
|
||||
}
|
||||
if (extension == null) extension = "";
|
||||
return new AttachmentItem(h, size.width, size.height, extension,
|
||||
thumbnailSize.width, thumbnailSize.height, hasError);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the size of a JPEG {@link InputStream} if EXIF info is available.
|
||||
*/
|
||||
private Size getSizeFromExif(InputStream is) throws IOException {
|
||||
ExifInterface exif = new ExifInterface(is);
|
||||
// these can return 0 independent of default value
|
||||
int width = exif.getAttributeInt(TAG_IMAGE_WIDTH, 0);
|
||||
int height = exif.getAttributeInt(TAG_IMAGE_LENGTH, 0);
|
||||
if (width == 0 || height == 0) return new Size();
|
||||
int orientation = exif.getAttributeInt(TAG_ORIENTATION, 0);
|
||||
if (orientation == ORIENTATION_ROTATE_90 ||
|
||||
orientation == ORIENTATION_ROTATE_270 ||
|
||||
orientation == ORIENTATION_TRANSVERSE ||
|
||||
orientation == ORIENTATION_TRANSPOSE) {
|
||||
//noinspection SuspiciousNameCombination
|
||||
return new Size(height, width, "image/jpeg");
|
||||
}
|
||||
return new Size(width, height, "image/jpeg");
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the size of any image {@link InputStream}.
|
||||
*/
|
||||
private Size getSizeFromBitmap(InputStream is) {
|
||||
DecodeResult result = imageHelper.decodeStream(is);
|
||||
if (result.width < 1 || result.height < 1) return new Size();
|
||||
return new Size(result.width, result.height, result.mimeType);
|
||||
}
|
||||
|
||||
private Size getThumbnailSize(int width, int height, String mimeType) {
|
||||
float widthPercentage = maxWidth / (float) width;
|
||||
float heightPercentage = maxHeight / (float) height;
|
||||
float scaleFactor = Math.min(widthPercentage, heightPercentage);
|
||||
if (scaleFactor > 1) scaleFactor = 1f;
|
||||
int thumbnailWidth = (int) (width * scaleFactor);
|
||||
int thumbnailHeight = (int) (height * scaleFactor);
|
||||
if (thumbnailWidth < minWidth || thumbnailHeight < minHeight) {
|
||||
widthPercentage = minWidth / (float) width;
|
||||
heightPercentage = minHeight / (float) height;
|
||||
scaleFactor = Math.max(widthPercentage, heightPercentage);
|
||||
thumbnailWidth = (int) (width * scaleFactor);
|
||||
thumbnailHeight = (int) (height * scaleFactor);
|
||||
if (thumbnailWidth > maxWidth) thumbnailWidth = maxWidth;
|
||||
if (thumbnailHeight > maxHeight) thumbnailHeight = maxHeight;
|
||||
}
|
||||
return new Size(thumbnailWidth, thumbnailHeight, mimeType);
|
||||
}
|
||||
|
||||
private static class Size {
|
||||
|
||||
private final int width;
|
||||
private final int height;
|
||||
private final String mimeType;
|
||||
private final boolean error;
|
||||
|
||||
private Size(int width, int height, String mimeType) {
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
this.mimeType = mimeType;
|
||||
this.error = false;
|
||||
}
|
||||
|
||||
private Size() {
|
||||
this.width = 0;
|
||||
this.height = 0;
|
||||
this.mimeType = "";
|
||||
this.error = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,129 +0,0 @@
|
||||
package org.briarproject.briar.android.attachment;
|
||||
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.bramble.api.sync.MessageId;
|
||||
import org.briarproject.briar.api.messaging.Attachment;
|
||||
import org.briarproject.briar.api.messaging.AttachmentHeader;
|
||||
import org.briarproject.briar.api.messaging.MessagingManager;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
|
||||
@NotNullByDefault
|
||||
class AttachmentRetrieverImpl implements AttachmentRetriever {
|
||||
|
||||
private static final Logger LOG =
|
||||
getLogger(AttachmentRetrieverImpl.class.getName());
|
||||
|
||||
private final MessagingManager messagingManager;
|
||||
private final ImageHelper imageHelper;
|
||||
private final ImageSizeCalculator imageSizeCalculator;
|
||||
private final int defaultSize;
|
||||
private final int minWidth, maxWidth;
|
||||
private final int minHeight, maxHeight;
|
||||
|
||||
private final Map<MessageId, List<AttachmentItem>> attachmentCache =
|
||||
new ConcurrentHashMap<>();
|
||||
|
||||
@Inject
|
||||
AttachmentRetrieverImpl(MessagingManager messagingManager,
|
||||
AttachmentDimensions dimensions, ImageHelper imageHelper,
|
||||
ImageSizeCalculator imageSizeCalculator) {
|
||||
this.messagingManager = messagingManager;
|
||||
this.imageHelper = imageHelper;
|
||||
this.imageSizeCalculator = imageSizeCalculator;
|
||||
defaultSize = dimensions.defaultSize;
|
||||
minWidth = dimensions.minWidth;
|
||||
maxWidth = dimensions.maxWidth;
|
||||
minHeight = dimensions.minHeight;
|
||||
maxHeight = dimensions.maxHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cachePut(MessageId messageId,
|
||||
List<AttachmentItem> attachments) {
|
||||
attachmentCache.put(messageId, attachments);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public List<AttachmentItem> cacheGet(MessageId messageId) {
|
||||
return attachmentCache.get(messageId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Attachment getMessageAttachment(AttachmentHeader h)
|
||||
throws DbException {
|
||||
return messagingManager.getAttachment(h);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttachmentItem getAttachmentItem(Attachment a, boolean needsSize) {
|
||||
AttachmentHeader h = a.getHeader();
|
||||
if (!needsSize) {
|
||||
String extension =
|
||||
imageHelper.getExtensionFromMimeType(h.getContentType());
|
||||
boolean hasError = false;
|
||||
if (extension == null) {
|
||||
extension = "";
|
||||
hasError = true;
|
||||
}
|
||||
return new AttachmentItem(h, 0, 0, extension, 0, 0, hasError);
|
||||
}
|
||||
|
||||
InputStream is = new BufferedInputStream(a.getStream());
|
||||
Size size = imageSizeCalculator.getSize(is, h.getContentType());
|
||||
|
||||
// calculate thumbnail size
|
||||
Size thumbnailSize = new Size(defaultSize, defaultSize, size.mimeType);
|
||||
if (!size.error) {
|
||||
thumbnailSize =
|
||||
getThumbnailSize(size.width, size.height, size.mimeType);
|
||||
}
|
||||
// get file extension
|
||||
String extension = imageHelper.getExtensionFromMimeType(size.mimeType);
|
||||
boolean hasError = extension == null || size.error;
|
||||
if (!h.getContentType().equals(size.mimeType)) {
|
||||
if (LOG.isLoggable(WARNING)) {
|
||||
LOG.warning("Header has different mime type (" +
|
||||
h.getContentType() + ") than image (" + size.mimeType +
|
||||
").");
|
||||
}
|
||||
hasError = true;
|
||||
}
|
||||
if (extension == null) extension = "";
|
||||
return new AttachmentItem(h, size.width, size.height, extension,
|
||||
thumbnailSize.width, thumbnailSize.height, hasError);
|
||||
}
|
||||
|
||||
private Size getThumbnailSize(int width, int height, String mimeType) {
|
||||
float widthPercentage = maxWidth / (float) width;
|
||||
float heightPercentage = maxHeight / (float) height;
|
||||
float scaleFactor = Math.min(widthPercentage, heightPercentage);
|
||||
if (scaleFactor > 1) scaleFactor = 1f;
|
||||
int thumbnailWidth = (int) (width * scaleFactor);
|
||||
int thumbnailHeight = (int) (height * scaleFactor);
|
||||
if (thumbnailWidth < minWidth || thumbnailHeight < minHeight) {
|
||||
widthPercentage = minWidth / (float) width;
|
||||
heightPercentage = minHeight / (float) height;
|
||||
scaleFactor = Math.max(widthPercentage, heightPercentage);
|
||||
thumbnailWidth = (int) (width * scaleFactor);
|
||||
thumbnailHeight = (int) (height * scaleFactor);
|
||||
if (thumbnailWidth > maxWidth) thumbnailWidth = maxWidth;
|
||||
if (thumbnailHeight > maxHeight) thumbnailHeight = maxHeight;
|
||||
}
|
||||
return new Size(thumbnailWidth, thumbnailHeight, mimeType);
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import java.io.InputStream;
|
||||
|
||||
@NotNullByDefault
|
||||
public interface ImageHelper {
|
||||
interface ImageHelper {
|
||||
|
||||
DecodeResult decodeStream(InputStream is);
|
||||
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
package org.briarproject.briar.android.attachment;
|
||||
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.webkit.MimeTypeMap;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
import javax.inject.Inject;
|
||||
|
||||
@Immutable
|
||||
@NotNullByDefault
|
||||
class ImageHelperImpl implements ImageHelper {
|
||||
|
||||
@Inject
|
||||
ImageHelperImpl() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public DecodeResult decodeStream(InputStream is) {
|
||||
BitmapFactory.Options options = new BitmapFactory.Options();
|
||||
options.inJustDecodeBounds = true;
|
||||
BitmapFactory.decodeStream(is, null, options);
|
||||
String mimeType = options.outMimeType;
|
||||
if (mimeType == null) mimeType = "";
|
||||
return new DecodeResult(options.outWidth, options.outHeight,
|
||||
mimeType);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String getExtensionFromMimeType(String mimeType) {
|
||||
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
|
||||
return mimeTypeMap.getExtensionFromMimeType(mimeType);
|
||||
}
|
||||
}
|
||||
@@ -1,94 +0,0 @@
|
||||
package org.briarproject.briar.android.attachment;
|
||||
|
||||
import android.support.media.ExifInterface;
|
||||
|
||||
import com.bumptech.glide.util.MarkEnforcingInputStream;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.briar.android.attachment.ImageHelper.DecodeResult;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import static android.support.media.ExifInterface.ORIENTATION_ROTATE_270;
|
||||
import static android.support.media.ExifInterface.ORIENTATION_ROTATE_90;
|
||||
import static android.support.media.ExifInterface.ORIENTATION_TRANSPOSE;
|
||||
import static android.support.media.ExifInterface.ORIENTATION_TRANSVERSE;
|
||||
import static android.support.media.ExifInterface.TAG_IMAGE_LENGTH;
|
||||
import static android.support.media.ExifInterface.TAG_IMAGE_WIDTH;
|
||||
import static android.support.media.ExifInterface.TAG_ORIENTATION;
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
|
||||
@NotNullByDefault
|
||||
class ImageSizeCalculator {
|
||||
|
||||
private static final Logger LOG =
|
||||
getLogger(ImageSizeCalculator.class.getName());
|
||||
|
||||
private static final int READ_LIMIT = 1024 * 8192;
|
||||
|
||||
private final ImageHelper imageHelper;
|
||||
|
||||
ImageSizeCalculator(ImageHelper imageHelper) {
|
||||
this.imageHelper = imageHelper;
|
||||
}
|
||||
|
||||
Size getSize(InputStream is, String contentType) {
|
||||
Size size = new Size();
|
||||
is = new MarkEnforcingInputStream(is);
|
||||
is.mark(READ_LIMIT);
|
||||
if (contentType.equals("image/jpeg")) {
|
||||
try {
|
||||
// use exif to get size
|
||||
size = getSizeFromExif(is);
|
||||
is.reset();
|
||||
} catch (IOException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
}
|
||||
}
|
||||
if (size.error) {
|
||||
// need to mark again to re-add read limit
|
||||
is.mark(READ_LIMIT);
|
||||
try {
|
||||
// use BitmapFactory to get size
|
||||
size = getSizeFromBitmap(is);
|
||||
is.reset();
|
||||
} catch (IOException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
}
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the size of a JPEG {@link InputStream} if EXIF info is available.
|
||||
*/
|
||||
private Size getSizeFromExif(InputStream is) throws IOException {
|
||||
ExifInterface exif = new ExifInterface(is);
|
||||
// these can return 0 independent of default value
|
||||
int width = exif.getAttributeInt(TAG_IMAGE_WIDTH, 0);
|
||||
int height = exif.getAttributeInt(TAG_IMAGE_LENGTH, 0);
|
||||
if (width == 0 || height == 0) return new Size();
|
||||
int orientation = exif.getAttributeInt(TAG_ORIENTATION, 0);
|
||||
if (orientation == ORIENTATION_ROTATE_90 ||
|
||||
orientation == ORIENTATION_ROTATE_270 ||
|
||||
orientation == ORIENTATION_TRANSVERSE ||
|
||||
orientation == ORIENTATION_TRANSPOSE) {
|
||||
//noinspection SuspiciousNameCombination
|
||||
return new Size(height, width, "image/jpeg");
|
||||
}
|
||||
return new Size(width, height, "image/jpeg");
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the size of any image {@link InputStream}.
|
||||
*/
|
||||
private Size getSizeFromBitmap(InputStream is) {
|
||||
DecodeResult result = imageHelper.decodeStream(is);
|
||||
if (result.width < 1 || result.height < 1) return new Size();
|
||||
return new Size(result.width, result.height, result.mimeType);
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
package org.briarproject.briar.android.attachment;
|
||||
|
||||
class Size {
|
||||
|
||||
final int width;
|
||||
final int height;
|
||||
final String mimeType;
|
||||
final boolean error;
|
||||
|
||||
Size(int width, int height, String mimeType) {
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
this.mimeType = mimeType;
|
||||
this.error = false;
|
||||
}
|
||||
|
||||
Size() {
|
||||
this.width = 0;
|
||||
this.height = 0;
|
||||
this.mimeType = "";
|
||||
this.error = true;
|
||||
}
|
||||
}
|
||||
@@ -82,20 +82,19 @@ public class NicknameFragment extends BaseFragment {
|
||||
|
||||
@Nullable
|
||||
private String getNicknameOrNull() {
|
||||
Editable text = contactNameInput.getText();
|
||||
if (text == null || text.toString().trim().length() == 0) {
|
||||
Editable name = contactNameInput.getText();
|
||||
if (name == null || name.toString().trim().length() == 0) {
|
||||
contactNameLayout.setError(getString(R.string.nickname_missing));
|
||||
contactNameInput.requestFocus();
|
||||
return null;
|
||||
}
|
||||
String name = text.toString().trim();
|
||||
if (utf8IsTooLong(name, MAX_AUTHOR_NAME_LENGTH)) {
|
||||
if (utf8IsTooLong(name.toString(), MAX_AUTHOR_NAME_LENGTH)) {
|
||||
contactNameLayout.setError(getString(R.string.name_too_long));
|
||||
contactNameInput.requestFocus();
|
||||
return null;
|
||||
}
|
||||
contactNameLayout.setError(null);
|
||||
return name;
|
||||
return name.toString().trim();
|
||||
}
|
||||
|
||||
private void onAddButtonClicked() {
|
||||
|
||||
@@ -82,7 +82,7 @@ public class AliasDialogFragment extends AppCompatDialogFragment {
|
||||
}
|
||||
|
||||
private void onSetButtonClicked() {
|
||||
String alias = aliasEditText.getText().toString().trim();
|
||||
String alias = aliasEditText.getText().toString();
|
||||
if (toUtf8(alias).length > MAX_AUTHOR_NAME_LENGTH) {
|
||||
aliasEditLayout.setError(getString(R.string.name_too_long));
|
||||
} else {
|
||||
|
||||
@@ -37,7 +37,6 @@ import org.briarproject.bramble.api.contact.event.ContactRemovedEvent;
|
||||
import org.briarproject.bramble.api.db.DatabaseExecutor;
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.db.NoSuchContactException;
|
||||
import org.briarproject.bramble.api.db.NoSuchMessageException;
|
||||
import org.briarproject.bramble.api.event.Event;
|
||||
import org.briarproject.bramble.api.event.EventBus;
|
||||
import org.briarproject.bramble.api.event.EventListener;
|
||||
@@ -82,7 +81,6 @@ import org.briarproject.briar.api.messaging.Attachment;
|
||||
import org.briarproject.briar.api.messaging.AttachmentHeader;
|
||||
import org.briarproject.briar.api.messaging.MessagingManager;
|
||||
import org.briarproject.briar.api.messaging.PrivateMessageHeader;
|
||||
import org.briarproject.briar.api.messaging.event.AttachmentReceivedEvent;
|
||||
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -109,12 +107,10 @@ import static android.support.v7.util.SortedList.INVALID_POSITION;
|
||||
import static android.view.Gravity.RIGHT;
|
||||
import static android.widget.Toast.LENGTH_SHORT;
|
||||
import static java.util.Collections.emptyList;
|
||||
import static java.util.Collections.singletonList;
|
||||
import static java.util.Collections.sort;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static java.util.logging.Level.INFO;
|
||||
import static java.util.logging.Level.WARNING;
|
||||
import static java.util.logging.Logger.getLogger;
|
||||
import static org.briarproject.bramble.util.LogUtils.logDuration;
|
||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||
import static org.briarproject.bramble.util.LogUtils.now;
|
||||
@@ -142,7 +138,7 @@ public class ConversationActivity extends BriarActivity
|
||||
public static final String CONTACT_ID = "briar.CONTACT_ID";
|
||||
|
||||
private static final Logger LOG =
|
||||
getLogger(ConversationActivity.class.getName());
|
||||
Logger.getLogger(ConversationActivity.class.getName());
|
||||
|
||||
private static final int TRANSITION_DURATION_MS = 500;
|
||||
private static final int ONBOARDING_DELAY_MS = 250;
|
||||
@@ -175,8 +171,6 @@ public class ConversationActivity extends BriarActivity
|
||||
volatile GroupInvitationManager groupInvitationManager;
|
||||
|
||||
private final Map<MessageId, String> textCache = new ConcurrentHashMap<>();
|
||||
private final Map<MessageId, PrivateMessageHeader> missingAttachments =
|
||||
new ConcurrentHashMap<>();
|
||||
private final Observer<String> contactNameObserver = name -> {
|
||||
requireNonNull(name);
|
||||
loadMessages();
|
||||
@@ -440,40 +434,29 @@ public class ConversationActivity extends BriarActivity
|
||||
});
|
||||
}
|
||||
|
||||
private void eagerlyLoadMessageSize(PrivateMessageHeader h) {
|
||||
try {
|
||||
MessageId id = h.getId();
|
||||
// If the message has text, load it
|
||||
if (h.hasText()) {
|
||||
String text = textCache.get(id);
|
||||
if (text == null) {
|
||||
LOG.info("Eagerly loading text for latest message");
|
||||
text = messagingManager.getMessageText(id);
|
||||
textCache.put(id, requireNonNull(text));
|
||||
}
|
||||
private void eagerlyLoadMessageSize(PrivateMessageHeader h)
|
||||
throws DbException {
|
||||
MessageId id = h.getId();
|
||||
// If the message has text, load it
|
||||
if (h.hasText()) {
|
||||
String text = textCache.get(id);
|
||||
if (text == null) {
|
||||
LOG.info("Eagerly loading text for latest message");
|
||||
text = messagingManager.getMessageText(id);
|
||||
textCache.put(id, requireNonNull(text));
|
||||
}
|
||||
// If the message has a single image, load its size - for multiple
|
||||
// images we use a grid so the size is fixed
|
||||
List<AttachmentHeader> headers = h.getAttachmentHeaders();
|
||||
if (headers.size() == 1) {
|
||||
List<AttachmentItem> items = attachmentRetriever.cacheGet(id);
|
||||
if (items == null) {
|
||||
LOG.info("Eagerly loading image size for latest message");
|
||||
AttachmentHeader header = headers.get(0);
|
||||
try {
|
||||
Attachment a = attachmentRetriever
|
||||
.getMessageAttachment(header);
|
||||
AttachmentItem item =
|
||||
attachmentRetriever.getAttachmentItem(a, true);
|
||||
attachmentRetriever.cachePut(id, singletonList(item));
|
||||
} catch (NoSuchMessageException e) {
|
||||
LOG.info("Attachment not received yet");
|
||||
missingAttachments.put(header.getMessageId(), h);
|
||||
}
|
||||
}
|
||||
}
|
||||
// If the message has a single image, load its size - for multiple
|
||||
// images we use a grid so the size is fixed
|
||||
if (h.getAttachmentHeaders().size() == 1) {
|
||||
List<AttachmentItem> items = attachmentRetriever.cacheGet(id);
|
||||
if (items == null) {
|
||||
LOG.info("Eagerly loading image size for latest message");
|
||||
items = attachmentRetriever.getAttachmentItems(
|
||||
attachmentRetriever.getMessageAttachments(
|
||||
h.getAttachmentHeaders()));
|
||||
attachmentRetriever.cachePut(id, items);
|
||||
}
|
||||
} catch (DbException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -551,30 +534,16 @@ public class ConversationActivity extends BriarActivity
|
||||
&& adapter.isScrolledToBottom(layoutManager);
|
||||
}
|
||||
|
||||
private void loadMessageAttachments(PrivateMessageHeader h) {
|
||||
// TODO: Use placeholders for missing/invalid attachments
|
||||
private void loadMessageAttachments(MessageId messageId,
|
||||
List<AttachmentHeader> headers) {
|
||||
runOnDbThread(() -> {
|
||||
try {
|
||||
List<Pair<AttachmentHeader, Attachment>> attachments =
|
||||
attachmentRetriever.getMessageAttachments(headers);
|
||||
// TODO move getting the items off to IoExecutor, if size == 1
|
||||
List<AttachmentHeader> headers = h.getAttachmentHeaders();
|
||||
boolean needsSize = headers.size() == 1;
|
||||
List<AttachmentItem> items = new ArrayList<>(headers.size());
|
||||
for (AttachmentHeader header : headers) {
|
||||
try {
|
||||
Attachment a = attachmentRetriever
|
||||
.getMessageAttachment(header);
|
||||
AttachmentItem item = attachmentRetriever
|
||||
.getAttachmentItem(a, needsSize);
|
||||
items.add(item);
|
||||
} catch (NoSuchMessageException e) {
|
||||
LOG.info("Attachment not received yet");
|
||||
missingAttachments.put(header.getMessageId(), h);
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Don't cache items unless all are present and valid
|
||||
attachmentRetriever.cachePut(h.getId(), items);
|
||||
displayMessageAttachments(h.getId(), items);
|
||||
List<AttachmentItem> items =
|
||||
attachmentRetriever.getAttachmentItems(attachments);
|
||||
displayMessageAttachments(messageId, items);
|
||||
} catch (DbException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
}
|
||||
@@ -584,6 +553,7 @@ public class ConversationActivity extends BriarActivity
|
||||
private void displayMessageAttachments(MessageId m,
|
||||
List<AttachmentItem> items) {
|
||||
runOnUiThreadUnlessDestroyed(() -> {
|
||||
attachmentRetriever.cachePut(m, items);
|
||||
Pair<Integer, ConversationMessageItem> pair =
|
||||
adapter.getMessageItem(m);
|
||||
if (pair != null) {
|
||||
@@ -597,13 +567,6 @@ public class ConversationActivity extends BriarActivity
|
||||
|
||||
@Override
|
||||
public void eventOccurred(Event e) {
|
||||
if (e instanceof AttachmentReceivedEvent) {
|
||||
AttachmentReceivedEvent a = (AttachmentReceivedEvent) e;
|
||||
if (a.getContactId().equals(contactId)) {
|
||||
LOG.info("Attachment received");
|
||||
onAttachmentReceived(a.getMessageId());
|
||||
}
|
||||
}
|
||||
if (e instanceof ContactRemovedEvent) {
|
||||
ContactRemovedEvent c = (ContactRemovedEvent) e;
|
||||
if (c.getContactId().equals(contactId)) {
|
||||
@@ -654,15 +617,6 @@ public class ConversationActivity extends BriarActivity
|
||||
scrollToBottom();
|
||||
}
|
||||
|
||||
@UiThread
|
||||
private void onAttachmentReceived(MessageId attachmentId) {
|
||||
PrivateMessageHeader h = missingAttachments.remove(attachmentId);
|
||||
if (h != null) {
|
||||
LOG.info("Missing attachment received");
|
||||
loadMessageAttachments(h);
|
||||
}
|
||||
}
|
||||
|
||||
@UiThread
|
||||
private void onNewConversationMessage(ConversationMessageHeader h) {
|
||||
if (h instanceof ConversationRequest ||
|
||||
@@ -949,11 +903,11 @@ public class ConversationActivity extends BriarActivity
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AttachmentItem> getAttachmentItems(PrivateMessageHeader h) {
|
||||
List<AttachmentItem> attachments =
|
||||
attachmentRetriever.cacheGet(h.getId());
|
||||
public List<AttachmentItem> getAttachmentItems(MessageId m,
|
||||
List<AttachmentHeader> headers) {
|
||||
List<AttachmentItem> attachments = attachmentRetriever.cacheGet(m);
|
||||
if (attachments == null) {
|
||||
loadMessageAttachments(h);
|
||||
loadMessageAttachments(m, headers);
|
||||
return emptyList();
|
||||
}
|
||||
return attachments;
|
||||
|
||||
@@ -18,6 +18,7 @@ import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.db.NoSuchContactException;
|
||||
import org.briarproject.bramble.api.db.TransactionManager;
|
||||
import org.briarproject.bramble.api.identity.AuthorId;
|
||||
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.bramble.api.settings.Settings;
|
||||
import org.briarproject.bramble.api.settings.SettingsManager;
|
||||
@@ -50,6 +51,7 @@ 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.attachment.AttachmentDimensions.getAttachmentDimensions;
|
||||
import static org.briarproject.briar.android.settings.SettingsFragment.SETTINGS_NAMESPACE;
|
||||
import static org.briarproject.briar.android.util.UiUtils.observeForeverOnce;
|
||||
|
||||
@@ -99,13 +101,10 @@ public class ConversationViewModel extends AndroidViewModel
|
||||
@Inject
|
||||
ConversationViewModel(Application application,
|
||||
@DatabaseExecutor Executor dbExecutor,
|
||||
TransactionManager db,
|
||||
MessagingManager messagingManager,
|
||||
ContactManager contactManager,
|
||||
@IoExecutor Executor ioExecutor, TransactionManager db,
|
||||
MessagingManager messagingManager, ContactManager contactManager,
|
||||
SettingsManager settingsManager,
|
||||
PrivateMessageFactory privateMessageFactory,
|
||||
AttachmentRetriever attachmentRetriever,
|
||||
AttachmentCreator attachmentCreator) {
|
||||
PrivateMessageFactory privateMessageFactory) {
|
||||
super(application);
|
||||
this.dbExecutor = dbExecutor;
|
||||
this.db = db;
|
||||
@@ -113,8 +112,10 @@ public class ConversationViewModel extends AndroidViewModel
|
||||
this.contactManager = contactManager;
|
||||
this.settingsManager = settingsManager;
|
||||
this.privateMessageFactory = privateMessageFactory;
|
||||
this.attachmentRetriever = attachmentRetriever;
|
||||
this.attachmentCreator = attachmentCreator;
|
||||
this.attachmentRetriever = new AttachmentRetriever(messagingManager,
|
||||
getAttachmentDimensions(application.getResources()));
|
||||
this.attachmentCreator = new AttachmentCreator(getApplication(),
|
||||
ioExecutor, messagingManager, attachmentRetriever);
|
||||
messagingGroupId = Transformations
|
||||
.map(contact, c -> messagingManager.getContactGroup(c).getId());
|
||||
contactDeleted.setValue(false);
|
||||
|
||||
@@ -15,6 +15,7 @@ import org.briarproject.briar.api.forum.ForumInvitationRequest;
|
||||
import org.briarproject.briar.api.forum.ForumInvitationResponse;
|
||||
import org.briarproject.briar.api.introduction.IntroductionRequest;
|
||||
import org.briarproject.briar.api.introduction.IntroductionResponse;
|
||||
import org.briarproject.briar.api.messaging.AttachmentHeader;
|
||||
import org.briarproject.briar.api.messaging.PrivateMessageHeader;
|
||||
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest;
|
||||
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse;
|
||||
@@ -55,7 +56,8 @@ class ConversationVisitor implements
|
||||
if (h.getAttachmentHeaders().isEmpty()) {
|
||||
attachments = emptyList();
|
||||
} else {
|
||||
attachments = attachmentCache.getAttachmentItems(h);
|
||||
attachments = attachmentCache
|
||||
.getAttachmentItems(h.getId(), h.getAttachmentHeaders());
|
||||
}
|
||||
if (h.isLocal()) {
|
||||
item = new ConversationMessageItem(
|
||||
@@ -293,6 +295,7 @@ class ConversationVisitor implements
|
||||
}
|
||||
|
||||
interface AttachmentCache {
|
||||
List<AttachmentItem> getAttachmentItems(PrivateMessageHeader h);
|
||||
List<AttachmentItem> getAttachmentItems(MessageId m,
|
||||
List<AttachmentHeader> headers);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import org.briarproject.bramble.api.db.DatabaseExecutor;
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.bramble.api.sync.MessageId;
|
||||
import org.briarproject.briar.android.attachment.AttachmentItem;
|
||||
import org.briarproject.briar.android.viewmodel.LiveEvent;
|
||||
import org.briarproject.briar.android.viewmodel.MutableLiveEvent;
|
||||
@@ -134,10 +135,10 @@ public class ImageViewModel extends AndroidViewModel {
|
||||
|
||||
private void saveImage(AttachmentItem attachment, OutputStreamProvider osp,
|
||||
@Nullable Runnable afterCopy) {
|
||||
MessageId messageId = attachment.getMessageId();
|
||||
dbExecutor.execute(() -> {
|
||||
try {
|
||||
Attachment a =
|
||||
messagingManager.getAttachment(attachment.getHeader());
|
||||
Attachment a = messagingManager.getAttachment(messageId);
|
||||
copyImageFromDb(a, osp, afterCopy);
|
||||
} catch (DbException e) {
|
||||
logException(LOG, WARNING, e);
|
||||
|
||||
@@ -9,8 +9,8 @@ import com.bumptech.glide.load.data.DataFetcher;
|
||||
import org.briarproject.bramble.api.db.DatabaseExecutor;
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
import org.briarproject.bramble.api.sync.MessageId;
|
||||
import org.briarproject.briar.android.attachment.AttachmentItem;
|
||||
import org.briarproject.briar.api.messaging.Attachment;
|
||||
import org.briarproject.briar.api.messaging.MessagingManager;
|
||||
|
||||
import java.io.InputStream;
|
||||
@@ -50,12 +50,11 @@ class BriarDataFetcher implements DataFetcher<InputStream> {
|
||||
@Override
|
||||
public void loadData(Priority priority,
|
||||
DataCallback<? super InputStream> callback) {
|
||||
MessageId id = attachment.getMessageId();
|
||||
dbExecutor.execute(() -> {
|
||||
if (cancel) return;
|
||||
try {
|
||||
Attachment a =
|
||||
messagingManager.getAttachment(attachment.getHeader());
|
||||
inputStream = a.getStream();
|
||||
inputStream = messagingManager.getAttachment(id).getStream();
|
||||
callback.onDataReady(inputStream);
|
||||
} catch (DbException e) {
|
||||
callback.onLoadFailed(e);
|
||||
|
||||
@@ -28,7 +28,6 @@ import static android.content.Context.LAYOUT_INFLATER_SERVICE;
|
||||
import static android.view.KeyEvent.KEYCODE_ENTER;
|
||||
import static android.view.inputmethod.EditorInfo.IME_ACTION_SEND;
|
||||
import static android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT;
|
||||
import static java.lang.Character.isWhitespace;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static org.briarproject.bramble.util.StringUtils.utf8IsTooLong;
|
||||
|
||||
@@ -126,31 +125,19 @@ public class EmojiTextInputView extends KeyboardAwareLinearLayout implements
|
||||
@Override
|
||||
public void onTextChanged(CharSequence s, int start, int before,
|
||||
int count) {
|
||||
if (emptyTextAllowed || listener == null) return;
|
||||
// Work out whether the trimmed text has become empty or non-empty
|
||||
if (isEmpty) {
|
||||
// We only need to check the characters that were added
|
||||
if (countLeadingWhitespace(s, start, count) < count) {
|
||||
isEmpty = false;
|
||||
listener.onTextIsEmptyChanged(false);
|
||||
}
|
||||
} else if (before > 0) {
|
||||
// Characters have been removed or replaced - check from the start
|
||||
int length = s.length();
|
||||
if (countLeadingWhitespace(s, 0, length) == length) {
|
||||
// Need to start at position 0 to change empty
|
||||
if (start != 0 || emptyTextAllowed || listener == null) return;
|
||||
if (s.length() == 0) {
|
||||
if (!isEmpty) {
|
||||
isEmpty = true;
|
||||
listener.onTextIsEmptyChanged(true);
|
||||
}
|
||||
} else if (isEmpty) {
|
||||
isEmpty = false;
|
||||
listener.onTextIsEmptyChanged(false);
|
||||
}
|
||||
}
|
||||
|
||||
private int countLeadingWhitespace(CharSequence s, int off, int len) {
|
||||
for (int i = 0; i < len; i++) {
|
||||
if (!isWhitespace(s.charAt(off + i))) return i;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
}
|
||||
@@ -255,7 +242,6 @@ public class EmojiTextInputView extends KeyboardAwareLinearLayout implements
|
||||
|
||||
interface TextInputListener {
|
||||
void onTextIsEmptyChanged(boolean isEmpty);
|
||||
|
||||
void onSendEvent();
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:hint="@string/set_contact_alias_hint"
|
||||
android:inputType="text|textCapWords"
|
||||
android:inputType="textPersonName"
|
||||
android:textColor="?android:attr/textColorPrimary"
|
||||
android:textSize="@dimen/text_size_medium"/>
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
<string name="download_briar_button">Descarrega Briar 1.0</string>
|
||||
<string name="startup_open_database">S\'està desxifrant la base de dades...</string>
|
||||
<string name="startup_migrate_database">S\'està actualitzant la base de dades...</string>
|
||||
<string name="startup_compact_database">S\'està compactant la base de dades...</string>
|
||||
<string name="startup_compact_database">Compactant la base de dades...</string>
|
||||
<!--Navigation Drawer-->
|
||||
<string name="nav_drawer_open_description">Obre el calaix de navegació</string>
|
||||
<string name="nav_drawer_close_description">Tanca el calaix de navegació</string>
|
||||
@@ -116,11 +116,9 @@
|
||||
<string name="date_no_private_messages">Sense missatges.</string>
|
||||
<string name="no_private_messages">No hi ha cap missatge</string>
|
||||
<string name="message_hint">Escriviu un missatge</string>
|
||||
<string name="image_caption_hint">Afegiu una nota (opcional)</string>
|
||||
<string name="image_caption_hint">Afegeix una captura (opcional)</string>
|
||||
<string name="image_attach">Afegeix una imatge</string>
|
||||
<string name="image_attach_error">La imatge(s) no s\'ha pogut afegir </string>
|
||||
<string name="image_attach_error_too_big">La imatge és massa gran. El límit és %d MB.</string>
|
||||
<string name="image_attach_error_invalid_mime_type">El format de la imatge no s\'admet: %s</string>
|
||||
<string name="image_attach_error">La imatge no s\'ha pogut afegir </string>
|
||||
<string name="set_contact_alias">Canvia el nom del contacte</string>
|
||||
<string name="set_contact_alias_hint">Nom del contacte</string>
|
||||
<string name="set_alias_button">Canvia</string>
|
||||
@@ -129,19 +127,18 @@
|
||||
<string name="dialog_message_delete_contact">Segur que voleu suprimir aquest contacte i tots els missatges que us heu intercanviat?</string>
|
||||
<string name="contact_deleted_toast">S\'ha suprimit el contacte</string>
|
||||
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
|
||||
<string name="you">Vós</string>
|
||||
<string name="save_image">Desa la imatge</string>
|
||||
<string name="you">Vos</string>
|
||||
<string name="save_image">Desa imatge</string>
|
||||
<string name="dialog_title_save_image">Voleu desar la imatge?</string>
|
||||
<string name="dialog_message_save_image">Si deseu aquesta imatge la resta d\'aplicacions també hi podran accedir.\n\nSegur que voleu desar-la?</string>
|
||||
<string name="dialog_message_save_image">Desant aquesta imatge es permetrà a altres aplicacions accedir-hi.\n\nConfirmeu que la voleu desar?</string>
|
||||
<string name="save_image_success">La imatge s\'ha desat</string>
|
||||
<string name="save_image_error">La imatge no s\'ha pogut desar </string>
|
||||
<string name="dialog_title_no_image_support">No hi ha cap imatge disponible</string>
|
||||
<string name="dialog_message_no_image_support">La versió de Briar del vostre contacte no permet afegir imatges.
|
||||
Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="dialog_title_image_support">Ara ja podeu enviar imatges a aquest contacte</string>
|
||||
<string name="dialog_title_no_image_support">Cap imatge disponible</string>
|
||||
<string name="dialog_message_no_image_support">El vostre contacte de Briar encara no admet afegir imatges.
|
||||
Un cop s\'actualitzi ja li veureu una icona diferent </string>
|
||||
<string name="dialog_title_image_support">Ara podeu enviar imatges a aquest contacte</string>
|
||||
<string name="dialog_message_image_support">Premeu aquesta icona per afegir imatges.</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">Afegeix un contacte proper</string>
|
||||
<string name="face_to_face">Heu de coincidir en el mateix lloc amb la persona que voleu afegir com a contacte.\n\nD\'aquesta manera evitareu que algú suplanti les vostres identitats o pugui llegir els vostres missatges en el futur.</string>
|
||||
<string name="continue_button">Continua</string>
|
||||
<string name="try_again_button">Torna-ho a provar</string>
|
||||
@@ -150,8 +147,8 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="contact_added_toast">S\'ha afegit el contacte %s</string>
|
||||
<string name="contact_already_exists">El contacte %s ja existia</string>
|
||||
<string name="qr_code_invalid">El codi QR és invàlid</string>
|
||||
<string name="qr_code_too_old">El codi QR que heu escanejat prové d\'una versió antiga de %s.\n\nDemaneu al vostre contacte que l\'actualitzi i torneu a provar-ho.</string>
|
||||
<string name="qr_code_too_new">El codi QR que heu escanejat prové d\'una versió de %s més nova que la vostra.\n\nActualitzeu la vostra aplicació i torneu a provar-ho.</string>
|
||||
<string name="qr_code_too_old">El codi QR que heu escanejat prové d\'una versió antiga de %s.\n\nDemaneu al vostre contacte que actualitzi a l\'última versió i torneu a provar-ho.</string>
|
||||
<string name="qr_code_too_new">El codi QR que heu escanejat prové d\'una versió nova de %s.\n\nActualitzeu a l\'última versió i torneu a provar-ho.</string>
|
||||
<string name="camera_error">Error de la càmera</string>
|
||||
<string name="connecting_to_device">Connectant-se al dispositiu\u2026</string>
|
||||
<string name="authenticating_with_device">Autenticant-se amb el dispositiu\u2026</string>
|
||||
@@ -159,66 +156,14 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="connection_error_explanation">Comproveu que esteu connectats a la mateixa xarxa Wi-Fi.</string>
|
||||
<string name="connection_error_feedback">Si aquest problema persisteix, <a href="feedback">envieu-nos un comentari</a> per ajudar-nos a millorar l\'aplicació.</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">Afegeix un contacte llunyà</string>
|
||||
<string name="add_contact_nearby_title">Afegeix un contacte proper</string>
|
||||
<string name="add_contact_remotely_title">Afegeix un contacte llunyà</string>
|
||||
<string name="contact_name_hint">Doneu un sobrenom al contacte</string>
|
||||
<string name="contact_link_intro">Escriviu l\'enllaç del vostre contacte</string>
|
||||
<string name="contact_link_hint">Enllaç del contacte</string>
|
||||
<string name="paste_button">Enganxa</string>
|
||||
<string name="add_contact_button">Afegiu un contacte</string>
|
||||
<string name="paste_button">Pegar</string>
|
||||
<string name="copy_button">Copia</string>
|
||||
<string name="share_button">Comparteix</string>
|
||||
<string name="send_link_title">Intercanvieu els enllaços</string>
|
||||
<string name="add_contact_choose_nickname">Trieu un sobrenom</string>
|
||||
<string name="add_contact_choose_a_nickname">Escriviu un sobrenom</string>
|
||||
<string name="nickname_intro">Doneu un sobrenom al contacte. Només vós podreu veure\'l.</string>
|
||||
<string name="your_link">Lliureu aquest enllaç al contacte que voleu afegir</string>
|
||||
<string name="link_clip_label">Enllaç de Briar</string>
|
||||
<string name="link_copied_toast">L\'enllaç s\'ha copiat</string>
|
||||
<string name="adding_contact_error">Hi ha hagut un error en afegir el contacte</string>
|
||||
<string name="pending_contact_requests_snackbar">Hi ha sol·licituds de contacte pendents</string>
|
||||
<string name="pending_contact_requests">Sol·licituds de contacte pendents</string>
|
||||
<string name="no_pending_contacts">No hi ha sol·licituds de contacte pendents</string>
|
||||
<string name="share_button">Compartir</string>
|
||||
<string name="add_contact_remote_connecting">S\'està connectant...</string>
|
||||
<string name="waiting_for_contact_to_come_online">S\'està esperant que el contacte estigui connectat…</string>
|
||||
<string name="connecting">S\'està connectant...</string>
|
||||
<string name="adding_contact">S\'està afegint el contacte…</string>
|
||||
<string name="adding_contact_failed">No s\'ha pogut afegir el contacte</string>
|
||||
<string name="dialog_title_remove_pending_contact">Confirmació de la supressió</string>
|
||||
<string name="dialog_message_remove_pending_contact">Aquest contacte encara està essent afegit. Si el suprimiu ara ja no s\'acabarà d\'afegir.</string>
|
||||
<string name="own_link_error">Escriviu l\'enllaç del vostre contacte i no el vostre enllaç</string>
|
||||
<string name="nickname_missing">Escriviu un sobrenom</string>
|
||||
<string name="invalid_link">Enllaç erroni</string>
|
||||
<string name="unsupported_link">Aquest enllaç prové d\'una versió de Biar més nova que la vostra.\n\nActualitzeu la vostra aplicació i torneu a provar-ho.</string>
|
||||
<string name="intent_own_link">Heu accedit al vostre propi enllaç. Feu servir el del contacte que voleu afegir!</string>
|
||||
<string name="missing_link">Escriviu un enllaç</string>
|
||||
<!--This is a numeral indicating the first step in a series of screens-->
|
||||
<string name="step_1">1</string>
|
||||
<!--This is a numeral indicating the second step in a series of screens-->
|
||||
<string name="step_2">2</string>
|
||||
<plurals name="contact_added_notification_text">
|
||||
<item quantity="one">S\'ha afegit el nou contacte </item>
|
||||
<item quantity="other">S\'han afegit %d nous contactes.</item>
|
||||
</plurals>
|
||||
<string name="adding_contact_slow_warning">Afegir aquest contacte està trigant més que de costum…</string>
|
||||
<string name="adding_contact_slow_title">No pot connectar-se al contacte</string>
|
||||
<string name="adding_contact_slow_text">Afegir aquest contacte està trigant més que de costum.\n\nComproveu que el contacte ha rebut el vostre enllaç i també us ha afegit.</string>
|
||||
<string name="offline_state">No hi ha connexió a Internet</string>
|
||||
<string name="duplicate_link_dialog_title">Enllaç duplicat</string>
|
||||
<string name="duplicate_link_dialog_text_1">Teniu una sol·licitud de contacte pendent amb l\'enllaç %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%s i %s són la mateixa persona?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
<string name="same_person_button">Mateixa persona</string>
|
||||
<!--This is a button for answering that two nicknames refer to different people. This string
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Persones diferents</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s i %s us han enviat el mateix enllaç.\n\nUn d\'ells pot estar provant de descobrir quins són els vostres contactes.\n\nNo els hi digueu que heu rebut el mateix enllaç d\'algú altre.</string>
|
||||
<string name="pending_contact_updated_toast">S\'ha actualitzat la sol·licitud de contacte pendent</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Presenteu als vostres contactes</string>
|
||||
<string name="introduction_onboarding_text">Podeu presentar als vostres contactes entre si, de manera que no necessitin trobar-se en persona per a relacionar-se a través de Briar.</string>
|
||||
@@ -407,12 +352,12 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="bluetooth_setting_enabled">Sempre que hi hagi contactes propers</string>
|
||||
<string name="bluetooth_setting_disabled">Només quan s\'afegeixen contactes</string>
|
||||
<string name="tor_network_setting">Connecta a través d\'Internet (Tor)</string>
|
||||
<string name="tor_network_setting_automatic">Automàtic, basat en la posició</string>
|
||||
<string name="tor_network_setting_automatic">Automàtic basat en la ubicació</string>
|
||||
<string name="tor_network_setting_without_bridges">Usa Tor sense ponts</string>
|
||||
<string name="tor_network_setting_with_bridges">Usa Tor amb ponts</string>
|
||||
<string name="tor_network_setting_never">No et connectis</string>
|
||||
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||
<string name="tor_network_setting_summary">Automàtic: %1$s (a %2$s)</string>
|
||||
<string name="tor_network_setting_summary">Automàtic: %1$s (en %2$s)</string>
|
||||
<string name="tor_mobile_data_title">Usa dades mòbils</string>
|
||||
<string name="tor_only_when_charging_title">Connecta a través d\'Internet (Tor) només quan s\'estigui carregant</string>
|
||||
<string name="tor_only_when_charging_summary">Desactiva la connexió a Internet quan el dispositiu estigui funcionant amb la bateria</string>
|
||||
@@ -421,7 +366,7 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="pref_lock_title">Bloqueig de l\'aplicació</string>
|
||||
<string name="pref_lock_summary">Usa el bloqueig de pantalla del dispositiu per protegir Briar mentre inicieu la sessió</string>
|
||||
<string name="pref_lock_disabled_summary">Per utilitzar aquesta funció, configureu el bloqueig de pantalla en el vostre dispositiu</string>
|
||||
<string name="pref_lock_timeout_title">Temps d\'inactivitat abans de bloquejar-se</string>
|
||||
<string name="pref_lock_timeout_title">Temps d\'inactivitat per al bloqueig</string>
|
||||
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
|
||||
<string name="pref_lock_timeout_summary">Briar es bloquejarà automàticament després de %s de no usar-se.</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
@@ -485,7 +430,7 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<!--Link Warning-->
|
||||
<string name="link_warning_title">Avís d\'enllaç</string>
|
||||
<string name="link_warning_intro">L\'enllaç s\'obrirà amb una aplicació externa.</string>
|
||||
<string name="link_warning_text">Això podria usar-se per a identificar-vos. Penseu si us en refieu prou de la persona que us ha enviat l\'enllaç. Avalueu si us convindria obrir-lo amb un navegador que faciliti l\'anonimat com Tor Browser.</string>
|
||||
<string name="link_warning_text">Això es podria utilitzar-se per identificar-vos. Penseu si confieu en la persona que us ha enviat aquest enllaç i considereu obrir-lo amb el navegador Tor.</string>
|
||||
<string name="link_warning_open_link">Obre l\'enllaç</string>
|
||||
<!--Crash Reporter-->
|
||||
<string name="crash_report_title">Informe de fallida de Briar</string>
|
||||
@@ -512,10 +457,10 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<!--Permission Requests-->
|
||||
<string name="permission_camera_title">Permís de la càmera</string>
|
||||
<string name="permission_camera_request_body">Per escanejar el codi QR, Briar necessita accedir a la càmera.</string>
|
||||
<string name="permission_location_title">Permís d\'accés a la posició</string>
|
||||
<string name="permission_location_request_body">Per a descobrir dispositius Bluetooth, Briar necessita accedir a la vostra posició.\n\nBriar no guarda la vostra posició ni la comparteix amb ningú.</string>
|
||||
<string name="permission_camera_location_title">Permís d\'accés a la càmera i a la posició</string>
|
||||
<string name="permission_camera_location_request_body">Per escanejar el codi QR, Briar necessita accedir a la càmera.\n\nPer trobar dispositius Bluetooth, Briar necessita accedir a la vostra posició.\n\nBriar no guarda la vostra posició ni la comparteix amb ningú.</string>
|
||||
<string name="permission_location_title">Permís d\'accés a l\'ubicació</string>
|
||||
<string name="permission_location_request_body">Per trobar dispositius Bluetooth, Briar necessita la vostra ubicació.\n\nBriar no guarda la vostra ubicació ni la comparteix amb ningú.</string>
|
||||
<string name="permission_camera_location_title">Permís d\'accés a la càmera i l\'ubicació</string>
|
||||
<string name="permission_camera_location_request_body">Per escanejar el codi QR, Briar necessita accedir a la càmera.\n\nPer trobar dispositius Bluetooth, Briar necessita la vostra ubicació.\n\nBriar no guarda la vostra ubicació ni la comparteix amb ningú.</string>
|
||||
<string name="permission_camera_denied_body">Heu denegat l\'accés a la càmera però per afegir contactes cal utilitzar la càmera.\n\nRecomanem que permeteu l\'accés a la càmera.</string>
|
||||
<string name="qr_code">Codi QR</string>
|
||||
<string name="show_qr_code_fullscreen">Mostra el codi QR a pantalla completa</string>
|
||||
@@ -528,15 +473,15 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
|
||||
<string name="lock_tap_to_unlock">Toqueu per desbloquejar-lo</string>
|
||||
<!--Screenshots-->
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_alice">Alba</string>
|
||||
<string name="screenshot_alice">Alice</string>
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_bob">Pere</string>
|
||||
<string name="screenshot_bob">Bob</string>
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_carol">Queralt</string>
|
||||
<string name="screenshot_carol">Carol</string>
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Bob!-->
|
||||
<string name="screenshot_message_1">Hola Pere!</string>
|
||||
<string name="screenshot_message_1">Hola Bob!</string>
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Alice!-->
|
||||
<string name="screenshot_message_2">Hola Alba! Gràcies per recomanar-me Briar!</string>
|
||||
<string name="screenshot_message_2">Hola Alice! Gràcies per recomanar-me Briar!</string>
|
||||
<!--This is a message to be used in screenshots.-->
|
||||
<string name="screenshot_message_3">De res, espero que t\'agradi 😀</string>
|
||||
</resources>
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<string name="passwords_do_not_match">Passwörter stimmen nicht überein</string>
|
||||
<string name="create_account_button">Konto anlegen</string>
|
||||
<string name="more_info">Weitere Informationen</string>
|
||||
<string name="don_t_ask_again">Nicht erneut nachfragen</string>
|
||||
<string name="don_t_ask_again">Frage nicht noch einmal</string>
|
||||
<string name="setup_huawei_text">Bitte tippe auf die Schaltfläche unten und stelle sicher, dass Briar unter \"Geschützte Apps\" angezeigt wird.</string>
|
||||
<string name="setup_huawei_button">Briar schützen</string>
|
||||
<string name="setup_huawei_help">Wenn Briar nicht zur Liste der geschützten Apps hinzugefügt wird, kann es nicht im Hintergrund ausgeführt werden.</string>
|
||||
@@ -48,7 +48,7 @@
|
||||
<string name="download_briar_button">Lade Briar 1.0 herunter</string>
|
||||
<string name="startup_open_database">Datenbank wird entschlüsselt...</string>
|
||||
<string name="startup_migrate_database">Datenbank wird aktualisiert...</string>
|
||||
<string name="startup_compact_database">Datenbank wird komprimiert ...</string>
|
||||
<string name="startup_compact_database">Datenbank komprimieren...</string>
|
||||
<!--Navigation Drawer-->
|
||||
<string name="nav_drawer_open_description">Navigationsleiste öffnen</string>
|
||||
<string name="nav_drawer_close_description">Navigationsleiste schliessen</string>
|
||||
@@ -118,9 +118,7 @@
|
||||
<string name="message_hint">Nachricht eingeben</string>
|
||||
<string name="image_caption_hint">Überschrift hinzufügen (optional)</string>
|
||||
<string name="image_attach">Bild anhängen</string>
|
||||
<string name="image_attach_error">Bild(er) konnte(n) nicht angehängt werden</string>
|
||||
<string name="image_attach_error_too_big">Bild zu groß. Das Limit beträgt %d MB.</string>
|
||||
<string name="image_attach_error_invalid_mime_type">Nicht unterstütztes Bildformat: %s</string>
|
||||
<string name="image_attach_error">Konnte kein Bild anhängen</string>
|
||||
<string name="set_contact_alias">Kontaktnamen ändern</string>
|
||||
<string name="set_contact_alias_hint">Name des Kontakts</string>
|
||||
<string name="set_alias_button">Ändern</string>
|
||||
@@ -133,14 +131,13 @@
|
||||
<string name="save_image">Bild speichern</string>
|
||||
<string name="dialog_title_save_image">Bild speichern?</string>
|
||||
<string name="dialog_message_save_image">Gespeicherte Bilder können von vielen anderen Apps eingesehen werden.\n\nBist du sicher, dass du das Bild speichern möchtest?</string>
|
||||
<string name="save_image_success">Bild wurde gespeichert</string>
|
||||
<string name="save_image_error">Bild konnte nicht gespeichert werden</string>
|
||||
<string name="save_image_success">Bild wurde gespeichert.</string>
|
||||
<string name="save_image_error">Konnte Bild nicht speichern.</string>
|
||||
<string name="dialog_title_no_image_support">Bilder nicht verfügbar</string>
|
||||
<string name="dialog_message_no_image_support">Der Briar deines Kontakts unterstützt noch keine Bildanhänge. Sobald die Aktualisierung abgeschlossen ist, siehst du ein anderes Symbol.</string>
|
||||
<string name="dialog_title_image_support">Du kannst nun Bilder an diesen Kontakt senden</string>
|
||||
<string name="dialog_message_image_support">Tippe auf das Symbol, um Bilder anzuhängen.</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">Kontakt in der Nähe hinzufügen</string>
|
||||
<string name="face_to_face">Um einen neuen Kontakt hinzuzufügen, ist es notwendig, dass sich beide Kontakte an einem Ort treffen.\n\nDadurch wird betrügerische Identitätsvortäuschung und unautorisierter Kommunikationszugriff verhindert.</string>
|
||||
<string name="continue_button">Weiter</string>
|
||||
<string name="try_again_button">Noch einmal versuchen</string>
|
||||
@@ -155,24 +152,18 @@
|
||||
<string name="connecting_to_device">Verbinde mit Gerät\u2026</string>
|
||||
<string name="authenticating_with_device">Authentifiziere Gerät\u2026</string>
|
||||
<string name="connection_error_title">Keine Verbindung zum Kontakt</string>
|
||||
<string name="connection_error_explanation">Überprüfe, ob ihr beide mit dem selben WLAN-Netzwerk verbunden seid.</string>
|
||||
<string name="connection_error_explanation">Überprüfe ob ihr beide mit dem selben Wi-Fi Netzwerk verbunden seit.</string>
|
||||
<string name="connection_error_feedback">Wenn das Problem weiterbesteht, hilf uns die App zu verbessern und <a href="feedback">schicke Feedback</a>.</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">Kontakt aus der Ferne hinzufügen</string>
|
||||
<string name="add_contact_nearby_title">Kontakt in der Nähe hinzufügen</string>
|
||||
<string name="add_contact_remotely_title">Kontakt aus der Ferne hinzufügen</string>
|
||||
<string name="contact_name_hint">Gib dem Kontakt einen Spitznamen</string>
|
||||
<string name="contact_link_intro">Hier den Link deines Kontakts einfügen</string>
|
||||
<string name="contact_link_hint">Kontakt Link</string>
|
||||
<string name="paste_button">Einfügen</string>
|
||||
<string name="add_contact_button">Kontakt hinzufügen</string>
|
||||
<string name="copy_button">Kopieren</string>
|
||||
<string name="share_button">Teilen</string>
|
||||
<string name="send_link_title">Links austauschen</string>
|
||||
<string name="add_contact_choose_nickname">Wähle einen Spitznamen</string>
|
||||
<string name="add_contact_choose_a_nickname">Gib einen Spitznamen ein</string>
|
||||
<string name="nickname_intro">Gib deinem Kontakt einen Spitznamen. Nur du kannst ihn sehen.</string>
|
||||
<string name="your_link">Gebe diesen Link zu dem Kontakt den du hinzufügen möchtest</string>
|
||||
<string name="nickname_intro">Gib deinem Kontakt einen Spitznamen. Nur du kannst es sehen.</string>
|
||||
<string name="link_clip_label">Briar Link</string>
|
||||
<string name="link_copied_toast">Link kopiert</string>
|
||||
<string name="adding_contact_error">Es gab einen Fehler beim Hinzufügen des Kontaktes.</string>
|
||||
@@ -180,18 +171,10 @@
|
||||
<string name="pending_contact_requests">Ausstehende Kontaktanfragen</string>
|
||||
<string name="no_pending_contacts">Keine ausstehenden Kontakte</string>
|
||||
<string name="add_contact_remote_connecting">Verbindung wird aufgebaut …</string>
|
||||
<string name="waiting_for_contact_to_come_online">Warte auf Online-Aktivität des Kontakts ...</string>
|
||||
<string name="connecting">Verbindung wird aufgebaut …</string>
|
||||
<string name="adding_contact">Kontakt hinzufügen...</string>
|
||||
<string name="adding_contact_failed">Hinzufügen von Kontakt ist fehlgeschlagen</string>
|
||||
<string name="dialog_title_remove_pending_contact">Entfernung bestätigen</string>
|
||||
<string name="dialog_message_remove_pending_contact">Dieser Kontakt befindet sich noch beim Hinzufügen. Wenn er jetzt Entfernt wird, wird das Hinzufügen abgebrochen.</string>
|
||||
<string name="own_link_error">Gebe den Link deines Kontakts ein, nicht deinen Eigenen.</string>
|
||||
<string name="nickname_missing">Bitte gib einen Spitznamen an</string>
|
||||
<string name="invalid_link">Ungültiger Link</string>
|
||||
<string name="unsupported_link">Dieser Link kommt von einer neueren Version von Briar. Bitte führe eine Aktualisierung auf die aktuelle Version durch und versuche es dann nochmal. </string>
|
||||
<string name="intent_own_link">Du hast deinen eigenen Link aufgerufen. Nutze einen Link von deinen Kontakten, die du hinzufügen möchtest!</string>
|
||||
<string name="missing_link">Bitte gebe einen Link ein</string>
|
||||
<!--This is a numeral indicating the first step in a series of screens-->
|
||||
<string name="step_1">1</string>
|
||||
<!--This is a numeral indicating the second step in a series of screens-->
|
||||
@@ -200,24 +183,6 @@
|
||||
<item quantity="one">Neuer Kontakt hinzugefügt.</item>
|
||||
<item quantity="other">%d neue Kontakte hinzugefügt.</item>
|
||||
</plurals>
|
||||
<string name="adding_contact_slow_warning">Das Hinzufügen des Kontakts dauert länger den normal</string>
|
||||
<string name="adding_contact_slow_title">Kann nicht zu Kontakt verbinden</string>
|
||||
<string name="adding_contact_slow_text">Das Hinzufügen des Kontakts dauert länger den normal.\n\nBitte kontrolliere, dass dein Kontakt dein Link erhalten und eingegeben hat:</string>
|
||||
<string name="offline_state">Keine Internetverbindung</string>
|
||||
<string name="duplicate_link_dialog_title">Link duplizieren</string>
|
||||
<string name="duplicate_link_dialog_text_1">Du hast bereits einen Kontakt mit diesem Link ausstehend: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Sind %s und %s dieselbe Person?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
<string name="same_person_button">Selbe Person</string>
|
||||
<!--This is a button for answering that two nicknames refer to different people. This string
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Andere Person</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s und %s haben Dir denselben Link geschickt.\n\nMöglicherweise versucht einer der beiden mehr über deine Kontakte zu erfahren.\n\nDu solltest deswegen niemandem sagen, dass Du diesen Link auch von jemand anderem erhalten hast,</string>
|
||||
<string name="pending_contact_updated_toast">Ausstehender Kontakt aktualisiert</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Mache deine Kontakte untereinander bekannt</string>
|
||||
<string name="introduction_onboarding_text">Du kannst deine Kontakte untereinander bekannt machen. So können sie sich über Briar verbinden, ohne sich persönlich treffen zu müssen.</string>
|
||||
@@ -407,8 +372,8 @@
|
||||
<string name="bluetooth_setting_disabled">Nur beim Hinzufügen von Kontakten</string>
|
||||
<string name="tor_network_setting">Über Internet (Tor) verbinden</string>
|
||||
<string name="tor_network_setting_automatic">Automatisch (standortbasiert)</string>
|
||||
<string name="tor_network_setting_without_bridges">Tor ohne Bridges nutzen</string>
|
||||
<string name="tor_network_setting_with_bridges">Tor mit Bridges nutzen</string>
|
||||
<string name="tor_network_setting_without_bridges">Tor ohne Bridges benutzen</string>
|
||||
<string name="tor_network_setting_with_bridges">Tor mit Bridges benutzen</string>
|
||||
<string name="tor_network_setting_never">Nicht verbinden</string>
|
||||
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||
<string name="tor_network_setting_summary">Automatisch: %1$s (in %2$s)</string>
|
||||
@@ -514,7 +479,7 @@
|
||||
<string name="permission_location_title">Berechtigung Standort</string>
|
||||
<string name="permission_location_request_body">Um Bluetooth-Geräte zu finden, braucht Briar Zugriff auf deinen Standort.\n\nBriar speichert weder deinen Standort noch gibt es ihn an andere weiter.</string>
|
||||
<string name="permission_camera_location_title">Kamera und Standort</string>
|
||||
<string name="permission_camera_location_request_body">Um den QR-Code zu scannen, braucht Briar Zugriff auf die Kamera.\n\nUm Bluetooth-Geräte zu finden, braucht Briar Zugriff auf deinen Standort.\n\nBriar speichert weder deinen Standort noch gibt es ihn an andere weiter.</string>
|
||||
<string name="permission_camera_location_request_body">Um den QR-Code zu scannen, brauch Briar Zugriff auf die Kamera.\n\nUm Bluetooth-Geräte zu finden, braucht Briar Zugriff auf deinen Standort.\n\nBriar speichert weder deinen Standort noch gibt es ihn an andere weiter.</string>
|
||||
<string name="permission_camera_denied_body">Du hast den Zugriff auf die Kamera verweigert, aber das Hinzufügen von Kontakten erfordert die Verwendung der Kamera.\n\nBitte gewähre den Zugriff.</string>
|
||||
<string name="qr_code">QR-Code</string>
|
||||
<string name="show_qr_code_fullscreen">QR-Code im Vollbildmodus anzeigen</string>
|
||||
|
||||
@@ -118,9 +118,7 @@
|
||||
<string name="message_hint">Idatzi mezua</string>
|
||||
<string name="image_caption_hint">Gehitu epigrafea (aukerakoa)</string>
|
||||
<string name="image_attach">Erantsi irudia</string>
|
||||
<string name="image_attach_error">Ezin izan dira irudiak erantsi</string>
|
||||
<string name="image_attach_error_too_big">Irudia handiegia da. Muga %d MB da.</string>
|
||||
<string name="image_attach_error_invalid_mime_type">Onartu gabeko irudi formatua: %s</string>
|
||||
<string name="image_attach_error">Ezin izan da irudia erantsi</string>
|
||||
<string name="set_contact_alias">Aldatu kontaktuaren izena</string>
|
||||
<string name="set_contact_alias_hint">Kontaktuaren izena</string>
|
||||
<string name="set_alias_button">Aldatu</string>
|
||||
@@ -140,7 +138,6 @@
|
||||
<string name="dialog_title_image_support">Orain irudiak bidali ahal dizkiozu eranskin gisa kontaktu honei</string>
|
||||
<string name="dialog_message_image_support">Sakatu ikono hau irudiak eransteko.</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">Gehitu inguruko kontaktua</string>
|
||||
<string name="face_to_face">Kontaktu gisa gehitu nahi duzun pertsonarekin aurrez aurre egon behar duzu.\n\nHonek etorkizunean inork zure itxurak egitea edo zure mezuak irakurtzea eragotziko du.</string>
|
||||
<string name="continue_button">Jarraitu</string>
|
||||
<string name="try_again_button">Saiatu berriro</string>
|
||||
@@ -158,66 +155,14 @@
|
||||
<string name="connection_error_explanation">Egiaztatu biak Wi-Fi sare berera konektatuta zaudetela.</string>
|
||||
<string name="connection_error_feedback">Arazoa mantentzen bada, mesedez <a href="feedback">bidali iruzkin bat</a> aplikazioa hobetzen laguntzeko.</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">Gehitu urruneko kontaktua</string>
|
||||
<string name="add_contact_nearby_title">Gehitu inguruko kontaktua</string>
|
||||
<string name="add_contact_remotely_title">Gehitu urruneko kontaktua</string>
|
||||
<string name="contact_name_hint">Eman ezizena kontaktuari</string>
|
||||
<string name="contact_link_intro">Sartu zure kontaktuaren ezizena hemen</string>
|
||||
<string name="contact_link_hint">Kontaktuaren esteka</string>
|
||||
<string name="paste_button">Itsatsi</string>
|
||||
<string name="add_contact_button">Gehitu kontaktua</string>
|
||||
<string name="copy_button">Kopiatu</string>
|
||||
<string name="share_button">Elkarbanatu</string>
|
||||
<string name="send_link_title">Partekatu estekak</string>
|
||||
<string name="add_contact_choose_nickname">Aukeratu ezizena</string>
|
||||
<string name="add_contact_choose_a_nickname">Sartu ezizen bat</string>
|
||||
<string name="nickname_intro">Eman ezizena zure kontaktuari. Zuk ikusi dezakezu, beste inork ez</string>
|
||||
<string name="your_link">Eman esteka hau gehitu nahi duzun kontaktuari</string>
|
||||
<string name="link_clip_label">Briar esteka</string>
|
||||
<string name="link_copied_toast">Esteka kopiatuta</string>
|
||||
<string name="adding_contact_error">Errore bat gertatu da kontaktua gehitzean.</string>
|
||||
<string name="pending_contact_requests_snackbar">Kontaktu eskaerak daude aztertzeke</string>
|
||||
<string name="pending_contact_requests">Kontaktu eskaerak aztertzeke</string>
|
||||
<string name="no_pending_contacts">Ez dago kontakturik aztertzeke</string>
|
||||
<string name="add_contact_remote_connecting">Elkartzen</string>
|
||||
<string name="waiting_for_contact_to_come_online">Kontaktua konektatu bitartean zain...</string>
|
||||
<string name="connecting">Elkartzen</string>
|
||||
<string name="adding_contact">Kontaktua gehitzen...</string>
|
||||
<string name="adding_contact_failed">Kontaktua gehitzeak huts egin du</string>
|
||||
<string name="dialog_title_remove_pending_contact">Berretsi kentzea</string>
|
||||
<string name="dialog_message_remove_pending_contact">Kontaktu hau gehitzen ari da oraindik. orain kentzen baduzu, ez da gehituko.</string>
|
||||
<string name="own_link_error">Sartu zure kontaktuaren esteka, ez zurea</string>
|
||||
<string name="nickname_missing">Sartu ezizen bat</string>
|
||||
<string name="invalid_link">Esteka baliogabea</string>
|
||||
<string name="unsupported_link">Esteka hau Briar-en bertsio berriago batetik dator. Eguneratu azken bertsiora eta saiatu berriro.</string>
|
||||
<string name="intent_own_link">Zure esteka ireki duzu. Erabili gehitu nahi duzun kontaktuarena!</string>
|
||||
<string name="missing_link">Sartu esteka bat</string>
|
||||
<!--This is a numeral indicating the first step in a series of screens-->
|
||||
<string name="step_1">1</string>
|
||||
<!--This is a numeral indicating the second step in a series of screens-->
|
||||
<string name="step_2">2</string>
|
||||
<plurals name="contact_added_notification_text">
|
||||
<item quantity="one">Kontaktu berria gehitu da</item>
|
||||
<item quantity="other">%d kontaktu berri gehitu dira.</item>
|
||||
</plurals>
|
||||
<string name="adding_contact_slow_warning">Kontaktu hau gehitzeak ohi baino denbora gehiago hartzen ari da</string>
|
||||
<string name="adding_contact_slow_title">Ezin da kontaktuarekin kontaktatu</string>
|
||||
<string name="adding_contact_slow_text">Kontaktu hau gehitzeak ohi baino denbora gehiago hartzen du.\n\nEgiaztatu kontaktua esteka jaso duela eta zu gehitu zaituela:</string>
|
||||
<string name="offline_state">Internet konexiorik ez</string>
|
||||
<string name="duplicate_link_dialog_title">Bikoiztutako esteka</string>
|
||||
<string name="duplicate_link_dialog_text_1">Baduzu kontaktu bat aztertzeke esteka honekin: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Ziur %s eta %s pertsona bera direla?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
<string name="same_person_button">Pertsona bera</string>
|
||||
<!--This is a button for answering that two nicknames refer to different people. This string
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Pertsona desberdina</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s eta %s erabiltzaileek esteka bera bidali dizute.\n\nBietako batek agian zure kontaktuak zeintzuk diren asmatu nahi du.\n\nEz esan esteka bera jaso duzula beste norbaitengandik.</string>
|
||||
<string name="pending_contact_updated_toast">Aztertzeke zegoen kontaktua eguneratu da</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Aurkeztu zure kontaktuak</string>
|
||||
<string name="introduction_onboarding_text">Zure kontaktuak elkarren artean aurkez ditzakezu, Briar bidez konektatzeko aurrez aurre egon behar izan ez dezaten.</string>
|
||||
|
||||
@@ -2,21 +2,21 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!--Setup-->
|
||||
<string name="setup_title">به Briar (برایر) خوش آمدید</string>
|
||||
<string name="setup_name_explanation">نام مستعار شما کنار هر مطلبی که پست کنید قرار خواهد گرفت. بعد از ایجاد حساب کاربری امکان تغییر آن وجود ندارد.</string>
|
||||
<string name="setup_name_explanation">نام مستعارتان کنار هر مطلب شما قرار خواهد گرفت و بعد از ایجاد حساب کاربری امکان تغییر آن وجود ندارد.</string>
|
||||
<string name="setup_next">بعدی</string>
|
||||
<string name="setup_password_intro">یک گذرواژه انتخاب کنید</string>
|
||||
<string name="setup_password_explanation">حساب کاربری Briar (برایر) شما به صورت رمزگذاری شده روی دستگاه شما به جای حافظه ابری ذخیره شده است. اگر گذرواژه خود را فراموش کنید یا Briar (برایر) را پاک کنید، راهی برای بازیابی حساب کاربری شما وجود نخواهد داشت.
|
||||
<string name="setup_password_intro">یک رمز عبور انتخاب کنید</string>
|
||||
<string name="setup_password_explanation">حساب کاربری Briar (برایر) شما به صورت رمزگذاری شده روی دستگاه شما به جای حافظه ابری ذخیره شده است. اگر شما رمز عبور خود را فراموش کنید یا Briar (برایر) را پاک کنید، راهی برای بازیابی حساب کاربری شما وجود نخواهد داشت.
|
||||
|
||||
یک گذرواژه طولانی انتخاب کنید که حدس آن سخت باشد، مثل چهار عبارت تصادفی یا ده لغت تصادفی با اعداد و نماد ها.</string>
|
||||
یک رمز عبور طولانی انتخاب کنید که حدس آن سخت باشد، مثل چهار عبارت تصادفی یا ده لغت تصادفی با اعداد و نماد ها.</string>
|
||||
<string name="setup_doze_title">اتصال های پس زمینه</string>
|
||||
<string name="setup_doze_intro">برای دریافت پیام، Briar (برایر) نیاز دارد تا در پس زمینه اتصال داشته باشد.</string>
|
||||
<string name="setup_doze_explanation">برای دریافت پیام، Briar (برایر) نیاز دارد تا در پس زمینه اتصال داشته باشد. لطفا بهینه سازی باتری را غیر فعال کنید تا Briar (برایر) بتواند به اتصال خود ادامه دهد.</string>
|
||||
<string name="setup_doze_button">دادن اجازه به ارتباطات</string>
|
||||
<string name="setup_doze_button">دادن اجازه به اتصالات</string>
|
||||
<string name="choose_nickname">نام مستعار خود را انتخاب کنید</string>
|
||||
<string name="choose_password">گذرواژه خود را انتخاب کنید</string>
|
||||
<string name="confirm_password">گذرواژه خود را تایید کنید</string>
|
||||
<string name="choose_password">رمز عبور خود را انتخاب کنید</string>
|
||||
<string name="confirm_password">رمز عبور خود را تایید کنید</string>
|
||||
<string name="name_too_long">نام بیش از حد طولانی می باشد</string>
|
||||
<string name="password_too_weak">گذرواژه ضعیف می باشد</string>
|
||||
<string name="password_too_weak">رمز عبور ضعیف می باشد</string>
|
||||
<string name="passwords_do_not_match">رمز های عبور مطابقت ندارند </string>
|
||||
<string name="create_account_button">ایجاد حساب کاربری</string>
|
||||
<string name="more_info">اطلاعات بیشتر</string>
|
||||
@@ -26,21 +26,21 @@
|
||||
<string name="setup_huawei_help">اگر Briar (برایر) به فهرست برنامه های محافظت شده اضافه نشده، نمی تواند در پس زمینه مشغول به کار باشد.</string>
|
||||
<string name="warning_dozed">ناتوانی %s برای اجراء در پس زمینه</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">گذرواژه</string>
|
||||
<string name="try_again">گذرواژه اشتباه است، لطفا دوباره سعی کنید</string>
|
||||
<string name="enter_password">رمز عبور</string>
|
||||
<string name="try_again">رمز عبور اشتباه است، لطفا دوباره سعی کنید</string>
|
||||
<string name="sign_in_button">ورود</string>
|
||||
<string name="forgotten_password">گذرواژه خود را فراموش کرده ام</string>
|
||||
<string name="dialog_title_lost_password">گذرواژه گمشده</string>
|
||||
<string name="dialog_message_lost_password">حساب کاربری Briar (برایر) شما به صورت رمزنگاری شده روی سیستم شما به جای حافظه ابری ذخیره شده است برای همین ما نمی توانیم گذرواژه شما را به صورت مجدد تنظیم کنیم. آیا مایل هستید تا حساب کاربری شما را پاک کنیم و دوباره از ابتدا شروع کنیم؟
|
||||
<string name="forgotten_password">رمز عبور را فراموش کرده ام</string>
|
||||
<string name="dialog_title_lost_password">رمز عبور گمشده</string>
|
||||
<string name="dialog_message_lost_password">حساب کاربری Briar (برایر) شما به صورت رمزنگاری شده روی سیستم شما به جای حافظه ابری ذخیره شده است برای همین ما نمی توانیم رمز عبور شما را به صورت مجدد تنظیم کنیم. آیا مایل هستید تا حساب کاربری شما را پاک کنیم و دوباره از ابتدا شروع کنیم؟
|
||||
|
||||
اخطار: هویت های شما، مخاطبان شما و پیام های شما برای همیشه از بین خواهند رفت.</string>
|
||||
<string name="startup_failed_notification_title">Briar (برایر) نمی تواند شروع به کار کند.</string>
|
||||
<string name="startup_failed_notification_text">برای اطلاعات بیشتر کلیک کنید</string>
|
||||
<string name="startup_failed_activity_title">خطا در شروع Briar (برایر)</string>
|
||||
<string name="startup_failed_db_error">به دلایلی، پایگاه داده Briar (برایر) شما خراب شده و قابل اصلاح نیست. حساب کاربری شما، داده های شما و تمام مخاطبان شما از بین رفته اند. متاسفانه، شما یا باید Briar (برایر) را دوباره نصب کنید یا یک حساب کاربری جدید در هنگام خواست گذرواژه با انتخاب گذرواژه خود را فراموش کرده ام\' ایجاد کنید.</string>
|
||||
<string name="startup_failed_data_too_old_error">حساب کاربری شما با یک نسخه قدیمی از این برنامه ایجاد شده است و به همین خاطر با این نسخه نمی تواند باز شود. شما باید نسخه قدیمی را دوباره نصب کنید یا یک حساب کاربری جدید با \"گذرواژه خود را فراموش کرده ام\" در صفحه ی گذرواژه ایجاد کنید.</string>
|
||||
<string name="startup_failed_db_error">به دلایلی، دیتابیس Briar (برایر) شما خراب شده و قابل اصلاح نیست. حساب کاربری شما، داده های شما و تمام مخاطبان شما از بین رفته اند. متاسفانه، شما یا باید Briar (برایر) را دوباره نصب کنید یا یک حساب کاربری جدید با انتخاب \'رمز عبور ام را فراموش کرده ام\' انتخاب کنید.</string>
|
||||
<string name="startup_failed_data_too_old_error">حساب کاربری شما با یک نسخه قدیمی از این برنامه ایجاد شده است و به همین خاطربا این نسخه نمی تواند باز شود. شما باید نسخه قدیمی را دوباره نصب کنید یا یک حساب کاربری جدید با \"رمز عبور ام را فراموش کرده ام\" در صفحه ی رمز عبور ایجاد کنید.</string>
|
||||
<string name="startup_failed_data_too_new_error">این نسخه از برنامه قدیمی می باشد. لطفا به آخرین نسخه از برنامه ارتقاء داده و دوباره سعی کنید.</string>
|
||||
<string name="startup_failed_service_error">Briar (برایر) نمی تواند یک افزونه ضروری را اجراء کند. نصب دوباره Briar (برایر) معمولا این مشکل را حل میکند. هرچند، توجه داشته باشید که حساب کاربری و تمام داده های مرتبط با آن را از دست خواهید داد از آنجایی که Briar (برایر) از هیچ سرور مرکزی برای ذخیره داده های شما استفاده نمی کند.</string>
|
||||
<string name="startup_failed_service_error">Briar (برایر) نمی تواند یک پلاگین ضروری را اجراء کند. نصب دوباره Briar (برایر) معمولا این مشکل را حل میکند. هرچند، توجه داشته باشید که حساب کاربری و تمام داده های مرتبط با آن را از دست خواهید داد از آنجایی که Briar (برایر) از هیچ سرور مرکزی برای ذخیره داده های شما استفاده نمی کند.</string>
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="one">این یک نسخه آزمایشی از Briar (برایر) می باشد. حساب کاربری شما در %d روز آینده به پایان می رسد و امکان تمدید آن وجود نخواهد داشت.</item>
|
||||
<item quantity="other">این یک نسخه آزمایشی از Briar (برایر) می باشد. حساب کاربری شما در %d روز آینده به پایان می رسد و امکان تمدید آن وجود نخواهد داشت.</item>
|
||||
@@ -50,15 +50,15 @@
|
||||
|
||||
بابت تست از شما سپاسگزاریم.</string>
|
||||
<string name="download_briar">برای اینکه به استفاده خود از Briar (برایر) ادامه دهید، لطفا نسخه ۱.۰ را دانلود کنید.</string>
|
||||
<string name="create_new_account">لازم است تا یک حساب کاربری جدید ایجاد کنید، ولی می توانید از همان نام مستعار استفاده کنید.</string>
|
||||
<string name="create_new_account">لازم است تا یک حساب کاربری جدید ایجاد کنید، می توانید از نام مستعار یکسان برای حساب های کاربری استفاده کنید.</string>
|
||||
<string name="download_briar_button">دانلود Briar (برایر) 1.0</string>
|
||||
<string name="startup_open_database">در حال رمزگشایی سیستم ...</string>
|
||||
<string name="startup_migrate_database">در حال ارتقا سیستم ...</string>
|
||||
<string name="startup_compact_database">درحال فشرده سازی پایگاه داده...</string>
|
||||
<string name="startup_open_database">رمزگشایی سیستم ...</string>
|
||||
<string name="startup_migrate_database">به روز رسانی سیستم ...</string>
|
||||
<string name="startup_compact_database">درحال فشردهسازی پایگاه داده...</string>
|
||||
<!--Navigation Drawer-->
|
||||
<string name="nav_drawer_open_description">باز کردن منوی برنامه</string>
|
||||
<string name="nav_drawer_close_description">بستن منوی برنامه</string>
|
||||
<string name="contact_list_button">مخاطبان</string>
|
||||
<string name="contact_list_button">مخاطبین</string>
|
||||
<string name="groups_button">گروه های خصوصی</string>
|
||||
<string name="forums_button">تالار های گفتمان</string>
|
||||
<string name="blogs_button">بلاگ ها</string>
|
||||
@@ -72,7 +72,7 @@
|
||||
<string name="transport_lan">وای فای</string>
|
||||
<!--Notifications-->
|
||||
<string name="reminder_notification_title">از Briar (برایر) خارج شد</string>
|
||||
<string name="reminder_notification_text">برای وارد شدن دوباره ضربه بزنید.</string>
|
||||
<string name="reminder_notification_text">برای وارد شدن دوباره کلیک کنید.</string>
|
||||
<string name="reminder_notification_channel_title">یادآور ورود Briar (برایر)</string>
|
||||
<string name="reminder_notification_dismiss">رد کردن</string>
|
||||
<string name="ongoing_notification_title">وارد Briar (برایر) شد</string>
|
||||
@@ -115,18 +115,16 @@
|
||||
<string name="show_onboarding">نمایش پنجره راهنما</string>
|
||||
<string name="fix">اصلاح</string>
|
||||
<string name="help">راهنما</string>
|
||||
<string name="sorry">پوزش</string>
|
||||
<string name="sorry">متاسفم</string>
|
||||
<!--Contacts and Private Conversations-->
|
||||
<string name="no_contacts">هیچ مخاطبی برای نمایش وجود ندارد</string>
|
||||
<string name="no_contacts_action">برای افزودن مخاطب روی + کلیک کنید</string>
|
||||
<string name="date_no_private_messages">هیچ پیامی موجود نیست</string>
|
||||
<string name="no_private_messages">هیچ پیامی برای نشان دادن وجود ندارد</string>
|
||||
<string name="message_hint">نوشتن پیام</string>
|
||||
<string name="image_caption_hint">افزودن یک شرح (اختیاری)</string>
|
||||
<string name="image_attach">پیوست کردن تصویر</string>
|
||||
<string name="image_attach_error">پیوست کردن تصویر(ها) ممکن نمی باشد</string>
|
||||
<string name="image_attach_error_too_big">تصویر بیش از اندازه بزرگ است. محدودیت %d مگابایت می باشد.</string>
|
||||
<string name="image_attach_error_invalid_mime_type">فرمت تصویر پشتیبانی نمیشود: %s</string>
|
||||
<string name="image_caption_hint">یک عنوان اضافه کنید (اختیاری)</string>
|
||||
<string name="image_attach">تصویر پیوست</string>
|
||||
<string name="image_attach_error">تصویر پیوست نشد</string>
|
||||
<string name="set_contact_alias">تغییر نام مخاطب</string>
|
||||
<string name="set_contact_alias_hint">نام مخاطب</string>
|
||||
<string name="set_alias_button">تغییر</string>
|
||||
@@ -138,19 +136,15 @@
|
||||
<string name="you">شما</string>
|
||||
<string name="save_image">ذخیره تصویر</string>
|
||||
<string name="dialog_title_save_image">ذخیره تصویر؟</string>
|
||||
<string name="dialog_message_save_image">ذخیره این تصویر به دیگر برنامهها اجازه میدهد تا به آن دسترسی داشته باشند.
|
||||
|
||||
آیا از ذخیره کردن مطمئن می باشید؟</string>
|
||||
<string name="dialog_message_save_image">ذخیره این تصویر به دیگر برنامهها اجازه میدهد تا به آن دسترسی داشته باشند.\n\n آیا مطمئن هستید که میخواهید ذخیره کنید؟</string>
|
||||
<string name="save_image_success">تصویر ذخیره شد</string>
|
||||
<string name="save_image_error">تصویر ذخیره نشد</string>
|
||||
<string name="dialog_title_no_image_support">تصاویر در دسترس نمی باشند</string>
|
||||
<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="dialog_title_no_image_support">تصاویر در دسترس نیست</string>
|
||||
<string name="dialog_message_no_image_support">مخاطب برایر شما هنوز از پیوستهای تصویر پشتیبانی نمیکند. هنگامی که آنها را ارتقا دهید یک آیکون دیگر خواهید دید.</string>
|
||||
<string name="dialog_title_image_support">شما هم اکنون میتوانید تصاویر را به این مخاطب ارسال کنید</string>
|
||||
<string name="dialog_message_image_support">برای پیوست تصاویر به روی آیکون ضربه بزنید</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">افزودن مخاطب از نزدیک</string>
|
||||
<string name="face_to_face">برای اضافه کردن فرد به عنوان مخاطب باید با او به صورت حضوری ملاقات کنید.
|
||||
|
||||
این از جعل هویت شما و یا از خوانده شدن پیام هایتان در آینده جلوگیری خواهد کرد.</string>
|
||||
<string name="continue_button">ادامه</string>
|
||||
<string name="try_again_button">دوباره سعی کنید</string>
|
||||
@@ -158,86 +152,29 @@
|
||||
<string name="exchanging_contact_details">تبادیل جزییات مخاطبu2026\</string>
|
||||
<string name="contact_added_toast">مخاطب اضافه شد: %s</string>
|
||||
<string name="contact_already_exists">مخاطب %s از قبل وجود دارد</string>
|
||||
<string name="qr_code_invalid">کد کیوآر نامعتبر می باشد</string>
|
||||
<string name="qr_code_too_old">کد کیوآر اسکن شده متعلق به یک نسخه قدیمی از %s است.
|
||||
<string name="qr_code_invalid">کد QR نامعتبر می باشد</string>
|
||||
<string name="qr_code_too_old">کد QR اسکن شده متعلق به یک نسخه قدیمی از %s است.
|
||||
|
||||
لطفا از مخاطب خود بخواهید تا به آخرین نسخه ارتقا داده و سپس دوباره تلاش کنید.</string>
|
||||
<string name="qr_code_too_new">کد کیوآر اسکن شده توسط شما متعلق به یک نسخه جدیدتر از %s است.
|
||||
لطفا از مخاطبتان بخواهید تا به آخرین نسخه ارتقا داده و سپس دوباره تلاش کنید.</string>
|
||||
<string name="qr_code_too_new">کد QR که شما اسکن کردهاید متعلق به یک نسخه جدیدتر از %s است.
|
||||
|
||||
لطفا به آخرین نسخه ارتقا داده و دوباره تلاش کنید.</string>
|
||||
<string name="camera_error">خطای دوربین</string>
|
||||
<string name="connecting_to_device">اتصال به دستگاهu2026\</string>
|
||||
<string name="authenticating_with_device">تصدیق سازی با دستگاه u2026\</string>
|
||||
<string name="connection_error_title">اتصال به مخاطب شما برقرار نشد</string>
|
||||
<string name="connection_error_explanation">لطفا مطمئن شوید که هر دو شما به شبکه وای فای یکسان متصل هستید.</string>
|
||||
<string name="connection_error_feedback">اگر این مشکل ادامه پیدا کرد، لطفا <a href="feedback">بازخورد ارسال کنید</a> تا به ما در بهبود برنامه کمک کنید.</string>
|
||||
<string name="connection_error_explanation">لطفا مطمئن شوید که هردو شما به شبکه وای فای یکسان متصل هستید.</string>
|
||||
<string name="connection_error_feedback">اگر این مشکل ادامه پیدا کرد، لطفا <a href="feedback">بازخورد ارسال کنید</a> تا به ما در ارتقاء برنامه کمک کنید.</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">افزودن مخاطب از دور</string>
|
||||
<string name="add_contact_nearby_title">افزودن مخاطب از نزدیک</string>
|
||||
<string name="add_contact_remotely_title">افزودن مخاطب از راه دور</string>
|
||||
<string name="contact_name_hint">دادن یک نام مستعار به مخاطب</string>
|
||||
<string name="contact_link_intro">پیوند آمده از مخاطب خود را اینجا وارد کنید</string>
|
||||
<string name="contact_link_hint">پیوند مخاطب</string>
|
||||
<string name="paste_button">چسباندن</string>
|
||||
<string name="add_contact_button">افزودن مخاطب</string>
|
||||
<string name="copy_button">کپی</string>
|
||||
<string name="share_button">اشتراک گذاری</string>
|
||||
<string name="send_link_title">تبادل پیوندها</string>
|
||||
<string name="add_contact_choose_nickname">انتخاب نام مستعار</string>
|
||||
<string name="add_contact_choose_a_nickname">یک نام مستعار وارد کنید</string>
|
||||
<string name="nickname_intro">به مخاطب خود یک نام مستعار بدهید. فقط شما قادر به دیدن آن می باشید.</string>
|
||||
<string name="your_link">برای افزودن مخاطب این پیوند را به او بدهید</string>
|
||||
<string name="link_clip_label">پیوند Briar (برایر)</string>
|
||||
<string name="link_copied_toast">پیوند کپی شد</string>
|
||||
<string name="adding_contact_error">یک خطا هنگام افزودن مخاطب رخ داد.</string>
|
||||
<string name="pending_contact_requests_snackbar">درخواست های مخاطب معلق وجود دارند</string>
|
||||
<string name="pending_contact_requests">درخواست های مخاطب معلق</string>
|
||||
<string name="no_pending_contacts">هیچ مخاطب معلقی وجود ندارد</string>
|
||||
<string name="copy_button">تکثیر</string>
|
||||
<string name="share_button">همرسانی</string>
|
||||
<string name="add_contact_remote_connecting">در حال اتصال…</string>
|
||||
<string name="waiting_for_contact_to_come_online">انتظار برای آنلاین شدن مخاطب...</string>
|
||||
<string name="connecting">در حال اتصال…</string>
|
||||
<string name="adding_contact">در حال افزودن مخاطب...</string>
|
||||
<string name="adding_contact_failed">افزودن مخاطب ناموفق بود</string>
|
||||
<string name="dialog_title_remove_pending_contact">تایید حذف</string>
|
||||
<string name="dialog_message_remove_pending_contact">این مخاطب هنوز در حال اضافه شدن می باشد. اگر اکنون آن را حذف کنید، دیگر افزوده نخواهد شد.</string>
|
||||
<string name="own_link_error">به جای پیوند خود، پیوند مخاطب را وارد کنید</string>
|
||||
<string name="nickname_missing">لطفا یک نام مستعار وارد کنید</string>
|
||||
<string name="invalid_link">پیوند نامعتبر</string>
|
||||
<string name="unsupported_link">این پیوند از یک نسخه جدیدتر Briar (برایر) آمده است. لطفا به آخرین نسخه ارتقا دهید و دوباره امتحان کنید.</string>
|
||||
<string name="intent_own_link">شما پیوند خود را باز کردید. پیوند مخاطبی که میخواهید اضافه کنید را استفاده کنید!</string>
|
||||
<string name="missing_link">لطفا یک پیوند وارد کنید</string>
|
||||
<!--This is a numeral indicating the first step in a series of screens-->
|
||||
<string name="step_1">۱</string>
|
||||
<!--This is a numeral indicating the second step in a series of screens-->
|
||||
<string name="step_2">۲</string>
|
||||
<plurals name="contact_added_notification_text">
|
||||
<item quantity="one">مخاطب جدید افزوده شد.</item>
|
||||
<item quantity="other">%d مخاطب جدید افزوده شد.</item>
|
||||
</plurals>
|
||||
<string name="adding_contact_slow_warning">افزودن این مخاطب بیشتر از حد معمول وقت گرفته است</string>
|
||||
<string name="adding_contact_slow_title">عدم توانایی در اتصال به مخاطب</string>
|
||||
<string name="adding_contact_slow_text">افزودن این مخاطب بیش تر از معمول وقت گرفته است.
|
||||
|
||||
لطفا بررسی کنید که مخاطب شما پیوندتان را دریافت کرده و شما را افزوده است:</string>
|
||||
<string name="offline_state">ارتباط با اینترنت برقرار نیست</string>
|
||||
<string name="duplicate_link_dialog_title">پیوند تکراری</string>
|
||||
<string name="duplicate_link_dialog_text_1">شما هم اکنون یک مخاطب معلق با این پیوند دارید: %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
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
<string name="same_person_button">همان شخص</string>
|
||||
<!--This is a button for answering that two nicknames refer to different people. This string
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">شخص متفاوت</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s و %s پیوند یکسانی را به شما ارسال کردند.
|
||||
|
||||
یکی از آن ها ممکن است سعی در شناسایی مخاطبان شما داشته باشد.
|
||||
|
||||
به آن ها نگویید که همان لینک را از یک شخص دیگر دریافت کرده اید.</string>
|
||||
<string name="pending_contact_updated_toast">مخاطب معلق به روز رسانی شد</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">معرفی مخاطبان</string>
|
||||
<string name="introduction_onboarding_text">شما می توانید مخاطبان خود را به یکدیگر معرفی کنید، در این صورت دیگر نیازی به دیدار حضوری برای اتصال روی Briar (برایر) نمی باشد.</string>
|
||||
@@ -430,11 +367,11 @@
|
||||
<string name="blogs_rss_feeds_manage_delete_error">خوراک نمی تواند پاک شود!</string>
|
||||
<string name="blogs_rss_feeds_manage_empty_state">هیچ خوراک RSS برای نمایش وجود ندارد
|
||||
|
||||
برای وارد کردن خوراک روی آیکون + ضربه بزنید</string>
|
||||
برای وارد کردن خوراک روی آیکون + کلیک کنید</string>
|
||||
<string name="blogs_rss_feeds_manage_error">مشکلی با بارگذاری فیدهای شما وجود داشت. لطفا بعدا امتحان کنید.</string>
|
||||
<!--Settings Display-->
|
||||
<string name="pref_language_title">زبان و منطقه</string>
|
||||
<string name="pref_language_changed">این تنظیمات زمانی که Briar (برایر) را ری استارت کنید تاثیر خود را می گذارند. لطفا خارج شوید و Briar (برایر) را دوباره راه اندازی کنید.</string>
|
||||
<string name="pref_language_changed">این تنظیمات زمانی که Briar (برایر) را ری استارت کنید تاثیر خود را می گذارند. لطفا خارج شوید و Briar (برایر) را ری استارت کنید.</string>
|
||||
<string name="pref_language_default">پیش فرض سیستم</string>
|
||||
<string name="display_settings_title">نمایش</string>
|
||||
<string name="pref_theme_title">قالب</string>
|
||||
@@ -448,15 +385,15 @@
|
||||
<string name="bluetooth_setting_enabled">هر زمانی که مخاطبان نزدیک هستند</string>
|
||||
<string name="bluetooth_setting_disabled">فقط در هنگام افزودن مخاطبان</string>
|
||||
<string name="tor_network_setting">اتصال از طریق اینترنت (تور)</string>
|
||||
<string name="tor_network_setting_automatic">خودکار مبتنی بر موقعیت</string>
|
||||
<string name="tor_network_setting_without_bridges">استفاده از تور بدون پل ها</string>
|
||||
<string name="tor_network_setting_with_bridges">استفاده از تور با پل ها</string>
|
||||
<string name="tor_network_setting_automatic">اتوماتیک مبتنی بر مکان</string>
|
||||
<string name="tor_network_setting_without_bridges">استفاده از تور بدون بریج</string>
|
||||
<string name="tor_network_setting_with_bridges">استفاده از تور با بریج</string>
|
||||
<string name="tor_network_setting_never">وصل نشو</string>
|
||||
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||
<string name="tor_network_setting_summary">خودکار: %1$s(در %2$s)</string>
|
||||
<string name="tor_mobile_data_title">استفاده از داده موبایل</string>
|
||||
<string name="tor_only_when_charging_title">اتصال از طریق اینترنت (تور) فقط در هنگام شارژ</string>
|
||||
<string name="tor_only_when_charging_summary">ارتباط اینترنت را هنگامی که دستگاه در حال استفاده از باتری خود می باشد را غیرفعال می کند</string>
|
||||
<string name="tor_only_when_charging_summary">وقتی دستگاه با باتری در حال اجرا است، ارتباط به اینترنت را غیرفعال میکند</string>
|
||||
<!--Settings Security and Panic-->
|
||||
<string name="security_settings_title">امنیت</string>
|
||||
<string name="pref_lock_title">قفل برنامه</string>
|
||||
@@ -477,17 +414,17 @@
|
||||
<string name="pref_lock_timeout_60">۱ ساعت</string>
|
||||
<string name="pref_lock_timeout_never">هرگز</string>
|
||||
<string name="pref_lock_timeout_never_summary">هیچوقت Briar (برایر) را به صورت خودکار قفل نکن</string>
|
||||
<string name="change_password">تغییر گذرواژه</string>
|
||||
<string name="current_password">گذرواژه فعلی</string>
|
||||
<string name="choose_new_password">گذرواژه جدید</string>
|
||||
<string name="confirm_new_password">تائید گذرواژه جدید</string>
|
||||
<string name="password_changed">گذرواژه تغییر کرده است</string>
|
||||
<string name="panic_setting">نصب دکمه هراس</string>
|
||||
<string name="change_password">تغییر رمز عبور</string>
|
||||
<string name="current_password">رمز عبور فعلی</string>
|
||||
<string name="choose_new_password">رمز عبور جدید</string>
|
||||
<string name="confirm_new_password">تائید رمز جدید</string>
|
||||
<string name="password_changed">رمز عبور تغییر کرده است</string>
|
||||
<string name="panic_setting">برپایی دکمه هراس</string>
|
||||
<string name="panic_setting_title">دکمه هراس</string>
|
||||
<string name="panic_setting_hint">تنظیم نحوه واکنش Briar (برایر) هنگام فعال سازی دکمه هراس</string>
|
||||
<string name="panic_app_setting_title">برنامه دکمه هراس</string>
|
||||
<string name="unknown_app">یک برنامه ناشناخته</string>
|
||||
<string name="panic_app_setting_summary">هیچ برنامه ای تنظیم نشده است</string>
|
||||
<string name="panic_app_setting_summary">هیچ برنامه تنظیم نشده است</string>
|
||||
<string name="panic_app_setting_none">هیچکدام</string>
|
||||
<string name="dialog_title_connect_panic_app">تایید برنامه هراس</string>
|
||||
<string name="dialog_message_connect_panic_app">آیا مطمئن هستید که میخواهید به %1$s اجازه دهید تا باعث عملیات مخرب دکمه هراس بشود؟</string>
|
||||
@@ -495,7 +432,7 @@
|
||||
<string name="panic_setting_signout_title">خروج</string>
|
||||
<string name="panic_setting_signout_summary">در صورت کلیک بر روی کلید هراس از Briar (برایر) خارج شو</string>
|
||||
<string name="purge_setting_title">حذف حساب کاربری</string>
|
||||
<string name="purge_setting_summary">در صورت فشار دادن دکمه هراس حساب کاربری Briar (برایر) شما حذف خواهد شد. اخطار: این باعث حذف دائمی تمام هویت ها، مخاطبان و پیام های شما خواهد شد</string>
|
||||
<string name="purge_setting_summary">پاک کردن حساب کاربری Briar (برایر) شما در صورتی که دکمه هراس فشار داده شود. اخطار: این باعث پاک شدن دائمی تمام هویت ها، مخاطبان و پیام های شما خواهد شد</string>
|
||||
<string name="uninstall_setting_title">پاک کردن Briar (برایر)</string>
|
||||
<string name="uninstall_setting_summary">این نیازمند تایید دستی در موعد هراس میباشد</string>
|
||||
<!--Settings Notifications-->
|
||||
@@ -524,10 +461,10 @@
|
||||
<string name="feedback_settings_title">بازخورد</string>
|
||||
<string name="send_feedback">ارسال بازخورد</string>
|
||||
<!--Link Warning-->
|
||||
<string name="link_warning_title">هشدار پیوند</string>
|
||||
<string name="link_warning_title">هشدار لینک</string>
|
||||
<string name="link_warning_intro">با باز کردن لینک زیر شما یک برنامه بیرونی را باز خواهید کرد.</string>
|
||||
<string name="link_warning_text">این میتواند برای شناسایی شما مورد استفاده قرار بگیرد. قبل از باز کردن این پیوند به قابل اطمینان بودن شخصی که آن را برای شما ارسال کرده فکر کنید و بعد برای احتیاط آن را با مرورگر تور باز کنید.</string>
|
||||
<string name="link_warning_open_link">باز کردن پیوند</string>
|
||||
<string name="link_warning_text">این میتواند برای شناسایی شما مورد استفاده قرار بگیرد. قبل از باز کردن آن به قابل اطمینان بودن شخصی که آن را برای شما ارسال کرده فکر کنید و بعد برای احتیاط آن را با مرورگر تور باز کنید.</string>
|
||||
<string name="link_warning_open_link">باز کردن لینک</string>
|
||||
<!--Crash Reporter-->
|
||||
<string name="crash_report_title">گزارش خطای Briar (برایر)</string>
|
||||
<string name="briar_crashed">متاسفیم، Briar (برایر) از کار افتاده است.</string>
|
||||
@@ -556,27 +493,21 @@
|
||||
<string name="screen_filter_allow">به این برنامه ها اجازه بده تا روی Briar (برایر) قرار بگیرند</string>
|
||||
<!--Permission Requests-->
|
||||
<string name="permission_camera_title">دسترسی به دوربین</string>
|
||||
<string name="permission_camera_request_body">برای اسکن کردن کد کیوآر دسترسی به دوربین لازم است.</string>
|
||||
<string name="permission_location_title">اجازه موقعیت</string>
|
||||
<string name="permission_location_request_body">برای پیدا کردن دستگاههای بلوتوث، Briar (برایر) نیاز به اجازه دسترسی به موقعیت شما دارد.
|
||||
|
||||
Briar (برایر) موقعیت شما را ذخیره نمیکند و آن را با کسی به اشتراک نمیگذارد.</string>
|
||||
<string name="permission_camera_request_body">برای اسکن کردن کد QR دسترسی به دوربین لازم است.</string>
|
||||
<string name="permission_location_title">مجوز موقعیت محل</string>
|
||||
<string name="permission_location_request_body">برای پیدا کردن دستگاههای بلوتوث، برایر نیاز به اجازه دسترسی به موقعیت مکانی شما دارد.\n\n برایر موقعیت مکان شما را ذخیره نمیکند و آن را با کسی به اشتراک نمیگذارد.</string>
|
||||
<string name="permission_camera_location_title">دوربین و موقعیت</string>
|
||||
<string name="permission_camera_location_request_body">برای اسکن کد کیوآر، Briar (برایر) نیاز به دسترسی به دوربین دارد.
|
||||
|
||||
برای پیدا کردن دستگاههای بلوتوث، Briar (برایر) نیاز به اجازه دسترسی به موقعیت شما دارد.
|
||||
|
||||
Briar (برایر) موقعیت شما را ذخیره نمیکند و آن را با کسی به اشتراک نمیگذارد.</string>
|
||||
<string name="permission_camera_location_request_body">برای اسکن کد کیوآر، برایر نیاز به دسترسی به دوربین دارد.\n\n برای پیدا کردن دستگاههای بلوتوث، برایر نیاز به اجازه دسترسی به موقعیت مکانی شما دارد.\n\n برایر موقعیت مکان شما را ذخیره نمیکند و آن را با کسی به اشتراک نمیگذارد.</string>
|
||||
<string name="permission_camera_denied_body">شما دسترسی به دوربین را رد کرده اید، اما افزودن مخاطب نیاز به دوربین دارد.
|
||||
|
||||
لطفا اجازه دسترسی را بدهید.</string>
|
||||
<string name="qr_code">کد کیوآر</string>
|
||||
<string name="show_qr_code_fullscreen">نمایش کد کیوآر به صورت فول اسکرین</string>
|
||||
<string name="qr_code">کد QR</string>
|
||||
<string name="show_qr_code_fullscreen">نمایش کد QR به صورت فول اسکرین</string>
|
||||
<!--App Locking-->
|
||||
<string name="lock_unlock">باز کردن قفل Briar (برایر)</string>
|
||||
<string name="lock_unlock_verbose">پین، الگو یا گذرواژه دستگاه خود را برای باز کردن قفل Briar (برایر) وارد کنید</string>
|
||||
<string name="lock_unlock">آنلاک کردن Briar (برایر)</string>
|
||||
<string name="lock_unlock_verbose">PIN، الگو یا رمز عبور دستگاه خود را برای آنلاک کردن Briar (برایر) وارد کنید</string>
|
||||
<string name="lock_unlock_fingerprint_description">برای ادامه سنسور اثر انگشت را با انگشت ثبت شده تان لمس کنید</string>
|
||||
<string name="lock_unlock_password">استفاده از گذرواژه</string>
|
||||
<string name="lock_unlock_password">از رمز عبور استفاده کنید</string>
|
||||
<string name="lock_is_locked">Briar (برایر) قفل می باشد</string>
|
||||
<string name="lock_tap_to_unlock">برای آنلاک کردن کلیک کنید</string>
|
||||
<!--Screenshots-->
|
||||
@@ -589,7 +520,7 @@ Briar (برایر) موقعیت شما را ذخیره نمیکند و آن
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Bob!-->
|
||||
<string name="screenshot_message_1">هی باب!</string>
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Alice!-->
|
||||
<string name="screenshot_message_2">هی آلیس! ممنون از اینکه درباره Briar (برایر) به من گفتی!</string>
|
||||
<string name="screenshot_message_2">هی آلیس! ممنون از اینکه درباره Briar به من گفتی!</string>
|
||||
<!--This is a message to be used in screenshots.-->
|
||||
<string name="screenshot_message_3">خواهش میکنم، امیدوارم ازش خوشت بیاد 😀</string>
|
||||
</resources>
|
||||
|
||||
@@ -118,9 +118,7 @@
|
||||
<string name="message_hint">Esciba unha mensaxe</string>
|
||||
<string name="image_caption_hint">Engadir un comentario (optativo)</string>
|
||||
<string name="image_attach">Anexar imaxe</string>
|
||||
<string name="image_attach_error">Non se anexaron imaxe(s)</string>
|
||||
<string name="image_attach_error_too_big">Imaxe demasiado grande. Max %d MB.</string>
|
||||
<string name="image_attach_error_invalid_mime_type">Formato non admitido: %s</string>
|
||||
<string name="image_attach_error">Non se anexou a imaxe</string>
|
||||
<string name="set_contact_alias">Cambiar o nome do contacto</string>
|
||||
<string name="set_contact_alias_hint">Nome do contacto</string>
|
||||
<string name="set_alias_button">Cambiar</string>
|
||||
@@ -140,7 +138,6 @@
|
||||
<string name="dialog_title_image_support">Xa pode enviar imaxes a este contacto</string>
|
||||
<string name="dialog_message_image_support">Toque en esta icona para anexar imaxes.</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">Engadir contacto próximo</string>
|
||||
<string name="face_to_face">Debe atoparse coa persoa que quere engadir como contacto.\n\Isto evitará que calquera poida suplantala ou ler as súas mensaxes no futuro.</string>
|
||||
<string name="continue_button">Continuar</string>
|
||||
<string name="try_again_button">Tenteo de novo</string>
|
||||
@@ -158,66 +155,13 @@
|
||||
<string name="connection_error_explanation">Por favor, comprobe que ambas están conectadas a mesma rede Wi-Fi.</string>
|
||||
<string name="connection_error_feedback">Si persiste o problema,<a href="feedback">envíe un informe</a> para axudarnos a mellorar a app.</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">Engadir contacto a distancia</string>
|
||||
<string name="add_contact_nearby_title">Engadir contacto próximo</string>
|
||||
<string name="add_contact_remotely_title">Engadir contacto a distancia</string>
|
||||
<string name="contact_name_hint">Darlle un alcume ao contacto</string>
|
||||
<string name="contact_link_intro">Introducir aquí a ligazón do seu contacto</string>
|
||||
<string name="contact_link_hint">Ligazón do contacto</string>
|
||||
<string name="paste_button">Pegar</string>
|
||||
<string name="add_contact_button">Engadir contacto</string>
|
||||
<string name="copy_button">Copiar</string>
|
||||
<string name="share_button">Compartir</string>
|
||||
<string name="send_link_title">Intercambiar ligazóns</string>
|
||||
<string name="add_contact_choose_nickname">Escoller alcume</string>
|
||||
<string name="add_contact_choose_a_nickname">Introducir alcume</string>
|
||||
<string name="nickname_intro">Déalle un alcume ao contacto. Só vostede pode velo.</string>
|
||||
<string name="your_link">Envíe esta ligazón ao contacto que quere engadir</string>
|
||||
<string name="link_clip_label">Ligazón Briar</string>
|
||||
<string name="link_copied_toast">Ligazón copiada</string>
|
||||
<string name="adding_contact_error">Algo fallou ao engadir o contacto.</string>
|
||||
<string name="pending_contact_requests_snackbar">Existen solicitudes de contactos pendentes</string>
|
||||
<string name="pending_contact_requests">Solicitudes Pendentes de Contactos</string>
|
||||
<string name="no_pending_contacts">Sen contactos pendentes</string>
|
||||
<string name="add_contact_remote_connecting">Conectando...</string>
|
||||
<string name="waiting_for_contact_to_come_online">Agardando a que o contacto se conecte...</string>
|
||||
<string name="connecting">Conectando...</string>
|
||||
<string name="adding_contact">Engadindo contacto...</string>
|
||||
<string name="adding_contact_failed">Fallou engadir contacto</string>
|
||||
<string name="dialog_title_remove_pending_contact">Confirme a eliminación</string>
|
||||
<string name="dialog_message_remove_pending_contact">Este contacto aínda está a ser engadido. Se o elimina agora, non será engadido.</string>
|
||||
<string name="own_link_error">Introduza a ligazón do contacto, non o propio</string>
|
||||
<string name="nickname_missing">Por favor introduza un alcume</string>
|
||||
<string name="invalid_link">Ligazón non válida</string>
|
||||
<string name="unsupported_link">Esta ligazón chega desde unha versión nova de Briar. Por favor, actualice a nova versión e inténteo de novo.</string>
|
||||
<string name="intent_own_link">Abreu a súa propia ligazón. Utilice a do contacto que quere engadir!</string>
|
||||
<string name="missing_link">Por favor introduza ligazón</string>
|
||||
<!--This is a numeral indicating the first step in a series of screens-->
|
||||
<string name="step_1">1</string>
|
||||
<!--This is a numeral indicating the second step in a series of screens-->
|
||||
<string name="step_2">2</string>
|
||||
<plurals name="contact_added_notification_text">
|
||||
<item quantity="one">Novo contacto engadido.</item>
|
||||
<item quantity="other">%d novos contactos engadidos.</item>
|
||||
</plurals>
|
||||
<string name="adding_contact_slow_warning">Estanos a costar moito tempo engadir esta usuaria</string>
|
||||
<string name="adding_contact_slow_title">Non puido conectar co Contacto</string>
|
||||
<string name="adding_contact_slow_text">Estanos a costar engadir este contacto.\n\nPor favor, comprobe que o contacto recibeu a súa ligazón e engadeuna a vostede:</string>
|
||||
<string name="offline_state">Sen conexión a internet</string>
|
||||
<string name="duplicate_link_dialog_title">Duplicar Ligazón</string>
|
||||
<string name="duplicate_link_dialog_text_1">Xa ten un contacto pendente con esta ligazón: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Son %s e %s a mesma persoa?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
<string name="same_person_button">Mesma Persoa</string>
|
||||
<!--This is a button for answering that two nicknames refer to different people. This string
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Diferente Persoa</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s e %s enviaronlle a mesma ligazón.\n\nUnha delas podería estar a intentar descubrir os seus contactos.\n\nNon lles diga que recibeu a mesma ligazón de alguén máis.</string>
|
||||
<string name="pending_contact_updated_toast">Contacto pendente actualizado</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Presente aos seus contactos</string>
|
||||
<string name="introduction_onboarding_text">Pode presentar aos seus contactos, así non precisan encontrarse en persoa para conectar a través de Briar.</string>
|
||||
|
||||
@@ -1,488 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!--Setup-->
|
||||
<string name="setup_title">Velkomin í Briar</string>
|
||||
<string name="setup_name_explanation">Stuttnefnið þitt birtist við hlið alls þess efnis sem þú sendir inn. Þú getur ekki breytt því eftir að þú hefur skráð notandaaðganginn þinn.</string>
|
||||
<string name="setup_next">Næsta</string>
|
||||
<string name="setup_password_intro">Veldu lykilorð</string>
|
||||
<string name="setup_password_explanation">Notandaaðgangur þinn í Briar er geymdur dulritaður á tækinu þínu, ekki í tölvuskýi. Ef þú gleymir lykilorðinu þínu eða fjarlægir Briar, þá er engin leið til að endurheimta notandaaðganginn þinn.\n\nVeldu langt lykilorð sem erfitt er að giska á, svo sem eins og fjögur orð af handahófi, eða slembna samsetningu tíu bósktafa, tölustafa og tákna.</string>
|
||||
<string name="setup_doze_title">Bakgrunnstengingar</string>
|
||||
<string name="setup_doze_intro">Til að taka á móti skilaboðum þarf Briar að haldast tengt í bakgrunni.</string>
|
||||
<string name="setup_doze_explanation">Til að taka á móti skilaboðum þarf Briar að haldast tengt í bakgrunni. Gerðu orkusparnaðarferli óvirk svo Briar geti haldið tengingum.</string>
|
||||
<string name="setup_doze_button">Leyfa tengingar</string>
|
||||
<string name="choose_nickname">Veldu þér stuttnefni</string>
|
||||
<string name="choose_password">Veldu þér lykilorð</string>
|
||||
<string name="confirm_password">Staðfestu lykilorðið</string>
|
||||
<string name="name_too_long">Nafnið er of langt</string>
|
||||
<string name="password_too_weak">Lykilorðið er of veikt</string>
|
||||
<string name="passwords_do_not_match">Lykilorðin stemma ekki</string>
|
||||
<string name="create_account_button">Búa til notandaaðgang</string>
|
||||
<string name="more_info">Nánari upplýsingar</string>
|
||||
<string name="don_t_ask_again">Ekki spyrja aftur</string>
|
||||
<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="warning_dozed">%s gat ekki keyrt í bakgrunni</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Lykilorð</string>
|
||||
<string name="try_again">Rangt lykilorð, reyndu aftur</string>
|
||||
<string name="sign_in_button">Skrá inn</string>
|
||||
<string name="forgotten_password">Ég hef gleymt lykilorðinu mínu</string>
|
||||
<string name="dialog_title_lost_password">Týnt lykilorð</string>
|
||||
<string name="dialog_message_lost_password">Notandaaðgangur þinn í Briar er geymdur dulritaður á tækinu þínu, ekki í tölvuskýi, þannig að við getum ekki endurstillt lykilorðið þitt. Myndirðu vilja eyða notandaaðgangnum þínum og byrja aftur?\n\nVarúð: Auðkennin þín, tengiliðir og skilaboð munu tapast óendurkræft.</string>
|
||||
<string name="startup_failed_notification_title">Gat ekki ræst Briar.</string>
|
||||
<string name="startup_failed_notification_text">Ýttu til að sjá meiri upplýsingar.</string>
|
||||
<string name="startup_failed_activity_title">Bilun í ræsingu Briar</string>
|
||||
<string name="startup_failed_db_error">Af einhverjum ástæðum er Briar-gagnagrunnurinn svo skemmdur að ekki er hægt að laga hann. Notandaaðgangurinn þinn, gögnin þín og allir tengiliðir hafa tapast. Því miður þarft þú að setja Briar upp aftur, eða setja upp nýjan notandaaðgang með því að velja \'Ég hef gleymt lykilorðinu mínu\' þegar beðið er um lykilorð.</string>
|
||||
<string name="startup_failed_data_too_old_error">Notandaaðgangurinn þinn var útbúinn með eldri útgáfu forritsins og er ekki hægt að opna hann með þessari útgáfu. Þú þarft annað hvort að setja gömlu útgáfuna aftur, eða setja upp nýjan notandaaðgang með því að velja \'Ég hef gleymt lykilorðinu mínu\' þegar beðið er um lykilorð.</string>
|
||||
<string name="startup_failed_data_too_new_error">Þessi útgáfa forritsins er of gömul. Uppfærðu í nýjustu útgáfuna og prófaðu síðan aftur.</string>
|
||||
<string name="startup_failed_service_error">Briar tókst ekki að ræsa nauðsynlega forritsviðbót. Venjulega er nóg að setja Briar upp aftur til að leysa þetta vandamál. Hinsvegar, athugaðu að þá munt þú missa notandaaðganginn þinn ásamt öllum gögnum honum tengdum, því Briar notar ekki miðlæga þjóna til að geyma gögnin þín.</string>
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="one">Þetta er prufuútgáfa af Briar. Notandaaðgangurinn þinn mun renna út eftir %d dag og er ekki hægt að endurnýja hann.</item>
|
||||
<item quantity="other">Þetta er prufuútgáfa af Briar. Notandaaðgangurinn þinn mun renna út eftir %d daga og er ekki hægt að endurnýja hann.</item>
|
||||
</plurals>
|
||||
<string name="expiry_update">Dagsetningin fyrir prufuútgáfuna hefur verið framlengd. Notandaaðgangurinn þinn mun núna renna út eftir %d daga.</string>
|
||||
<string name="expiry_date_reached">Þessi hugbúnaður er úreltur.\nTakk fyrir að hafa tekið þátt í prófunum!</string>
|
||||
<string name="download_briar">Til að halda áfram að nota Briar, ættirðu að sækja útgáfu 1.0.</string>
|
||||
<string name="create_new_account">Þú þarft að búa til nýjan notandaaðgang, en þú getur notað áfram sama stuttnefni.</string>
|
||||
<string name="download_briar_button">Sækja Briar 1.0</string>
|
||||
<string name="startup_open_database">Afkóða gagnagrunn…</string>
|
||||
<string name="startup_migrate_database">Uppfæri gagnagrunn…</string>
|
||||
<string name="startup_compact_database">Þjappa gagnagrunni…</string>
|
||||
<!--Navigation Drawer-->
|
||||
<string name="nav_drawer_open_description">Opna leiðsagnarsleðann</string>
|
||||
<string name="nav_drawer_close_description">Loka leiðsagnarsleðanum</string>
|
||||
<string name="contact_list_button">Tengiliðir</string>
|
||||
<string name="groups_button">Einkahópar</string>
|
||||
<string name="forums_button">Vefspjallsvæði</string>
|
||||
<string name="blogs_button">Blogg</string>
|
||||
<!--This is part of the main menu. The app will be locked when this is tapped.-->
|
||||
<string name="lock_button">Læsa forriti</string>
|
||||
<string name="settings_button">Stillingar</string>
|
||||
<string name="sign_out_button">Skrá út</string>
|
||||
<!--Transports-->
|
||||
<string name="transport_tor">Internet</string>
|
||||
<string name="transport_bt">Bluetooth</string>
|
||||
<string name="transport_lan">Þráðlaust Wi-Fi net</string>
|
||||
<!--Notifications-->
|
||||
<string name="reminder_notification_title">Skráð út úr Briar</string>
|
||||
<string name="reminder_notification_text">Ýttu til að skrá þig aftur inn.</string>
|
||||
<string name="reminder_notification_channel_title">Áminning um innskráningu í Briar</string>
|
||||
<string name="reminder_notification_dismiss">Hafna</string>
|
||||
<string name="ongoing_notification_title">Skráð inn í Briar</string>
|
||||
<string name="ongoing_notification_text">Snertu til að opna Briar.</string>
|
||||
<plurals name="private_message_notification_text">
|
||||
<item quantity="one"> Ný einkaskilaboð.</item>
|
||||
<item quantity="other">%d ný einkaskilaboð.</item>
|
||||
</plurals>
|
||||
<plurals name="group_message_notification_text">
|
||||
<item quantity="one">Ný hópskilaboð</item>
|
||||
<item quantity="other">%d ný hópskilaboð.</item>
|
||||
</plurals>
|
||||
<plurals name="forum_post_notification_text">
|
||||
<item quantity="one">Ný færsla á spjallsvæði.</item>
|
||||
<item quantity="other">%d nýjar færslur á spjallsvæði.</item>
|
||||
</plurals>
|
||||
<plurals name="blog_post_notification_text">
|
||||
<item quantity="one">Ný bloggfærsla.</item>
|
||||
<item quantity="other">%d nýjar bloggfærslur.</item>
|
||||
</plurals>
|
||||
<!--Misc-->
|
||||
<string name="now">núna</string>
|
||||
<string name="show">Birta</string>
|
||||
<string name="hide">Fela</string>
|
||||
<string name="ok">Í lagi</string>
|
||||
<string name="cancel">Hætta við</string>
|
||||
<string name="got_it">Náði því</string>
|
||||
<string name="delete">Eyða</string>
|
||||
<string name="accept">Samþykkja</string>
|
||||
<string name="decline">Hafna</string>
|
||||
<string name="options">Valkostir</string>
|
||||
<string name="online">Nettengt</string>
|
||||
<string name="offline">Ónettengt</string>
|
||||
<string name="send">Senda</string>
|
||||
<string name="allow">Leyfa</string>
|
||||
<string name="open">Opna</string>
|
||||
<string name="no_data">Engin gögn</string>
|
||||
<string name="ellipsis">…</string>
|
||||
<string name="text_too_long">Textinn sem var settur inn er of langur</string>
|
||||
<string name="show_onboarding">Birta hjálparglugga</string>
|
||||
<string name="fix">Laga</string>
|
||||
<string name="help">Hjálp</string>
|
||||
<string name="sorry">Því miður</string>
|
||||
<!--Contacts and Private Conversations-->
|
||||
<string name="no_contacts">Engir tengiliðir til að birta</string>
|
||||
<string name="no_contacts_action">Ýttu á + táknið til að bæta við tengilið</string>
|
||||
<string name="date_no_private_messages">Engin skilaboð.</string>
|
||||
<string name="no_private_messages">Engin skilaboð sem hægt er að birta</string>
|
||||
<string name="message_hint">Skrifaðu skilaboð</string>
|
||||
<string name="image_caption_hint">Bæta við fyrirsögn (valfrjálst)</string>
|
||||
<string name="image_attach">Hengja við mynd</string>
|
||||
<string name="set_contact_alias">Breyta nafni tengiliðar</string>
|
||||
<string name="set_contact_alias_hint">Nafn tengiliðar</string>
|
||||
<string name="set_alias_button">Breyta</string>
|
||||
<string name="delete_contact">Eyða tengilið</string>
|
||||
<string name="dialog_title_delete_contact">Staðfesta eyðingu tengiliðar</string>
|
||||
<string name="dialog_message_delete_contact">Ertu viss að þú viljir fjarlægja þennan tengilið ásamt öllum þeim skilaboðum sem ykkur hafa farið á milli?</string>
|
||||
<string name="contact_deleted_toast">Tengilið eytt</string>
|
||||
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
|
||||
<string name="you">Þú</string>
|
||||
<string name="save_image">Vista mynd</string>
|
||||
<string name="dialog_title_save_image">Vista mynd?</string>
|
||||
<string name="dialog_message_save_image">Ef þú vistar myndina geta önnur forrit fengið aðgang að henni.\n\nErtu viss um að þú viljir vista ?</string>
|
||||
<string name="save_image_success">Mynd var vistuð</string>
|
||||
<string name="save_image_error">Gat ekki vistað mynd</string>
|
||||
<string name="dialog_title_no_image_support">Myndir ekki tiltækar</string>
|
||||
<string name="dialog_message_no_image_support">Briar-útgáfa tengiliðarins þíns styður ekki ennþá myndaviðhengi. Þegar þeir verða búnir að uppgæra hugbúnaðinn muntu sjá öðruvísi tákn.</string>
|
||||
<string name="dialog_title_image_support">Þú getur núna sent myndir til þessa tengiliðar</string>
|
||||
<string name="dialog_message_image_support">Ýttu á þessa táknmynd til að hengja við myndir.</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="face_to_face">Þú verður að hitta persónuna sem þú vilt bæta við sem tengilið.\n\nÞetta kemur í veg fyrir að nokkur geti látist vera þú eða nokkur geti framvegis lesið skilaboðin þín.</string>
|
||||
<string name="continue_button">Halda áfram</string>
|
||||
<string name="try_again_button">Reyndu aftur</string>
|
||||
<string name="waiting_for_contact_to_scan">Bíð eftir að tengiliður skanni og tengist\u2026</string>
|
||||
<string name="exchanging_contact_details">Skiptist á upplýsingum um tengilið\u2026</string>
|
||||
<string name="contact_added_toast">Tengilið bætt við: %s</string>
|
||||
<string name="contact_already_exists">Tengiliðurinn %s er þegar til</string>
|
||||
<string name="qr_code_invalid">QR-kóðinn er ógildur</string>
|
||||
<string name="qr_code_too_old">QR-kóðinn sem þú skannaðir kemur frá eldri útgáfu af %s.\n\nBiddu tengiliðinn þinn um að uppfæra í nýjustu útgáfuna og prófaðu síðan aftur.</string>
|
||||
<string name="qr_code_too_new">QR-kóðinn sem þú skannaðir kemur frá nýrri útgáfu af %s.\n\nUppfærðu í nýjustu útgáfuna og prófaðu síðan aftur.</string>
|
||||
<string name="camera_error">Villa í myndavél</string>
|
||||
<string name="connecting_to_device">Tengist við tæki\u2026</string>
|
||||
<string name="authenticating_with_device">Auðkenni við tæki\u2026</string>
|
||||
<string name="connection_error_title">Gat ekki tengst við tengiliðinn þinn</string>
|
||||
<string name="connection_error_explanation">Athugaðu hvort þið séuð ekki báðir tengdir við sama þráðlausa Wi-Fi netið.</string>
|
||||
<string name="connection_error_feedback">Ef þetta vandamál er viðvarandi, ættirðu að <a href="feedback">senda umsögn</a> til að hjálpa okkur að bæta forritið.</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remote_connecting">Tengist…</string>
|
||||
<string name="connecting">Tengist…</string>
|
||||
<!--This is a numeral indicating the first step in a series of screens-->
|
||||
<!--This is a numeral indicating the second step in a series of screens-->
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
<!--This is a button for answering that two nicknames refer to different people. This string
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Kynntu tengiliðina þína</string>
|
||||
<string name="introduction_onboarding_text">Þú getur kynnt tengiliðina þína fyrir hver öðrum, svo að þeir þurfi ekki að hittast í eigin persónu til að tengjast í gegnum Briar.</string>
|
||||
<string name="introduction_menu_item">Útbúðu kynningu</string>
|
||||
<string name="introduction_activity_title">Veldu tengilið</string>
|
||||
<string name="introduction_not_possible">Þú ert þegar með eina kynningu í vinnslu gagnvart þessum tengiliðum. Leyfðu því ferli að ljúka fyrst. Ef þú eða tengiliðirnir þínir eruð sjaldan á netinu, gæti þetta tekið svolítinn tíma.</string>
|
||||
<string name="introduction_message_title">Kynntu tengiliði</string>
|
||||
<string name="introduction_message_hint">Bættu við skilaboðum (valfrjálst)</string>
|
||||
<string name="introduction_button">Útbúðu kynningu</string>
|
||||
<string name="introduction_sent">Kynningin þín hefur verið send.</string>
|
||||
<string name="introduction_error">Villa kom upp við kynninguna.</string>
|
||||
<string name="introduction_response_error">Villa kom upp við að svara kynningunni.</string>
|
||||
<string name="introduction_request_sent">Þú hefur verið beðin/n um að kynna %1$s fyrir %2$s.</string>
|
||||
<string name="introduction_request_received">%1$s hefur beðið um að fá að kynna þig fyrir %2$s. Viltu bæta %2$s við tengiliðalistann þinn?</string>
|
||||
<string name="introduction_request_exists_received">%1$s hefur beðið um að fá að kynna þig fyrir %2$s, en %2$s er þegar í tengiliðalistanum þínum. Þar sem ekki er víst að %1$s viti það, þá geturðu samt svarað:</string>
|
||||
<string name="introduction_request_answered_received">%1$s hefur beðið um að fá að kynna þig fyrir %2$s.</string>
|
||||
<string name="introduction_response_accepted_sent">Þú samþykktir kynningu við %1$s.</string>
|
||||
<string name="introduction_response_accepted_sent_info">Áður en %1$s verður bætt í tengiliðaskrána þína, verða þeir einnig að samþykkja kynninguna. Það gæti tekið svolítinn tíma.</string>
|
||||
<string name="introduction_response_declined_sent">Þú hafnaðir kynningu við %1$s.</string>
|
||||
<string name="introduction_response_accepted_received">%1$s samþykkti kynningu við %2$s.</string>
|
||||
<string name="introduction_response_declined_received">%1$s hafnaði kynningu við %2$s.</string>
|
||||
<string name="introduction_response_declined_received_by_introducee">%1$s segir að %2$s hafi hafnað kynningunni.</string>
|
||||
<!--Private Groups-->
|
||||
<string name="groups_list_empty">Engir hópar sem hægt er að birta</string>
|
||||
<string name="groups_list_empty_action">Ýttu á + táknið til að útbúa hóp, eða biddu tengiliðina þína um að deila hópi með þér</string>
|
||||
<string name="groups_created_by">Búið til af %s</string>
|
||||
<plurals name="messages">
|
||||
<item quantity="one">%d skilaboð</item>
|
||||
<item quantity="other">%d skilaboð</item>
|
||||
</plurals>
|
||||
<string name="groups_group_is_empty">Þessi hópur er tómur</string>
|
||||
<string name="groups_group_is_dissolved">Þessi hópur hefur verið leystur upp</string>
|
||||
<string name="groups_remove">Fjarlægja</string>
|
||||
<string name="groups_create_group_title">Búa til einkahóp</string>
|
||||
<string name="groups_create_group_button">Búa til hóp</string>
|
||||
<string name="groups_create_group_invitation_button">Senda boð</string>
|
||||
<string name="groups_create_group_hint">Veldu nafn á einkahópinn þinn</string>
|
||||
<string name="groups_invitation_sent">Boð í hóp hafa verið send</string>
|
||||
<string name="groups_member_list">Listi yfir meðlimi</string>
|
||||
<string name="groups_invite_members">Bjóða meðlimum</string>
|
||||
<string name="groups_member_created_you">Þú bjóst til hópinn</string>
|
||||
<string name="groups_member_created">%s bjó til hópinn</string>
|
||||
<string name="groups_member_joined_you">Þú gekkst í hópinn</string>
|
||||
<string name="groups_member_joined">%s gekk í hópinn</string>
|
||||
<string name="groups_leave">Hætta í hópi</string>
|
||||
<string name="groups_leave_dialog_title">Staðfesting á að hætta í hópi</string>
|
||||
<string name="groups_leave_dialog_message">Ertu viss um að þú viljir hætta í þessum hópi?</string>
|
||||
<string name="groups_dissolve">Leysa upp hóp</string>
|
||||
<string name="groups_dissolve_dialog_title">Staðfesting á að leysa upp hóp</string>
|
||||
<string name="groups_dissolve_dialog_message">Ertu viss um að þú viljir leysa upp þennan hóp?\n\nAllir aðrir meðlimir hópsins eiga á hættu að geta ekki haldið áfram með samtöl sín og gætu misst af síðustu skilaboðunum.</string>
|
||||
<string name="groups_dissolve_button">Leysa upp</string>
|
||||
<string name="groups_dissolved_dialog_title">Hópur var leystur upp</string>
|
||||
<string name="groups_dissolved_dialog_message">Stofnandi hópsins hefur leyst hann upp.\n\nÞú getur ekki lengur skrifað skilaboð til hópsins og mögulega færðu ekki öll þau skilaboð sem þegar hafa verið skrifuð.</string>
|
||||
<!--Private Group Invitations-->
|
||||
<string name="groups_invitations_title">Boð í hópa</string>
|
||||
<string name="groups_invitations_invitation_sent">Þú hefur boðið %1$s að ganga í hópinn \"%2$s\".</string>
|
||||
<string name="groups_invitations_invitation_received">%1$s hefur boðið þér að ganga í hópinn \"%2$s\".</string>
|
||||
<string name="groups_invitations_joined">Hefur gengið í hópinn</string>
|
||||
<string name="groups_invitations_declined">Boði í hóp hafnað</string>
|
||||
<plurals name="groups_invitations_open">
|
||||
<item quantity="one">%d opið boð í hóp</item>
|
||||
<item quantity="other">%d opin boð í hóp</item>
|
||||
</plurals>
|
||||
<string name="groups_invitations_response_accepted_sent">Þú samþykktir boð í hóp frá %s.</string>
|
||||
<string name="groups_invitations_response_declined_sent">Þú hafnaðir boði í hóp frá %s.</string>
|
||||
<string name="groups_invitations_response_accepted_received">%s samþykkti boð í hóp.</string>
|
||||
<string name="groups_invitations_response_declined_received">%s hafnaði boði í hóp.</string>
|
||||
<string name="sharing_status_groups">Einungis stofnandinn getur boðið nýjum meðlimum í hópinn. Hé fyrir neðan eru allir skráðir meðlimir í hópnum.</string>
|
||||
<!--Private Groups Revealing Contacts-->
|
||||
<string name="groups_reveal_contacts">Uppljóstra um tengiliði</string>
|
||||
<string name="groups_reveal_dialog_message">Þú getur valið hvort eigi að birta tengiliði fyrir öllum núverandi og verðandi meðlimum þessa hóps.\n\nAð ljóstra upp um tengiliði gerir tengingu þína við hópinn hraðari og áreiðanlegri, vegna þess að þá getur þú átt samskipti við birtu tengiliðina jafnvel þótt stofnandi hópsins sé ekki á netinu.</string>
|
||||
<string name="groups_reveal_visible">Vensl tengiliðar eru sýnileg hópnum</string>
|
||||
<string name="groups_reveal_visible_revealed_by_us">Vensl tengiliðar eru sýnileg hópnum (uppljóstrað af þér)</string>
|
||||
<string name="groups_reveal_visible_revealed_by_contact">Vensl tengiliðar eru sýnileg hópnum (uppljóstrað af %s)</string>
|
||||
<string name="groups_reveal_invisible">Vensl tengiliðar eru ekki sýnileg hópnum</string>
|
||||
<!--Forums-->
|
||||
<string name="no_forums">Engin spjallsvæði sem hægt er að birta</string>
|
||||
<string name="no_forums_action">Ýttu á + táknið til að útbúa spjallsvæði, eða biddu tengiliðina þína um að deila spjallsvæði með þér</string>
|
||||
<string name="create_forum_title">Búa til spjallsvæði</string>
|
||||
<string name="choose_forum_hint">Veldu nafn á spjallsvæðið þitt</string>
|
||||
<string name="create_forum_button">Búa til spjallsvæði</string>
|
||||
<string name="forum_created_toast">Spjallsvæði búið til</string>
|
||||
<string name="no_forum_posts">Engar færslur sem hægt er að birta</string>
|
||||
<string name="no_posts">Engar færslur</string>
|
||||
<plurals name="posts">
|
||||
<item quantity="one">%d færsla</item>
|
||||
<item quantity="other">%d færslur</item>
|
||||
</plurals>
|
||||
<string name="forum_new_message_hint">Ný færsla</string>
|
||||
<string name="forum_message_reply_hint">Nýtt svar</string>
|
||||
<string name="btn_reply">Svara</string>
|
||||
<string name="forum_leave">Hætta á spjallsvæði</string>
|
||||
<string name="dialog_title_leave_forum">Staðfesta að hætt sé á spjallsvæði</string>
|
||||
<string name="dialog_message_leave_forum">Ertu viss um að þú viljir fjarlægja þetta spjallsvæði?\n\nAllir tengiliðir sem þú hefur deilt þessu bloggi með gætu hætt að fá uppfærslur.</string>
|
||||
<string name="dialog_button_leave">Hætta</string>
|
||||
<string name="forum_left_toast">Hætti á spjallsvæði</string>
|
||||
<!--Forum Sharing-->
|
||||
<string name="forum_share_button">Deila spjallsvæði</string>
|
||||
<string name="contacts_selected">Tengiliðir valdir</string>
|
||||
<string name="activity_share_toolbar_header">Veldu tengiliði</string>
|
||||
<string name="no_contacts_selector">Engir tengiliðir til að birta</string>
|
||||
<string name="no_contacts_selector_action">Komdu aftur hingað eftir að þú hefur bætt við tengilið</string>
|
||||
<string name="forum_shared_snackbar">Spjallsvæði deilt með völdum tengiliðum</string>
|
||||
<string name="forum_share_message">Bæta við skilaboðum (valfrjálst)</string>
|
||||
<string name="forum_share_error">Villa kom upp við að deila þessu spjallsvæði.</string>
|
||||
<string name="forum_invitation_received">%1$s hefur deilt spjallsvæðinu \"%2$s\" með þér.</string>
|
||||
<string name="forum_invitation_sent">Þú hefur deilt spjallsvæðinu \"%1$s\" með %2$s.</string>
|
||||
<string name="forum_invitations_title">Boð á spjallsvæði</string>
|
||||
<string name="forum_invitation_exists">Þú hefur þegar samþykkt boð inn á þetta spjallsvæði.\n\nAð samþykkja fleiri boð inn á spjallsvæðið mun gera tenginguna þína við spjallsvæðið hraðvirkari og áreiðanlegri.</string>
|
||||
<string name="forum_joined_toast">Tekur þátt á spjallsvæði</string>
|
||||
<string name="forum_declined_toast">Boði hafnað</string>
|
||||
<string name="shared_by_format">Deilt af %s</string>
|
||||
<string name="forum_invitation_already_sharing">Þegar deilt</string>
|
||||
<string name="forum_invitation_response_accepted_sent">Þú samþykktir boð á spjallsvæði frá %s.</string>
|
||||
<string name="forum_invitation_response_declined_sent">Þú hafnaðir boði á spjallsvæði frá %s.</string>
|
||||
<string name="forum_invitation_response_accepted_received">%s samþykkti boð á spjallsvæði.</string>
|
||||
<string name="forum_invitation_response_declined_received">%s hafnaði boði á spjallsvæði.</string>
|
||||
<string name="sharing_status">Staða deilingar</string>
|
||||
<string name="sharing_status_forum">Hver og einn meðlimur spjallsvæðis getur deilt því með tengiliðunum sínum. Þú ert að deila þessu spjallsvæði með eftirfarandi tengiliðum. Það gætu einnig verið fyrir hendi meðlimir sem þú sérð ekki.</string>
|
||||
<string name="shared_with">Deilt með %1$d (%2$d á netinu)</string>
|
||||
<plurals name="forums_shared">
|
||||
<item quantity="one">%d spjallsvæði deilt með tengiliðum</item>
|
||||
<item quantity="other">%d spjallsvæðum deilt með tengiliðum</item>
|
||||
</plurals>
|
||||
<string name="nobody">Enginn</string>
|
||||
<!--Blogs-->
|
||||
<string name="blogs_other_blog_empty_state">Engar færslur sem hægt er að birta</string>
|
||||
<string name="read_more">lesa meira</string>
|
||||
<string name="blogs_write_blog_post">Skrifa bloggfærslu</string>
|
||||
<string name="blogs_write_blog_post_body_hint">Skrifaðu bloggfærsluna þína</string>
|
||||
<string name="blogs_publish_blog_post">Birta</string>
|
||||
<string name="blogs_blog_post_created">Bloggfærsla útbúin</string>
|
||||
<string name="blogs_blog_post_received">Ný bloggfærsla móttekin</string>
|
||||
<string name="blogs_blog_post_scroll_to">Skruna að</string>
|
||||
<string name="blogs_feed_empty_state">Engar færslur sem hægt er að birta</string>
|
||||
<string name="blogs_feed_empty_state_action">Færslur frá tengiliðum þínum og bloggum sem þú ert áskrifandi að munu birtast hér\n\nÝttu á pennatáknið til að skrifa færslu</string>
|
||||
<string name="blogs_remove_blog">Fjarlægja blogg</string>
|
||||
<string name="blogs_remove_blog_dialog_message">Ertu viss um að þú viljir fjarlægja þetta blogg?\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 bloggi með gætu hætt að fá uppfærslur.</string>
|
||||
<string name="blogs_remove_blog_ok">Fjarlægja</string>
|
||||
<string name="blogs_blog_removed">Blogg var fjarlægt</string>
|
||||
<string name="blogs_reblog_comment_hint">Bæta við athugasemd (valkvætt)</string>
|
||||
<string name="blogs_reblog_button">Endurblogg</string>
|
||||
<!--Blog Sharing-->
|
||||
<string name="blogs_sharing_share">Deila bloggi</string>
|
||||
<string name="blogs_sharing_error">Það kom upp villa við að deila þessu bloggi.</string>
|
||||
<string name="blogs_sharing_button">Deila bloggi</string>
|
||||
<string name="blogs_sharing_snackbar">Bloggi deilt með völdum tengiliðum</string>
|
||||
<string name="blogs_sharing_response_accepted_sent">Þú samþykktir boð á blogg frá %s.</string>
|
||||
<string name="blogs_sharing_response_declined_sent">Þú hafnaðir boði á blogg frá %s.</string>
|
||||
<string name="blogs_sharing_response_accepted_received">%s samþykkti boð á blogg.</string>
|
||||
<string name="blogs_sharing_response_declined_received">%s hafnaði boði á blogg.</string>
|
||||
<string name="blogs_sharing_invitation_received">%1$s deildi blogginu \"%2$s\" með þér.</string>
|
||||
<string name="blogs_sharing_invitation_sent">Þú deildir blogginu \"%1$s\" með %2$s.</string>
|
||||
<string name="blogs_sharing_invitations_title">Boð á blogg</string>
|
||||
<string name="blogs_sharing_joined_toast">Gerðist áskrifandi að bloggi</string>
|
||||
<string name="blogs_sharing_declined_toast">Boði hafnað</string>
|
||||
<string name="sharing_status_blog">Hver sá sem gerist áskrifandi að bloggi getur deilt því með tengiliðunum sínum. Þú ert að deila þessu bloggi með eftirfarandi tengiliðum. Það gætu einnig verið fyrir hendi áskrifendur sem þú sérð ekki.</string>
|
||||
<!--RSS Feeds-->
|
||||
<string name="blogs_rss_feeds_import">Flytja inn RSS-streymi</string>
|
||||
<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_manage">Sýsla með RSS-streymi</string>
|
||||
<string name="blogs_rss_feeds_manage_imported">Fflutt 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 Display-->
|
||||
<string name="pref_language_title">Tungumál og landsvæði</string>
|
||||
<string name="pref_language_changed">Þessi stilling tekur gildi í næst þegar þú skráir þig inn í Briar. Skráðu þig út og endurræstu Briar.</string>
|
||||
<string name="pref_language_default">Sjálfgefið í kerfinu</string>
|
||||
<string name="display_settings_title">Birting</string>
|
||||
<string name="pref_theme_title">Þema</string>
|
||||
<string name="pref_theme_light">Ljóst</string>
|
||||
<string name="pref_theme_dark">Dökkt</string>
|
||||
<string name="pref_theme_auto">Sjálfvirkt (eftir tíma dags)</string>
|
||||
<string name="pref_theme_system">Sjálfgefið í kerfinu</string>
|
||||
<!--Settings Network-->
|
||||
<string name="network_settings_title">Netkerfi</string>
|
||||
<string name="bluetooth_setting">Tengjast í gegnum Bluetooth</string>
|
||||
<string name="bluetooth_setting_enabled">Alltaf þegar tengiliðir eru nálægt</string>
|
||||
<string name="bluetooth_setting_disabled">Aðeins þegar tengiliðum er bætt við</string>
|
||||
<string name="tor_network_setting">Tengjast í gegnum internetið (Tor)</string>
|
||||
<string name="tor_network_setting_automatic">Sjálfvirkt byggt á staðsetningu</string>
|
||||
<string name="tor_network_setting_without_bridges">Nota Tor án brúa</string>
|
||||
<string name="tor_network_setting_with_bridges">Nota Tor með brúm</string>
|
||||
<string name="tor_network_setting_never">Ekki tengjast</string>
|
||||
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||
<string name="tor_network_setting_summary">Sjálfvirkt: %1$s (eftir %2$s)</string>
|
||||
<string name="tor_mobile_data_title">Nota farsímagagnasamband</string>
|
||||
<string name="tor_only_when_charging_title">Tengjast í gegnum internetið (Tor) aðeins þegar verið er í hleðslu</string>
|
||||
<string name="tor_only_when_charging_summary">Gerir internettengingu óvirka þegar tækið keyrir á rafhlöðu</string>
|
||||
<!--Settings Security and Panic-->
|
||||
<string name="security_settings_title">Öryggi</string>
|
||||
<string name="pref_lock_title">Forritslæsing</string>
|
||||
<string name="pref_lock_summary">Notaðu skjálæsingu tækisins til að vernda Briar á meðan þú ert skráð/ur inn</string>
|
||||
<string name="pref_lock_disabled_summary">Til að nota þetta þarftu að setja upp skjálæsingu fyrir tækið þitt</string>
|
||||
<string name="pref_lock_timeout_title">Tímamörk forritslæsingar við aðgerðaleysi</string>
|
||||
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
|
||||
<string name="pref_lock_timeout_summary">Þehar ekki er verið að nota Briar, læsa því sjálfvirkt eftir %s</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_1">1 mínúta</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_5">5 mínútur</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_15">15 mínútur</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_30">30 mínútur</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_60">1 klukkustund</string>
|
||||
<string name="pref_lock_timeout_never">Aldrei</string>
|
||||
<string name="pref_lock_timeout_never_summary">Aldrei læsa Briar sjálfvirkt</string>
|
||||
<string name="change_password">Breyta lykilorði</string>
|
||||
<string name="current_password">Núverandi lykilorð</string>
|
||||
<string name="choose_new_password">Nýtt lykilorð</string>
|
||||
<string name="confirm_new_password">Staðfestu nýtt lykilorð</string>
|
||||
<string name="password_changed">Lykilorðinu hefur verið breytt</string>
|
||||
<string name="panic_setting">Uppsetning neyðarhnapps</string>
|
||||
<string name="panic_setting_title">Neyðarhnappur</string>
|
||||
<string name="panic_setting_hint">Stilltu hvernig Briar mun bregðast við ef þú notar neyðarhnappsforrit</string>
|
||||
<string name="panic_app_setting_title">Forrit fyrir neyðarhnapp</string>
|
||||
<string name="unknown_app">óþekkt forrit</string>
|
||||
<string name="panic_app_setting_summary">Ekkert forrit hefur verið stillt</string>
|
||||
<string name="panic_app_setting_none">Ekkert</string>
|
||||
<string name="dialog_title_connect_panic_app">Staðfesta neyðarhnappsforrit</string>
|
||||
<string name="dialog_message_connect_panic_app">Ertu viss um að þú viljir leyfa %1$s að setja í gang eyðileggjandi neyðarhnappsaðgerðir?</string>
|
||||
<string name="panic_setting_destructive_action">Óafturkræfar aðgerðir</string>
|
||||
<string name="panic_setting_signout_title">Skrá út</string>
|
||||
<string name="panic_setting_signout_summary">Skrá út úr Briar ef ýtt er á neyðarhnapp</string>
|
||||
<string name="purge_setting_title">Eyða notandaaðgangi</string>
|
||||
<string name="purge_setting_summary">Eyða Briar-aðgangnum þínum ef ýtt er á neyðarhnapp. Varúð: Þetta mun eyða endanlega auðkennunum þínum, tengiliðum og skilaboðum</string>
|
||||
<string name="uninstall_setting_title">Fjarlægja Briar</string>
|
||||
<string name="uninstall_setting_summary">Þetta krefst handvirkrar staðfestingar komi upp neyðarástand</string>
|
||||
<!--Settings Notifications-->
|
||||
<string name="notification_settings_title">Tilkynningar</string>
|
||||
<string name="notify_sign_in_title">Minna mig á að skrá inn</string>
|
||||
<string name="notify_sign_in_summary">Birta áminningu þegar síminn er ræstur eða þegar forritið hefur verið uppfært</string>
|
||||
<string name="notify_private_messages_setting_title">Einkaskilaboð</string>
|
||||
<string name="notify_private_messages_setting_summary">Birta aðvaranir vegna einkaskilaboða</string>
|
||||
<string name="notify_private_messages_setting_summary_26">Stilla aðvaranir vegna einkaskilaboða</string>
|
||||
<string name="notify_group_messages_setting_title">Hópskilaboð</string>
|
||||
<string name="notify_group_messages_setting_summary">Birta aðvaranir vegna hópskilaboða</string>
|
||||
<string name="notify_group_messages_setting_summary_26">Stilla aðvaranir vegna hópskilaboða</string>
|
||||
<string name="notify_forum_posts_setting_title">Færslur á spjallsvæði</string>
|
||||
<string name="notify_forum_posts_setting_summary">Birta aðvaranir vegna færslna á spjallsvæði</string>
|
||||
<string name="notify_forum_posts_setting_summary_26">Stilla aðvaranir vegna færslna á spjallsvæði</string>
|
||||
<string name="notify_blog_posts_setting_title">Bloggfærslur</string>
|
||||
<string name="notify_blog_posts_setting_summary">Birta aðvaranir vegna færslna á bloggi</string>
|
||||
<string name="notify_blog_posts_setting_summary_26">Stilla aðvaranir vegna færslna á bloggi</string>
|
||||
<string name="notify_vibration_setting">Titra</string>
|
||||
<string name="notify_sound_setting">Hljóð</string>
|
||||
<string name="notify_sound_setting_default">Sjálfgefinn hringitónn</string>
|
||||
<string name="notify_sound_setting_disabled">Ekkert</string>
|
||||
<string name="choose_ringtone_title">Veldu hringitón</string>
|
||||
<string name="cannot_load_ringtone">Get ekki hlaðið inn hringitóni</string>
|
||||
<!--Settings Feedback-->
|
||||
<string name="feedback_settings_title">Umsagnir</string>
|
||||
<string name="send_feedback">Senda umsögn</string>
|
||||
<!--Link Warning-->
|
||||
<string name="link_warning_title">Aðvörun vegna tengils</string>
|
||||
<string name="link_warning_intro">Þú ert í þann mund að fara að opna eftirfarandi tengil með utanaðkomandi forriti.</string>
|
||||
<string name="link_warning_text">Þetta er hægt að nota til að auðkenna þig. Hugsaðu þig vel um hvort þú treystir þeim sem sendi þér þennan tengil og íhugaðu hvort þú ættir frekar að opna hann með Tor-vafranum.</string>
|
||||
<string name="link_warning_open_link">Opna tengil</string>
|
||||
<!--Crash Reporter-->
|
||||
<string name="crash_report_title">Hrunskýrsla fyrir Briar</string>
|
||||
<string name="briar_crashed">Því miður, Briar hefur hrunið.</string>
|
||||
<string name="not_your_fault">Það er ekki þér að kenna.</string>
|
||||
<string name="please_send_report">Hjálpaðu okkur við að bæta Briar með því að senda okkur hrunskýrslu.</string>
|
||||
<string name="report_is_encrypted">Við lofum að skýrslan sé dulrituð og send á öruggan máta.</string>
|
||||
<string name="feedback_title">Umsagnir</string>
|
||||
<string name="describe_crash">Lýstu því hvað gerðist (valfrjálst)</string>
|
||||
<string name="enter_feedback">Settu inn umsögnina þína</string>
|
||||
<string name="optional_contact_email">Tölvupóstfangið þitt (valfrjálst)</string>
|
||||
<string name="include_debug_report_crash">Senda nafnlaus gögn um hrunið</string>
|
||||
<string name="include_debug_report_feedback">Senda nafnlaus gögn um tækið</string>
|
||||
<string name="could_not_load_report_data">Gat ekki hlaðið inn gögnum skýrslunnar.</string>
|
||||
<string name="send_report">Senda skýrslu</string>
|
||||
<string name="close">Loka</string>
|
||||
<string name="dev_report_saved">Skýrsla vistuð. Hún verður send næst þegar þú skráir þig inn í Briar.</string>
|
||||
<!--Sign Out-->
|
||||
<string name="progress_title_logout">Skrái út úr Briar…</string>
|
||||
<!--Screen Filters & Tapjacking-->
|
||||
<string name="screen_filter_title">Skjáyfirlag fannst</string>
|
||||
<string name="screen_filter_body">Annað forrit er að birta upplýsingar ofan á Briar. Í öryggisskyni mun Briar ekki bregðast við snertingum þegar annað forrit teiknar ofaná það.\n\nEftirfarandi forrit gætu verið að birta upplýsingar ofan á:\n\n%1$s</string>
|
||||
<string name="screen_filter_allow">Leyfa þessum forritum að birta upplýsingar efst</string>
|
||||
<!--Permission Requests-->
|
||||
<string name="permission_camera_title">Heimildir á myndavél</string>
|
||||
<string name="permission_camera_request_body">Til að skanna QR-kóðann þarf Briar heimild til að nota myndavélina.</string>
|
||||
<string name="permission_location_title">Heimild fyrir staðsetningu</string>
|
||||
<string name="permission_location_request_body">Til að finna Bluetooth-tæki, þarf Briar heimild til að nota staðsetningu þína.\n\nBriar geymir ekki staðsetningar eða deilir þeim með neinum.</string>
|
||||
<string name="permission_camera_location_title">Myndavél og staðsetning</string>
|
||||
<string name="permission_camera_location_request_body">Til að skanna QR-kóðann, þarf Briar aðgang að myndavélinni.\n\nTil að finna Bluetooth-tæki, þarf Briar heimild til að nota staðsetningu þína.\n\nBriar geymir ekki staðsetningar eða deilir þeim með neinum.</string>
|
||||
<string name="permission_camera_denied_body">Þú hefur hafnað aðgangi að myndavélinni, en það að bæta við tengiliðum krefst notkun hennar.\n\nÍhugaðu að veita þennan aðgang.</string>
|
||||
<string name="qr_code">QR-kóði</string>
|
||||
<string name="show_qr_code_fullscreen">Birta QR-kóða á öllum skjánum</string>
|
||||
<!--App Locking-->
|
||||
<string name="lock_unlock">Aflæsa Briar</string>
|
||||
<string name="lock_unlock_verbose">Settu inn PIN-númer tækisins, mynstur eða lykilorðið þitt til að aflæsa Briar</string>
|
||||
<string name="lock_unlock_fingerprint_description">Snertu fingrafaraskynjarann með viðeigandi fingri til að halda áfram</string>
|
||||
<string name="lock_unlock_password">Nota lykilorð</string>
|
||||
<string name="lock_is_locked">Briar er læst</string>
|
||||
<string name="lock_tap_to_unlock">Ýttu til að aflæsa</string>
|
||||
<!--Screenshots-->
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_alice">Lísa</string>
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_bob">Bjössi</string>
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_carol">Kata</string>
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Bob!-->
|
||||
<string name="screenshot_message_1">Hæ Bjössi!</string>
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Alice!-->
|
||||
<string name="screenshot_message_2">Hæ Lísa! Takk fyrir að segja mér frá Briar!</string>
|
||||
<!--This is a message to be used in screenshots.-->
|
||||
<string name="screenshot_message_3">Ekki málið, vona að þér líki það 😀</string>
|
||||
</resources>
|
||||
@@ -1,483 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!--Setup-->
|
||||
<string name="setup_title">Briar에 오신 것을 환영합니다</string>
|
||||
<string name="setup_name_explanation">별명은 게시한 모든 컨텐츠 옆에 보여지게 됩니다. 별명은 계정을 만든 후에는 바꿀 수 없습니다.</string>
|
||||
<string name="setup_next">다음</string>
|
||||
<string name="setup_password_intro">비밀번호를 정해주세요.</string>
|
||||
<string name="setup_password_explanation">Briar 계정은 암호화되어 기기에 저장되기 때문에 클라우드에 저장되지 않습니다. 비밀번호를 잊어버리셨거나 Briar를 삭제하셨었다면 계정을 복구할 방법이 없습니다.\n\n연관성 없는 네 단어, 혹은 완전히 무작위적인 글자, 숫자, 그리고 기호의 조합과 같은 길고 알아맞추기 어려운 비밀번호로 정해주세요.</string>
|
||||
<string name="setup_doze_title">백그라운드 연결</string>
|
||||
<string name="setup_doze_intro">메시지를 받기 위해서는 Briar가 백그라운드에서 연결된 상태를 유지해야 합니다.</string>
|
||||
<string name="setup_doze_explanation">메시지를 받기 위해서는 Briar가 백그라운드에서 연결된 상태를 유지해야 합니다. Briar가 백그라운드에서 연결된 상태를 유지할 수 있게 배터리 최적화를 비활성화해 주세요.</string>
|
||||
<string name="setup_doze_button">연결 허용하기</string>
|
||||
<string name="choose_nickname">별명을 정하세요</string>
|
||||
<string name="choose_password">비밀번호를 정하세요</string>
|
||||
<string name="confirm_password">비밀번호를 확인하세요</string>
|
||||
<string name="name_too_long">이름이 너무 깁니다.</string>
|
||||
<string name="password_too_weak">비밀번호가 너무 약합니다</string>
|
||||
<string name="passwords_do_not_match">비밀번호가 일치하지 않습니다</string>
|
||||
<string name="create_account_button">계정 만들기</string>
|
||||
<string name="more_info">추가 정보</string>
|
||||
<string name="don_t_ask_again">다시는 물어보지 않기</string>
|
||||
<string name="setup_huawei_text">밑의 버튼을 눌러 Briar를 \"보호된 앱\" 스크린에서 보호되게 해 주세요.</string>
|
||||
<string name="setup_huawei_button">Briar 보호하기</string>
|
||||
<string name="setup_huawei_help">Briar가 보호된 앱 목록에 추가되지 않는다면, 백그라운드에서 실행될 수 없습니다.</string>
|
||||
<string name="warning_dozed">%s가 백그라운드에서 실행될 수 없었습니다</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">비밀번호</string>
|
||||
<string name="try_again">잘못된 비밀번호입니다. 다시 시도하세요.</string>
|
||||
<string name="sign_in_button">로그인</string>
|
||||
<string name="forgotten_password">비밀번호를 잊어버렸습니다</string>
|
||||
<string name="dialog_title_lost_password">비밀번호 분실</string>
|
||||
<string name="dialog_message_lost_password">Briar 계정은 클라우드가 아니라 기기에서 암호화돼 저장되므로 비밀번호를 재설정 할 수 없습니다. 계정을 삭제하고 다시 시작하시겠습니까? \n\n주의 : 신원, 연락처 및 메시지는 영구적으로 손실됩니다.</string>
|
||||
<string name="startup_failed_notification_title">Briar가 켜질 수 없습니다</string>
|
||||
<string name="startup_failed_notification_text">눌러서 추가 정보 확인.</string>
|
||||
<string name="startup_failed_activity_title">Briar 시작 실패</string>
|
||||
<string name="startup_failed_db_error">어떤 이유에선지, Briar 데이터베이스가 복구될 수 없을 정도로 손상됐습니다. 데이터와 모든 연락처 정보가 사라졌습니다. 안타깝게도, Briar를 다시 설치하거나 비밀번호를 입력하는 화면에서 \"비밀번호를 잊어버렸습니다\"를 눌러 새로운 계정을 설정해야 합니다.</string>
|
||||
<string name="startup_failed_data_too_old_error">너무 오래된 버전의 Briar를 이용해 만든 계정이라 이 버전으로는 사용할 수 없습니다. 이전 버전을 다시 설치하거나 비밀번호를 입력하는 창에서 \'비밀번호를 잊어버렸습니다\'를 선택해 새로운 계정을 설정하세요.</string>
|
||||
<string name="startup_failed_data_too_new_error">이 버전의 앱은 너무 오래됐습니다. 최신 버전으로 업그레이드하고 다시 시도하세요.</string>
|
||||
<string name="startup_failed_service_error">Briar에서 필요한 플러그인을 시작하지 못했습니다. Briar를 다시 설치하면 대개 이 문제가 해결됩니다. 그렇지만 Briar에서는 데이터를 저장하기 위해 중앙 서버를 사용하고 있지 않기 때문에 계정과 관련된 모든 데이터를 잃게 됩니다.</string>
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="other">이 Briar는 테스트용입니다. %d일 내에 계정이 만료되고 다시 되돌리지 못합니다.</item>
|
||||
</plurals>
|
||||
<string name="expiry_update">테스트 만료 기한이 늘어났습니다. 이제 %d일 후에 계정이 만료됩니다.</string>
|
||||
<string name="expiry_date_reached">이 소프트웨어는 만료되었습니다. \ n 테스트 해 주셔서 감사합니다!</string>
|
||||
<string name="download_briar">Briar를 계속 사용하기 위해선, 1.0 버전을 다운로드해 주세요.</string>
|
||||
<string name="create_new_account">새로운 계정을 만들어야 하지만, 같은 별명을 사용할 수 있습니다.</string>
|
||||
<string name="download_briar_button">Briar 1.0 다운로드</string>
|
||||
<string name="startup_open_database">데이터베이스를 복호화하고 있습니다....</string>
|
||||
<string name="startup_migrate_database">데이터베이스를 업그레이드 하고 있습니다...</string>
|
||||
<string name="startup_compact_database">데이터베이스를 작게 만들고 있습니다...</string>
|
||||
<!--Navigation Drawer-->
|
||||
<string name="nav_drawer_open_description">탐색 창 열기</string>
|
||||
<string name="nav_drawer_close_description">탐색 창 닫기</string>
|
||||
<string name="contact_list_button">연락처</string>
|
||||
<string name="groups_button">개인 모임</string>
|
||||
<string name="forums_button">포럼</string>
|
||||
<string name="blogs_button">블로그</string>
|
||||
<!--This is part of the main menu. The app will be locked when this is tapped.-->
|
||||
<string name="lock_button">앱 잠그기</string>
|
||||
<string name="settings_button">설정</string>
|
||||
<string name="sign_out_button">로그아웃</string>
|
||||
<!--Transports-->
|
||||
<string name="transport_tor">인터넷</string>
|
||||
<string name="transport_bt">블루투스</string>
|
||||
<string name="transport_lan">Wi-Fi</string>
|
||||
<!--Notifications-->
|
||||
<string name="reminder_notification_title">Briar에서 로그아웃 됨</string>
|
||||
<string name="reminder_notification_text">눌러서 다시 로그인하세요.</string>
|
||||
<string name="reminder_notification_channel_title">Briar 로그인 알림</string>
|
||||
<string name="reminder_notification_dismiss">그만 보기</string>
|
||||
<string name="ongoing_notification_title">Briar에 로그인 됨</string>
|
||||
<string name="ongoing_notification_text">Briar를 열려면 만지세요.</string>
|
||||
<plurals name="private_message_notification_text">
|
||||
<item quantity="other">새로운 %d개의 개인 메시지가 있습니다.</item>
|
||||
</plurals>
|
||||
<plurals name="group_message_notification_text">
|
||||
<item quantity="other">새로운 %d개의 모임 메시지가 있습니다.</item>
|
||||
</plurals>
|
||||
<plurals name="forum_post_notification_text">
|
||||
<item quantity="other">새로운 %d개의 포럼 게시물이 있습니다.</item>
|
||||
</plurals>
|
||||
<plurals name="blog_post_notification_text">
|
||||
<item quantity="other">새로운 %d개의 블로그 게시물이 있습니다.</item>
|
||||
</plurals>
|
||||
<!--Misc-->
|
||||
<string name="now">지금</string>
|
||||
<string name="show">Show</string>
|
||||
<string name="hide">숨기기</string>
|
||||
<string name="ok">확인</string>
|
||||
<string name="cancel">취소</string>
|
||||
<string name="got_it">알겠습니다</string>
|
||||
<string name="delete">삭제</string>
|
||||
<string name="accept">받아들이기</string>
|
||||
<string name="decline">거절하기</string>
|
||||
<string name="options">옵션</string>
|
||||
<string name="online">온라인</string>
|
||||
<string name="offline">오프라인</string>
|
||||
<string name="send">보내기</string>
|
||||
<string name="allow">허용하기</string>
|
||||
<string name="open">열기</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>
|
||||
<!--Contacts and Private Conversations-->
|
||||
<string name="no_contacts">저장된 연락처가 없습니다</string>
|
||||
<string name="no_contacts_action">+ 상징을 눌러서 연락처를 추가하세요</string>
|
||||
<string name="date_no_private_messages">메시지가 없습니다.</string>
|
||||
<string name="no_private_messages">저장된 메시지가 없습니다</string>
|
||||
<string name="message_hint">메시지 입력하기</string>
|
||||
<string name="image_caption_hint">캡션 넣기(선택 사항)</string>
|
||||
<string name="image_attach">이미지 첨부하기</string>
|
||||
<string name="set_contact_alias">연락처 이름 바꾸기</string>
|
||||
<string name="set_contact_alias_hint">연락처 이름</string>
|
||||
<string name="set_alias_button">바꾸기</string>
|
||||
<string name="delete_contact">연락처 지우기</string>
|
||||
<string name="dialog_title_delete_contact">연락처 삭제 확인</string>
|
||||
<string name="dialog_message_delete_contact">정말로 이 연락처, 그리고 이 연락처와의 메시지를 모두 빼시겠어요?</string>
|
||||
<string name="contact_deleted_toast">연락처가 삭제됐습니다</string>
|
||||
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
|
||||
<string name="you">당신</string>
|
||||
<string name="save_image">이미지 저장하기</string>
|
||||
<string name="dialog_title_save_image">이미지를 저장하시겠어요?</string>
|
||||
<string name="dialog_message_save_image">이 이미지를 저장하면 다른 앱에서도 볼 수 있게 됩니다. 정말로 저장하시겠어요?</string>
|
||||
<string name="save_image_success">이미지가 저장됐습니다</string>
|
||||
<string name="save_image_error">이미지를 저장할 수 없었습니다</string>
|
||||
<string name="dialog_title_no_image_support">이미지를 사용할 수 없습니다</string>
|
||||
<string name="dialog_message_no_image_support">연락하는 분의 Briar가 이미지 첨부를 지원하지 않습니다. 이 분이 업그레이드하면 다른 상징을 볼 수 있습니다.</string>
|
||||
<string name="dialog_title_image_support">이제 이 분에게 이미지를 보낼 수 있습니다</string>
|
||||
<string name="dialog_message_image_support">이 상징을 눌러 이미지를 첨부하세요.</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="face_to_face">연락처를 추가하려는 사람과 먼저 만나야 합니다.\n\n나중에 누군가 당신인 척 하거나 메시지를 훔쳐보는 것을 방지할 수 있습니다.</string>
|
||||
<string name="continue_button">계속하기</string>
|
||||
<string name="try_again_button">다시 시도하기</string>
|
||||
<string name="waiting_for_contact_to_scan">연락처가 스캔하고 연결하길 기다리고 있습니다\u2026</string>
|
||||
<string name="exchanging_contact_details">연락처 세부사항을 교환하고 있습니다\u2026</string>
|
||||
<string name="contact_added_toast">%s: 연락처가 추가됐습니다.</string>
|
||||
<string name="contact_already_exists">%s의 연락처가 이미 있습니다</string>
|
||||
<string name="qr_code_invalid">QR 코드가 유효하지 않습니다</string>
|
||||
<string name="qr_code_too_old">스캔한 QR 코드는 너무 오래된 버전의 %s에서 나왔습니다.\n\n연락하는 분에게 최신 버전으로 업그레이드를 부탁하고 다시 시도하세요.</string>
|
||||
<string name="qr_code_too_new">스캔한 QR 코드는 더 새로운 버전의 %s에서 나왔습니다.\n\n최신 버전으로 업그레이드 후에 다시 시도해 주세요.</string>
|
||||
<string name="camera_error">카메라 오류</string>
|
||||
<string name="connecting_to_device">\u2026 기기에 연결하고 있습니다</string>
|
||||
<string name="authenticating_with_device">\u2026 기기와 인증하고 있습니다</string>
|
||||
<string name="connection_error_title">연락처에 연결하지 못했습니다</string>
|
||||
<string name="connection_error_explanation">둘 다 같은 Wi-Fi 네트워크에 연결돼 있는지 확인해 보세요.</string>
|
||||
<string name="connection_error_feedback">문제가 계속된다면, 부디 <a href="feedback">피드백을 남겨서</a> 앱이 좋아지게 도와주세요.</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="paste_button">붙여 넣기</string>
|
||||
<string name="copy_button">복사하기</string>
|
||||
<string name="share_button">공유</string>
|
||||
<string name="add_contact_remote_connecting">접속중...</string>
|
||||
<string name="connecting">접속중...</string>
|
||||
<!--This is a numeral indicating the first step in a series of screens-->
|
||||
<string name="step_1">1</string>
|
||||
<!--This is a numeral indicating the second step in a series of screens-->
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
<!--This is a button for answering that two nicknames refer to different people. This string
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">연락처끼리 소개시키기</string>
|
||||
<string name="introduction_onboarding_text">연락처끼리 서로 소개해서, 직접 만날 필요 없이 Briar로 연결될 수 있습니다.</string>
|
||||
<string name="introduction_menu_item">소개하기</string>
|
||||
<string name="introduction_activity_title">연락처 선택하기</string>
|
||||
<string name="introduction_not_possible">이미 이 연락처와 소개시키고 있습니다. 먼저 이 소개를 끝내주세요. 만약 당신이나 연락하는 분이 거의 온라인이 아니라면, 시간이 좀 걸릴 수 있습니다.</string>
|
||||
<string name="introduction_message_title">연락처 소개하기</string>
|
||||
<string name="introduction_message_hint">메시지 추가하기(선택 사항)</string>
|
||||
<string name="introduction_button">소개하기</string>
|
||||
<string name="introduction_sent">소개시켰습니다.</string>
|
||||
<string name="introduction_error">소개하는 과정에서 문제가 있었습니다.</string>
|
||||
<string name="introduction_response_error">소개에 응하는 과정에서 문제가 있었습니다.</string>
|
||||
<string name="introduction_request_sent">%2$s에게 %1$s를 소개하고 싶다고 했습니다.</string>
|
||||
<string name="introduction_request_received">%1$s이(가) %2$s에게 소개시키고 싶다고 물었습니다. %2$s을(를) 연락처 목록에 추가하고 싶으십니까?</string>
|
||||
<string name="introduction_request_exists_received">%1$s이(가) %2$s에게 소개시키고 싶다고 물었지만, %2$s은(는) 이미 연락처 목록에 있습니다. %1$s이(가) 아직 이 부분을 모르고 있을 수 있으니, 아직 응할 수 있습니다:</string>
|
||||
<string name="introduction_request_answered_received">%1$s이(가) %2$s에게 소개시키고 싶다고 물었습니다.</string>
|
||||
<string name="introduction_response_accepted_sent">%1$s에게 소개되겠다고 했습니다.</string>
|
||||
<string name="introduction_response_accepted_sent_info">%1$s이(가) 당신의 연락처를 받기 전에, 그 쪽에서도 소개를 승락해야 합니다. 여기서 시간이 좀 걸릴 수 있습니다.</string>
|
||||
<string name="introduction_response_declined_sent">%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>
|
||||
<!--Private Groups-->
|
||||
<string name="groups_list_empty">모임이 없습니다.</string>
|
||||
<string name="groups_list_empty_action">+ 상징을 눌러 모임을 만들거나, 연락하는 분에게 모임을 공유해 달라고 물어보세요</string>
|
||||
<string name="groups_created_by">%s이(가) 만듦</string>
|
||||
<plurals name="messages">
|
||||
<item quantity="other">메시지 %d개</item>
|
||||
</plurals>
|
||||
<string name="groups_group_is_empty">이 모임에는 아무도 없습니다</string>
|
||||
<string name="groups_group_is_dissolved">이 모임은 해체됐습니다</string>
|
||||
<string name="groups_remove">빼기</string>
|
||||
<string name="groups_create_group_title">개인 모임 만들기</string>
|
||||
<string name="groups_create_group_button">모임 만들기</string>
|
||||
<string name="groups_create_group_invitation_button">초대장 보내기</string>
|
||||
<string name="groups_create_group_hint">개인 모임의 이름을 정하세요</string>
|
||||
<string name="groups_invitation_sent">모임 초대장을 보냈습니다</string>
|
||||
<string name="groups_member_list">구성원 목록</string>
|
||||
<string name="groups_invite_members">구성원 초대하기</string>
|
||||
<string name="groups_member_created_you">모임을 만들었습니다</string>
|
||||
<string name="groups_member_created">%s이(가) 모임을 만들었습니다</string>
|
||||
<string name="groups_member_joined_you">모임에 참가했습니다</string>
|
||||
<string name="groups_member_joined">%s이(가) 모임에 참가했습니다</string>
|
||||
<string name="groups_leave">모임 나가기</string>
|
||||
<string name="groups_leave_dialog_title">모임 떠나기 확인</string>
|
||||
<string name="groups_leave_dialog_message">정말로 이 모임을 나가고 싶으신가요?</string>
|
||||
<string name="groups_dissolve">모임 해체하기</string>
|
||||
<string name="groups_dissolve_dialog_title">모임 해체 확인</string>
|
||||
<string name="groups_dissolve_dialog_message">정말로 이 모임을 해체하려고 하세요?\n\n모든 다른 구성원들이 대화를 계속할 수 없게 되고, 최신 메시지를 받지 못할 수 있습니다.</string>
|
||||
<string name="groups_dissolve_button">해체하기</string>
|
||||
<string name="groups_dissolved_dialog_title">모임이 해체됐습니다</string>
|
||||
<string name="groups_dissolved_dialog_message">이 모임을 만든 분이 모임을 해체하셨습니다.\n\n더 이상 모임에 메시지를 보내지 못하고, 올려진 게시글을 받아보지 못할 수 있습니다.</string>
|
||||
<!--Private Group Invitations-->
|
||||
<string name="groups_invitations_title">모임 초대장</string>
|
||||
<string name="groups_invitations_invitation_sent">%1$s을(를) \"%2$s\" 모임에 참가하도록 초대했습니다.</string>
|
||||
<string name="groups_invitations_invitation_received">%1$s이(가) \"%2$s\" 모임에 참가하도록 초대했습니다.</string>
|
||||
<string name="groups_invitations_joined">모임에 참가했습니다</string>
|
||||
<string name="groups_invitations_declined">모임 초대장 거절함</string>
|
||||
<plurals name="groups_invitations_open">
|
||||
<item quantity="other">받을 수 있는 초대장 %d개</item>
|
||||
</plurals>
|
||||
<string name="groups_invitations_response_accepted_sent">%s(으)로부터 받은 초대장을 승락했습니다.</string>
|
||||
<string name="groups_invitations_response_declined_sent">%s(으)로부터의 모임 초대장을 거절했습니다.</string>
|
||||
<string name="groups_invitations_response_accepted_received">%s이(가) 모임 초대장을 승락했습니다.</string>
|
||||
<string name="groups_invitations_response_declined_received">%s이(가) 모임 초대장을 거절했습니다.</string>
|
||||
<string name="sharing_status_groups">모임을 만든 분만 새로운 구성원을 초대할 수 있습니다. 다음은 모임의 모든 현재 구성원입니다.</string>
|
||||
<!--Private Groups Revealing Contacts-->
|
||||
<string name="groups_reveal_contacts">연락처 보이기</string>
|
||||
<string name="groups_reveal_dialog_message">이 모임의 지금과 앞으로 들어올 구성원에게 연락처를 공개할지를 정할 수 있습니다.\n\n연락처를 공개하면, 모임을 만든 사람이 오프라인이어도 공개된 연락처와 연결할 수 있기 때문에 모임에 더 빠르고 안정적으로 연결할 수 있습니다.</string>
|
||||
<string name="groups_reveal_visible">연락처 관계가 모임에서 보입니다</string>
|
||||
<string name="groups_reveal_visible_revealed_by_us">연락처 관계가 모임에서 보입니다(본인이 공개)</string>
|
||||
<string name="groups_reveal_visible_revealed_by_contact">연락처 관계가 모임에서 보입니다(%s이(가) 공개)</string>
|
||||
<string name="groups_reveal_invisible">연락처 관계가 모임에서 보이지 않습니다</string>
|
||||
<!--Forums-->
|
||||
<string name="no_forums">보여드릴 포럼이 없습니다</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>
|
||||
<string name="forum_created_toast">포럼이 만들어졌습니다</string>
|
||||
<string name="no_forum_posts">게시물이 없습니다</string>
|
||||
<string name="no_posts">게시글이 없습니다</string>
|
||||
<plurals name="posts">
|
||||
<item quantity="other">게시글 %d개</item>
|
||||
</plurals>
|
||||
<string name="forum_new_message_hint">새로운 게시글</string>
|
||||
<string name="forum_message_reply_hint">새로운 답글</string>
|
||||
<string name="btn_reply">답장</string>
|
||||
<string name="forum_leave">포럼 떠나기</string>
|
||||
<string name="dialog_title_leave_forum">포럼 떠나기 확인</string>
|
||||
<string name="dialog_message_leave_forum">정말로 이 포럼을 떠나려고 하세요?\n\n이 포럼과 공유한 연락처에서 업데이트가 되지 않을 수 있습니다.</string>
|
||||
<string name="dialog_button_leave">떠나기</string>
|
||||
<string name="forum_left_toast">포럼을 떠났습니다</string>
|
||||
<!--Forum Sharing-->
|
||||
<string name="forum_share_button">포럼 공유하기</string>
|
||||
<string name="contacts_selected">선택한 연락처</string>
|
||||
<string name="activity_share_toolbar_header">연락처 선택하기</string>
|
||||
<string name="no_contacts_selector">저장된 연락처가 없습니다</string>
|
||||
<string name="no_contacts_selector_action">연락처를 추가한 후에 돌아오길 바랍니다</string>
|
||||
<string name="forum_shared_snackbar">선택한 연락처와 공유하는 포럼</string>
|
||||
<string name="forum_share_message">메시지 추가하기(선택 사항)</string>
|
||||
<string name="forum_share_error">포럼을 공유하는 과정에서 문제가 있었습니다</string>
|
||||
<string name="forum_invitation_received">%1$s이(가) \"%2$s\" 포럼을 공유했습니다.</string>
|
||||
<string name="forum_invitation_sent">\"%1$s\" 포럼을 %2$s과(와) 공유했습니다.</string>
|
||||
<string name="forum_invitations_title">포럼 초대장</string>
|
||||
<string name="forum_invitation_exists">이미 이 포럼에 초대를 승락했습니다.\n\n초대를 더 많이 승락할수록 더 빠르고 안정적으로 포럼에 연결할 수 있습니다.</string>
|
||||
<string name="forum_joined_toast">포럼에 참가했습니다.</string>
|
||||
<string name="forum_declined_toast">초대장 거절함</string>
|
||||
<string name="shared_by_format">%s에 의해 공유됨</string>
|
||||
<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_accepted_received">%s이(가) 포럼 초대장을 승락했습니다.</string>
|
||||
<string name="forum_invitation_response_declined_received">%s이(가) 포럼 초대장을 거절했습니다.</string>
|
||||
<string name="sharing_status">공유 상태</string>
|
||||
<string name="sharing_status_forum">포럼의 어느 구성원이든 연락처와 공유할 수 있습니다. 다음 연락처와 포럼을 공유하고 있습니다. 볼 수 없는 구성원이 더 있을 수 있습니다.</string>
|
||||
<string name="shared_with">와(과) 공유하고 있습니다.(%1$d명 온라인)</string>
|
||||
<plurals name="forums_shared">
|
||||
<item quantity="other">연락처와 공유한 %d개의 포럼</item>
|
||||
</plurals>
|
||||
<string name="nobody">아무도 없음</string>
|
||||
<!--Blogs-->
|
||||
<string name="blogs_other_blog_empty_state">게시물이 없습니다</string>
|
||||
<string name="read_more">더 읽기</string>
|
||||
<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_received">새로운 블로그 게시물을 받았습니다</string>
|
||||
<string name="blogs_blog_post_scroll_to">스크롤</string>
|
||||
<string name="blogs_feed_empty_state">게시물이 없습니다</string>
|
||||
<string name="blogs_feed_empty_state_action">연락처와 구독한 블로그의 게시물이 여기에 나타납니다.\n\n게시물을 쓰려면 펜 상징을 누르세요</string>
|
||||
<string name="blogs_remove_blog">블로그 빼기</string>
|
||||
<string name="blogs_remove_blog_dialog_message">정말로 이 블로그를 빼시겠어요?\n\n기기에서 게시물은 빠지겠지만 다른 사람의 기기에서는 빠지지 않습니다.\n\n이 블로그를 공유하던 연락처에서 업데이트가 되지 않을 수 있습니다. </string>
|
||||
<string name="blogs_remove_blog_ok">빼기</string>
|
||||
<string name="blogs_blog_removed">블로그를 뺐습니다</string>
|
||||
<string name="blogs_reblog_comment_hint">글 추가하기(선택 사항)</string>
|
||||
<string name="blogs_reblog_button">재블로그</string>
|
||||
<!--Blog Sharing-->
|
||||
<string name="blogs_sharing_share">블로그 공유하기</string>
|
||||
<string name="blogs_sharing_error">블로그를 공유하는 과정에서 문제가 있었습니다.</string>
|
||||
<string name="blogs_sharing_button">블로그 공유하기</string>
|
||||
<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_accepted_received">%s이(가) 블로그 초대를 승락했습니다.</string>
|
||||
<string name="blogs_sharing_response_declined_received">%s이(가) 블로그 초대장을 거절했습니다.</string>
|
||||
<string name="blogs_sharing_invitation_received">%1$s이(가) \"%2$s\" 블로그를 공유했습니다.</string>
|
||||
<string name="blogs_sharing_invitation_sent">%2$s와(과) \"%1$s\" 블로그를 공유했습니다.</string>
|
||||
<string name="blogs_sharing_invitations_title">블로그 초대장</string>
|
||||
<string name="blogs_sharing_joined_toast">블로그에 구독함</string>
|
||||
<string name="blogs_sharing_declined_toast">모임 초대장 거절함</string>
|
||||
<string name="sharing_status_blog">블로그에 구독한 누구든 연락처와 공유할 수 있습니다. 다음 연락처와 이 블로그를 공유하고 있습니다. 보이지 않는 다른 구독자가 더 있을 수 있습니다.</string>
|
||||
<!--RSS Feeds-->
|
||||
<string name="blogs_rss_feeds_import">RSS 피드 불러오기</string>
|
||||
<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 Display-->
|
||||
<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>
|
||||
<string name="pref_theme_title">테마</string>
|
||||
<string name="pref_theme_light">빛</string>
|
||||
<string name="pref_theme_dark">어둠</string>
|
||||
<string name="pref_theme_auto">자동(시간에 따라)</string>
|
||||
<string name="pref_theme_system">기본 설정</string>
|
||||
<!--Settings Network-->
|
||||
<string name="network_settings_title">네트워크</string>
|
||||
<string name="bluetooth_setting">블루투스로 연결하기</string>
|
||||
<string name="bluetooth_setting_enabled">연락처가 가까이 있을 때마다</string>
|
||||
<string name="bluetooth_setting_disabled">연락처를 추가할 때만</string>
|
||||
<string name="tor_network_setting">인터넷(Tor)를 통해 연결하기</string>
|
||||
<string name="tor_network_setting_automatic">장소에 따라 자동으로</string>
|
||||
<string name="tor_network_setting_without_bridges">Tor를 브리지 없이 사용하기</string>
|
||||
<string name="tor_network_setting_with_bridges">Tor를 브리지를 통해 사용하기</string>
|
||||
<string name="tor_network_setting_never">연결하지 말기</string>
|
||||
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||
<string name="tor_network_setting_summary">자동: %1$s(%2$s에서)</string>
|
||||
<string name="tor_mobile_data_title">모바일 데이터 사용하기</string>
|
||||
<string name="tor_only_when_charging_title">충전할 때만 인터넷(Tor)을 통해 연결하기</string>
|
||||
<string name="tor_only_when_charging_summary">베터리로 구동하고 있을 때는 인터넷 연결을 비활성화</string>
|
||||
<!--Settings Security and Panic-->
|
||||
<string name="security_settings_title"> 보안</string>
|
||||
<string name="pref_lock_title">앱 잠금</string>
|
||||
<string name="pref_lock_summary">로그인한 동안 기기의 화면 잠금을 사용해서 Briar 보호하기</string>
|
||||
<string name="pref_lock_disabled_summary">이 기능을 이용하려면 기기에 화면 잠금을 설정하세요</string>
|
||||
<string name="pref_lock_timeout_title">앱 잠금까지의 대기시간</string>
|
||||
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
|
||||
<string name="pref_lock_timeout_summary">Briar를 사용하지 않으면 %s 후에 자동으로 잠그기</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_1">1분</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_5">5분</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_15">15분</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_30">30분</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_60">1시간</string>
|
||||
<string name="pref_lock_timeout_never">절대</string>
|
||||
<string name="pref_lock_timeout_never_summary">절대 자동으로 Briar 잠그지 않기</string>
|
||||
<string name="change_password">비밀번호 바꾸기</string>
|
||||
<string name="current_password">현재 비밀번호</string>
|
||||
<string name="choose_new_password">새 비밀번호</string>
|
||||
<string name="confirm_new_password">새 비밀번호 확인:</string>
|
||||
<string name="password_changed">비밀번호가 바꼈습니다.</string>
|
||||
<string name="panic_setting">패닉 버튼 설정</string>
|
||||
<string name="panic_setting_title">패닉 버튼</string>
|
||||
<string name="panic_setting_hint">패닉 버튼을 누를 때 Briar가 어떻게 반응할지 설정</string>
|
||||
<string name="panic_app_setting_title">패닉 버튼 앱</string>
|
||||
<string name="unknown_app">모르는 앱</string>
|
||||
<string name="panic_app_setting_summary">설정된 앱이 없습니다</string>
|
||||
<string name="panic_app_setting_none">없음</string>
|
||||
<string name="dialog_title_connect_panic_app">패닉 앱 확인</string>
|
||||
<string name="dialog_message_connect_panic_app">%1$s이(가) 파괴적인 패닉 버튼 동작을 작동시킬 수 있게 허용하시겠어요?</string>
|
||||
<string name="panic_setting_destructive_action">파괴적인 행동</string>
|
||||
<string name="panic_setting_signout_title">로그아웃</string>
|
||||
<string name="panic_setting_signout_summary">패닉 버튼이 눌리면 Briar에서 로그아웃하기</string>
|
||||
<string name="purge_setting_title">계정 삭제하기</string>
|
||||
<string name="purge_setting_summary">패닉 버튼이 눌리면 Brirar 계정을 지우기(주의: 계정, 연락처와 메시지가 영구적으로 지워집니다)</string>
|
||||
<string name="uninstall_setting_title">Briar 삭제하기</string>
|
||||
<string name="uninstall_setting_summary">패닉 상황에서 수동으로 확인해야 합니다</string>
|
||||
<!--Settings Notifications-->
|
||||
<string name="notification_settings_title">알림</string>
|
||||
<string name="notify_sign_in_title">로그인 알려주기</string>
|
||||
<string name="notify_sign_in_summary">폰이 켜지거나 앱이 업데이트되면 알려주기</string>
|
||||
<string name="notify_private_messages_setting_title">개인 메시지</string>
|
||||
<string name="notify_private_messages_setting_summary">개인 메시지에 대해 알림 보이기</string>
|
||||
<string name="notify_private_messages_setting_summary_26">개인 메시지에 대해 알림 설정하기</string>
|
||||
<string name="notify_group_messages_setting_title">모임 메시지</string>
|
||||
<string name="notify_group_messages_setting_summary">모임 메시지 알림 보이기</string>
|
||||
<string name="notify_group_messages_setting_summary_26">모임 메시지 알림 설정</string>
|
||||
<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_summary">블로그 게시물 알림 보이기</string>
|
||||
<string name="notify_blog_posts_setting_summary_26">블로그 게시물 알림 설정</string>
|
||||
<string name="notify_vibration_setting">진동</string>
|
||||
<string name="notify_sound_setting">소리</string>
|
||||
<string name="notify_sound_setting_default">기본 벨소리</string>
|
||||
<string name="notify_sound_setting_disabled">없음</string>
|
||||
<string name="choose_ringtone_title">벨소리 정하기</string>
|
||||
<string name="cannot_load_ringtone">벨소리를 불러올 수 없었습니다</string>
|
||||
<!--Settings Feedback-->
|
||||
<string name="feedback_settings_title">피드백</string>
|
||||
<string name="send_feedback">피드백 보내기</string>
|
||||
<!--Link Warning-->
|
||||
<string name="link_warning_title">링크 경고</string>
|
||||
<string name="link_warning_intro">외부 앱으로 링크를 열려고 합니다</string>
|
||||
<string name="link_warning_text">당신이 추적당할 수 있습니다. 이 링크를 보낸 사람을 믿을 수 있는지 생각해보고 Tor 브라우저로 여는 것을 고려하세요.</string>
|
||||
<string name="link_warning_open_link">링크 열기</string>
|
||||
<!--Crash Reporter-->
|
||||
<string name="crash_report_title">Briar 사고 리포트</string>
|
||||
<string name="briar_crashed">죄송해요, Briar가 꺼졌어요.</string>
|
||||
<string name="not_your_fault">당신 탓이 아니에요.</string>
|
||||
<string name="please_send_report">부디 사고 리포트를 저희에게 보내서 더 나은 Briar를 만드는 것을 도와주세요.</string>
|
||||
<string name="report_is_encrypted">리포트가 암호화되고 안전하게 보내진다고 약속하겠습니다.</string>
|
||||
<string name="feedback_title">피드백</string>
|
||||
<string name="describe_crash">무슨 일이 있었는지 서술해주세요(선택 사항)</string>
|
||||
<string name="enter_feedback">피드백 적기</string>
|
||||
<string name="optional_contact_email">이메일 주소(선택 사항)</string>
|
||||
<string name="include_debug_report_crash">사고에 대해 익명으로 자료도 보내기</string>
|
||||
<string name="include_debug_report_feedback">익명으로 이 기기에 대한 자료도 보내기</string>
|
||||
<string name="could_not_load_report_data">리포트 자료를 불러올 수 없었습니다.</string>
|
||||
<string name="send_report">리포트 보내기</string>
|
||||
<string name="close">닫기</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는 다른 앱이 위에 있을 때는 만져도 반응하지 않습니다.\n\n다음 앱이 화면 위에 있을 수 있습니다.\n\n%1$s</string>
|
||||
<string name="screen_filter_allow">이 앱이 위에 있는 것을 허용하기</string>
|
||||
<!--Permission Requests-->
|
||||
<string name="permission_camera_title">카메라 권한</string>
|
||||
<string name="permission_camera_request_body">QR 코드를 스캔하려면 Briar가 카메라를 사용할 수 있어야 합니다.</string>
|
||||
<string name="permission_location_title">위치 권한</string>
|
||||
<string name="permission_location_request_body">블루투스 기기를 찾으려면, Briar는 위치 정보에 대한 권한이 필요합니다.\n\nBriar는 위치 정보를 저장하거나 누구에게도 공유하지 않습니다.</string>
|
||||
<string name="permission_camera_location_title">카메라와 위치 정보</string>
|
||||
<string name="permission_camera_location_request_body">QR 코드를 스캔하려면, Briar는 카메라를 사용할 수 있어야 합니다.\n\n블루투스 기기를 찾으려면, Briar는 위치 정보에 대한 권한이 필요합니다.\n\nBriar는 위치 정보를 저장하거나 누구에게도 공유하지 않습니다.</string>
|
||||
<string name="permission_camera_denied_body">카메라 사용을 거절하셨지만, 연락처를 추가하기 위해서는 카메라를 사용해야 합니다.\n\n사용 허가를 고려해주시기 바랍니다.</string>
|
||||
<string name="qr_code">QR 코드</string>
|
||||
<string name="show_qr_code_fullscreen">QR 코드를 큰 화면으로 보이기</string>
|
||||
<!--App Locking-->
|
||||
<string name="lock_unlock">Briar 잠금 해제</string>
|
||||
<string name="lock_unlock_verbose">기기의 PIN, 패턴이나 비밀번호를 입력해 Briar를 잠금 해제하세요</string>
|
||||
<string name="lock_unlock_fingerprint_description">계속하시려면 등록된 손가락으로 지문인식 센서를 만져주세요</string>
|
||||
<string name="lock_unlock_password">비밀번호 사용하기</string>
|
||||
<string name="lock_is_locked">Briar가 잠겼습니다</string>
|
||||
<string name="lock_tap_to_unlock">눌러 잠금해제</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>
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_bob">철수</string>
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_carol">민수</string>
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Bob!-->
|
||||
<string name="screenshot_message_1">철수야, 안녕?</string>
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Alice!-->
|
||||
<string name="screenshot_message_2">영희야, 안녕! Briar에 대해 알려줘서 고마워!</string>
|
||||
<!--This is a message to be used in screenshots.-->
|
||||
<string name="screenshot_message_3">문자나 전화할 때는 Signal도 사용해 봐^^ 엄청 편하고 안전해!</string>
|
||||
</resources>
|
||||
@@ -1,561 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!--Setup-->
|
||||
<string name="setup_title">Sveiki atvykę į Briar</string>
|
||||
<string name="setup_name_explanation">Jūsų slapyvardis bus rodomas šalia bet kokio jūsų skelbiamo turinio. Sukūrę paskyrą, slapyvardžio pakeisti nebegalėsite.</string>
|
||||
<string name="setup_next">Kitas</string>
|
||||
<string name="setup_password_intro">Pasirinkite slaptažodį</string>
|
||||
<string name="setup_password_explanation">Jūsų Briar paskyra yra saugoma šifruotu pavidalu jūsų įrenginyje, o ne debesijoje. Jei pamiršite savo slaptažodį ar pašalinsite Briar programėlę, daugiau nebegalėsite atkurti savo paskyros.\n\nPasirinkite ilgą slaptažodį, kurį sunku atspėti, kaip pavyzdžiui, keturis atsitiktinius žodžius ar dešimt atsitiktinių raidžių, skaitmenų ir simbolių.</string>
|
||||
<string name="setup_doze_title">Foniniai ryšiai</string>
|
||||
<string name="setup_doze_intro">Norint gauti žinutes, Briar turi išlikti fone prisijungusi.</string>
|
||||
<string name="setup_doze_explanation">Norint gauti žinutes, Briar turi išlikti fone prisijungusi. Išjunkite akumuliatoriaus naudojimo optimizavimą, kad Briar galėtų išlikti prisijungusi.</string>
|
||||
<string name="setup_doze_button">Leisti ryšius</string>
|
||||
<string name="choose_nickname">Pasirinkite savo slapyvardį</string>
|
||||
<string name="choose_password">Pasirinkite savo slaptažodį</string>
|
||||
<string name="confirm_password">Pakartokite savo slaptažodį</string>
|
||||
<string name="name_too_long">Vardas yra per ilgas</string>
|
||||
<string name="password_too_weak">Slaptažodis yra per silpnas</string>
|
||||
<string name="passwords_do_not_match">Slaptažodžiai nesutampa</string>
|
||||
<string name="create_account_button">Sukurti paskyrą</string>
|
||||
<string name="more_info">Daugiau informacijos</string>
|
||||
<string name="don_t_ask_again">Daugiau nebeklausti</string>
|
||||
<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="warning_dozed">%s nepavyko pasileisti fone</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">Slaptažodis</string>
|
||||
<string name="try_again">Neteisingas slaptažodis, bandykite dar kartą</string>
|
||||
<string name="sign_in_button">Prisijungti</string>
|
||||
<string name="forgotten_password">Aš pamiršau savo slaptažodį</string>
|
||||
<string name="dialog_title_lost_password">Prarastas slaptažodis</string>
|
||||
<string name="dialog_message_lost_password">Jūsų Briar paskyra yra saugoma šifruotu pavidalu jūsų įrenginyje, o ne debesijoje, taigi, negalime atstatyti jūsų slaptažodžio Ar norėtumėte ištrinti savo paskyrą ir pradėti iš naujo?\n\nDėmesio: Jūsų tapatybės, žinutės ir adresatai bus prarasti visiems laikams.</string>
|
||||
<string name="startup_failed_notification_title">Nepavyko paleisti Briar</string>
|
||||
<string name="startup_failed_notification_text">Bakstelėkite išsamesnei informacijai.</string>
|
||||
<string name="startup_failed_activity_title">Briar paleidimo nesėkmė</string>
|
||||
<string name="startup_failed_db_error">Dėl kažkokių priežasčių, jūsų Briar duomenų bazė yra nepataisomai sugadinta. Jūsų paskyra, jūsų duomenys ir visi jūsų adresatai yra prarasti. Dėja, turite iš naujo įdiegti Briar arba nusistatyti naują paskyrą, slaptažodžio užklausoje, pasirinkdami \"Aš pamiršau savo slaptažodį\".</string>
|
||||
<string name="startup_failed_data_too_old_error">Jūsų paskyra buvo sukurta, naudojant seną šios programėlės versiją, ir negali būti atverta naudojant šią versiją. Jūs privalote arba iš naujo įdiegti seną versiją, arba nusistatyti naują paskyrą, slaptažodžio užklausoje, pasirinkdami \"Aš pamiršau savo slaptažodį\".</string>
|
||||
<string name="startup_failed_data_too_new_error">Ši programėlės versija yra per sena. Atnaujinkite į naujausią versiją ir bandykite dar kartą.</string>
|
||||
<string name="startup_failed_service_error">Briar nepavyko paleisti reikiamo įskiepio. Briar įdiegimas iš naujo, įprastai, išsprendžia šią problemą. Vis dėlto, turėkite omenyje, kad kadangi Briar duomenų laikymui nenaudoja centrinių serverių, jūs tokiu atveju prarasite savo paskyrą ir visus su ja susietus duomenis.</string>
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="one">Tai yra bandomoji Briar versija. Jūsų paskyros galiojimas pasibaigs po %d dienos ir negalės būti pratęstas.</item>
|
||||
<item quantity="few">Tai yra bandomoji Briar versija. Jūsų paskyros galiojimas pasibaigs po %d dienų ir negalės būti pratęstas.</item>
|
||||
<item quantity="many">Tai yra bandomoji Briar versija. Jūsų paskyros galiojimas pasibaigs po %d dienų ir negalės būti pratęstas.</item>
|
||||
<item quantity="other">Tai yra bandomoji Briar versija. Jūsų paskyros galiojimas pasibaigs po %d dienos ir negalės būti pratęstas.</item>
|
||||
</plurals>
|
||||
<string name="expiry_update">Bandomosios versijos galiojimo pabaigos data buvo pratęsta. Dabar, jūsų paskyros galiojimo laikas pasibaigs po %d dienų.</string>
|
||||
<string name="expiry_date_reached">Programinės įrangos galiojimas pasibaigė.\nDėkojame, kad išbandėte!</string>
|
||||
<string name="download_briar">Norėdami naudotis Briar, atsisiųskite versiją 1.0.</string>
|
||||
<string name="create_new_account">Jūs turėsite susikurti paskyrą, tačiau galėsite naudoti tą patį slapyvardį.</string>
|
||||
<string name="download_briar_button">Atsisiųsti Briar 1.0</string>
|
||||
<string name="startup_open_database">Iššifruojama duomenų bazė…</string>
|
||||
<string name="startup_migrate_database">Naujinama duomenų bazė…</string>
|
||||
<string name="startup_compact_database">Suspaudžiama duomenų bazė…</string>
|
||||
<!--Navigation Drawer-->
|
||||
<string name="nav_drawer_open_description">Atidaryti naršymo stalčių</string>
|
||||
<string name="nav_drawer_close_description">Uždaryti naršymo stalčių</string>
|
||||
<string name="contact_list_button">Adresatai</string>
|
||||
<string name="groups_button">Privačios grupės</string>
|
||||
<string name="forums_button">Forumai</string>
|
||||
<string name="blogs_button">Tinklaraščiai</string>
|
||||
<!--This is part of the main menu. The app will be locked when this is tapped.-->
|
||||
<string name="lock_button">Užrakinti programėlę</string>
|
||||
<string name="settings_button">Nustatymai</string>
|
||||
<string name="sign_out_button">Atsijungti</string>
|
||||
<!--Transports-->
|
||||
<string name="transport_tor">Internetas</string>
|
||||
<string name="transport_bt">Bluetooth</string>
|
||||
<string name="transport_lan">Belaidis (Wi-Fi)</string>
|
||||
<!--Notifications-->
|
||||
<string name="reminder_notification_title">Atsijungta iš Briar</string>
|
||||
<string name="reminder_notification_text">Bakstelėkite, norėdami prisijungti atgal.</string>
|
||||
<string name="reminder_notification_channel_title">Briar prisijungimo priminimas</string>
|
||||
<string name="reminder_notification_dismiss">Atmesti</string>
|
||||
<string name="ongoing_notification_title">Prisijungta į Briar</string>
|
||||
<string name="ongoing_notification_text">Prilieskite, norėdami atverti Briar.</string>
|
||||
<plurals name="private_message_notification_text">
|
||||
<item quantity="one">Nauja privati žinutė.</item>
|
||||
<item quantity="few">%d naujos privačios žinutės.</item>
|
||||
<item quantity="many">%d naujų privačių žinučių.</item>
|
||||
<item quantity="other">%d nauja privati žinutė.</item>
|
||||
</plurals>
|
||||
<plurals name="group_message_notification_text">
|
||||
<item quantity="one">Nauja grupės žinutė.</item>
|
||||
<item quantity="few">%d naujos grupės žinutės.</item>
|
||||
<item quantity="many">%d naujų grupės žinučių.</item>
|
||||
<item quantity="other">%d nauja grupės žinutė.</item>
|
||||
</plurals>
|
||||
<plurals name="forum_post_notification_text">
|
||||
<item quantity="one">Naujas forumo įrašas.</item>
|
||||
<item quantity="few">%d nauji forumo įrašai.</item>
|
||||
<item quantity="many">%d naujų forumo įrašų.</item>
|
||||
<item quantity="other">%d naujas forumo įrašas.</item>
|
||||
</plurals>
|
||||
<plurals name="blog_post_notification_text">
|
||||
<item quantity="one">Naujas tinklaraščio įrašas.</item>
|
||||
<item quantity="few">%d nauji tinklaraščio įrašai.</item>
|
||||
<item quantity="many">%d naujų tinklaraščio įrašų.</item>
|
||||
<item quantity="other">%d naujas tinklaraščio įrašas.</item>
|
||||
</plurals>
|
||||
<!--Misc-->
|
||||
<string name="now">dabar</string>
|
||||
<string name="show">Rodyti</string>
|
||||
<string name="hide">Slėpti</string>
|
||||
<string name="ok">Gerai</string>
|
||||
<string name="cancel">Atsisakyti</string>
|
||||
<string name="got_it">Supratau</string>
|
||||
<string name="delete">Ištrinti</string>
|
||||
<string name="accept">Priimti</string>
|
||||
<string name="decline">Atmesti</string>
|
||||
<string name="options">Parametrai</string>
|
||||
<string name="online">Pasiekiama(-s)</string>
|
||||
<string name="offline">Nepasiekiama(-s)</string>
|
||||
<string name="send">Siųsti</string>
|
||||
<string name="allow">Leisti</string>
|
||||
<string name="open">Atverti</string>
|
||||
<string name="no_data">Nėra duomenų</string>
|
||||
<string name="ellipsis">…</string>
|
||||
<string name="text_too_long">Įvestas tekstas yra per ilgas</string>
|
||||
<string name="show_onboarding">Rodyti pagalbos dialogą</string>
|
||||
<string name="fix">Pataisyti</string>
|
||||
<string name="help">Pagalba</string>
|
||||
<string name="sorry">Atsiprašome</string>
|
||||
<!--Contacts and Private Conversations-->
|
||||
<string name="no_contacts">Nėra rodytinų adresatų</string>
|
||||
<string name="no_contacts_action">Norėdami pridėti adresatą, bakstelėkite + piktogramą</string>
|
||||
<string name="date_no_private_messages">Žinučių nėra.</string>
|
||||
<string name="no_private_messages">Nėra rodytinų žinučių</string>
|
||||
<string name="message_hint">Rašykite žinutę</string>
|
||||
<string name="image_caption_hint">Pridėkite paaiškinimą (nebūtina)</string>
|
||||
<string name="image_attach">Pridėti paveikslą</string>
|
||||
<string name="image_attach_error">Nepavyko pridėti paveikslo(-ų)</string>
|
||||
<string name="image_attach_error_too_big">Paveikslas per didelis. Apribojimas yra %d MB.</string>
|
||||
<string name="image_attach_error_invalid_mime_type">Nepalaikomas paveikslo formatas: %s</string>
|
||||
<string name="set_contact_alias">Pakeisti adresato vardą</string>
|
||||
<string name="set_contact_alias_hint">Adresato vardas</string>
|
||||
<string name="set_alias_button">Pakeisti</string>
|
||||
<string name="delete_contact">Ištrinti adresatą</string>
|
||||
<string name="dialog_title_delete_contact">Patvirtinkite adresato ištrynimą</string>
|
||||
<string name="dialog_message_delete_contact">Ar tikrai norite pašalinti šį adresatą ir visas žinutes, kuriomis apsikeitėte su šiuo adresatu ?</string>
|
||||
<string name="contact_deleted_toast">Adresatas ištrintas</string>
|
||||
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
|
||||
<string name="you">Jūs</string>
|
||||
<string name="save_image">Įrašyti paveikslą</string>
|
||||
<string name="dialog_title_save_image">Įrašyti paveikslą?</string>
|
||||
<string name="dialog_message_save_image">Įrašius šį paveikslą, kitoms programėlėms bus leista gauti prieigą prie jo.\n\nAr tikrai norite įrašyti?</string>
|
||||
<string name="save_image_success">Paveikslas buvo įrašytas</string>
|
||||
<string name="save_image_error">Nepavyko įrašyti paveikslo</string>
|
||||
<string name="dialog_title_no_image_support">Paveikslai neprieinami</string>
|
||||
<string name="dialog_message_no_image_support">Jūsų adresato Briar kol kas nepalaiko paveikslo priedų. Jam atnaujinus programėlę, jūs matysite kitokią piktogramą.</string>
|
||||
<string name="dialog_title_image_support">Dabar šiam adresatui galite siųsti paveikslus</string>
|
||||
<string name="dialog_message_image_support">Bakstelėkite šią piktogramą, norėdami pridėti paveikslus.</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">Pridėti šalia esantį adresatą</string>
|
||||
<string name="face_to_face">Jūs privalote susitikti gyvai su asmeniu, kurį norite pridėti kaip adresatą.\n\nTai neleis bet kam apsimetinėti jumis ar ateityje skaityti jūsų žinutes.</string>
|
||||
<string name="continue_button">Tęsti</string>
|
||||
<string name="try_again_button">Bandyti dar kartą</string>
|
||||
<string name="waiting_for_contact_to_scan">Laukiama, kol adresatas nuskenuos ir prisijungs\u2026</string>
|
||||
<string name="exchanging_contact_details">Apsikeičiama adresato informacija\u2026</string>
|
||||
<string name="contact_added_toast">Adresatas pridėtas: %s</string>
|
||||
<string name="contact_already_exists">Adresatas %s jau yra</string>
|
||||
<string name="qr_code_invalid">QR kodas yra neteisingas</string>
|
||||
<string name="qr_code_too_old">Jūsų nuskenuotas QR kodas yra iš senesnės %s versijos.\n\nPaprašykite adresato, kad atsinaujintų į naujausią versiją, o tuomet bandykite dar kartą.</string>
|
||||
<string name="qr_code_too_new">Jūsų nuskenuotas QR kodas yra iš naujesnės %s versijos.\n\nAtsinaujinkite į naujausią versiją, o tuomet bandykite dar kartą.</string>
|
||||
<string name="camera_error">Kameros klaida</string>
|
||||
<string name="connecting_to_device">Jungiamasi prie įrenginio\u2026</string>
|
||||
<string name="authenticating_with_device">Tapatybės nustatymas su įrenginiu\u2026</string>
|
||||
<string name="connection_error_title">Nepavyko prisijungti prie jūsų adresato</string>
|
||||
<string name="connection_error_explanation">Įsitikinkite, kad abu esate prisijungę prie to paties belaidžio (Wi-Fi) tinklo.</string>
|
||||
<string name="connection_error_feedback">Jei ši problema išlieka, <a href="feedback">atsiųskite mums atsiliepimą</a>, kad padėtumėte mums patobulinti programėlę.</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">Pridėti adresatą per atstumą</string>
|
||||
<string name="add_contact_nearby_title">Pridėti šalia esantį adresatą</string>
|
||||
<string name="add_contact_remotely_title">Pridėti adresatą per atstumą</string>
|
||||
<string name="contact_name_hint">Suteikite adresatui slapyvardį</string>
|
||||
<string name="contact_link_intro">Čia įveskite iš adresato gautą nuorodą</string>
|
||||
<string name="contact_link_hint">Adresato nuoroda</string>
|
||||
<string name="paste_button">Įdėti</string>
|
||||
<string name="add_contact_button">Pridėti adresatą</string>
|
||||
<string name="copy_button">Kopijuoti</string>
|
||||
<string name="share_button">Bendrinti</string>
|
||||
<string name="send_link_title">Apsikeiskite nuorodomis</string>
|
||||
<string name="add_contact_choose_nickname">Pasirinkite slapyvardį</string>
|
||||
<string name="add_contact_choose_a_nickname">Įveskite slapyvardį</string>
|
||||
<string name="nickname_intro">Suteikite savo adresatui slapyvardį. Slapyvardį matysite tik jūs.</string>
|
||||
<string name="your_link">Perduokite šią nuorodą adresatui, kurį norite pridėti</string>
|
||||
<string name="link_clip_label">Briar nuoroda</string>
|
||||
<string name="link_copied_toast">Nuoroda nukopijuota</string>
|
||||
<string name="adding_contact_error">Pridedant adresatą, įvyko klaida.</string>
|
||||
<string name="pending_contact_requests_snackbar">Yra laukiančių adresato užklausų</string>
|
||||
<string name="pending_contact_requests">Laukiančios adresato užklausos</string>
|
||||
<string name="no_pending_contacts">Laukiančių adresatų nėra</string>
|
||||
<string name="add_contact_remote_connecting">Jungiamasi…</string>
|
||||
<string name="waiting_for_contact_to_come_online">Laukiama, kol adresatas prisijungs prie tinko…</string>
|
||||
<string name="connecting">Jungiamasi…</string>
|
||||
<string name="adding_contact">Pridedamas adresatas…</string>
|
||||
<string name="adding_contact_failed">Adresato pridėti nepavyko</string>
|
||||
<string name="dialog_title_remove_pending_contact">Patvirtinkite šalinimą</string>
|
||||
<string name="dialog_message_remove_pending_contact">Šis adresatas yra vis dar pridedamas. Jeigu jį dabar pašalinsite, jis nebus pridėtas.</string>
|
||||
<string name="own_link_error">Įveskite ne savo, o adresato nuorodą</string>
|
||||
<string name="nickname_missing">Įveskite slapyvardį</string>
|
||||
<string name="invalid_link">Neteisinga nuoroda</string>
|
||||
<string name="unsupported_link">Ši nuoroda atėjo iš naujesnės Briar versijos. Atsinaujinkite į naujausią versiją ir bandykite dar kartą.</string>
|
||||
<string name="intent_own_link">Jūs atvėrėte savo nuorodą. Naudokite nuorodą to adresato, kurį norite pridėti!</string>
|
||||
<string name="missing_link">Įveskite nuorodą</string>
|
||||
<!--This is a numeral indicating the first step in a series of screens-->
|
||||
<string name="step_1">1</string>
|
||||
<!--This is a numeral indicating the second step in a series of screens-->
|
||||
<string name="step_2">2</string>
|
||||
<plurals name="contact_added_notification_text">
|
||||
<item quantity="one">Pridėtas naujas adresatas.</item>
|
||||
<item quantity="few">Pridėti %d nauji adresatai.</item>
|
||||
<item quantity="many">Pridėta %d naujų adresatų.</item>
|
||||
<item quantity="other">Pridėtas %d naujas adresatas.</item>
|
||||
</plurals>
|
||||
<string name="adding_contact_slow_warning">Adresato pridėjimas užtrunka ilgiau nei įprasta</string>
|
||||
<string name="adding_contact_slow_title">Nepavyksta prisijungti prie adresato</string>
|
||||
<string name="adding_contact_slow_text">Šio adresato pridėjimas užtrunka ilgiau nei įprasta.\n\nPatikrinkite ar šis adresatas gavo jūsų nuorodą ir pridėjo jus:</string>
|
||||
<string name="offline_state">Nėra interneto ryšio</string>
|
||||
<string name="duplicate_link_dialog_title">Identiška nuoroda</string>
|
||||
<string name="duplicate_link_dialog_text_1">Jūs jau turite laukiančią adresato užklausą su šia nuoroda: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Ar %s ir %s yra tas pats asmuo?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
<string name="same_person_button">Tas pats asmuo</string>
|
||||
<!--This is a button for answering that two nicknames refer to different people. This string
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Kitas asmuo</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s ir %s išsiuntė jums tą pačią nuorodą.\n\nGali būti, kad vienas iš šių asmenų bando sužinoti kas yra jūsų adresatų sąraše.\n\nNesakykite šiems asmenims, kad gavote tokią pačią nuorodą iš kito asmens.</string>
|
||||
<string name="pending_contact_updated_toast">Laukiantis adresatas atnaujintas</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Supažindinkite savo adresatus</string>
|
||||
<string name="introduction_onboarding_text">Galite supažindinti savo adresatus vieną su kitu, kad jiems nereikėtų susitikti gyvai ir jie galėtų užmegzti ryšį, naudodami Briar.</string>
|
||||
<string name="introduction_menu_item">Supažindinti</string>
|
||||
<string name="introduction_activity_title">Pasirinkite adresatą</string>
|
||||
<string name="introduction_not_possible">Jau vyksta vienas supažindinimas tarp šių adresatų. Iš pradžių, leiskite, kad jis būtų užbaigtas. Jeigu jūs ar jūsų adresatai retai būna prisijungę, tuomet tai gali šiek tiek užtrukti.</string>
|
||||
<string name="introduction_message_title">Supažindinkite adresatus</string>
|
||||
<string name="introduction_message_hint">Pridėkite žinutę (nebūtina)</string>
|
||||
<string name="introduction_button">Supažindinti</string>
|
||||
<string name="introduction_sent">Jūsų supažindinimas išsiųstas.</string>
|
||||
<string name="introduction_error">Supažindinant, įvyko klaida.</string>
|
||||
<string name="introduction_response_error">Klaida, atsakant į supažindinimą</string>
|
||||
<string name="introduction_request_sent">Jūs paprašėte, kad naudotojas %1$s būtų supažindintas su %2$s.</string>
|
||||
<string name="introduction_request_received">%1$s paprašė supažindinti jus su %2$s. Ar norite pridėti naudotoją %2$s į savo adresatų sąrašą?</string>
|
||||
<string name="introduction_request_exists_received">%1$s paprašė supažindinti jus su %2$s, tačiau %2$s jau yra jūsų adresatų sąraše. Kadangi %1$s gali to ir nežinoti, vis tiek galite atsakyti:</string>
|
||||
<string name="introduction_request_answered_received">%1$s paprašė supažindinti jus su %2$s.</string>
|
||||
<string name="introduction_response_accepted_sent">Jūs priėmėte supažindinimą su %1$s.</string>
|
||||
<string name="introduction_response_accepted_sent_info">Prieš tai, kai naudotojas %1$s bus pridėtas į jūsų adresatus, jis taip pat turi priimti supažindinimą. Tai gali šiek tiek užtrukti.</string>
|
||||
<string name="introduction_response_declined_sent">Jūs atmetėte supažindinimą su %1$s.</string>
|
||||
<string name="introduction_response_accepted_received">%1$s priėmė supažindinimą su %2$s.</string>
|
||||
<string name="introduction_response_declined_received">%1$s atmetė supažindinimą su %2$s.</string>
|
||||
<string name="introduction_response_declined_received_by_introducee">%1$s sako, kad %2$s atmetė supažindinimą.</string>
|
||||
<!--Private Groups-->
|
||||
<string name="groups_list_empty">Nėra rodytinų grupių</string>
|
||||
<string name="groups_list_empty_action">Norėdami sukurti grupę ar paprašyti savo adresatų pradėti su jumis bendrinti grupes, bakstelėkite + piktogramą</string>
|
||||
<string name="groups_created_by">Sukūrė %s</string>
|
||||
<plurals name="messages">
|
||||
<item quantity="one">%d žinutė</item>
|
||||
<item quantity="few">%d žinutės</item>
|
||||
<item quantity="many">%d žinučių</item>
|
||||
<item quantity="other">%d žinutė</item>
|
||||
</plurals>
|
||||
<string name="groups_group_is_empty">Ši grupė tuščia</string>
|
||||
<string name="groups_group_is_dissolved">Ši grupė išformuota</string>
|
||||
<string name="groups_remove">Šalinti</string>
|
||||
<string name="groups_create_group_title">Sukurkite privačią grupę</string>
|
||||
<string name="groups_create_group_button">Sukurti grupę</string>
|
||||
<string name="groups_create_group_invitation_button">Siųsti pakvietimą</string>
|
||||
<string name="groups_create_group_hint">Pasirinkite savo privačios grupės pavadinimą</string>
|
||||
<string name="groups_invitation_sent">Pakvietimas į grupę išsiųstas</string>
|
||||
<string name="groups_member_list">Narių sąrašas</string>
|
||||
<string name="groups_invite_members">Pakviesti narius</string>
|
||||
<string name="groups_member_created_you">Jūs sukūrėte grupę</string>
|
||||
<string name="groups_member_created">%s sukūrė grupę</string>
|
||||
<string name="groups_member_joined_you">Jūs prisijungėte prie grupės</string>
|
||||
<string name="groups_member_joined">%s prisijungė prie grupės</string>
|
||||
<string name="groups_leave">Išeiti iš grupės</string>
|
||||
<string name="groups_leave_dialog_title">Patvirtinkite išėjimą iš grupės</string>
|
||||
<string name="groups_leave_dialog_message">Ar tikrai norite išeiti iš šios grupės?</string>
|
||||
<string name="groups_dissolve">Išformuoti grupę</string>
|
||||
<string name="groups_dissolve_dialog_title">Patvirtinkite grupės išformavimą</string>
|
||||
<string name="groups_dissolve_dialog_message">Ar tikrai norite išformuoti šią grupę?\n\nVisi kiti nariai negalės tęsti savo pokalbio ir gali nebegauti naujausių žinučių.</string>
|
||||
<string name="groups_dissolve_button">Išformuoti</string>
|
||||
<string name="groups_dissolved_dialog_title">Grupė išformuota</string>
|
||||
<string name="groups_dissolved_dialog_message">Šios grupės įkūrėjas ją išformavo.\n\nJūs daugiau nebegalite rašyti žinučių į šią grupę ir galite nebegauti visų parašytų įrašų.</string>
|
||||
<!--Private Group Invitations-->
|
||||
<string name="groups_invitations_title">Pakvietimai į grupę</string>
|
||||
<string name="groups_invitations_invitation_sent">Jūs pakvietėte, kad %1$s prisijungtų prie grupės \"%2$s\".</string>
|
||||
<string name="groups_invitations_invitation_received">%1$s pakvietė jus prisijungti prie grupės \"%2$s\".</string>
|
||||
<string name="groups_invitations_joined">Prisijungta prie grupės</string>
|
||||
<string name="groups_invitations_declined">Pakvietimas į grupę atmestas</string>
|
||||
<plurals name="groups_invitations_open">
|
||||
<item quantity="one">%d atviras pakvietimas į grupę</item>
|
||||
<item quantity="few">%d atviri pakvietimai į grupę</item>
|
||||
<item quantity="many">%d atvirų pakvietimų į grupę</item>
|
||||
<item quantity="other">%d atviras pakvietimas į grupę</item>
|
||||
</plurals>
|
||||
<string name="groups_invitations_response_accepted_sent">Jūs priėmėte pakvietimą į grupę iš %s.</string>
|
||||
<string name="groups_invitations_response_declined_sent">Jūs atmetėte pakvietimą į grupę iš %s.</string>
|
||||
<string name="groups_invitations_response_accepted_received">%s priėmė pakvietimą į grupę.</string>
|
||||
<string name="groups_invitations_response_declined_received">%s atmetė pakvietimą į grupę.</string>
|
||||
<string name="sharing_status_groups">Tik įkūrėjas gali kviesti naujus narius į grupę. Žemiau yra visi esami grupės nariai.</string>
|
||||
<!--Private Groups Revealing Contacts-->
|
||||
<string name="groups_reveal_contacts">Atskleisti adresatus</string>
|
||||
<string name="groups_reveal_dialog_message">Galite pasirinkti ar atskleisti adresatus visiems esamiems ir būsimiems šios grupės nariams.\n\nAdresatų atskleidimas paverčia jūsų ryšį su grupe greitesnį ir labiau patikimą, nes galite bendrauti su atskleistais adresatais netgi tuomet, kai grupės įkūrėjas yra atsijungęs.</string>
|
||||
<string name="groups_reveal_visible">Adresatų sąryšiai yra matomi grupei</string>
|
||||
<string name="groups_reveal_visible_revealed_by_us">Adresatų sąryšiai yra matomi grupei (atskleidėte jūs)</string>
|
||||
<string name="groups_reveal_visible_revealed_by_contact">Adresatų sąryšiai yra matomi grupei (atskleidė %s)</string>
|
||||
<string name="groups_reveal_invisible">Adresatų sąryšiai nėra matomi grupei</string>
|
||||
<!--Forums-->
|
||||
<string name="no_forums">Nėra rodytinų forumų</string>
|
||||
<string name="no_forums_action">Norėdami sukurti forumą ar paprašyti savo adresatų pradėti su jumis bendrinti forumus, bakstelėkite + piktogramą</string>
|
||||
<string name="create_forum_title">Sukurkite forumą</string>
|
||||
<string name="choose_forum_hint">Pasirinkite savo forumo pavadinimą</string>
|
||||
<string name="create_forum_button">Sukurti forumą</string>
|
||||
<string name="forum_created_toast">Forumas sukurtas</string>
|
||||
<string name="no_forum_posts">Nėra rodytinų įrašų</string>
|
||||
<string name="no_posts">Įrašų nėra</string>
|
||||
<plurals name="posts">
|
||||
<item quantity="one">%d įrašas</item>
|
||||
<item quantity="few">%d įrašai</item>
|
||||
<item quantity="many">%d įrašų</item>
|
||||
<item quantity="other">%d įrašas</item>
|
||||
</plurals>
|
||||
<string name="forum_new_message_hint">Naujas įrašas</string>
|
||||
<string name="forum_message_reply_hint">Naujas atsakymas</string>
|
||||
<string name="btn_reply">Atsakyti</string>
|
||||
<string name="forum_leave">Išeiti iš forumo</string>
|
||||
<string name="dialog_title_leave_forum">Patvirtinkite išėjimą iš forumo</string>
|
||||
<string name="dialog_message_leave_forum">Ar tikrai norite išeiti iš šio forumo?\n\nBet kokie adresatai, su kuriais bendrinote šį forumą, gali nustoti gauti atnaujinimus.</string>
|
||||
<string name="dialog_button_leave">Išeiti</string>
|
||||
<string name="forum_left_toast">Išeita iš forumo</string>
|
||||
<!--Forum Sharing-->
|
||||
<string name="forum_share_button">Bendrinti forumą</string>
|
||||
<string name="contacts_selected">Pasirinkti adresatai</string>
|
||||
<string name="activity_share_toolbar_header">Pasirinkite adresatus</string>
|
||||
<string name="no_contacts_selector">Nėra rodytinų adresatų</string>
|
||||
<string name="no_contacts_selector_action">Grįžkite čia po to, kai pridėsite adresatą</string>
|
||||
<string name="forum_shared_snackbar">Forumas bendrinamas su pasirinktais adresatais</string>
|
||||
<string name="forum_share_message">Pridėkite žinutę (nebūtina)</string>
|
||||
<string name="forum_share_error">Bendrinant šį forumą, įvyko klaida.</string>
|
||||
<string name="forum_invitation_received">%1$s pradėjo bendrinti su jumis forumą \"%2$s\".</string>
|
||||
<string name="forum_invitation_sent">Jūs pradėjote bendrinti su %2$s forumą \"%1$s\".</string>
|
||||
<string name="forum_invitations_title">Pakvietimai į forumą</string>
|
||||
<string name="forum_invitation_exists">Jūs jau priėmėte pakvietimą į šį forumą.\n\nPriėmus daugiau pakvietimų, jūsų ryšys su forumu taps greitesnis ir patikimesnis.</string>
|
||||
<string name="forum_joined_toast">Prisijungta prie forumo</string>
|
||||
<string name="forum_declined_toast">Pakvietimas atmestas</string>
|
||||
<string name="shared_by_format">Bendrina %s</string>
|
||||
<string name="forum_invitation_already_sharing">Jau bendrinamas</string>
|
||||
<string name="forum_invitation_response_accepted_sent">Jūs priėmėte pakvietimą į forumą iš %s.</string>
|
||||
<string name="forum_invitation_response_declined_sent">Jūs atmetėte pakvietimą į forumą iš %s.</string>
|
||||
<string name="forum_invitation_response_accepted_received">%s priėmė pakvietimą į forumą.</string>
|
||||
<string name="forum_invitation_response_declined_received">%s atmetė pakvietimą į forumą.</string>
|
||||
<string name="sharing_status">Bendrinimo būsena</string>
|
||||
<string name="sharing_status_forum">Bet kuris forumo narys gali jį bendrinti su savo adresatais. Jūs bendrinate šį forumą su šiais adresatais. Taip pat gali būti ir kitų narių, kurių nematote.</string>
|
||||
<string name="shared_with">Bendrinama su %1$d (%2$d pasiekiami)</string>
|
||||
<plurals name="forums_shared">
|
||||
<item quantity="one">Adresatų bendrinamas %d forumas</item>
|
||||
<item quantity="few">Adresatų bendrinami %d forumai</item>
|
||||
<item quantity="many">Adresatų bendrinama %d forumų</item>
|
||||
<item quantity="other">Adresatų bendrinamas %d forumas</item>
|
||||
</plurals>
|
||||
<string name="nobody">Niekas</string>
|
||||
<!--Blogs-->
|
||||
<string name="blogs_other_blog_empty_state">Nėra rodytinų įrašų</string>
|
||||
<string name="read_more">skaityti daugiau</string>
|
||||
<string name="blogs_write_blog_post">Rašyti tinklaraščio įrašą</string>
|
||||
<string name="blogs_write_blog_post_body_hint">Rašykite savo tinklaraščio įrašą</string>
|
||||
<string name="blogs_publish_blog_post">Paskelbti</string>
|
||||
<string name="blogs_blog_post_created">Tinklaraščio įrašas sukurtas</string>
|
||||
<string name="blogs_blog_post_received">Gautas naujas tinklaraščio įrašas</string>
|
||||
<string name="blogs_blog_post_scroll_to">Slinkti</string>
|
||||
<string name="blogs_feed_empty_state">Nėra rodytinų įrašų</string>
|
||||
<string name="blogs_feed_empty_state_action">Čia bus rodomi įrašai iš jūsų adresatų bei jūsų prenumeruojamų tinklaraščių\n\nNorėdami rašyti įrašą, bakstelėkite rašiklio piktogramą</string>
|
||||
<string name="blogs_remove_blog">Šalinti tinklaraštį</string>
|
||||
<string name="blogs_remove_blog_dialog_message">Ar tikrai norite pašalinti šį tinklaraštį?\n\nĮrašai bus pašalinti iš jūsų įrenginio, tačiau liks kitų žmonių įrenginiuose.\n\nBet kokie adresatai, su kuriais bendrinote šį tinklaraštį, gali nustoti gauti atnaujinimus.</string>
|
||||
<string name="blogs_remove_blog_ok">Šalinti</string>
|
||||
<string name="blogs_blog_removed">Tinklaraštis pašalintas</string>
|
||||
<string name="blogs_reblog_comment_hint">Pridėkite komentarą (nebūtina)</string>
|
||||
<string name="blogs_reblog_button">Bendrinti į savo tinklaraštį</string>
|
||||
<!--Blog Sharing-->
|
||||
<string name="blogs_sharing_share">Bendrinti tinklaraštį</string>
|
||||
<string name="blogs_sharing_error">Bendrinant šį tinklaraštį, įvyko klaida.</string>
|
||||
<string name="blogs_sharing_button">Bendrinti tinklaraštį</string>
|
||||
<string name="blogs_sharing_snackbar">Tinklaraštis bendrinamas su pasirinktais adresatais</string>
|
||||
<string name="blogs_sharing_response_accepted_sent">Jūs priėmėte pakvietimą į tinklaraštį iš %s.</string>
|
||||
<string name="blogs_sharing_response_declined_sent">Jūs atmetėte pakvietimą į tinklaraštį iš %s.</string>
|
||||
<string name="blogs_sharing_response_accepted_received">%s priėmė pakvietimą į tinklaraštį.</string>
|
||||
<string name="blogs_sharing_response_declined_received">%s atmetė pakvietimą į tinklaraštį.</string>
|
||||
<string name="blogs_sharing_invitation_received">%1$s pradėjo bendrinti su jumis tinklaraštį \"%2$s\".</string>
|
||||
<string name="blogs_sharing_invitation_sent">Jūs pradėjote bendrinti su %2$s tinklaraštį \"%1$s\".</string>
|
||||
<string name="blogs_sharing_invitations_title">Pakvietimai į tinklaraštį</string>
|
||||
<string name="blogs_sharing_joined_toast">Tinklaraštis užprenumeruotas</string>
|
||||
<string name="blogs_sharing_declined_toast">Pakvietimas atmestas</string>
|
||||
<string name="sharing_status_blog">Bet kas, prenumeruojantis tinklaraštį, gali jį bendrinti su savo adresatais. Jūs bendrinate šį tinklaraštį su šiais adresatais. Taip pat gali būti ir kitų prenumeratorių, kurių nematote.</string>
|
||||
<!--RSS Feeds-->
|
||||
<string name="blogs_rss_feeds_import">Importuoti RSS kanalą</string>
|
||||
<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_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 Display-->
|
||||
<string name="pref_language_title">Kalba ir regionas</string>
|
||||
<string name="pref_language_changed">Šis nustatymas įsigalios, kai paleisite Briar iš naujo. Atsijunkite ir paleiskite Briar iš naujo.</string>
|
||||
<string name="pref_language_default">Sistemos numatytoji</string>
|
||||
<string name="display_settings_title">Rodinys</string>
|
||||
<string name="pref_theme_title">Apipavidalinimas</string>
|
||||
<string name="pref_theme_light">Šviesus</string>
|
||||
<string name="pref_theme_dark">Tamsus</string>
|
||||
<string name="pref_theme_auto">Automatinis (Dienos metas)</string>
|
||||
<string name="pref_theme_system">Sistemos numatytasis</string>
|
||||
<!--Settings Network-->
|
||||
<string name="network_settings_title">Tinklai</string>
|
||||
<string name="bluetooth_setting">Prisijungti per Bluetooth</string>
|
||||
<string name="bluetooth_setting_enabled">Kai adresatai yra šalia</string>
|
||||
<string name="bluetooth_setting_disabled">Tik pridedant adresatus</string>
|
||||
<string name="tor_network_setting">Prisijungti per internetą (Tor)</string>
|
||||
<string name="tor_network_setting_automatic">Automatiškai pagal buvimo vietą</string>
|
||||
<string name="tor_network_setting_without_bridges">Naudoti Tor be tinklų tiltų</string>
|
||||
<string name="tor_network_setting_with_bridges">Naudoti Tor su tinklų tiltais</string>
|
||||
<string name="tor_network_setting_never">Neprisijungti</string>
|
||||
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||
<string name="tor_network_setting_summary">Automatiškai: %1$s (šalyje %2$s)</string>
|
||||
<string name="tor_mobile_data_title">Naudoti mobiliuosius duomenis</string>
|
||||
<string name="tor_only_when_charging_title">Prisijungti per internetą (Tor) tik įkraunant įrenginį</string>
|
||||
<string name="tor_only_when_charging_summary">Išjungia interneto ryšį, kai įrenginys veikia naudodamas akumuliatorių</string>
|
||||
<!--Settings Security and Panic-->
|
||||
<string name="security_settings_title">Saugumas</string>
|
||||
<string name="pref_lock_title">Programėlės užrakinimas</string>
|
||||
<string name="pref_lock_summary">Naudoti įrenginio ekrano užraktą, kad esant prisijungus, Briar būtų apsaugota</string>
|
||||
<string name="pref_lock_disabled_summary">Norėdami naudoti šią ypatybę, nusistatykite įrenginyje ekrano užraktą</string>
|
||||
<string name="pref_lock_timeout_title">Programėlės užrakinimo laiko limitas esant neveiklumui</string>
|
||||
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
|
||||
<string name="pref_lock_timeout_summary">Nenaudojant Briar, automatiškai ją užrakinti po %s</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_1">1 minutės</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_5">5 minučių</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_15">15 minučių</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_30">30 minučių</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_60">1 valandos</string>
|
||||
<string name="pref_lock_timeout_never">Niekada</string>
|
||||
<string name="pref_lock_timeout_never_summary">Niekada automatiškai neužrakinti Briar</string>
|
||||
<string name="change_password">Pakeisti slaptažodį</string>
|
||||
<string name="current_password">Dabartinis slaptažodis</string>
|
||||
<string name="choose_new_password">Naujas slaptažodis</string>
|
||||
<string name="confirm_new_password">Pakartokite naują slaptažodį</string>
|
||||
<string name="password_changed">Slaptažodis pakeistas.</string>
|
||||
<string name="panic_setting">Panikos mygtuko sąranka</string>
|
||||
<string name="panic_setting_title">Panikos mygtukas</string>
|
||||
<string name="panic_setting_hint">Konfigūruoti ką Briar darys, kai naudosite panikos mygtuko programėlę</string>
|
||||
<string name="panic_app_setting_title">Panikos mygtuko programėlė</string>
|
||||
<string name="unknown_app">nežinoma programėlė</string>
|
||||
<string name="panic_app_setting_summary">Nėra nustatyta jokia programėlė</string>
|
||||
<string name="panic_app_setting_none">Nėra</string>
|
||||
<string name="dialog_title_connect_panic_app">Patvirtinkite panikos programėlę</string>
|
||||
<string name="dialog_message_connect_panic_app">Ar tikrai norite leisti %1$s sukelti naikinamuosius panikos mygtuko veiksmus?</string>
|
||||
<string name="panic_setting_destructive_action">Naikinamieji veiksmai</string>
|
||||
<string name="panic_setting_signout_title">Atsijungti</string>
|
||||
<string name="panic_setting_signout_summary">Atsijungti iš Briar, jei yra paspaudžiamas panikos mygtukas</string>
|
||||
<string name="purge_setting_title">Ištrinti paskyrą</string>
|
||||
<string name="purge_setting_summary">Ištrinti jūsų Briar paskyrą, jei yra paspaudžiamas panikos mygtukas. Dėmesio: Tai visiems laikams ištrins jūsų tapatybes, adresatus ir žinutes</string>
|
||||
<string name="uninstall_setting_title">Pašalinti Briar</string>
|
||||
<string name="uninstall_setting_summary">Panikos atveju, tai reikalauja rankinio patvirtinimo</string>
|
||||
<!--Settings Notifications-->
|
||||
<string name="notification_settings_title">Pranešimai</string>
|
||||
<string name="notify_sign_in_title">Priminti man prisijungti</string>
|
||||
<string name="notify_sign_in_summary">Rodyti priminimą, kai telefonas įsijungia ar, kai programėlė buvo atnaujinta</string>
|
||||
<string name="notify_private_messages_setting_title">Privačios žinutės</string>
|
||||
<string name="notify_private_messages_setting_summary">Rodyti pranešimus apie privačias žinutes</string>
|
||||
<string name="notify_private_messages_setting_summary_26">Konfigūruoti privačių žinučių pranešimus</string>
|
||||
<string name="notify_group_messages_setting_title">Grupės žinutės</string>
|
||||
<string name="notify_group_messages_setting_summary">Rodyti pranešimus apie grupės žinutes</string>
|
||||
<string name="notify_group_messages_setting_summary_26">Konfigūruoti grupės žinučių pranešimus</string>
|
||||
<string name="notify_forum_posts_setting_title">Forumo įrašai</string>
|
||||
<string name="notify_forum_posts_setting_summary">Rodyti pranešimus apie forumo įrašus</string>
|
||||
<string name="notify_forum_posts_setting_summary_26">Konfigūruoti forumo įrašų pranešimus</string>
|
||||
<string name="notify_blog_posts_setting_title">Tinklaraščio įrašai</string>
|
||||
<string name="notify_blog_posts_setting_summary">Rodyti pranešimus apie tinklaraščio įrašus</string>
|
||||
<string name="notify_blog_posts_setting_summary_26">Konfigūruoti tinklaraščio įrašų pranešimus</string>
|
||||
<string name="notify_vibration_setting">Vibruoti</string>
|
||||
<string name="notify_sound_setting">Garsas</string>
|
||||
<string name="notify_sound_setting_default">Numatytoji skambėjimo melodija</string>
|
||||
<string name="notify_sound_setting_disabled">Nėra</string>
|
||||
<string name="choose_ringtone_title">Pasirinkite skambėjimo melodiją</string>
|
||||
<string name="cannot_load_ringtone">Nepavyksta įkelti skambučio melodijos</string>
|
||||
<!--Settings Feedback-->
|
||||
<string name="feedback_settings_title">Atsiliepimai</string>
|
||||
<string name="send_feedback">Siųsti atsiliepimą</string>
|
||||
<!--Link Warning-->
|
||||
<string name="link_warning_title">Įspėjimas apie nuorodą</string>
|
||||
<string name="link_warning_intro">Jūs ketinate atverti šią nuorodą, naudojant išorinę programėlę.</string>
|
||||
<string name="link_warning_text">Tai gali būti panaudota tam, kad jūs būtumėte atpažinti. Pagalvokite ar pasitikite asmeniu, kuris jums siunčia šią nuorodą ir apsvarstykite galimybę ją atverti, naudojant Tor Browser.</string>
|
||||
<string name="link_warning_open_link">Atverti nuorodą</string>
|
||||
<!--Crash Reporter-->
|
||||
<string name="crash_report_title">Briar strigties ataskaita</string>
|
||||
<string name="briar_crashed">Atleiskite, Briar užstrigo.</string>
|
||||
<string name="not_your_fault">Tai nėra jūsų kaltė.</string>
|
||||
<string name="please_send_report">Padėkite mums sukurti geresnę Briar, išsiųsdami mums strigties ataskaitą.</string>
|
||||
<string name="report_is_encrypted">Mes pažadame, kad ataskaita yra šifruota ir išsiunčiama saugiai.</string>
|
||||
<string name="feedback_title">Atsiliepimai</string>
|
||||
<string name="describe_crash">Aprašykite kas nutiko (nebūtina)</string>
|
||||
<string name="enter_feedback">Įveskite savo atsiliepimą</string>
|
||||
<string name="optional_contact_email">Jūsų el. pašto adresas (nebūtina)</string>
|
||||
<string name="include_debug_report_crash">Įtraukti anoniminius duomenis apie strigtį</string>
|
||||
<string name="include_debug_report_feedback">Įtraukti anoniminius duomenis apie šį įrenginį</string>
|
||||
<string name="could_not_load_report_data">Nepavyko įkelti ataskaitos duomenų.</string>
|
||||
<string name="send_report">Siųsti ataskaitą</string>
|
||||
<string name="close">Užverti</string>
|
||||
<string name="dev_report_saved">Ataskaita įrašyta. Ji bus išsiųsta, kai kitą kartą prisijungsite prie Briar.</string>
|
||||
<!--Sign Out-->
|
||||
<string name="progress_title_logout">Atsijungiama iš Briar…</string>
|
||||
<!--Screen Filters & Tapjacking-->
|
||||
<string name="screen_filter_title">Aptikta ekrano perdanga</string>
|
||||
<string name="screen_filter_body">Aptikta kitos programėlės perdanga virš Briar. Tam, kad būtų apsaugotas jūsų saugumas, Briar nereaguos į prilietimus tol, kol kita programėlė yra atvaizduojama ant viršaus. Gali būti, kad šios programėlės perdengia Briar:\n\n%1$s</string>
|
||||
<string name="screen_filter_allow">Leisti šioms programėlėms perdengti ant viršaus</string>
|
||||
<!--Permission Requests-->
|
||||
<string name="permission_camera_title">Kameros leidimas</string>
|
||||
<string name="permission_camera_request_body">Norint nuskenuoti QR kodą, Briar reikia prieigos prie kameros.</string>
|
||||
<string name="permission_location_title">Įrenginio vietovės leidimas</string>
|
||||
<string name="permission_location_request_body">Tam, kad galėtų atrasti Bluetooth įrenginius, Briar reikia gauti prieigą prie jūsų įrenginio vietovės.\n\nBriar nesaugo jūsų įrenginio vietovės ir su niekuo jos nebendrina.</string>
|
||||
<string name="permission_camera_location_title">Kamera ir įrenginio vietovė</string>
|
||||
<string name="permission_camera_location_request_body">Tam, kad galėtų nuskenuoti QR kodą, Briar reikia gauti prieigą prie jūsų kameros.\n\nTam, kad galėtų atrasti Bluetooth įrenginius, Briar reikia gauti prieigą prie jūsų įrenginio vietovės.\n\nBriar nesaugo jūsų įrenginio vietovės ir su niekuo jos nebendrina.</string>
|
||||
<string name="permission_camera_denied_body">Jūs uždraudėte prieigą prie kameros, tačiau norint pridėti adresatus, reikia naudoti kamerą.\n\nApsvarstykite galimybę sutekti prieigą prie kameros.</string>
|
||||
<string name="qr_code">QR kodas</string>
|
||||
<string name="show_qr_code_fullscreen">Rodyti QR kodą visame ekrane</string>
|
||||
<!--App Locking-->
|
||||
<string name="lock_unlock">Atrakinti Briar</string>
|
||||
<string name="lock_unlock_verbose">Norėdami atrakinti Briar, įveskite savo įrenginio PIN, šabloną ar slaptažodį</string>
|
||||
<string name="lock_unlock_fingerprint_description">Norėdami tęsti, priregistruotu pirštu prilieskite piršto atspaudo jutiklį</string>
|
||||
<string name="lock_unlock_password">Naudoti slaptažodį</string>
|
||||
<string name="lock_is_locked">Briar užrakinta</string>
|
||||
<string name="lock_tap_to_unlock">Bakstelėkite, norėdami atrakinti</string>
|
||||
<!--Screenshots-->
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_alice">Jurgita</string>
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_bob">Mindaugas</string>
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_carol">Vilma</string>
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Bob!-->
|
||||
<string name="screenshot_message_1">Labas, Mindaugai!</string>
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Alice!-->
|
||||
<string name="screenshot_message_2">Sveika, Jurgita! Ačiū, kad papasakojai man apie Briar!</string>
|
||||
<!--This is a message to be used in screenshots.-->
|
||||
<string name="screenshot_message_3">Jokių problemų, tikiuosi tau patiks 😀</string>
|
||||
</resources>
|
||||
@@ -50,7 +50,6 @@
|
||||
<string name="download_briar_button">Pobierz Briar 1.0</string>
|
||||
<string name="startup_open_database">Deszyfruję Bazę Danych...</string>
|
||||
<string name="startup_migrate_database">Aktualizuję Bazę Danych...</string>
|
||||
<string name="startup_compact_database">Kompaktowanie Bazy Danych…</string>
|
||||
<!--Navigation Drawer-->
|
||||
<string name="nav_drawer_open_description">Otwórz panel nawigacji</string>
|
||||
<string name="nav_drawer_close_description">Zamknij panel nawigacji</string>
|
||||
@@ -126,12 +125,6 @@
|
||||
<string name="date_no_private_messages">Brak wiadomości.</string>
|
||||
<string name="no_private_messages">Brak wiadomości do pokazania</string>
|
||||
<string name="message_hint">Typ wiadomości</string>
|
||||
<string name="image_caption_hint">Dodaj podpis (opcjonalne)</string>
|
||||
<string name="image_attach">Załącz zdjęcie</string>
|
||||
<string name="image_attach_error">Nie udało się dołączyć zdjęcia/zdjęć</string>
|
||||
<string name="image_attach_error_too_big">Zdjęcie jest zbyt duże. Limit wynosi %d MB.</string>
|
||||
<string name="image_attach_error_invalid_mime_type">Format zdjęcia jest nieobsługiwany: %s</string>
|
||||
<string name="set_contact_alias">Zmień imię kontaktu</string>
|
||||
<string name="set_contact_alias_hint">Nazwa kontaktu</string>
|
||||
<string name="set_alias_button">Zmień</string>
|
||||
<string name="delete_contact">Usuń kontakt</string>
|
||||
@@ -141,16 +134,7 @@
|
||||
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
|
||||
<string name="you">You</string>
|
||||
<string name="save_image">Zapisz obrazek</string>
|
||||
<string name="dialog_title_save_image">Zapisać Zdjęcie?</string>
|
||||
<string name="dialog_message_save_image">Zapisanie tego zdjęcia pozwoli innym aplikacjom na dostęp do niego.\n\nJesteś pewien, że chcesz go zapisać?</string>
|
||||
<string name="save_image_success">Zdjęcie zostało zapisane</string>
|
||||
<string name="save_image_error">Nie udało się zapisać zdjęcia</string>
|
||||
<string name="dialog_title_no_image_support">Zdjęcie Niedostępne</string>
|
||||
<string name="dialog_message_no_image_support">Briar twojego kontaktu nie obsługuje jeszcze załączników zdjęć. Jak wykonają aktualizację, zobaczysz inną ikonę.</string>
|
||||
<string name="dialog_title_image_support">Możesz teraz wysyłać zdjęcia do tego kontaktu</string>
|
||||
<string name="dialog_message_image_support">Kliknij tą ikonę aby dołączyć zdjęcia.</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">Dodaj Kontakt w Pobliżu</string>
|
||||
<string name="face_to_face">Musisz spotkać się z osobą którą chcesz dodać jako kontakt.\n\nTo uniemożliwi komukolwiek podszyć się pod Ciebie lub czytać wysyłane wiadomości.</string>
|
||||
<string name="continue_button">Kontynuuj</string>
|
||||
<string name="try_again_button">Spróbuj ponownie</string>
|
||||
@@ -159,8 +143,6 @@
|
||||
<string name="contact_added_toast">Kontakt dodany: %s</string>
|
||||
<string name="contact_already_exists">Kontakt %s już istnieje</string>
|
||||
<string name="qr_code_invalid">Kod QR jest nie prawidłowy</string>
|
||||
<string name="qr_code_too_old">Kod QR, który zeskanowałeś pochodzi od starszej wersji %s.\n\nPoproś swój kontakt do aktualizacji do najnowszej wersji i spróbuj ponownie.</string>
|
||||
<string name="qr_code_too_new">Kod QR, który zeskanowałeś pochodzi od nowszej wersji %s.\n\nZaktualizuj do najnowszej wersji i spróbuj ponownie.</string>
|
||||
<string name="camera_error">Błąd aparatu</string>
|
||||
<string name="connecting_to_device">Łączenie z urządzeniem\u2026</string>
|
||||
<string name="authenticating_with_device">Autoryzowanie z urządzeniem\u2026</string>
|
||||
@@ -168,68 +150,14 @@
|
||||
<string name="connection_error_explanation">Sprawdź czy oboje jesteście połączeni z tą samą siecią Wi-Fi.</string>
|
||||
<string name="connection_error_feedback">Jeśli problem będzie występować, proszę <a href="feedback">wysłać zgłoszenie</a> aby pomóc nam ulepszyć aplikację.</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">Dodaj Kontakt na Odległość</string>
|
||||
<string name="add_contact_nearby_title">Dodaj kontakt w pobliżu</string>
|
||||
<string name="add_contact_remotely_title">Dodaj kontakt na odległość</string>
|
||||
<string name="contact_name_hint">Daj pseudonim kontaktowi</string>
|
||||
<string name="contact_link_intro">Wprowadź tutaj link od swojego kontaktu</string>
|
||||
<string name="contact_link_hint">Link kontaktu</string>
|
||||
<string name="paste_button">Wklej</string>
|
||||
<string name="add_contact_button">Dodaj kontakt</string>
|
||||
<string name="copy_button">Kopiuj</string>
|
||||
<string name="share_button">Udostępnij</string>
|
||||
<string name="send_link_title">Wymień linki</string>
|
||||
<string name="add_contact_choose_nickname">Wybierz Pseudonim</string>
|
||||
<string name="add_contact_choose_a_nickname">Wprowadź pseudonim</string>
|
||||
<string name="nickname_intro">Daj pseudonim swojemu kontaktowi. Tylko ty możesz go widzieć.</string>
|
||||
<string name="your_link">Podaj ten link kontaktowi, którego chcesz dodać</string>
|
||||
<string name="link_clip_label">Link Briar</string>
|
||||
<string name="link_copied_toast">Link skopiowany</string>
|
||||
<string name="adding_contact_error">Wystąpił błąd podczas dodawaniu kontaktu</string>
|
||||
<string name="pending_contact_requests_snackbar">Są prośby oczekujących kontaktów</string>
|
||||
<string name="pending_contact_requests">Prośby Oczekujących Kontaktów</string>
|
||||
<string name="no_pending_contacts">Brak oczekujących kontaktów</string>
|
||||
<string name="add_contact_remote_connecting">Trwa łączenie...</string>
|
||||
<string name="waiting_for_contact_to_come_online">Czekam, aż kontakt pojawi się online…</string>
|
||||
<string name="connecting">Trwa łączenie...</string>
|
||||
<string name="adding_contact">Dodawanie kontaktu…</string>
|
||||
<string name="adding_contact_failed">Dodawanie kontaktu nie powiodło się</string>
|
||||
<string name="dialog_title_remove_pending_contact">Potwierdź Usunięcie</string>
|
||||
<string name="dialog_message_remove_pending_contact">Ten kontakt jest nadal dodawany. Jeżeli go teraz usuniesz, nie zostanie on dodany.</string>
|
||||
<string name="own_link_error">Wprowadź link twojego kontaktu, nie swój</string>
|
||||
<string name="nickname_missing">Proszę, wprowadź pseudonim</string>
|
||||
<string name="invalid_link">Niepoprawny pseudonim</string>
|
||||
<string name="unsupported_link">Ten link pochodzi od nowszej wersji Briara. Zaktualizuj do najnowszej wersji i spróbuj ponownie.</string>
|
||||
<string name="intent_own_link">Otworzyłeś swój własny link. Użyj jednego z kontaktów, którego chcesz dodać!</string>
|
||||
<string name="missing_link">Proszę, wprowadź link</string>
|
||||
<!--This is a numeral indicating the first step in a series of screens-->
|
||||
<string name="step_1">1</string>
|
||||
<!--This is a numeral indicating the second step in a series of screens-->
|
||||
<string name="step_2">2</string>
|
||||
<plurals name="contact_added_notification_text">
|
||||
<item quantity="one">Nowy kontakt dodany.</item>
|
||||
<item quantity="few">Nowe kontakty dodane.</item>
|
||||
<item quantity="many">Nowe kontakty dodane.</item>
|
||||
<item quantity="other">Dodano %d nowych kontaktów.</item>
|
||||
</plurals>
|
||||
<string name="adding_contact_slow_warning">Dodawanie tego kontaktu zajmuje więcej czasu niż zwykle</string>
|
||||
<string name="adding_contact_slow_title">Nie Można Połączyć się z Kontaktem</string>
|
||||
<string name="adding_contact_slow_text">Dodawanie tego kontaktu zajmuje więcej czasu niż zwykle.\n\nProsze sprawdź czy twój kontakt otrzymał twój link i ciebie dodał:</string>
|
||||
<string name="offline_state">Brak połączenia z Internetem</string>
|
||||
<string name="duplicate_link_dialog_title">Link Duplikat</string>
|
||||
<string name="duplicate_link_dialog_text_1">Masz już oczekujący kontakt z tym linkiem: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Czy %s i %s to te same osoby?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
<string name="same_person_button">Ta Sama Osoba</string>
|
||||
<!--This is a button for answering that two nicknames refer to different people. This string
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Inna Osoba</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s i %s wysłał ci ten sam link.\n\nJeden z nich może próbować odkryć, kim są twoje kontakty.\n\nNie mów im, że otrzymałeś ten sam link od kogoś innego.</string>
|
||||
<string name="pending_contact_updated_toast">Oczekujący kontakt zaktualizowany</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Udostępnij swoje kontakty.</string>
|
||||
<string name="introduction_onboarding_text">Możesz udostępniać kontakty, tak aby osoby nie musiały spotykać się osobiście.</string>
|
||||
@@ -433,14 +361,10 @@
|
||||
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||
<string name="tor_network_setting_summary">Automatycznie: %1$s (za %2$s)</string>
|
||||
<string name="tor_mobile_data_title">Używaj danych komórkowych</string>
|
||||
<string name="tor_only_when_charging_title">Łącz przez Internet (Tor) tylko podczas ładowania</string>
|
||||
<string name="tor_only_when_charging_summary">Wyłącza połączenie Internetowe, gdy urządzenie pracuje na baterii</string>
|
||||
<!--Settings Security and Panic-->
|
||||
<string name="security_settings_title">Bezpieczeństwo</string>
|
||||
<string name="pref_lock_title">Blokada aplikacji</string>
|
||||
<string name="pref_lock_summary">Użyj blokady ekranu urządzenia by chronić Briar gdy zalogowany</string>
|
||||
<string name="pref_lock_disabled_summary">Aby użyć tej funkcji skonfiguruj blokadę ekranu na swoim urządzeniu</string>
|
||||
<string name="pref_lock_timeout_title">Czas bezczynności aplikacji</string>
|
||||
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
|
||||
<string name="pref_lock_timeout_summary">Gdy nie używam Briar, automatycznie zablokuj po %s</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
@@ -469,7 +393,6 @@
|
||||
<string name="panic_app_setting_none">Brak</string>
|
||||
<string name="dialog_title_connect_panic_app">Potwierdź Awaryjną Aplikację</string>
|
||||
<string name="dialog_message_connect_panic_app">Czy na pewno chcesz pozwolić %1$s aby działała jako przycisk wyjścia awaryjnego?</string>
|
||||
<string name="panic_setting_destructive_action">Działania Destrukcyjne</string>
|
||||
<string name="panic_setting_signout_title">Wyloguj się</string>
|
||||
<string name="panic_setting_signout_summary">Wyloguj się z Briar jeśli przycisk zostanie wciśnięty</string>
|
||||
<string name="purge_setting_title">Skasuj Konto</string>
|
||||
@@ -504,7 +427,6 @@
|
||||
<!--Link Warning-->
|
||||
<string name="link_warning_title">Uważaj na link</string>
|
||||
<string name="link_warning_intro">Otwierasz link w zewnętrznej aplikacji.</string>
|
||||
<string name="link_warning_text">Może to posłużyć do twojej identyfikacji. Zastanów się czy ufasz osobie która wysłała Ci ten link i rozważ otwarcie go za pomocą Przeglądarki Tor.</string>
|
||||
<string name="link_warning_open_link">Otwórz Link</string>
|
||||
<!--Crash Reporter-->
|
||||
<string name="crash_report_title">Zgłoś błąd w Briar</string>
|
||||
@@ -531,10 +453,7 @@
|
||||
<!--Permission Requests-->
|
||||
<string name="permission_camera_title">Dostęp do aparatu</string>
|
||||
<string name="permission_camera_request_body">Aby zeskanować kod QR, Briar potrzebuje mieć dostęp do aparatu.</string>
|
||||
<string name="permission_location_title">Dostęp do lokalizacji</string>
|
||||
<string name="permission_location_request_body">Aby odkryć urządzenia Bluetooth, Briar potrzebuje zezwolenia na dostęp do twojej lokalizacji.\n\nBriar nie przechowuje twojej lokalizacji ani nie udostępnia jej nikomu.</string>
|
||||
<string name="permission_camera_location_title">Kamera i lokalizacja</string>
|
||||
<string name="permission_camera_location_request_body">Aby zeskanować kod QR, Briar potrzebuje dostępu do kamery.\n\nAby odkryć urządzenia Bluetooth, Briar potrzebuje zezwolenia na dostęp do Twojej lokalizacji.\n\nBriar nie przechowuje Twojej lokalizacji ani nie udostępnia jej nikomu.</string>
|
||||
<string name="permission_camera_denied_body">Odmówiłeś dostępu do kamery, lecz dodawanie kontaktów tego wymaga.\n\nProszę udzielić dostępu.</string>
|
||||
<string name="qr_code">Kod QR</string>
|
||||
<string name="show_qr_code_fullscreen">Pokaż QR na pełnym ekranie</string>
|
||||
@@ -547,15 +466,9 @@
|
||||
<string name="lock_tap_to_unlock">Dotknij by odblokować</string>
|
||||
<!--Screenshots-->
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_alice">Alicja</string>
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_bob">Bob</string>
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_carol">Karol</string>
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Bob!-->
|
||||
<string name="screenshot_message_1">Hej Bob!</string>
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Alice!-->
|
||||
<string name="screenshot_message_2">Hej Alicja! Dzięki za opowiedzenie mi o Briarze!</string>
|
||||
<!--This is a message to be used in screenshots.-->
|
||||
<string name="screenshot_message_3">Nie ma problemu, mam nadzieję, że ci się podoba 😀</string>
|
||||
</resources>
|
||||
|
||||
@@ -116,12 +116,6 @@
|
||||
<string name="date_no_private_messages">Sem Mensagens</string>
|
||||
<string name="no_private_messages">Nenhuma mensagem para ser exibida</string>
|
||||
<string name="message_hint">Digite a mensagem</string>
|
||||
<string name="image_caption_hint">Adicione uma legenda (opcional)</string>
|
||||
<string name="image_attach">Anexar imagem</string>
|
||||
<string name="image_attach_error">Não foi possível anexar imagem(s)</string>
|
||||
<string name="image_attach_error_too_big">Imagem muito grande. O limite é de %dMB. </string>
|
||||
<string name="image_attach_error_invalid_mime_type">Formato da imagem não suportado: %s</string>
|
||||
<string name="set_contact_alias">Alterar nome do contato</string>
|
||||
<string name="set_contact_alias_hint">Nome de contato</string>
|
||||
<string name="set_alias_button">Trocar</string>
|
||||
<string name="delete_contact">Apagar contato</string>
|
||||
@@ -130,17 +124,7 @@
|
||||
<string name="contact_deleted_toast">Contato apagado</string>
|
||||
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
|
||||
<string name="you">Você</string>
|
||||
<string name="save_image">Salvar imagem</string>
|
||||
<string name="dialog_title_save_image">Salvar imagem?</string>
|
||||
<string name="dialog_message_save_image">Salvando essa imagem irá permitir que outros aplicativos a acessem.\n\nVocê tem certeza que quer salvar? </string>
|
||||
<string name="save_image_success">Imagem salva</string>
|
||||
<string name="save_image_error">Não foi possível salvar imagem</string>
|
||||
<string name="dialog_title_no_image_support">Imagens indisponíveis</string>
|
||||
<string name="dialog_message_no_image_support">Seu contato do Briar ainda não suporta anexo de imagens. Quando ele atualizar um você verá ícone diferente.</string>
|
||||
<string name="dialog_title_image_support">Você agora pode enviar imagens para esse contato</string>
|
||||
<string name="dialog_message_image_support">Toque nesse ícone para anexar imagens.</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">Adicionar contato que está próximo</string>
|
||||
<string name="face_to_face">Você deve estar frente-a-frente com a pessoa que deseja adicionar como contato.\n\nIsso evita que alguém se passe por você ou leia suas mensagens no futuro.</string>
|
||||
<string name="continue_button">Continuar</string>
|
||||
<string name="try_again_button">Tente novamente</string>
|
||||
@@ -158,66 +142,15 @@
|
||||
<string name="connection_error_explanation">Por favor. certifique se ambos estão conectados na mesma rede Wi-Fi.</string>
|
||||
<string name="connection_error_feedback">Se o problema persistir, for favor <a href="feedback">enviar feedback</a> para nós ajudar a melhor o app.</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">Adicionar contato à distância</string>
|
||||
<string name="add_contact_nearby_title">Adicionar contato que está próximo</string>
|
||||
<string name="add_contact_remotely_title">Adicionar contato à distância</string>
|
||||
<string name="contact_name_hint">De um apelido ao contato</string>
|
||||
<string name="contact_link_intro">Insira o link do seu contato aqui</string>
|
||||
<string name="contact_link_hint">Link do contato</string>
|
||||
<string name="paste_button">Colar</string>
|
||||
<string name="add_contact_button">Adicionar contato</string>
|
||||
<string name="copy_button">Copiar</string>
|
||||
<string name="share_button">Compartilhar</string>
|
||||
<string name="send_link_title">Passem os links</string>
|
||||
<string name="add_contact_choose_nickname">Escolha um apelido</string>
|
||||
<string name="add_contact_choose_a_nickname">Insira um apelido</string>
|
||||
<string name="nickname_intro">De um apelido ao contato. Somente você pode vê-lo. </string>
|
||||
<string name="your_link">Passe esse link para o contato que você quer adicionar</string>
|
||||
<string name="link_clip_label">Link Briar</string>
|
||||
<string name="link_copied_toast">Link copiado</string>
|
||||
<string name="adding_contact_error">Ocorreu um erro ao adicionar o contato.</string>
|
||||
<string name="pending_contact_requests_snackbar">Existem solicitações de contato pendentes</string>
|
||||
<string name="pending_contact_requests">Solicitações de contatos pendentes</string>
|
||||
<string name="no_pending_contacts">Sem contatos pendentes</string>
|
||||
<string name="add_contact_remote_connecting">Conectando...</string>
|
||||
<string name="waiting_for_contact_to_come_online">Esperando pelo usuário estar online ...</string>
|
||||
<string name="connecting">Conectando...</string>
|
||||
<string name="adding_contact">Adicionando contato ...</string>
|
||||
<string name="adding_contact_failed">Adicionar o contato falhou</string>
|
||||
<string name="dialog_title_remove_pending_contact">Confirme a remoção </string>
|
||||
<string name="dialog_message_remove_pending_contact">Esse contato ainda está sendo adicionado. Se você removê-lo agora, o mesmo não será adicionado</string>
|
||||
<string name="own_link_error">Insira o link do seu contato, não seu próprio </string>
|
||||
<string name="nickname_missing">Por favor insira um apelido</string>
|
||||
<string name="invalid_link">Link invalido</string>
|
||||
<string name="unsupported_link">Esse link veio de uma versão mais recente do Briar. Por favor atualize para versão mais recente e tente novamente </string>
|
||||
<string name="intent_own_link">Você abriu seu próprio link. Utilize o link do contato que quer adicionar!</string>
|
||||
<string name="missing_link">Por favor insira um link</string>
|
||||
<!--This is a numeral indicating the first step in a series of screens-->
|
||||
<string name="step_1">1</string>
|
||||
<!--This is a numeral indicating the second step in a series of screens-->
|
||||
<string name="step_2">2</string>
|
||||
<plurals name="contact_added_notification_text">
|
||||
<item quantity="one">Novo contato adicionado.</item>
|
||||
<item quantity="other">%dnovos contados adicionados.</item>
|
||||
</plurals>
|
||||
<string name="adding_contact_slow_warning">Adicionar este contato está demorando mais que o normal</string>
|
||||
<string name="adding_contact_slow_title">Não foi possível conectar ao contato </string>
|
||||
<string name="adding_contact_slow_text">Adicionar este contato está demorando mais que o normal.\n\nPor favor se certifique que o seu contato recebeu seu link e adicionou você: </string>
|
||||
<string name="offline_state">Sem conexão à Internet</string>
|
||||
<string name="duplicate_link_dialog_title">Link duplicado</string>
|
||||
<string name="duplicate_link_dialog_text_1">Você já tem um contato pendente com esse link: %s </string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">%s e %s são a mesma pessoa?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
<string name="same_person_button">Mesma pessoa</string>
|
||||
<!--This is a button for answering that two nicknames refer to different people. This string
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Pessoa diferente</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s e %s te enviaram o mesmo link.\n\nUm deles talvez esteja tentando descobrir quem são seus contatos.\n\nNão conte pra eles que recebeu o mesmo link de outra pessoa.</string>
|
||||
<string name="pending_contact_updated_toast">Contato pendente atualizado</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Apresente seus contatos</string>
|
||||
<string name="introduction_onboarding_text">Você pode apresentar seus contatos entre si, assim eles não precisam se encontrar pessoalmente para se comunicar no Briar.</string>
|
||||
@@ -413,8 +346,6 @@
|
||||
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||
<string name="tor_network_setting_summary">Automático: %1$s (em %2$s) </string>
|
||||
<string name="tor_mobile_data_title">Usar dados moveis</string>
|
||||
<string name="tor_only_when_charging_title">Conectar via Internet (Tor) apenas enquanto carregando</string>
|
||||
<string name="tor_only_when_charging_summary">Desabilita conexão à Internet quando seu dispositivo estiver somente na bateria</string>
|
||||
<!--Settings Security and Panic-->
|
||||
<string name="security_settings_title">Segurança</string>
|
||||
<string name="pref_lock_title">Bloqueio de app</string>
|
||||
@@ -484,7 +415,6 @@
|
||||
<!--Link Warning-->
|
||||
<string name="link_warning_title">Aviso sobre Link</string>
|
||||
<string name="link_warning_intro">Você está prestes a abrir esse link em um Aplicativo Externo.</string>
|
||||
<string name="link_warning_text">Isso pode ser usado para identificar você. Pense sobre se quer ou não confiar na pessoa que te enviou esse link e considere abrindo o no Tor Browser</string>
|
||||
<string name="link_warning_open_link">Abrir Link</string>
|
||||
<!--Crash Reporter-->
|
||||
<string name="crash_report_title">Relatório de falhas do Briar</string>
|
||||
|
||||
@@ -123,9 +123,7 @@
|
||||
<string name="message_hint">Scrieți mesajul</string>
|
||||
<string name="image_caption_hint">Adaugă un subtitlu (opțional)</string>
|
||||
<string name="image_attach">Atașează imagine</string>
|
||||
<string name="image_attach_error">Nu s-au putut atașa imaginile</string>
|
||||
<string name="image_attach_error_too_big">Imaginea este prea mare. Limita este de %d MB.</string>
|
||||
<string name="image_attach_error_invalid_mime_type">Format de imagine incompatibil: %s</string>
|
||||
<string name="image_attach_error">Nu s-a putut atașa o imagine</string>
|
||||
<string name="set_contact_alias">Schimbă nume contact</string>
|
||||
<string name="set_contact_alias_hint">Nume contact</string>
|
||||
<string name="set_alias_button">Modifică</string>
|
||||
@@ -185,16 +183,13 @@
|
||||
<string name="pending_contact_requests">Solicitări de contact în așteptare</string>
|
||||
<string name="no_pending_contacts">Nici un contact în așteptare</string>
|
||||
<string name="add_contact_remote_connecting">Se conectează...</string>
|
||||
<string name="waiting_for_contact_to_come_online">Așteptăm contactul să se conecteze…</string>
|
||||
<string name="waiting_for_contact_to_come_online">Așteptăm contactul să se conectexe…\n\nA introdus deja adresa dumneavoastră?</string>
|
||||
<string name="connecting">Se conectează...</string>
|
||||
<string name="adding_contact">Se adaugă contactul…</string>
|
||||
<string name="adding_contact_failed">Adăugarea contactului a eșuat</string>
|
||||
<string name="dialog_title_remove_pending_contact">Confirmați eliminarea</string>
|
||||
<string name="dialog_message_remove_pending_contact">Acest contact este în curs de adăugare. Eliminănd acum, nu v-a mai fi adăugat.</string>
|
||||
<string name="own_link_error">Introduceți adresa contactului, nu cea personală</string>
|
||||
<string name="nickname_missing">Vă rugăm să introduceți un nume</string>
|
||||
<string name="invalid_link">Adresă invalidă</string>
|
||||
<string name="unsupported_link">Adresa pe care ați scanat-o aparține unei versiuni mai noi de Briar. Vă rugăm să actualizați la cea mai recentă versiune și încercați din nou.</string>
|
||||
<string name="intent_own_link">Ați deschis adresa dumneavoastră. Folosiți-o pe cea a contactului pe care doriți să-l adăugați!</string>
|
||||
<string name="missing_link">Vă rugăm să introduceți o adresă</string>
|
||||
<!--This is a numeral indicating the first step in a series of screens-->
|
||||
@@ -206,24 +201,6 @@
|
||||
<item quantity="few">%d contacte noi adăugate.</item>
|
||||
<item quantity="other">%d de contacte noi adăugate.</item>
|
||||
</plurals>
|
||||
<string name="adding_contact_slow_warning">Se pare că durează mai mult să se adauge acest contact</string>
|
||||
<string name="adding_contact_slow_title">Nu s-a putut face conectarea contactului</string>
|
||||
<string name="adding_contact_slow_text">Se pare că durează mai mult să se adauge acest contact.\n\nVă rugăm să verificați dacă și contactul a primit adresa dumneavoastră și va adăugat:</string>
|
||||
<string name="offline_state">Nu este disponibilă o conexiune la internet</string>
|
||||
<string name="duplicate_link_dialog_title">Adresă duplicat</string>
|
||||
<string name="duplicate_link_dialog_text_1">Deja aveți un contact în așteptare cu această adresă: %s</string>
|
||||
<!--This is a question asking whether two nicknames refer to the same person-->
|
||||
<string name="duplicate_link_dialog_text_2">Sunt %s și %s aceeași persoană?</string>
|
||||
<!--This is a button for answering that two nicknames do indeed refer to the same person. This
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
<string name="same_person_button">Aceeași persoană</string>
|
||||
<!--This is a button for answering that two nicknames refer to different people. This string
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">Persoană diferită</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s și %s v-au trimis aceeași adresă.\n\nUnii dintre ei s-ar putea să încerce să descopere care vă sunt contactele.\n\nNu le spuneți că ați primit aceeași adresă și de la altcineva.</string>
|
||||
<string name="pending_contact_updated_toast">Listă solicitări de contact în așteptare actualizată</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">Recomandați-vă contactele</string>
|
||||
<string name="introduction_onboarding_text">Puteți să vă recomandați contactele unele altora, încât sa nu fie nevoie ca să se vadă față în față pentru a se putea conecta la Briar.</string>
|
||||
@@ -344,7 +321,7 @@
|
||||
<string name="forum_invitation_response_declined_sent">Ați refuzat invitația la forum de la %s.</string>
|
||||
<string name="forum_invitation_response_accepted_received">%s a acceptat invitația la forum.</string>
|
||||
<string name="forum_invitation_response_declined_received">%s a refuzat invitația la forum.</string>
|
||||
<string name="sharing_status">Stare partajare</string>
|
||||
<string name="sharing_status">Partajare stare</string>
|
||||
<string name="sharing_status_forum">Orice membru al unui forum poate să-l împărtășească cu contactele lor. Partajați acest forum cu următoarele persoane de contact. Pot exista și alți membri pe care să nu îi puteți vedea.</string>
|
||||
<string name="shared_with">Partajat cu %1$d (%2$d conectați)</string>
|
||||
<plurals name="forums_shared">
|
||||
|
||||
@@ -114,8 +114,6 @@
|
||||
<string name="image_caption_hint">添加一段描述(可选)</string>
|
||||
<string name="image_attach">附加图片</string>
|
||||
<string name="image_attach_error">无法附加图片</string>
|
||||
<string name="image_attach_error_too_big">图片过大。上限为 %d MB。</string>
|
||||
<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="set_alias_button">更改</string>
|
||||
@@ -135,7 +133,6 @@
|
||||
<string name="dialog_title_image_support">你现在可以向此联系人发送图片</string>
|
||||
<string name="dialog_message_image_support">轻按此图标即可附加图片。</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">添加附近的联系人</string>
|
||||
<string name="face_to_face">您必须面对面添加联系人。\n\n这样将防止未来他人冒充您的身份并查看您的信息。</string>
|
||||
<string name="continue_button">继续</string>
|
||||
<string name="try_again_button">重试</string>
|
||||
@@ -153,65 +150,8 @@
|
||||
<string name="connection_error_explanation">请确保你们连接到了同一个无线局域网中。</string>
|
||||
<string name="connection_error_feedback">如果该问题仍存在,请 <a href="feedback">发送反馈</a> 帮助我们改善应用。</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">添加远处的联系人</string>
|
||||
<string name="add_contact_nearby_title">添加附近的联系人</string>
|
||||
<string name="add_contact_remotely_title">添加远处的联系人</string>
|
||||
<string name="contact_name_hint">添加联系人昵称</string>
|
||||
<string name="contact_link_intro">在此输入您联系人的链接</string>
|
||||
<string name="contact_link_hint">联系人的链接</string>
|
||||
<string name="paste_button">粘贴</string>
|
||||
<string name="add_contact_button">添加联系人</string>
|
||||
<string name="copy_button">复制</string>
|
||||
<string name="share_button">分享</string>
|
||||
<string name="send_link_title">交换链接</string>
|
||||
<string name="add_contact_choose_nickname">选择昵称</string>
|
||||
<string name="add_contact_choose_a_nickname">输入昵称</string>
|
||||
<string name="nickname_intro">为联系人添加一个昵称。仅您可见。</string>
|
||||
<string name="your_link">将此链接发送给您希望添加的联系人</string>
|
||||
<string name="link_clip_label">Briar 链接</string>
|
||||
<string name="link_copied_toast">链接已复制</string>
|
||||
<string name="adding_contact_error">添加联系人时发生错误。</string>
|
||||
<string name="pending_contact_requests_snackbar">有待处理的联系人请求</string>
|
||||
<string name="pending_contact_requests">待处理的联系人请求</string>
|
||||
<string name="no_pending_contacts">没有待处理的联系人</string>
|
||||
<string name="add_contact_remote_connecting">连接中……</string>
|
||||
<string name="waiting_for_contact_to_come_online">正在等待联系人上线……</string>
|
||||
<string name="connecting">连接中……</string>
|
||||
<string name="adding_contact">正在添加联系人……</string>
|
||||
<string name="adding_contact_failed">添加联系人失败</string>
|
||||
<string name="dialog_title_remove_pending_contact">确认移除</string>
|
||||
<string name="dialog_message_remove_pending_contact">这个联系人还在添加中。如果您现在移除,则此联系人不会被添加。</string>
|
||||
<string name="own_link_error">输入您联系人的链接,不要输入您自己的</string>
|
||||
<string name="nickname_missing">请输入一个昵称</string>
|
||||
<string name="invalid_link">无效的链接</string>
|
||||
<string name="unsupported_link">这条链接来自更新版本的 Briar。请升级到最新版本后并重试。</string>
|
||||
<string name="intent_own_link">您打开了自己的链接。请使用您希望添加的联系人的链接!</string>
|
||||
<string name="missing_link">请输入一个链接</string>
|
||||
<!--This is a numeral indicating the first step in a series of screens-->
|
||||
<string name="step_1">1</string>
|
||||
<!--This is a numeral indicating the second step in a series of screens-->
|
||||
<string name="step_2">2</string>
|
||||
<plurals name="contact_added_notification_text">
|
||||
<item quantity="other">%d 新联系人已添加。</item>
|
||||
</plurals>
|
||||
<string name="adding_contact_slow_warning">添加此联系人比通常花费了更多时间</string>
|
||||
<string name="adding_contact_slow_title">无法连接到联系人</string>
|
||||
<string name="adding_contact_slow_text">添加此联系人比通常花费了更多时间。\n\n请检查您的联系人是否收到您的链接并已添加您:</string>
|
||||
<string name="offline_state">无网络连接</string>
|
||||
<string name="duplicate_link_dialog_title">重复的链接</string>
|
||||
<string name="duplicate_link_dialog_text_1">您已经有此链接的待处理联系人:</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
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
<string name="same_person_button">同一个人</string>
|
||||
<!--This is a button for answering that two nicknames refer to different people. This string
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">不同的人</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s 和 %s 给你发送了相同的链接。\n\n其中一个人可能企图找出谁是你的联系人。\n\n不要告诉他们你从其他人那里收到了相同的链接。</string>
|
||||
<string name="pending_contact_updated_toast">待处理联系人已更新</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">介绍您的联系人</string>
|
||||
<string name="introduction_onboarding_text">您可以互相介绍您的联系人,这样他们可以直接在 Briar 上建立联系而不必亲自见面。</string>
|
||||
|
||||
@@ -1,531 +0,0 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<!--Setup-->
|
||||
<string name="setup_title">歡迎來到 Briar</string>
|
||||
<string name="setup_name_explanation">您的暱稱將顯示在您發佈的任何內容旁。暱稱在創建帳戶後將無法更改。</string>
|
||||
<string name="setup_next">下一步</string>
|
||||
<string name="setup_password_intro">設置密碼</string>
|
||||
<string name="setup_password_explanation">您的 Briar 帳戶被加密儲存在您的裝置上,而非在雲端。卸載 Briar 或忘記密碼將導致帳戶無法恢復。請設置不易被猜出的長密碼,比如四個隨機英文單詞,或是由隨機字母、數字和符號組成的十位字符。</string>
|
||||
<string name="setup_doze_title">背景網絡連接</string>
|
||||
<string name="setup_doze_intro">爲了接收消息,Briar 需要在後臺保持連接。</string>
|
||||
<string name="setup_doze_explanation">Briar 需要保持背景網絡連接去接收消息。爲此,請停用電量優化選項。</string>
|
||||
<string name="setup_doze_button">允許連接</string>
|
||||
<string name="choose_nickname">設置暱稱</string>
|
||||
<string name="choose_password">設置密碼</string>
|
||||
<string name="confirm_password">確認密碼</string>
|
||||
<string name="name_too_long">暱稱過長</string>
|
||||
<string name="password_too_weak">密碼不夠強</string>
|
||||
<string name="passwords_do_not_match">兩個密碼並不相同</string>
|
||||
<string name="create_account_button">創建帳戶</string>
|
||||
<string name="more_info">更多信息</string>
|
||||
<string name="don_t_ask_again">不再詢問</string>
|
||||
<string name="setup_huawei_text">輕按下方的按鈕將 Briar 加入“受保護的程式”列表。</string>
|
||||
<string name="setup_huawei_button">保護 Briar</string>
|
||||
<string name="setup_huawei_help">如果 Briar 未被加入受保護程式列表,它將無法在背景運行。</string>
|
||||
<string name="warning_dozed">%s 無法在背景運行。</string>
|
||||
<!--Login-->
|
||||
<string name="enter_password">密碼</string>
|
||||
<string name="try_again">密碼錯誤,請重試</string>
|
||||
<string name="sign_in_button">登錄</string>
|
||||
<string name="forgotten_password">我忘記了密碼</string>
|
||||
<string name="dialog_title_lost_password">忘記密碼</string>
|
||||
<string name="dialog_message_lost_password">您的 Briar 帳戶被加密儲存在您的裝置上,而非在雲端。因此我們無法重置您的密碼。您是否希望刪除帳戶,重新開始?\n\n注意:刪除帳戶將永久失去您以前的身份、聯絡人和訊息。</string>
|
||||
<string name="startup_failed_notification_title">Briar 無法啓動</string>
|
||||
<string name="startup_failed_notification_text">輕按查看更多信息。</string>
|
||||
<string name="startup_failed_activity_title">Briar 啓動失敗</string>
|
||||
<string name="startup_failed_db_error">由於某些原因,Briar 數據庫已損壞並且無法修復。您的帳戶、數據和所有聯絡人已經丟失。很不幸,您需要重新安裝 Briar 或者在提示輸入密碼時選擇“我忘記了密碼”來重新創建一個 Briar 帳戶。</string>
|
||||
<string name="startup_failed_data_too_old_error">由於您的帳戶在舊版本程式創建,無法在現在的版本打開。您需要重新安裝舊版本程式或在提示輸入密碼時選擇“我忘記了密碼”以創建新的帳戶。</string>
|
||||
<string name="startup_failed_data_too_new_error">這程式的版本過舊。請升級至最新版本並重試。</string>
|
||||
<string name="startup_failed_service_error">Briar 無法開啓一個必需的插件。於通常情況下,重新安裝 Briar 可以解決該問題。但是由於 Briar 不使用中央服務器來儲存您的數據,這項操作將導致您的帳戶及相關的一切數據丟失。</string>
|
||||
<plurals name="expiry_warning">
|
||||
<item quantity="other">這是 Briar 的測試版本。您的帳戶將在 %d 天後到期,且無法延期。</item>
|
||||
</plurals>
|
||||
<string name="expiry_update">測試到期時間延長,您的帳戶將在 %d 天後到期。</string>
|
||||
<string name="expiry_date_reached">本軟件已過期。\n感謝您的測試!</string>
|
||||
<string name="download_briar">爲了繼續使用 Briar,請下載 1.0 版。</string>
|
||||
<string name="create_new_account">您要創建一個新帳戶,但可以續用現時的暱稱。</string>
|
||||
<string name="download_briar_button">下載 Briar 1.0</string>
|
||||
<string name="startup_open_database">正在解密數據庫……</string>
|
||||
<string name="startup_migrate_database">正在更新數據庫……</string>
|
||||
<string name="startup_compact_database">正在壓縮數據庫……</string>
|
||||
<!--Navigation Drawer-->
|
||||
<string name="nav_drawer_open_description">打開導航</string>
|
||||
<string name="nav_drawer_close_description">關閉導航</string>
|
||||
<string name="contact_list_button">聯絡人</string>
|
||||
<string name="groups_button">私人群組</string>
|
||||
<string name="forums_button">論壇</string>
|
||||
<string name="blogs_button">博客</string>
|
||||
<!--This is part of the main menu. The app will be locked when this is tapped.-->
|
||||
<string name="lock_button">鎖定程式</string>
|
||||
<string name="settings_button">設置</string>
|
||||
<string name="sign_out_button">登出</string>
|
||||
<!--Transports-->
|
||||
<string name="transport_tor">互聯網</string>
|
||||
<string name="transport_bt">藍牙</string>
|
||||
<string name="transport_lan">Wi-Fi</string>
|
||||
<!--Notifications-->
|
||||
<string name="reminder_notification_title">已登出 Briar</string>
|
||||
<string name="reminder_notification_text">輕按以重新登錄。</string>
|
||||
<string name="reminder_notification_channel_title">Briar 登錄提醒</string>
|
||||
<string name="reminder_notification_dismiss">忽略</string>
|
||||
<string name="ongoing_notification_title">已登錄 Briar</string>
|
||||
<string name="ongoing_notification_text">輕觸以打開 Briar</string>
|
||||
<plurals name="private_message_notification_text">
|
||||
<item quantity="other">%d 條新私信。</item>
|
||||
</plurals>
|
||||
<plurals name="group_message_notification_text">
|
||||
<item quantity="other">%d 條新群組消息。</item>
|
||||
</plurals>
|
||||
<plurals name="forum_post_notification_text">
|
||||
<item quantity="other">%d 條新論壇帖子。</item>
|
||||
</plurals>
|
||||
<plurals name="blog_post_notification_text">
|
||||
<item quantity="other">%d 條新博文。</item>
|
||||
</plurals>
|
||||
<!--Misc-->
|
||||
<string name="now">現在</string>
|
||||
<string name="show">顯示</string>
|
||||
<string name="hide">隱藏</string>
|
||||
<string name="ok">確定</string>
|
||||
<string name="cancel">取消</string>
|
||||
<string name="got_it">知道了</string>
|
||||
<string name="delete">刪除</string>
|
||||
<string name="accept">接受</string>
|
||||
<string name="decline">謝絕</string>
|
||||
<string name="options">選項</string>
|
||||
<string name="online">在線</string>
|
||||
<string name="offline">離線</string>
|
||||
<string name="send">發送</string>
|
||||
<string name="allow">允許</string>
|
||||
<string name="open">打開</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>
|
||||
<!--Contacts and Private Conversations-->
|
||||
<string name="no_contacts">尚無聯絡人可供顯示</string>
|
||||
<string name="no_contacts_action">輕按 + 號即可添加聯絡人</string>
|
||||
<string name="date_no_private_messages">沒有消息。</string>
|
||||
<string name="no_private_messages">尚無消息可供顯示</string>
|
||||
<string name="message_hint">輸入信息</string>
|
||||
<string name="image_caption_hint">添加圖片描述(可選)</string>
|
||||
<string name="image_attach">附加圖片</string>
|
||||
<string name="image_attach_error">無法附加圖片</string>
|
||||
<string name="image_attach_error_too_big">圖片檔案過大,上限為%dMB.</string>
|
||||
<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="set_alias_button">更改</string>
|
||||
<string name="delete_contact">刪除聯絡人</string>
|
||||
<string name="dialog_title_delete_contact">確認刪除聯絡人</string>
|
||||
<string name="dialog_message_delete_contact">確認要刪除該聯絡人和與其交流訊息嗎?</string>
|
||||
<string name="contact_deleted_toast">已刪除聯絡人</string>
|
||||
<!--This is shown in the action bar when opening an image in fullscreen that the user sent-->
|
||||
<string name="you">您</string>
|
||||
<string name="save_image">保存圖片</string>
|
||||
<string name="dialog_title_save_image">確定保存圖片嗎?</string>
|
||||
<string name="dialog_message_save_image">保存這張圖片後,其他程式都可以開啟它。\n\n您確定要保存嗎?</string>
|
||||
<string name="save_image_success">已保存圖片</string>
|
||||
<string name="save_image_error">無法保存圖片</string>
|
||||
<string name="dialog_title_no_image_support">無法開啟圖片</string>
|
||||
<string name="dialog_message_no_image_support">您的聯絡人的 Briar 版本尚未支持圖片附件。一旦他們升級後您就會看到一個不同的圖標。</string>
|
||||
<string name="dialog_title_image_support">您現在可以向此聯絡人發送圖片</string>
|
||||
<string name="dialog_message_image_support">輕按此圖標即可附加圖片。</string>
|
||||
<!--Adding Contacts-->
|
||||
<string name="add_contact_title">添加附近的聯絡人</string>
|
||||
<string name="face_to_face">您必須面對面添加聯絡人。\n\n這樣將防止他人冒充您的身份並查看您的信息。</string>
|
||||
<string name="continue_button">繼續</string>
|
||||
<string name="try_again_button">重試</string>
|
||||
<string name="waiting_for_contact_to_scan">等待聯絡人掃描並連接\u2026</string>
|
||||
<string name="exchanging_contact_details">正在交換聯絡人詳細信息\u2026</string>
|
||||
<string name="contact_added_toast">已添加聯絡人:%s</string>
|
||||
<string name="contact_already_exists">聯絡人 %s 已存在</string>
|
||||
<string name="qr_code_invalid">二維碼無效</string>
|
||||
<string name="qr_code_too_old">您所掃描的二維碼來自舊版本 %s 。\n\n請讓您的聯絡人升級到最新版本並重試。</string>
|
||||
<string name="qr_code_too_new">您所掃描的二維碼來自新版本 %s 。\n\n請升級到最新版本並重試。</string>
|
||||
<string name="camera_error">相機出錯</string>
|
||||
<string name="connecting_to_device">正在連接至裝置\u2026</string>
|
||||
<string name="authenticating_with_device">正在驗證裝置\u2026</string>
|
||||
<string name="connection_error_title">無法連接到您的聯絡人</string>
|
||||
<string name="connection_error_explanation">請確保您們連接到了同一個 Wi-Fi中。</string>
|
||||
<string name="connection_error_feedback">如果該問題仍存在,請 <a href="feedback">發送反饋</a> 幫助我們改善程式。</string>
|
||||
<!--Adding Contacts Remotely-->
|
||||
<string name="add_contact_remotely_title_case">添加遠處的聯絡人</string>
|
||||
<string name="add_contact_nearby_title">添加附近的聯絡人</string>
|
||||
<string name="add_contact_remotely_title">添加遠處的聯絡人</string>
|
||||
<string name="contact_name_hint">給聯絡人暱稱</string>
|
||||
<string name="contact_link_intro">在此輸入您的聯絡人的鏈接</string>
|
||||
<string name="contact_link_hint">聯絡人的鏈接</string>
|
||||
<string name="paste_button">貼上</string>
|
||||
<string name="add_contact_button">添加聯絡人</string>
|
||||
<string name="copy_button">複製</string>
|
||||
<string name="share_button">分享</string>
|
||||
<string name="send_link_title">交換鏈接</string>
|
||||
<string name="add_contact_choose_nickname">選擇暱稱</string>
|
||||
<string name="add_contact_choose_a_nickname">輸入暱稱</string>
|
||||
<string name="nickname_intro">爲聯絡人添加僅您可見的暱稱。</string>
|
||||
<string name="your_link">將此鏈接發送給您希望添加的聯絡人</string>
|
||||
<string name="link_clip_label">Briar鏈接</string>
|
||||
<string name="link_copied_toast">已複製鏈接</string>
|
||||
<string name="adding_contact_error">添加聯絡人時發生錯誤。</string>
|
||||
<string name="pending_contact_requests_snackbar">有未處理的聯絡人請求</string>
|
||||
<string name="pending_contact_requests">未處理的聯絡人請求</string>
|
||||
<string name="no_pending_contacts">沒有未處理的聯絡人</string>
|
||||
<string name="add_contact_remote_connecting">連接中……</string>
|
||||
<string name="waiting_for_contact_to_come_online">正等待聯絡人上網…</string>
|
||||
<string name="connecting">連接中……</string>
|
||||
<string name="adding_contact">正在添加聯絡人……</string>
|
||||
<string name="adding_contact_failed">添加聯絡人失敗</string>
|
||||
<string name="dialog_title_remove_pending_contact">確認移除</string>
|
||||
<string name="dialog_message_remove_pending_contact">還在添加這個聯絡人。如果您現在移除他/她,則不會添加此聯絡人。</string>
|
||||
<string name="own_link_error">輸入您的聯絡人的鏈接,而不是您的</string>
|
||||
<string name="nickname_missing">請輸入暱稱</string>
|
||||
<string name="invalid_link">無效的鏈接</string>
|
||||
<string name="unsupported_link">這條鏈接來自更新的 Briar 版本。請升級到最新版本後並重試。</string>
|
||||
<string name="intent_own_link">您打開了自己的鏈接。請使用您希望添加的聯絡人的鏈接!</string>
|
||||
<string name="missing_link">請輸入鏈接</string>
|
||||
<!--This is a numeral indicating the first step in a series of screens-->
|
||||
<string name="step_1">1</string>
|
||||
<!--This is a numeral indicating the second step in a series of screens-->
|
||||
<string name="step_2">2</string>
|
||||
<plurals name="contact_added_notification_text">
|
||||
<item quantity="other">%d 新聯絡人已添加。</item>
|
||||
</plurals>
|
||||
<string name="adding_contact_slow_warning">添加聯絡人需時過長</string>
|
||||
<string name="adding_contact_slow_title">不能連接至聯絡人</string>
|
||||
<string name="adding_contact_slow_text">添加聯絡人需時過長。\n\n請檢查聯絡人已收到您的鏈接並且已添加您:</string>
|
||||
<string name="offline_state">無互聯網連接</string>
|
||||
<string name="duplicate_link_dialog_title">重覆的鏈接</string>
|
||||
<string name="duplicate_link_dialog_text_1">您已經有此鏈接的聯絡人,尚待處理:%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
|
||||
string will be used in a dialog button, so if the translation of this string is longer than 20
|
||||
characters, please use "Yes" instead, and use "No" for the "Different Person" button-->
|
||||
<string name="same_person_button">同一個人</string>
|
||||
<!--This is a button for answering that two nicknames refer to different people. This string
|
||||
will be used in a dialog button, so if the translation of this string longer than 20 characters,
|
||||
please use "No" instead, and use "Yes" for the "Same Person" button-->
|
||||
<string name="different_person_button">不同的人</string>
|
||||
<string name="duplicate_link_dialog_text_3">%s和%s向您發送了相同的鏈接。\n\n 其中一個可能正試圖調查您的聯絡人是誰。\n\n請不要告訴他們您收到了來自其他人的相同鏈接。</string>
|
||||
<string name="pending_contact_updated_toast">已更新尚待處理的聯絡人</string>
|
||||
<!--Introductions-->
|
||||
<string name="introduction_onboarding_title">介紹您的聯絡人</string>
|
||||
<string name="introduction_onboarding_text">您可以互相介紹您的聯絡人,這樣他們可以直接在 Briar 上建立聯繫而不必親自見面。</string>
|
||||
<string name="introduction_menu_item">做介紹</string>
|
||||
<string name="introduction_activity_title">選擇聯絡人</string>
|
||||
<string name="introduction_not_possible">您已將這兩位聯絡人互相介紹過。請先等待該任務完成。如果您或您的聯絡人很少在線,這可能需要一些時間。</string>
|
||||
<string name="introduction_message_title">介紹聯絡人</string>
|
||||
<string name="introduction_message_hint">附加消息(選填)</string>
|
||||
<string name="introduction_button">做介紹</string>
|
||||
<string name="introduction_sent">您的介紹已發送。</string>
|
||||
<string name="introduction_error">介紹時發生錯誤。</string>
|
||||
<string name="introduction_response_error">回覆介紹時出錯</string>
|
||||
<string name="introduction_request_sent">您已將 %1$s 介紹給 %2$s。</string>
|
||||
<string name="introduction_request_received">%1$s 想要將您介紹給 %2$s。您希望將 %2$s 添加至您的聯絡人列表中嗎?</string>
|
||||
<string name="introduction_request_exists_received">%1$s 想要將您介紹給 %2$s,但是 %2$s 已經在您的聯絡人列表中。%1$s 可能並不知情,但您仍可以做出回覆:</string>
|
||||
<string name="introduction_request_answered_received">%1$s 想要將您介紹給 %2$s。</string>
|
||||
<string name="introduction_response_accepted_sent">您已接受與 %1$s 建立聯繫。</string>
|
||||
<string name="introduction_response_accepted_sent_info">在您添加 %1$s 爲聯絡人之前,他/她還需要接受你的介紹。這可能需要一些時間。</string>
|
||||
<string name="introduction_response_declined_sent">您已謝絕與 %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>
|
||||
<!--Private Groups-->
|
||||
<string name="groups_list_empty">尚無群組可供展示</string>
|
||||
<string name="groups_list_empty_action">輕按 + 號創建群組,或讓您的聯絡人分享群組給您</string>
|
||||
<string name="groups_created_by">由 %s 創建</string>
|
||||
<plurals name="messages">
|
||||
<item quantity="other">%d 條消息</item>
|
||||
</plurals>
|
||||
<string name="groups_group_is_empty">這群組是空的</string>
|
||||
<string name="groups_group_is_dissolved">已解散這群組</string>
|
||||
<string name="groups_remove">刪除</string>
|
||||
<string name="groups_create_group_title">創建私人群組</string>
|
||||
<string name="groups_create_group_button">創建群組</string>
|
||||
<string name="groups_create_group_invitation_button">發送邀請</string>
|
||||
<string name="groups_create_group_hint">爲私人群組命名</string>
|
||||
<string name="groups_invitation_sent">群組邀請已發送</string>
|
||||
<string name="groups_member_list">成員列表</string>
|
||||
<string name="groups_invite_members">邀請成員</string>
|
||||
<string name="groups_member_created_you">您創建了群組</string>
|
||||
<string name="groups_member_created">%s 創建了群組</string>
|
||||
<string name="groups_member_joined_you">您加入了群組</string>
|
||||
<string name="groups_member_joined">%s 加入了群組</string>
|
||||
<string name="groups_leave">退出群組</string>
|
||||
<string name="groups_leave_dialog_title">確認退出群組</string>
|
||||
<string name="groups_leave_dialog_message">確認要退出該群組嗎?</string>
|
||||
<string name="groups_dissolve">解散群組</string>
|
||||
<string name="groups_dissolve_dialog_title">確認解散群組</string>
|
||||
<string name="groups_dissolve_dialog_message">確認要解散該群組嗎?\n\n所有其他成員將無法繼續會話並可能無法接收最新的消息。</string>
|
||||
<string name="groups_dissolve_button">解散</string>
|
||||
<string name="groups_dissolved_dialog_title">已解散群組</string>
|
||||
<string name="groups_dissolved_dialog_message">群組創建者已解散該群組。\n\n您將無法在群組中發送消息,並可能無法接收所有已發送的消息。</string>
|
||||
<!--Private Group Invitations-->
|
||||
<string name="groups_invitations_title">群組邀請</string>
|
||||
<string name="groups_invitations_invitation_sent">您已邀請 %1$s 加入群組 “%2$s”。</string>
|
||||
<string name="groups_invitations_invitation_received">%1$s 已邀請您加入群組 “%2$s”。</string>
|
||||
<string name="groups_invitations_joined">已加入群組</string>
|
||||
<string name="groups_invitations_declined">群組邀請已謝絕</string>
|
||||
<plurals name="groups_invitations_open">
|
||||
<item quantity="other">%d 打開了群組邀請</item>
|
||||
</plurals>
|
||||
<string name="groups_invitations_response_accepted_sent">您接受了來自 %s 的群組邀請。</string>
|
||||
<string name="groups_invitations_response_declined_sent">您謝絕了來自 %s 的群組邀請。</string>
|
||||
<string name="groups_invitations_response_accepted_received">%s 接受了群組邀請。</string>
|
||||
<string name="groups_invitations_response_declined_received">%s 謝絕了群組邀請。</string>
|
||||
<string name="sharing_status_groups">只有創建者可以邀請新成員加入群組。下面是目前的群組成員。</string>
|
||||
<!--Private Groups Revealing Contacts-->
|
||||
<string name="groups_reveal_contacts">顯示聯絡人</string>
|
||||
<string name="groups_reveal_dialog_message">您可以決定是否對所有當前和未來的群組成員展示該群組的聯絡人。\n\n這將使您連接群組更快速更可靠,因爲即使群組創建者離線,您也可以與已展示的聯絡人交流。</string>
|
||||
<string name="groups_reveal_visible">群組可見聯絡人關係</string>
|
||||
<string name="groups_reveal_visible_revealed_by_us">群組可見聯絡人關係(由您設定)</string>
|
||||
<string name="groups_reveal_visible_revealed_by_contact">群組可見聯絡人關係(由 %s 設定)</string>
|
||||
<string name="groups_reveal_invisible">群組不可見聯絡人關係</string>
|
||||
<!--Forums-->
|
||||
<string name="no_forums">尚無論壇可供展示</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>
|
||||
<string name="forum_created_toast">論壇已創建</string>
|
||||
<string name="no_forum_posts">尚無帖子可供展示</string>
|
||||
<string name="no_posts">沒有帖子</string>
|
||||
<plurals name="posts">
|
||||
<item quantity="other">%d 條帖子</item>
|
||||
</plurals>
|
||||
<string name="forum_new_message_hint">新帖子</string>
|
||||
<string name="forum_message_reply_hint">新回覆</string>
|
||||
<string name="btn_reply">回覆</string>
|
||||
<string name="forum_leave">退出論壇</string>
|
||||
<string name="dialog_title_leave_forum">確認退出論壇</string>
|
||||
<string name="dialog_message_leave_forum">確認要退出該論壇嗎?那些經過您的分享而加入該論壇的聯絡人可能不會再收到更新。</string>
|
||||
<string name="dialog_button_leave">退出</string>
|
||||
<string name="forum_left_toast">已退出論壇</string>
|
||||
<!--Forum Sharing-->
|
||||
<string name="forum_share_button">分享論壇</string>
|
||||
<string name="contacts_selected">已選擇聯絡人</string>
|
||||
<string name="activity_share_toolbar_header">選擇聯絡人</string>
|
||||
<string name="no_contacts_selector">尚無聯絡人可供顯示</string>
|
||||
<string name="no_contacts_selector_action">請添加聯絡人後再來</string>
|
||||
<string name="forum_shared_snackbar">論壇已分享給選中的聯絡人</string>
|
||||
<string name="forum_share_message">附加消息(選填)</string>
|
||||
<string name="forum_share_error">分享該論壇時發生錯誤。</string>
|
||||
<string name="forum_invitation_received">%1$s 已將論壇 “%2$s” 分享給您。</string>
|
||||
<string name="forum_invitation_sent">您已將論壇 “%1$s” 分享給 %2$s。</string>
|
||||
<string name="forum_invitations_title">論壇邀請</string>
|
||||
<string name="forum_invitation_exists">您接受了加入該論壇的一份邀請。\n\n接受更多邀請將會使您連接論壇更快速更可靠。</string>
|
||||
<string name="forum_joined_toast">已加入論壇</string>
|
||||
<string name="forum_declined_toast">邀請已謝絕</string>
|
||||
<string name="shared_by_format">由 %s 分享</string>
|
||||
<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_accepted_received">%s 接受了論壇邀請。</string>
|
||||
<string name="forum_invitation_response_declined_received">%s 謝絕了論壇邀請。</string>
|
||||
<string name="sharing_status">分享狀態</string>
|
||||
<string name="sharing_status_forum">論壇的任何成員都可以將論壇分享給他們的聯絡人。您正在分享該論壇給下列聯絡人。可能有您所不可見的其他成員存在。</string>
|
||||
<string name="shared_with">已與 %1$d 分享(%2$d 在線)</string>
|
||||
<plurals name="forums_shared">
|
||||
<item quantity="other">%d 個論壇由聯絡人分享</item>
|
||||
</plurals>
|
||||
<string name="nobody">沒有人</string>
|
||||
<!--Blogs-->
|
||||
<string name="blogs_other_blog_empty_state">尚無博文可供展示</string>
|
||||
<string name="read_more">閱讀全文</string>
|
||||
<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_received">收到新博文</string>
|
||||
<string name="blogs_blog_post_scroll_to">滑動至</string>
|
||||
<string name="blogs_feed_empty_state">尚無博文可供展示</string>
|
||||
<string name="blogs_feed_empty_state_action">此處將顯示您的聯絡人和您所訂閱博客的博文\n\n輕按鋼筆圖標來寫一篇博文</string>
|
||||
<string name="blogs_remove_blog">刪除博客</string>
|
||||
<string name="blogs_remove_blog_dialog_message">確認要刪除該博客嗎?\n\n博文將會從您的裝置刪除,但仍會存在於其他人的裝置上。\n\n那些經過您的分享而訂閱該博客的聯絡人可能不會再收到更新。</string>
|
||||
<string name="blogs_remove_blog_ok">刪除</string>
|
||||
<string name="blogs_blog_removed">博客已刪除</string>
|
||||
<string name="blogs_reblog_comment_hint">添加評論(選填)</string>
|
||||
<string name="blogs_reblog_button">轉載</string>
|
||||
<!--Blog Sharing-->
|
||||
<string name="blogs_sharing_share">分享博客</string>
|
||||
<string name="blogs_sharing_error">分享該博客時發生錯誤。</string>
|
||||
<string name="blogs_sharing_button">分享博客</string>
|
||||
<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_accepted_received">%s 接受了博客邀請。</string>
|
||||
<string name="blogs_sharing_response_declined_received">%s 謝絕了博客邀請。</string>
|
||||
<string name="blogs_sharing_invitation_received">%1$s 向您分享博客 “%2$s”。</string>
|
||||
<string name="blogs_sharing_invitation_sent">您已將博客 “%1$s” 分享給 %2$s 。</string>
|
||||
<string name="blogs_sharing_invitations_title">博客邀請</string>
|
||||
<string name="blogs_sharing_joined_toast">已訂閱博客</string>
|
||||
<string name="blogs_sharing_declined_toast">邀請已謝絕</string>
|
||||
<string name="sharing_status_blog">任何訂閱博客的人都可以將它分享給他的聯絡人。您正在將該博客分享給下列聯絡人。可能有您所不可見的其他訂閱者存在。</string>
|
||||
<!--RSS Feeds-->
|
||||
<string name="blogs_rss_feeds_import">導入 RSS 訂閱源</string>
|
||||
<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 Display-->
|
||||
<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>
|
||||
<string name="pref_theme_title">主題</string>
|
||||
<string name="pref_theme_light">淺色</string>
|
||||
<string name="pref_theme_dark">深色</string>
|
||||
<string name="pref_theme_auto">自動(白天)</string>
|
||||
<string name="pref_theme_system">系統默認</string>
|
||||
<!--Settings Network-->
|
||||
<string name="network_settings_title">網絡</string>
|
||||
<string name="bluetooth_setting">通過藍牙連接</string>
|
||||
<string name="bluetooth_setting_enabled">只要聯絡人在附近時</string>
|
||||
<string name="bluetooth_setting_disabled">僅在添加聯絡人時</string>
|
||||
<string name="tor_network_setting">通過互聯網連接(Tor)</string>
|
||||
<string name="tor_network_setting_automatic">基於位置自動選擇</string>
|
||||
<string name="tor_network_setting_without_bridges">不通過網橋連接到 Tor</string>
|
||||
<string name="tor_network_setting_with_bridges">通過網橋連接到 Tor</string>
|
||||
<string name="tor_network_setting_never">不要連接</string>
|
||||
<!--How and when Tor will connect after Automatic: E.g. Don't connect (in China) or Use Tor with bridges (in Belarus)-->
|
||||
<string name="tor_network_setting_summary">自動選擇:%1$s(在 %2$s)</string>
|
||||
<string name="tor_mobile_data_title">使用移動數據</string>
|
||||
<string name="tor_only_when_charging_title">只有在充電時通過網絡(Tor)連接</string>
|
||||
<string name="tor_only_when_charging_summary">當裝置使用電池電量時關閉網絡連接</string>
|
||||
<!--Settings Security and Panic-->
|
||||
<string name="security_settings_title">安全</string>
|
||||
<string name="pref_lock_title">程式鎖</string>
|
||||
<string name="pref_lock_summary">登錄後,使用裝置的屏幕鎖定保護 Briar</string>
|
||||
<string name="pref_lock_disabled_summary">爲了使用該功能,請爲裝置設置屏幕鎖定</string>
|
||||
<string name="pref_lock_timeout_title">程式鎖所需的無操作時間</string>
|
||||
<!--The %s placeholder is replaced with the following time spans, e.g. 5 Minutes, 1 Hour-->
|
||||
<string name="pref_lock_timeout_summary">當有 %s 不使用 Briar 後,自動將其鎖定</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_1">1 分鐘</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_5">5 分鐘</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_15">15 分鐘</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_30">30 分鐘</string>
|
||||
<!--Will be shown in a list of lock times. Should fit into the %s of "automatically lock it after %s"-->
|
||||
<string name="pref_lock_timeout_60">1 小時</string>
|
||||
<string name="pref_lock_timeout_never">永不</string>
|
||||
<string name="pref_lock_timeout_never_summary">永不自動鎖定 Briar</string>
|
||||
<string name="change_password">更改密碼</string>
|
||||
<string name="current_password">當前密碼</string>
|
||||
<string name="choose_new_password">新密碼</string>
|
||||
<string name="confirm_new_password">確認新密碼</string>
|
||||
<string name="password_changed">密碼已更改。</string>
|
||||
<string name="panic_setting">創建緊急開關</string>
|
||||
<string name="panic_setting_title">緊急開關</string>
|
||||
<string name="panic_setting_hint">設置觸發緊急開關時 Briar 將作出的響應</string>
|
||||
<string name="panic_app_setting_title">緊急開關程式</string>
|
||||
<string name="unknown_app">未知程式</string>
|
||||
<string name="panic_app_setting_summary">尚未設置緊急程式</string>
|
||||
<string name="panic_app_setting_none">無</string>
|
||||
<string name="dialog_title_connect_panic_app">確認緊急程式</string>
|
||||
<string name="dialog_message_connect_panic_app">確認要允許 %1$s 觸發破壞性緊急開關反應嗎?</string>
|
||||
<string name="panic_setting_destructive_action">破壞性操作</string>
|
||||
<string name="panic_setting_signout_title">登出</string>
|
||||
<string name="panic_setting_signout_summary">觸發緊急開關時登出 Briar</string>
|
||||
<string name="purge_setting_title">刪除帳戶</string>
|
||||
<string name="purge_setting_summary">觸發緊急開關時刪除您的 Briar 帳戶。注意:這將導致您的身份、聯絡人和訊息永久丟失。</string>
|
||||
<string name="uninstall_setting_title">卸載 Briar</string>
|
||||
<string name="uninstall_setting_summary">需要確認緊急事件</string>
|
||||
<!--Settings Notifications-->
|
||||
<string name="notification_settings_title">消息通知</string>
|
||||
<string name="notify_sign_in_title">提醒我登錄</string>
|
||||
<string name="notify_sign_in_summary">當手機開機或程式更新時,顯示提醒</string>
|
||||
<string name="notify_private_messages_setting_title">私信</string>
|
||||
<string name="notify_private_messages_setting_summary">顯示私信通知</string>
|
||||
<string name="notify_private_messages_setting_summary_26">設置私信通知</string>
|
||||
<string name="notify_group_messages_setting_title">羣消息</string>
|
||||
<string name="notify_group_messages_setting_summary">顯示羣消息通知</string>
|
||||
<string name="notify_group_messages_setting_summary_26">設置羣消息通知</string>
|
||||
<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_summary">顯示博文通知</string>
|
||||
<string name="notify_blog_posts_setting_summary_26">設置博文通知</string>
|
||||
<string name="notify_vibration_setting">震動</string>
|
||||
<string name="notify_sound_setting">聲音</string>
|
||||
<string name="notify_sound_setting_default">默認鈴聲</string>
|
||||
<string name="notify_sound_setting_disabled">無</string>
|
||||
<string name="choose_ringtone_title">選擇鈴聲</string>
|
||||
<string name="cannot_load_ringtone">無法加載鈴聲</string>
|
||||
<!--Settings Feedback-->
|
||||
<string name="feedback_settings_title">反饋</string>
|
||||
<string name="send_feedback">提交反饋</string>
|
||||
<!--Link Warning-->
|
||||
<string name="link_warning_title">鏈接警告</string>
|
||||
<string name="link_warning_intro">您將要在另一個程式中打開以下鏈接</string>
|
||||
<string name="link_warning_text">這可能用來標識您的身份。請考慮一下您是否信任這個給您發送鏈接的人,並考慮用 Tor 瀏覽器打開它。</string>
|
||||
<string name="link_warning_open_link">打開鏈接</string>
|
||||
<!--Crash Reporter-->
|
||||
<string name="crash_report_title">Briar 崩潰報告</string>
|
||||
<string name="briar_crashed">抱歉,Briar 已崩潰。</string>
|
||||
<string name="not_your_fault">這並非您的錯誤所致。</string>
|
||||
<string name="please_send_report">請發送崩潰報告,以幫助我們優化 Briar 。</string>
|
||||
<string name="report_is_encrypted">我們保證會加密並安全地發送報告。</string>
|
||||
<string name="feedback_title">反饋</string>
|
||||
<string name="describe_crash">描述發生了什麼(選填)</string>
|
||||
<string name="enter_feedback">輸入您的反饋</string>
|
||||
<string name="optional_contact_email">您的郵箱地址(選填)</string>
|
||||
<string name="include_debug_report_crash">包含關於本次崩潰的匿名數據</string>
|
||||
<string name="include_debug_report_feedback">包含關於本裝置的匿名數據</string>
|
||||
<string name="could_not_load_report_data">無法加載報告數據。</string>
|
||||
<string name="send_report">發送報告</string>
|
||||
<string name="close">關閉</string>
|
||||
<string name="dev_report_saved">報告已保存,將於您下次登錄時發送。</string>
|
||||
<!--Sign Out-->
|
||||
<string name="progress_title_logout">正在登出 Briar……</string>
|
||||
<!--Screen Filters & Tapjacking-->
|
||||
<string name="screen_filter_title">檢測到屏幕覆蓋</string>
|
||||
<string name="screen_filter_body">另一個程式覆蓋在 Briar 上。爲了保護您的安全,Briar 在有其他程式覆蓋的情況下不會處理對觸控應。\n\n以下程式可能覆蓋在上方:\n\n%1$s</string>
|
||||
<string name="screen_filter_allow">允許這些程式覆蓋在上方</string>
|
||||
<!--Permission Requests-->
|
||||
<string name="permission_camera_title">相機權限</string>
|
||||
<string name="permission_camera_request_body">Briar 需要獲得相機權限以掃描二維碼。</string>
|
||||
<string name="permission_location_title">位置權限</string>
|
||||
<string name="permission_location_request_body">Briar 需要位置信息權限以發現藍牙裝置。\n\nBriar 不會存儲您的位置或將它分享給任何人。</string>
|
||||
<string name="permission_camera_location_title">相機和位置</string>
|
||||
<string name="permission_camera_location_request_body"> Briar 需要相機權限以掃描二維碼。\n\nBriar 需要位置信息權限以發現藍牙裝置。\n\nBriar 不會存儲您的位置或將它分享給任何人。</string>
|
||||
<string name="permission_camera_denied_body">您已拒絕相機權限,而添加聯絡人需要使用相機。\n\n請考慮授予相機權限。</string>
|
||||
<string name="qr_code">二維碼</string>
|
||||
<string name="show_qr_code_fullscreen">全熒幕顯示二維碼</string>
|
||||
<!--App Locking-->
|
||||
<string name="lock_unlock">解鎖 Briar</string>
|
||||
<string name="lock_unlock_verbose">輸入您裝置的 PIN 碼,圖案或密碼以解鎖 Briar</string>
|
||||
<string name="lock_unlock_fingerprint_description">用已註冊的手指輕觸指紋傳感器以繼續</string>
|
||||
<string name="lock_unlock_password">使用密碼</string>
|
||||
<string name="lock_is_locked">Briar 已鎖定</string>
|
||||
<string name="lock_tap_to_unlock">輕按以解鎖</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>
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_bob">波比</string>
|
||||
<!--This is a name to be used in screenshots. Feel free to change it to a local name.-->
|
||||
<string name="screenshot_carol">嘉露</string>
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Bob!-->
|
||||
<string name="screenshot_message_1">嗨,波比!</string>
|
||||
<!--This is a message to be used in screenshots. Please use the same translation for Alice!-->
|
||||
<string name="screenshot_message_2">嗨,愛麗詩!謝謝您告訴我關於 Briar 的事!</string>
|
||||
<!--This is a message to be used in screenshots.-->
|
||||
<string name="screenshot_message_3">沒問題,希望您喜歡它 😀</string>
|
||||
</resources>
|
||||
@@ -42,11 +42,8 @@
|
||||
<item>he</item>
|
||||
<item>hi</item>
|
||||
<item>hu</item>
|
||||
<item>is</item>
|
||||
<item>it</item>
|
||||
<item>ja</item>
|
||||
<item>ko</item>
|
||||
<item>lt</item>
|
||||
<item>mk</item>
|
||||
<item>ms</item>
|
||||
<item>nb</item>
|
||||
@@ -62,7 +59,6 @@
|
||||
<item>tr</item>
|
||||
<item>uk</item>
|
||||
<item>zh-CN</item>
|
||||
<item>zh-TW</item>
|
||||
</string-array>
|
||||
<string-array name="pref_theme_entries">
|
||||
<item>@string/pref_theme_light</item>
|
||||
|
||||
@@ -2,13 +2,14 @@ package org.briarproject.briar.android.attachment;
|
||||
|
||||
import org.briarproject.bramble.api.sync.MessageId;
|
||||
import org.briarproject.bramble.test.BrambleMockTestCase;
|
||||
import org.briarproject.briar.android.attachment.ImageHelper.DecodeResult;
|
||||
import org.briarproject.briar.api.messaging.Attachment;
|
||||
import org.briarproject.briar.api.messaging.AttachmentHeader;
|
||||
import org.briarproject.briar.api.messaging.MessagingManager;
|
||||
import org.jmock.Expectations;
|
||||
import org.jmock.lib.legacy.ClassImposteriser;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
|
||||
@@ -24,30 +25,32 @@ public class AttachmentRetrieverTest extends BrambleMockTestCase {
|
||||
100, 50, 200, 75, 300
|
||||
);
|
||||
private final MessageId msgId = new MessageId(getRandomId());
|
||||
private final ImageHelper imageHelper = context.mock(ImageHelper.class);
|
||||
private final ImageSizeCalculator imageSizeCalculator;
|
||||
private final AttachmentRetriever retriever;
|
||||
private final Attachment attachment = new Attachment(
|
||||
new BufferedInputStream(
|
||||
new ByteArrayInputStream(getRandomBytes(42))));
|
||||
|
||||
public AttachmentRetrieverTest() {
|
||||
context.setImposteriser(ClassImposteriser.INSTANCE);
|
||||
MessagingManager messagingManager =
|
||||
context.mock(MessagingManager.class);
|
||||
imageSizeCalculator = context.mock(ImageSizeCalculator.class);
|
||||
retriever = new AttachmentRetrieverImpl(messagingManager, dimensions,
|
||||
imageHelper, imageSizeCalculator);
|
||||
}
|
||||
private final MessagingManager messagingManager =
|
||||
context.mock(MessagingManager.class);
|
||||
private final ImageHelper imageHelper = context.mock(ImageHelper.class);
|
||||
private final AttachmentRetriever controller =
|
||||
new AttachmentRetriever(
|
||||
messagingManager,
|
||||
dimensions,
|
||||
imageHelper
|
||||
);
|
||||
|
||||
@Test
|
||||
public void testNoSize() {
|
||||
String mimeType = "image/jpeg";
|
||||
Attachment attachment = getAttachment(mimeType);
|
||||
AttachmentHeader h = getAttachmentHeader(mimeType);
|
||||
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(imageHelper).getExtensionFromMimeType(mimeType);
|
||||
will(returnValue("jpg"));
|
||||
}});
|
||||
|
||||
AttachmentItem item = retriever.getAttachmentItem(attachment, false);
|
||||
AttachmentItem item =
|
||||
controller.getAttachmentItem(h, attachment, false);
|
||||
assertEquals(mimeType, item.getMimeType());
|
||||
assertEquals("jpg", item.getExtension());
|
||||
assertFalse(item.hasError());
|
||||
@@ -56,31 +59,31 @@ public class AttachmentRetrieverTest extends BrambleMockTestCase {
|
||||
@Test
|
||||
public void testNoSizeWrongMimeTypeProducesError() {
|
||||
String mimeType = "application/octet-stream";
|
||||
Attachment attachment = getAttachment(mimeType);
|
||||
AttachmentHeader h = getAttachmentHeader(mimeType);
|
||||
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(imageHelper).getExtensionFromMimeType(mimeType);
|
||||
will(returnValue(null));
|
||||
}});
|
||||
|
||||
AttachmentItem item = retriever.getAttachmentItem(attachment, false);
|
||||
AttachmentItem item =
|
||||
controller.getAttachmentItem(h, attachment, false);
|
||||
assertTrue(item.hasError());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSmallJpegImage() {
|
||||
String mimeType = "image/jpeg";
|
||||
Attachment attachment = getAttachment(mimeType);
|
||||
AttachmentHeader h = getAttachmentHeader(mimeType);
|
||||
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(imageSizeCalculator).getSize(with(any(InputStream.class)),
|
||||
with(mimeType));
|
||||
will(returnValue(new Size(160, 240, mimeType)));
|
||||
oneOf(imageHelper).decodeStream(with(any(InputStream.class)));
|
||||
will(returnValue(new DecodeResult(160, 240, mimeType)));
|
||||
oneOf(imageHelper).getExtensionFromMimeType(mimeType);
|
||||
will(returnValue("jpg"));
|
||||
}});
|
||||
|
||||
AttachmentItem item = retriever.getAttachmentItem(attachment, true);
|
||||
AttachmentItem item = controller.getAttachmentItem(h, attachment, true);
|
||||
assertEquals(msgId, item.getMessageId());
|
||||
assertEquals(160, item.getWidth());
|
||||
assertEquals(240, item.getHeight());
|
||||
@@ -94,17 +97,16 @@ public class AttachmentRetrieverTest extends BrambleMockTestCase {
|
||||
@Test
|
||||
public void testBigJpegImage() {
|
||||
String mimeType = "image/jpeg";
|
||||
Attachment attachment = getAttachment(mimeType);
|
||||
AttachmentHeader h = getAttachmentHeader(mimeType);
|
||||
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(imageSizeCalculator).getSize(with(any(InputStream.class)),
|
||||
with(mimeType));
|
||||
will(returnValue(new Size(1728, 2592, mimeType)));
|
||||
oneOf(imageHelper).decodeStream(with(any(InputStream.class)));
|
||||
will(returnValue(new DecodeResult(1728, 2592, mimeType)));
|
||||
oneOf(imageHelper).getExtensionFromMimeType(mimeType);
|
||||
will(returnValue("jpg"));
|
||||
}});
|
||||
|
||||
AttachmentItem item = retriever.getAttachmentItem(attachment, true);
|
||||
AttachmentItem item = controller.getAttachmentItem(h, attachment, true);
|
||||
assertEquals(1728, item.getWidth());
|
||||
assertEquals(2592, item.getHeight());
|
||||
assertEquals(dimensions.maxWidth, item.getThumbnailWidth());
|
||||
@@ -114,24 +116,21 @@ public class AttachmentRetrieverTest extends BrambleMockTestCase {
|
||||
|
||||
@Test
|
||||
public void testMalformedError() {
|
||||
String mimeType = "image/jpeg";
|
||||
Attachment attachment = getAttachment(mimeType);
|
||||
AttachmentHeader h = getAttachmentHeader("image/jpeg");
|
||||
|
||||
context.checking(new Expectations() {{
|
||||
oneOf(imageSizeCalculator).getSize(with(any(InputStream.class)),
|
||||
with(mimeType));
|
||||
will(returnValue(new Size()));
|
||||
oneOf(imageHelper).decodeStream(with(any(InputStream.class)));
|
||||
will(returnValue(new DecodeResult(0, 0, "")));
|
||||
oneOf(imageHelper).getExtensionFromMimeType("");
|
||||
will(returnValue(null));
|
||||
}});
|
||||
|
||||
AttachmentItem item = retriever.getAttachmentItem(attachment, true);
|
||||
AttachmentItem item = controller.getAttachmentItem(h, attachment, true);
|
||||
assertTrue(item.hasError());
|
||||
}
|
||||
|
||||
private Attachment getAttachment(String contentType) {
|
||||
AttachmentHeader header = new AttachmentHeader(msgId, contentType);
|
||||
InputStream in = new ByteArrayInputStream(getRandomBytes(42));
|
||||
return new Attachment(header, in);
|
||||
private AttachmentHeader getAttachmentHeader(String contentType) {
|
||||
return new AttachmentHeader(msgId, contentType);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,27 +1,15 @@
|
||||
package org.briarproject.briar.api.messaging;
|
||||
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
|
||||
@Immutable
|
||||
@NotNullByDefault
|
||||
public class Attachment {
|
||||
|
||||
private final AttachmentHeader header;
|
||||
private final InputStream stream;
|
||||
|
||||
public Attachment(AttachmentHeader header, InputStream stream) {
|
||||
this.header = header;
|
||||
public Attachment(InputStream stream) {
|
||||
this.stream = stream;
|
||||
}
|
||||
|
||||
public AttachmentHeader getHeader() {
|
||||
return header;
|
||||
}
|
||||
|
||||
public InputStream getStream() {
|
||||
return stream;
|
||||
}
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
package org.briarproject.briar.api.messaging;
|
||||
|
||||
import org.briarproject.bramble.api.db.DbException;
|
||||
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
||||
|
||||
/**
|
||||
* An exception that is thrown when an {@link AttachmentHeader} is used to
|
||||
* load an {@link Attachment}, and the header refers to a message that is not
|
||||
* an attachment, or to an attachment that does not have the expected content
|
||||
* type.
|
||||
*/
|
||||
@NotNullByDefault
|
||||
public class InvalidAttachmentException extends DbException {
|
||||
}
|
||||
@@ -30,7 +30,7 @@ public interface MessagingManager extends ConversationClient {
|
||||
/**
|
||||
* The current minor version of the messaging client.
|
||||
*/
|
||||
int MINOR_VERSION = 2;
|
||||
int MINOR_VERSION = 1;
|
||||
|
||||
/**
|
||||
* Stores a local private message.
|
||||
@@ -40,7 +40,7 @@ public interface MessagingManager extends ConversationClient {
|
||||
/**
|
||||
* Stores a local attachment message.
|
||||
*
|
||||
* @throws FileTooBigException If the attachment is too big
|
||||
* @throws FileTooBigException
|
||||
*/
|
||||
AttachmentHeader addLocalAttachment(GroupId groupId, long timestamp,
|
||||
String contentType, InputStream is) throws DbException, IOException;
|
||||
@@ -68,13 +68,9 @@ public interface MessagingManager extends ConversationClient {
|
||||
String getMessageText(MessageId m) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns the attachment with the given message ID and content type.
|
||||
*
|
||||
* @throws InvalidAttachmentException If the header refers to a message
|
||||
* that is not an attachment, or to an attachment that does not have the
|
||||
* expected content type
|
||||
* Returns the attachment with the given ID.
|
||||
*/
|
||||
Attachment getAttachment(AttachmentHeader h) throws DbException;
|
||||
Attachment getAttachment(MessageId m) throws DbException;
|
||||
|
||||
/**
|
||||
* Returns true if the contact with the given {@link ContactId} does support
|
||||
|
||||
@@ -10,7 +10,7 @@ apply from: '../dagger.gradle'
|
||||
|
||||
dependencies {
|
||||
implementation project(path: ':briar-api', configuration: 'default')
|
||||
implementation 'com.rometools:rome:1.12.1'
|
||||
implementation 'com.rometools:rome:1.10.0'
|
||||
implementation 'org.jdom:jdom2:2.0.6'
|
||||
implementation 'com.squareup.okhttp3:okhttp:3.12.2'
|
||||
implementation 'org.jsoup:jsoup:1.11.3'
|
||||
|
||||
@@ -32,7 +32,6 @@ import org.briarproject.briar.api.conversation.ConversationMessageHeader;
|
||||
import org.briarproject.briar.api.messaging.Attachment;
|
||||
import org.briarproject.briar.api.messaging.AttachmentHeader;
|
||||
import org.briarproject.briar.api.messaging.FileTooBigException;
|
||||
import org.briarproject.briar.api.messaging.InvalidAttachmentException;
|
||||
import org.briarproject.briar.api.messaging.MessagingManager;
|
||||
import org.briarproject.briar.api.messaging.PrivateMessage;
|
||||
import org.briarproject.briar.api.messaging.PrivateMessageHeader;
|
||||
@@ -375,20 +374,13 @@ class MessagingManagerImpl implements MessagingManager, IncomingMessageHook,
|
||||
}
|
||||
|
||||
@Override
|
||||
public Attachment getAttachment(AttachmentHeader h) throws DbException {
|
||||
public Attachment getAttachment(MessageId m) throws DbException {
|
||||
// TODO: Support large messages
|
||||
MessageId m = h.getMessageId();
|
||||
byte[] body = clientHelper.getMessage(m).getBody();
|
||||
try {
|
||||
BdfDictionary meta = clientHelper.getMessageMetadataAsDictionary(m);
|
||||
Long messageType = meta.getOptionalLong(MSG_KEY_MSG_TYPE);
|
||||
if (messageType == null || messageType != ATTACHMENT)
|
||||
throw new InvalidAttachmentException();
|
||||
String contentType = meta.getString(MSG_KEY_CONTENT_TYPE);
|
||||
if (!contentType.equals(h.getContentType()))
|
||||
throw new InvalidAttachmentException();
|
||||
int offset = meta.getLong(MSG_KEY_DESCRIPTOR_LENGTH).intValue();
|
||||
return new Attachment(h, new ByteArrayInputStream(body, offset,
|
||||
return new Attachment(new ByteArrayInputStream(body, offset,
|
||||
body.length - offset));
|
||||
} catch (FormatException e) {
|
||||
throw new DbException(e);
|
||||
|
||||
@@ -65,7 +65,7 @@ public class MessagingModule {
|
||||
conversationManager.registerConversationClient(messagingManager);
|
||||
// Advertise the current or previous minor version depending on the
|
||||
// feature flag
|
||||
int minorVersion = featureFlags.shouldEnableImageAttachments() ? 2 : 0;
|
||||
int minorVersion = featureFlags.shouldEnableImageAttachments() ? 1 : 0;
|
||||
clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION,
|
||||
minorVersion, messagingManager);
|
||||
return messagingManager;
|
||||
|
||||
@@ -11,8 +11,8 @@ dependencyVerification {
|
||||
'com.google.googlejavaformat:google-java-format:1.5:google-java-format-1.5.jar:aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e',
|
||||
'com.google.guava:guava:25.0-jre:guava-25.0-jre.jar:3fd4341776428c7e0e5c18a7c10de129475b69ab9d30aeafbb5c277bb6074fa9',
|
||||
'com.google.j2objc:j2objc-annotations:1.1:j2objc-annotations-1.1.jar:2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6',
|
||||
'com.rometools:rome-utils:1.12.1:rome-utils-1.12.1.jar:d65ce5f0926ee80e1ed19b176428846098000fc4db09360a1b4dd3a1a36ed477',
|
||||
'com.rometools:rome:1.12.1:rome-1.12.1.jar:13414d70a6c185e1374588321861c6e9eb7928eee502d032094ef3ca0fd921ae',
|
||||
'com.rometools:rome-utils:1.10.0:rome-utils-1.10.0.jar:5bcfe917fe90e89ae8e02fed543c3657a882565a6bc98197fc11905d88a2a501',
|
||||
'com.rometools:rome:1.10.0:rome-1.10.0.jar:9ff5156d800f6c9ecbe7fca54daf756ac2720c41eb9240d2d66379700f1ecb8a',
|
||||
'com.squareup.okhttp3:okhttp:3.12.2:okhttp-3.12.2.jar:ada4af7d0d82d56a65947bfc8e1d39d1f22a9a7cc568fcbc48b41288891606ad',
|
||||
'com.squareup.okio:okio:1.15.0:okio-1.15.0.jar:693fa319a7e8843300602b204023b7674f106ebcb577f2dd5807212b66118bd2',
|
||||
'com.squareup:javapoet:1.11.1:javapoet-1.11.1.jar:9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90',
|
||||
|
||||
Reference in New Issue
Block a user