Compare commits

..

1 Commits

Author SHA1 Message Date
akwizgran
0134f5da14 Upgrade some test dependencies. 2021-04-30 14:55:08 +01:00
71 changed files with 582 additions and 863 deletions

View File

@@ -15,8 +15,8 @@ android {
defaultConfig {
minSdkVersion 16
targetSdkVersion 30
versionCode 10303
versionName "1.3.3"
versionCode 10302
versionName "1.3.2"
consumerProguardFiles 'proguard-rules.txt'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -50,7 +50,7 @@ dependencies {
compileOnly 'javax.annotation:jsr250-api:1.0'
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
testImplementation 'junit:junit:4.12'
testImplementation 'junit:junit:4.13.1'
testImplementation "org.jmock:jmock:2.8.2"
testImplementation "org.jmock:jmock-junit4:2.8.2"
testImplementation "org.jmock:jmock-legacy:2.8.2"

View File

@@ -62,7 +62,7 @@ dependencyVerification {
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
'javax.xml.bind:jaxb-api:2.3.1:jaxb-api-2.3.1.jar:88b955a0df57880a26a74708bc34f74dcaf8ebf4e78843a28b50eae945732b06',
'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a',
'junit:junit:4.13.1:junit-4.13.1.jar:c30719db974d6452793fe191b3638a5777005485bae145924044530ffa5f6122',
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
'net.sf.jopt-simple:jopt-simple:4.9:jopt-simple-4.9.jar:26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5',
'net.sf.kxml:kxml2:2.3.0:kxml2-2.3.0.jar:f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2',

View File

@@ -10,7 +10,7 @@ dependencies {
implementation "com.google.dagger:dagger:2.24"
implementation 'com.google.code.findbugs:jsr305:3.0.2'
testImplementation 'junit:junit:4.12'
testImplementation 'junit:junit:4.13.1'
testImplementation "org.jmock:jmock:2.8.2"
testImplementation "org.jmock:jmock-junit4:2.8.2"
testImplementation "org.jmock:jmock-legacy:2.8.2"

View File

@@ -4,7 +4,7 @@ dependencyVerification {
'com.google.code.findbugs:jsr305:3.0.2:jsr305-3.0.2.jar:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
'com.google.dagger:dagger:2.24:dagger-2.24.jar:550a6e46a6dfcdf1d764887b6090cea94f783327e50e5c73754f18facfc70b64',
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a',
'junit:junit:4.13.1:junit-4.13.1.jar:c30719db974d6452793fe191b3638a5777005485bae145924044530ffa5f6122',
'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d',
'org.apache.ant:ant:1.9.4:ant-1.9.4.jar:649ae0730251de07b8913f49286d46bba7b92d47c5f332610aa426c4f02161d8',
'org.beanshell:bsh:1.3.0:bsh-1.3.0.jar:9b04edc75d19db54f1b4e8b5355e9364384c6cf71eb0a1b9724c159d779879f8',

View File

@@ -21,7 +21,7 @@ dependencies {
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
testImplementation 'org.hsqldb:hsqldb:2.3.5' // The last version that supports Java 1.6
testImplementation 'junit:junit:4.12'
testImplementation 'junit:junit:4.13.1'
testImplementation "org.jmock:jmock:2.8.2"
testImplementation "org.jmock:jmock-junit4:2.8.2"
testImplementation "org.jmock:jmock-legacy:2.8.2"

View File

@@ -18,7 +18,7 @@ dependencyVerification {
'com.squareup:javapoet:1.11.1:javapoet-1.11.1.jar:9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90',
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a',
'junit:junit:4.13.1:junit-4.13.1.jar:c30719db974d6452793fe191b3638a5777005485bae145924044530ffa5f6122',
'net.i2p.crypto:eddsa:0.2.0:eddsa-0.2.0.jar:a7cb1b85c16e2f0730b9204106929a1d9aaae1df728adc7041a8b8b605692140',
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d',

View File

@@ -23,7 +23,7 @@ dependencies {
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
testImplementation project(path: ':bramble-core', configuration: 'testOutput')
testImplementation 'junit:junit:4.12'
testImplementation 'junit:junit:4.13.1'
testImplementation "org.jmock:jmock:2.8.2"
testImplementation "org.jmock:jmock-junit4:2.8.2"
testImplementation "org.jmock:jmock-legacy:2.8.2"

View File

@@ -16,7 +16,7 @@ dependencyVerification {
'com.squareup:javapoet:1.11.1:javapoet-1.11.1.jar:9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90',
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a',
'junit:junit:4.13.1:junit-4.13.1.jar:c30719db974d6452793fe191b3638a5777005485bae145924044530ffa5f6122',
'net.java.dev.jna:jna-platform:4.5.2:jna-platform-4.5.2.jar:f1d00c167d8921c6e23c626ef9f1c3ae0be473c95c68ffa012bc7ae55a87e2d6',
'net.java.dev.jna:jna:4.5.2:jna-4.5.2.jar:0c8eb7acf67261656d79005191debaba3b6bf5dd60a43735a245429381dbecff',
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',

View File

@@ -26,8 +26,8 @@ android {
defaultConfig {
minSdkVersion 16
targetSdkVersion 30
versionCode 10303
versionName "1.3.3"
versionCode 10302
versionName "1.3.2"
applicationId "org.briarproject.briar.android"
vectorDrawables.useSupportLibrary = true
@@ -133,7 +133,7 @@ dependencies {
testImplementation project(path: ':bramble-core', configuration: 'testOutput')
testImplementation 'androidx.test:runner:1.3.0'
testImplementation 'androidx.test.ext:junit:1.1.2'
testImplementation 'androidx.fragment:fragment-testing:1.2.5'
testImplementation 'androidx.fragment:fragment-testing:1.3.3'
testImplementation "androidx.arch.core:core-testing:2.1.0"
testImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
testImplementation 'org.robolectric:robolectric:4.3.1'

View File

@@ -322,6 +322,25 @@
android:value="org.briarproject.briar.android.blog.BlogActivity" />
</activity>
<activity
android:name="org.briarproject.briar.android.blog.RssFeedImportActivity"
android:label="@string/blogs_rss_feeds_import"
android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity"
android:windowSoftInputMode="adjustResize|stateAlwaysVisible">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
</activity>
<activity
android:name="org.briarproject.briar.android.blog.RssFeedManageActivity"
android:label="@string/blogs_rss_feeds_manage"
android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
</activity>
<activity
android:name="org.briarproject.briar.android.contact.add.nearby.AddNearbyContactActivity"
android:label="@string/add_contact_title"
@@ -428,15 +447,6 @@
android:theme="@style/BriarTheme"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name="org.briarproject.briar.android.blog.RssFeedActivity"
android:label="@string/blogs_rss_feeds"
android:parentActivityName="org.briarproject.briar.android.navdrawer.NavDrawerActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.navdrawer.NavDrawerActivity" />
</activity>
<activity
android:name=".android.contact.add.remote.PendingContactListActivity"
android:label="@string/pending_contact_requests"

View File

@@ -13,11 +13,8 @@ import org.briarproject.briar.android.blog.BlogPostFragment;
import org.briarproject.briar.android.blog.FeedFragment;
import org.briarproject.briar.android.blog.ReblogActivity;
import org.briarproject.briar.android.blog.ReblogFragment;
import org.briarproject.briar.android.blog.RssFeedActivity;
import org.briarproject.briar.android.blog.RssFeedDeleteFeedDialogFragment;
import org.briarproject.briar.android.blog.RssFeedImportFailedDialogFragment;
import org.briarproject.briar.android.blog.RssFeedImportFragment;
import org.briarproject.briar.android.blog.RssFeedManageFragment;
import org.briarproject.briar.android.blog.RssFeedImportActivity;
import org.briarproject.briar.android.blog.RssFeedManageActivity;
import org.briarproject.briar.android.blog.WriteBlogPostActivity;
import org.briarproject.briar.android.contact.ContactListFragment;
import org.briarproject.briar.android.contact.add.nearby.AddNearbyContactActivity;
@@ -164,7 +161,9 @@ public interface ActivityComponent {
void inject(IntroductionActivity activity);
void inject(RssFeedActivity activity);
void inject(RssFeedImportActivity activity);
void inject(RssFeedManageActivity activity);
void inject(StartupFailureActivity activity);
@@ -234,12 +233,4 @@ public interface ActivityComponent {
void inject(
BluetoothConnecterDialogFragment bluetoothConnecterDialogFragment);
void inject(RssFeedImportFragment fragment);
void inject(RssFeedManageFragment fragment);
void inject(RssFeedImportFailedDialogFragment fragment);
void inject(RssFeedDeleteFeedDialogFragment fragment);
}

View File

@@ -20,8 +20,4 @@ public interface BlogModule {
@ViewModelKey(BlogViewModel.class)
ViewModel bindBlogViewModel(BlogViewModel blogViewModel);
@Binds
@IntoMap
@ViewModelKey(RssFeedViewModel.class)
ViewModel bindRssFeedViewModel(RssFeedViewModel rssFeedViewModel);
}

View File

@@ -131,8 +131,15 @@ public class FeedFragment extends BaseFragment
i.putExtra(GROUP_ID, personalBlog.getId().getBytes());
startActivity(i);
return true;
} else if (itemId == R.id.action_rss_feeds) {
Intent i = new Intent(getActivity(), RssFeedActivity.class);
} else if (itemId == R.id.action_rss_feeds_import) {
Intent i = new Intent(getActivity(), RssFeedImportActivity.class);
startActivity(i);
return true;
} else if (itemId == R.id.action_rss_feeds_manage) {
Blog personalBlog = viewModel.getPersonalBlog().getValue();
if (personalBlog == null) return false;
Intent i = new Intent(getActivity(), RssFeedManageActivity.class);
i.putExtra(GROUP_ID, personalBlog.getId().getBytes());
startActivity(i);
return true;
}

View File

@@ -1,69 +0,0 @@
package org.briarproject.briar.android.blog;
import android.os.Bundle;
import android.widget.Toast;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BriarActivity;
import org.briarproject.briar.android.fragment.BaseFragment.BaseFragmentListener;
import javax.inject.Inject;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.ViewModelProvider;
import static org.briarproject.briar.android.blog.RssFeedViewModel.ImportResult.EXISTS;
import static org.briarproject.briar.android.blog.RssFeedViewModel.ImportResult.FAILED;
import static org.briarproject.briar.android.blog.RssFeedViewModel.ImportResult.IMPORTED;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class RssFeedActivity extends BriarActivity
implements BaseFragmentListener {
@Inject
ViewModelProvider.Factory viewModelFactory;
private RssFeedViewModel viewModel;
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(this, viewModelFactory)
.get(RssFeedViewModel.class);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_container);
if (savedInstanceState == null) {
showInitialFragment(RssFeedManageFragment.newInstance());
}
viewModel.getImportResult().observeEvent(this, this::onImportResult);
}
private void onImportResult(RssFeedViewModel.ImportResult result) {
if (result == IMPORTED) {
FragmentManager fm = getSupportFragmentManager();
if (fm.findFragmentByTag(RssFeedImportFragment.TAG) != null) {
onBackPressed();
}
} else if (result == FAILED) {
RssFeedImportFailedDialogFragment dialog =
RssFeedImportFailedDialogFragment.newInstance();
dialog.show(getSupportFragmentManager(),
RssFeedImportFailedDialogFragment.TAG);
} else if (result == EXISTS) {
Toast.makeText(this, R.string.blogs_rss_feeds_import_exists,
Toast.LENGTH_LONG).show();
}
}
}

View File

@@ -7,54 +7,91 @@ import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.util.BriarAdapter;
import org.briarproject.briar.android.util.UiUtils;
import org.briarproject.briar.api.feed.Feed;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static org.briarproject.briar.android.util.UiUtils.formatDate;
@NotNullByDefault
class RssFeedAdapter extends ListAdapter<Feed, RssFeedAdapter.FeedViewHolder> {
class RssFeedAdapter extends BriarAdapter<Feed, RssFeedAdapter.FeedViewHolder> {
private final RssFeedListener listener;
RssFeedAdapter(RssFeedListener listener) {
super(new DiffUtil.ItemCallback<Feed>() {
@Override
public boolean areItemsTheSame(Feed a, Feed b) {
return a.getUrl().equals(b.getUrl()) &&
a.getBlogId().equals(b.getBlogId()) &&
a.getAdded() == b.getAdded();
}
@Override
public boolean areContentsTheSame(Feed a, Feed b) {
return a.getUpdated() == b.getUpdated();
}
});
RssFeedAdapter(Context ctx, RssFeedListener listener) {
super(ctx, Feed.class);
this.listener = listener;
}
@Override
public FeedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(
View v = LayoutInflater.from(ctx).inflate(
R.layout.list_item_rss_feed, parent, false);
return new FeedViewHolder(v);
}
@Override
public void onBindViewHolder(FeedViewHolder ui, int position) {
ui.bindItem(getItem(position));
Feed item = getItemAt(position);
if (item == null) return;
// Feed Title
ui.title.setText(item.getTitle());
// Delete Button
ui.delete.setOnClickListener(v -> listener.onDeleteClick(item));
// Author
if (item.getRssAuthor() != null) {
ui.author.setText(item.getRssAuthor());
ui.author.setVisibility(VISIBLE);
ui.authorLabel.setVisibility(VISIBLE);
} else {
ui.author.setVisibility(GONE);
ui.authorLabel.setVisibility(GONE);
}
// Imported and Last Updated
ui.imported.setText(UiUtils.formatDate(ctx, item.getAdded()));
ui.updated.setText(UiUtils.formatDate(ctx, item.getUpdated()));
// Description
if (item.getDescription() != null) {
ui.description.setText(item.getDescription());
ui.description.setVisibility(VISIBLE);
} else {
ui.description.setVisibility(GONE);
}
// Open feed's blog when clicked
ui.layout.setOnClickListener(v -> listener.onFeedClick(item));
}
class FeedViewHolder extends RecyclerView.ViewHolder {
private final Context ctx;
@Override
public int compare(Feed a, Feed b) {
if (a == b) return 0;
long aTime = a.getAdded(), bTime = b.getAdded();
if (aTime > bTime) return -1;
if (aTime < bTime) return 1;
return 0;
}
@Override
public boolean areContentsTheSame(Feed a, Feed b) {
return a.getUpdated() == b.getUpdated();
}
@Override
public boolean areItemsTheSame(Feed a, Feed b) {
return a.getUrl().equals(b.getUrl()) &&
a.getBlogId().equals(b.getBlogId()) &&
a.getAdded() == b.getAdded();
}
static class FeedViewHolder extends RecyclerView.ViewHolder {
private final View layout;
private final TextView title;
private final ImageButton delete;
@@ -67,7 +104,6 @@ class RssFeedAdapter extends ListAdapter<Feed, RssFeedAdapter.FeedViewHolder> {
private FeedViewHolder(View v) {
super(v);
ctx = v.getContext();
layout = v;
title = v.findViewById(R.id.titleView);
delete = v.findViewById(R.id.deleteButton);
@@ -77,44 +113,10 @@ class RssFeedAdapter extends ListAdapter<Feed, RssFeedAdapter.FeedViewHolder> {
authorLabel = v.findViewById(R.id.author);
description = v.findViewById(R.id.descriptionView);
}
private void bindItem(Feed item) {
// Feed Title
title.setText(item.getTitle());
// Delete Button
delete.setOnClickListener(v -> listener.onDeleteClick(item));
// Author
if (item.getRssAuthor() != null) {
author.setText(item.getRssAuthor());
author.setVisibility(VISIBLE);
authorLabel.setVisibility(VISIBLE);
} else {
author.setVisibility(GONE);
authorLabel.setVisibility(GONE);
}
// Imported and Last Updated
imported.setText(formatDate(ctx, item.getAdded()));
updated.setText(formatDate(ctx, item.getUpdated()));
// Description
if (item.getDescription() != null) {
description.setText(item.getDescription());
description.setVisibility(VISIBLE);
} else {
description.setVisibility(GONE);
}
// Open feed's blog when clicked
layout.setOnClickListener(v -> listener.onFeedClick(item));
}
}
interface RssFeedListener {
void onFeedClick(Feed feed);
void onDeleteClick(Feed feed);
}

View File

@@ -1,64 +0,0 @@
package org.briarproject.briar.android.blog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.BaseActivity;
import javax.inject.Inject;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import androidx.lifecycle.ViewModelProvider;
import static java.util.Objects.requireNonNull;
import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class RssFeedDeleteFeedDialogFragment extends DialogFragment {
final static String TAG = RssFeedDeleteFeedDialogFragment.class.getName();
@Inject
ViewModelProvider.Factory viewModelFactory;
private RssFeedViewModel viewModel;
static RssFeedDeleteFeedDialogFragment newInstance(GroupId groupId) {
Bundle args = new Bundle();
args.putByteArray(GROUP_ID, groupId.getBytes());
RssFeedDeleteFeedDialogFragment f =
new RssFeedDeleteFeedDialogFragment();
f.setArguments(args);
return f;
}
@Override
public void onAttach(Context ctx) {
super.onAttach(ctx);
((BaseActivity) requireActivity()).getActivityComponent().inject(this);
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
.get(RssFeedViewModel.class);
}
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
GroupId groupId = new GroupId(
requireNonNull(requireArguments().getByteArray(GROUP_ID)));
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity(),
R.style.BriarDialogTheme);
builder.setTitle(getString(R.string.blogs_rss_remove_feed));
builder.setMessage(
getString(R.string.blogs_rss_remove_feed_dialog_message));
builder.setPositiveButton(R.string.cancel, null);
builder.setNegativeButton(R.string.blogs_rss_remove_feed_ok,
(dialog, which) -> viewModel.removeFeed(groupId));
return builder.create();
}
}

View File

@@ -0,0 +1,170 @@
package org.briarproject.briar.android.blog;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Patterns;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.lifecycle.IoExecutor;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BriarActivity;
import org.briarproject.briar.api.feed.FeedManager;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
import javax.annotation.Nullable;
import javax.inject.Inject;
import androidx.appcompat.app.AlertDialog;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
import static java.util.logging.Level.WARNING;
import static org.briarproject.bramble.util.LogUtils.logException;
import static org.briarproject.briar.android.util.UiUtils.hideSoftKeyboard;
public class RssFeedImportActivity extends BriarActivity {
private static final Logger LOG =
Logger.getLogger(RssFeedImportActivity.class.getName());
private EditText urlInput;
private Button importButton;
private ProgressBar progressBar;
@Inject
@IoExecutor
Executor ioExecutor;
@Inject
@SuppressWarnings("WeakerAccess")
volatile FeedManager feedManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rss_feed_import);
urlInput = findViewById(R.id.urlInput);
urlInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void afterTextChanged(Editable s) {
enableOrDisableImportButton();
}
});
urlInput.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == IME_ACTION_DONE && importButton.isEnabled() &&
importButton.getVisibility() == VISIBLE) {
publish();
return true;
}
return false;
});
importButton = findViewById(R.id.importButton);
importButton.setOnClickListener(v -> publish());
progressBar = findViewById(R.id.progressBar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
}
private void enableOrDisableImportButton() {
String url = urlInput.getText().toString();
importButton.setEnabled(validateAndNormaliseUrl(url) != null);
}
@Nullable
private String validateAndNormaliseUrl(String url) {
if (!Patterns.WEB_URL.matcher(url).matches()) return null;
try {
return new URL(url).toString();
} catch (MalformedURLException e) {
return null;
}
}
private void publish() {
// hide import button, show progress bar
importButton.setVisibility(GONE);
progressBar.setVisibility(VISIBLE);
hideSoftKeyboard(urlInput);
String url = validateAndNormaliseUrl(urlInput.getText().toString());
if (url == null) throw new AssertionError();
importFeed(url);
}
private void importFeed(String url) {
ioExecutor.execute(() -> {
try {
feedManager.addFeed(url);
feedImported();
} catch (DbException | IOException e) {
logException(LOG, WARNING, e);
importFailed();
}
});
}
private void feedImported() {
runOnUiThreadUnlessDestroyed(this::supportFinishAfterTransition);
}
private void importFailed() {
runOnUiThreadUnlessDestroyed(() -> {
// hide progress bar, show publish button
progressBar.setVisibility(GONE);
importButton.setVisibility(VISIBLE);
// show error dialog
AlertDialog.Builder builder =
new AlertDialog.Builder(RssFeedImportActivity.this,
R.style.BriarDialogTheme);
builder.setMessage(R.string.blogs_rss_feeds_import_error);
builder.setNegativeButton(R.string.cancel, null);
builder.setPositiveButton(R.string.try_again_button,
(dialog, which) -> publish());
AlertDialog dialog = builder.create();
dialog.show();
});
}
}

View File

@@ -1,53 +0,0 @@
package org.briarproject.briar.android.blog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.BaseActivity;
import javax.inject.Inject;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import androidx.lifecycle.ViewModelProvider;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class RssFeedImportFailedDialogFragment extends DialogFragment {
final static String TAG = RssFeedImportFailedDialogFragment.class.getName();
@Inject
ViewModelProvider.Factory viewModelFactory;
private RssFeedViewModel viewModel;
static RssFeedImportFailedDialogFragment newInstance() {
return new RssFeedImportFailedDialogFragment();
}
@Override
public void onAttach(Context ctx) {
super.onAttach(ctx);
((BaseActivity) requireActivity()).getActivityComponent().inject(this);
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
.get(RssFeedViewModel.class);
}
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
AlertDialog.Builder builder =
new AlertDialog.Builder(requireActivity(),
R.style.BriarDialogTheme);
builder.setMessage(R.string.blogs_rss_feeds_import_error);
builder.setNegativeButton(R.string.cancel, null);
builder.setPositiveButton(R.string.try_again_button,
(dialog, which) -> viewModel.retryImportFeed());
return builder.create();
}
}

View File

@@ -1,124 +0,0 @@
package org.briarproject.briar.android.blog;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.fragment.BaseFragment;
import javax.annotation.Nullable;
import javax.inject.Inject;
import androidx.lifecycle.ViewModelProvider;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
import static org.briarproject.briar.android.util.UiUtils.hideSoftKeyboard;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class RssFeedImportFragment extends BaseFragment {
public static final String TAG = RssFeedImportFragment.class.getName();
@Inject
ViewModelProvider.Factory viewModelFactory;
private RssFeedViewModel viewModel;
private EditText urlInput;
private Button importButton;
private ProgressBar progressBar;
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
.get(RssFeedViewModel.class);
}
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
requireActivity().setTitle(getString(R.string.blogs_rss_feeds_import));
View v = inflater.inflate(R.layout.fragment_rss_feed_import,
container, false);
urlInput = v.findViewById(R.id.urlInput);
urlInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void afterTextChanged(Editable s) {
enableOrDisableImportButton();
}
});
urlInput.setOnEditorActionListener((view, actionId, event) -> {
if (actionId == IME_ACTION_DONE && importButton.isEnabled() &&
importButton.getVisibility() == VISIBLE) {
publish();
return true;
}
return false;
});
importButton = v.findViewById(R.id.importButton);
importButton.setOnClickListener(view -> publish());
progressBar = v.findViewById(R.id.progressBar);
viewModel.getIsImporting().observe(getViewLifecycleOwner(),
this::onIsImporting);
return v;
}
@Override
public String getUniqueTag() {
return TAG;
}
private void enableOrDisableImportButton() {
String url = urlInput.getText().toString();
importButton.setEnabled(viewModel.validateAndNormaliseUrl(url) != null);
}
private void publish() {
String url = viewModel
.validateAndNormaliseUrl(urlInput.getText().toString());
if (url == null) throw new AssertionError();
viewModel.importFeed(url);
}
private void onIsImporting(Boolean importing) {
if (importing) {
// show progress bar, hide import button
importButton.setVisibility(GONE);
progressBar.setVisibility(VISIBLE);
hideSoftKeyboard(urlInput);
} else {
// show publish button, hide progress bar
importButton.setVisibility(VISIBLE);
progressBar.setVisibility(GONE);
}
}
}

View File

@@ -0,0 +1,178 @@
package org.briarproject.briar.android.blog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import com.google.android.material.snackbar.Snackbar;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BriarActivity;
import org.briarproject.briar.android.blog.RssFeedAdapter.RssFeedListener;
import org.briarproject.briar.android.view.BriarRecyclerView;
import org.briarproject.briar.api.feed.Feed;
import org.briarproject.briar.api.feed.FeedManager;
import java.util.List;
import java.util.logging.Logger;
import javax.inject.Inject;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.LinearLayoutManager;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
import static com.google.android.material.snackbar.Snackbar.LENGTH_LONG;
import static java.util.logging.Level.WARNING;
import static org.briarproject.bramble.util.LogUtils.logException;
public class RssFeedManageActivity extends BriarActivity
implements RssFeedListener {
private static final Logger LOG =
Logger.getLogger(RssFeedManageActivity.class.getName());
private BriarRecyclerView list;
private RssFeedAdapter adapter;
@Inject
@SuppressWarnings("WeakerAccess")
volatile FeedManager feedManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rss_feed_manage);
adapter = new RssFeedAdapter(this, this);
list = findViewById(R.id.feedList);
list.setLayoutManager(new LinearLayoutManager(this));
list.setAdapter(adapter);
}
@Override
public void onStart() {
super.onStart();
loadFeeds();
}
@Override
public void onStop() {
super.onStop();
adapter.clear();
list.showProgressBar();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.rss_feed_manage_actions, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
} else if (item.getItemId() == R.id.action_rss_feeds_import) {
Intent i = new Intent(this, RssFeedImportActivity.class);
startActivity(i);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
}
@Override
public void onFeedClick(Feed feed) {
Intent i = new Intent(this, BlogActivity.class);
i.putExtra(GROUP_ID, feed.getBlogId().getBytes());
i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
}
@Override
public void onDeleteClick(Feed feed) {
DialogInterface.OnClickListener okListener =
(dialog, which) -> deleteFeed(feed);
AlertDialog.Builder builder = new AlertDialog.Builder(this,
R.style.BriarDialogTheme);
builder.setTitle(getString(R.string.blogs_rss_remove_feed));
builder.setMessage(
getString(R.string.blogs_rss_remove_feed_dialog_message));
builder.setPositiveButton(R.string.cancel, null);
builder.setNegativeButton(R.string.blogs_rss_remove_feed_ok,
okListener);
builder.show();
}
private void loadFeeds() {
int revision = adapter.getRevision();
runOnDbThread(() -> {
try {
displayFeeds(revision, feedManager.getFeeds());
} catch (DbException e) {
logException(LOG, WARNING, e);
onLoadError();
}
});
}
private void displayFeeds(int revision, List<Feed> feeds) {
runOnUiThreadUnlessDestroyed(() -> {
if (revision == adapter.getRevision()) {
adapter.incrementRevision();
if (feeds.isEmpty()) list.showData();
else adapter.addAll(feeds);
} else {
LOG.info("Concurrent update, reloading");
loadFeeds();
}
});
}
private void deleteFeed(Feed feed) {
runOnDbThread(() -> {
try {
feedManager.removeFeed(feed);
onFeedDeleted(feed);
} catch (DbException e) {
logException(LOG, WARNING, e);
onDeleteError();
}
});
}
private void onLoadError() {
runOnUiThreadUnlessDestroyed(() -> {
list.setEmptyText(R.string.blogs_rss_feeds_manage_error);
list.showData();
});
}
private void onFeedDeleted(Feed feed) {
runOnUiThreadUnlessDestroyed(() -> {
adapter.incrementRevision();
adapter.remove(feed);
});
}
private void onDeleteError() {
runOnUiThreadUnlessDestroyed(() -> Snackbar.make(list,
R.string.blogs_rss_feeds_manage_delete_error,
LENGTH_LONG).show());
}
}

View File

@@ -1,123 +0,0 @@
package org.briarproject.briar.android.blog;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.fragment.BaseFragment;
import org.briarproject.briar.android.view.BriarRecyclerView;
import org.briarproject.briar.api.feed.Feed;
import javax.annotation.Nullable;
import javax.inject.Inject;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull;
import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
import static org.briarproject.briar.android.blog.RssFeedAdapter.RssFeedListener;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class RssFeedManageFragment extends BaseFragment
implements RssFeedListener {
public static final String TAG = RssFeedManageFragment.class.getName();
@Inject
ViewModelProvider.Factory viewModelFactory;
private RssFeedViewModel viewModel;
private BriarRecyclerView list;
private final RssFeedAdapter adapter = new RssFeedAdapter(this);
public static RssFeedManageFragment newInstance() {
return new RssFeedManageFragment();
}
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
viewModel = new ViewModelProvider(requireActivity(), viewModelFactory)
.get(RssFeedViewModel.class);
}
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
requireActivity().setTitle(R.string.blogs_rss_feeds);
View v = inflater.inflate(R.layout.fragment_rss_feed_manage,
container, false);
list = v.findViewById(R.id.feedList);
list.setLayoutManager(new LinearLayoutManager(getActivity()));
list.setAdapter(adapter);
viewModel.getFeeds().observe(getViewLifecycleOwner(), result -> result
.onError(e -> {
list.setEmptyText(R.string.blogs_rss_feeds_manage_error);
list.showData();
})
.onSuccess(feeds -> {
adapter.submitList(feeds);
if (requireNonNull(feeds).size() == 0) {
list.showData();
}
})
);
return v;
}
@Override
public String getUniqueTag() {
return TAG;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.rss_feed_manage_actions, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
requireActivity().onBackPressed();
return true;
} else if (item.getItemId() == R.id.action_rss_feeds_import) {
showNextFragment(new RssFeedImportFragment());
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onFeedClick(Feed feed) {
Intent i = new Intent(getActivity(), BlogActivity.class);
i.putExtra(GROUP_ID, feed.getBlogId().getBytes());
i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
}
@Override
public void onDeleteClick(Feed feed) {
RssFeedDeleteFeedDialogFragment dialog =
RssFeedDeleteFeedDialogFragment.newInstance(feed.getBlogId());
dialog.show(getParentFragmentManager(),
RssFeedDeleteFeedDialogFragment.TAG);
}
}

View File

@@ -1,180 +0,0 @@
package org.briarproject.briar.android.blog;
import android.app.Application;
import android.util.Patterns;
import org.briarproject.bramble.api.db.DatabaseExecutor;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.db.TransactionManager;
import org.briarproject.bramble.api.lifecycle.IoExecutor;
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.GroupId;
import org.briarproject.bramble.api.system.AndroidExecutor;
import org.briarproject.briar.android.viewmodel.DbViewModel;
import org.briarproject.briar.android.viewmodel.LiveEvent;
import org.briarproject.briar.android.viewmodel.LiveResult;
import org.briarproject.briar.android.viewmodel.MutableLiveEvent;
import org.briarproject.briar.api.feed.Feed;
import org.briarproject.briar.api.feed.FeedManager;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
import javax.inject.Inject;
import androidx.annotation.Nullable;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import static java.util.logging.Level.WARNING;
import static java.util.logging.Logger.getLogger;
import static org.briarproject.bramble.util.LogUtils.logDuration;
import static org.briarproject.bramble.util.LogUtils.logException;
import static org.briarproject.bramble.util.LogUtils.now;
import static org.briarproject.briar.android.blog.RssFeedViewModel.ImportResult.EXISTS;
import static org.briarproject.briar.android.blog.RssFeedViewModel.ImportResult.FAILED;
import static org.briarproject.briar.android.blog.RssFeedViewModel.ImportResult.IMPORTED;
@NotNullByDefault
class RssFeedViewModel extends DbViewModel {
enum ImportResult {IMPORTED, FAILED, EXISTS}
private static final Logger LOG =
getLogger(RssFeedViewModel.class.getName());
private final FeedManager feedManager;
private final Executor ioExecutor;
private final Executor dbExecutor;
private final MutableLiveData<LiveResult<List<Feed>>> feeds =
new MutableLiveData<>();
@Nullable
private volatile String urlFailedImport = null;
private final MutableLiveData<Boolean> isImporting =
new MutableLiveData<>(false);
private final MutableLiveEvent<ImportResult> importResult =
new MutableLiveEvent<>();
@Inject
RssFeedViewModel(Application app,
FeedManager feedManager,
@IoExecutor Executor ioExecutor,
@DatabaseExecutor Executor dbExecutor,
LifecycleManager lifecycleManager,
TransactionManager db,
AndroidExecutor androidExecutor) {
super(app, dbExecutor, lifecycleManager, db, androidExecutor);
this.feedManager = feedManager;
this.ioExecutor = ioExecutor;
this.dbExecutor = dbExecutor;
loadFeeds();
}
@Nullable
String validateAndNormaliseUrl(String url) {
if (!Patterns.WEB_URL.matcher(url).matches()) return null;
try {
return new URL(url).toString();
} catch (MalformedURLException e) {
return null;
}
}
LiveData<LiveResult<List<Feed>>> getFeeds() {
return feeds;
}
private void loadFeeds() {
loadFromDb(this::loadFeeds, feeds::setValue);
}
@DatabaseExecutor
private List<Feed> loadFeeds(Transaction txn) throws DbException {
long start = now();
List<Feed> feeds = feedManager.getFeeds(txn);
Collections.sort(feeds);
logDuration(LOG, "Loading feeds", start);
return feeds;
}
void removeFeed(GroupId groupId) {
dbExecutor.execute(() -> {
List<Feed> updated = removeListItems(getList(feeds), feed -> {
if (feed.getBlogId().equals(groupId)) {
try {
feedManager.removeFeed(feed);
return true;
} catch (DbException e) {
handleException(e);
}
}
return false;
});
if (updated != null) {
feeds.postValue(new LiveResult<>(updated));
}
});
}
LiveEvent<ImportResult> getImportResult() {
return importResult;
}
LiveData<Boolean> getIsImporting() {
return isImporting;
}
void importFeed(String url) {
isImporting.setValue(true);
urlFailedImport = null;
ioExecutor.execute(() -> {
try {
if (exists(url)) {
importResult.postEvent(EXISTS);
return;
}
Feed feed = feedManager.addFeed(url);
List<Feed> updated = addListItem(getList(feeds), feed);
if (updated != null) {
Collections.sort(updated);
feeds.postValue(new LiveResult<>(updated));
}
importResult.postEvent(IMPORTED);
} catch (DbException | IOException e) {
logException(LOG, WARNING, e);
urlFailedImport = url;
importResult.postEvent(FAILED);
} finally {
isImporting.postValue(false);
}
});
}
void retryImportFeed() {
if (urlFailedImport == null) {
throw new AssertionError();
}
importFeed(urlFailedImport);
}
private boolean exists(String url) {
List<Feed> list = getList(feeds);
if (list != null) {
for (Feed feed : list) {
if (url.equals(feed.getUrl())) {
return true;
}
}
}
return false;
}
}

View File

@@ -5,7 +5,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/margin_medium">
android:padding="@dimen/margin_medium"
tools:context=".android.blog.RssFeedImportActivity">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<org.briarproject.briar.android.view.BriarRecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/feedList"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:emptyText="@string/blogs_rss_feeds_manage_empty_state"
app:scrollToEnd="false"
tools:listitem="@layout/list_item_rss_feed" />

View File

@@ -10,8 +10,13 @@
app:showAsAction="always"/>
<item
android:id="@+id/action_rss_feeds"
android:title="@string/blogs_rss_feeds"
android:id="@+id/action_rss_feeds_import"
android:title="@string/blogs_rss_feeds_import"
app:showAsAction="never"/>
<item
android:id="@+id/action_rss_feeds_manage"
android:title="@string/blogs_rss_feeds_manage"
app:showAsAction="never"/>
</menu>

View File

@@ -461,12 +461,14 @@
<string name="blogs_rss_feeds_import_button">إستيراد</string>
<string name="blogs_rss_feeds_import_hint">ادخال رابط تحديثات RSS</string>
<string name="blogs_rss_feeds_import_error">معذرة! حدث خطأ في استيراد التحديثات.</string>
<string name="blogs_rss_feeds_manage">إدارة تحديثات RSS</string>
<string name="blogs_rss_feeds_manage_imported">تم استيراد:</string>
<string name="blogs_rss_feeds_manage_author">المؤلف/ة:</string>
<string name="blogs_rss_feeds_manage_updated">آخر تحديث:</string>
<string name="blogs_rss_remove_feed">ازالة الخلاصة</string>
<string name="blogs_rss_remove_feed_dialog_message">هل أنت متأكد/ة من رغبتك في حذف هذه الخلاصة؟\n\nالمنشورات ستحذف من جهازك وليس من أجهزة الآخرين.\n\nأي جهة اتصال قمت/ي بمشاركة هذه الخلاصة معها قد لا تتمكن من استلام التحديثات.</string>
<string name="blogs_rss_remove_feed_ok">حذف</string>
<string name="blogs_rss_feeds_manage_delete_error">لا يمكن حذف الخلاصة!</string>
<string name="blogs_rss_feeds_manage_empty_state">لا خلاصات RSS للعرض\n\nالرجاء لمس علامة + لإستيراد خلاصة.</string>
<string name="blogs_rss_feeds_manage_error">حدث خطأ في جلب خلاصاتك. الرجاء المحاولة لاحقًا.</string>
<!--Settings Profile Picture-->

View File

@@ -348,11 +348,13 @@
<string name="blogs_rss_feeds_import_button">İdxal</string>
<string name="blogs_rss_feeds_import_hint">RSS kanalın linkini daxil edin</string>
<string name="blogs_rss_feeds_import_error">Üzr istəyirik! Feed-inizdə idxal bir xəta baş verdi.</string>
<string name="blogs_rss_feeds_manage">RSS Feeds idarəetmə</string>
<string name="blogs_rss_feeds_manage_imported">İdxal olundu:</string>
<string name="blogs_rss_feeds_manage_author">Müəllif:</string>
<string name="blogs_rss_feeds_manage_updated">Son yeniləmə:</string>
<string name="blogs_rss_remove_feed">Feed\'i sil</string>
<string name="blogs_rss_remove_feed_ok">Sil</string>
<string name="blogs_rss_feeds_manage_delete_error">Feed silinmədi</string>
<string name="blogs_rss_feeds_manage_empty_state">Xeyr RSS əks etdirmir\n\nİdxal etmək üçün + düyməsinə toxunun</string>
<string name="blogs_rss_feeds_manage_error">Kanal yükləmədə bir problem var. Zəhmət olmasa bir az sonra yenə cəhd edin.</string>
<!--Settings Profile Picture-->

View File

@@ -238,11 +238,13 @@
<string name="blogs_rss_feeds_import_button">Внасяне</string>
<string name="blogs_rss_feeds_import_hint">Въведете URL адреса на RSS емисията</string>
<string name="blogs_rss_feeds_import_error">Възникна грешка при внасянето на емисия.</string>
<string name="blogs_rss_feeds_manage">Управление на RSS емисии</string>
<string name="blogs_rss_feeds_manage_imported">Внесена:</string>
<string name="blogs_rss_feeds_manage_author">Автор:</string>
<string name="blogs_rss_feeds_manage_updated">Последно актуализиране:</string>
<string name="blogs_rss_remove_feed">Премахване на емисия</string>
<string name="blogs_rss_remove_feed_ok">Премахване</string>
<string name="blogs_rss_feeds_manage_delete_error">Емисията не можа да бъде изтрита!</string>
<string name="blogs_rss_feeds_manage_error">Възникна проблем при зареждането на емисиите ви. Моля, опитайте пак по-късно.</string>
<!--Settings Display-->
<!--Settings Network-->

View File

@@ -332,12 +332,14 @@
<string name="blogs_rss_feeds_import_button">Uvezi</string>
<string name="blogs_rss_feeds_import_hint">Unesi URL od RSS kanala</string>
<string name="blogs_rss_feeds_import_error">Žao nam je! Došlo je do greške pri unosu vašeg kanala.</string>
<string name="blogs_rss_feeds_manage">Upravljanje RSS kanalima</string>
<string name="blogs_rss_feeds_manage_imported">Uvezeno:</string>
<string name="blogs_rss_feeds_manage_author">Autor:</string>
<string name="blogs_rss_feeds_manage_updated">Zadnje ažuriranje:</string>
<string name="blogs_rss_remove_feed">Uklonite kanal</string>
<string name="blogs_rss_remove_feed_dialog_message">Jeste li sigurni da želite da uklonite kanal?\n\nPostovi će biti uklonjeni sa vašeg uređaja ali ne is uređaja drugih ljudi.\n\nKontakti kojima ste podijelili ovaj blog će možda prestati da dobijaju novosti.</string>
<string name="blogs_rss_remove_feed_ok">Ukloni</string>
<string name="blogs_rss_feeds_manage_delete_error">Kanal nije bilo moguće ukloniti!</string>
<string name="blogs_rss_feeds_manage_empty_state">Nema RSS kanala za prikazivanje\n\nDotaknite + ikonu da uvezete kanal</string>
<string name="blogs_rss_feeds_manage_error">Došlo je do problema pri učitavanju vaših kanala. Probajte opet kasnije.</string>
<!--Settings Profile Picture-->

View File

@@ -421,12 +421,14 @@ Així que l\'actualitzi li veureu una icona diferent .</string>
<string name="blogs_rss_feeds_import_button">Subscriu-me</string>
<string name="blogs_rss_feeds_import_hint">Escriviu l\'URL del canal de notícies RSS</string>
<string name="blogs_rss_feeds_import_error">Ens sap greu! S\'ha produït un error en subscriure-us al vostre canal de notícies.</string>
<string name="blogs_rss_feeds_manage">Gestiona els canals de notícies RSS</string>
<string name="blogs_rss_feeds_manage_imported">Importat:</string>
<string name="blogs_rss_feeds_manage_author">Autor:</string>
<string name="blogs_rss_feeds_manage_updated">Darrera actualització:</string>
<string name="blogs_rss_remove_feed">Suprimeix la subscripció al canal de notícies</string>
<string name="blogs_rss_remove_feed_dialog_message">Segur que voleu suprimir la subscripció a aquest canal de notícies?\n\nLes notícies d\'aquest canal s\'eliminaran del vostre dispositiu però no del d\'altres persones.\n\nEls contactes amb els que hàgeu compartit aquest canal poden deixar de rebre les actualitzacions.</string>
<string name="blogs_rss_remove_feed_ok">Suprimeix la subscripció</string>
<string name="blogs_rss_feeds_manage_delete_error">La subscripció al canal de notícies no s\'ha pogut suprimir.</string>
<string name="blogs_rss_feeds_manage_empty_state">No hi ha cap notícia per mostrar\n\nFeu un toc sobre la icona + per subscriure-us a un canal de notícies</string>
<string name="blogs_rss_feeds_manage_error">S\'ha produït un problema en actualitzar els vostres canals de notícies. Torneu-ho a provar més endavant.</string>
<!--Settings Profile Picture-->

View File

@@ -302,11 +302,13 @@
<string name="blogs_rss_feeds_import_button">Import</string>
<string name="blogs_rss_feeds_import_hint">Zadejte URL adresu RSS kanálu</string>
<string name="blogs_rss_feeds_import_error">Omlouváme se! Vyskytla se chyba při importu vašeho kanálu.</string>
<string name="blogs_rss_feeds_manage">Správa RSS kanálů</string>
<string name="blogs_rss_feeds_manage_imported">Importováno:</string>
<string name="blogs_rss_feeds_manage_author">Autor:</string>
<string name="blogs_rss_feeds_manage_updated">Naposledy aktualizováno:</string>
<string name="blogs_rss_remove_feed">Odstranit kanál</string>
<string name="blogs_rss_remove_feed_ok">Odstranit</string>
<string name="blogs_rss_feeds_manage_delete_error">Kanál nemohl být odstraněn !</string>
<string name="blogs_rss_feeds_manage_empty_state">Žádné RSS kanály k zobrazení\n\nKlikněte na ikonu + pro nahrání příspěvků</string>
<string name="blogs_rss_feeds_manage_error">Vyskytl se problém s načtením vašeho kanálu příspěvků. Zkuste to prosím později.</string>
<!--Settings Display-->

View File

@@ -141,7 +141,7 @@
<string name="fix">Behoben</string>
<string name="help">Hilfe</string>
<string name="sorry">Entschuldigung</string>
<string name="error_start_activity">Nicht verfügbar für dein System</string>
<string name="error_start_activity">Nicht Verfügbar für dein System</string>
<string name="status_heading">Status:</string>
<!--Contacts and Private Conversations-->
<string name="no_contacts">Keine Kontakte vorhanden</string>
@@ -162,7 +162,6 @@
<string name="menu_item_connect_via_bluetooth">Über Bluetooth verbinden</string>
<string name="dialog_title_connect_via_bluetooth">Über Bluetooth verbinden</string>
<string name="dialog_message_connect_via_bluetooth">Dein Kontakt muss in der Nähe sein, damit dies funktioniert.\n\nDu und dein Kontakt sollten beide gleichzeitig \"Start\" drücken.</string>
<string name="toast_connect_via_bluetooth_already_discovering">Versucht bereits, eine Verbindung über Bluetooth herzustellen</string>
<string name="toast_connect_via_bluetooth_not_discoverable">Kann ohne Bluetooth nicht fortgesetzt werden</string>
<string name="toast_connect_via_bluetooth_no_location_permission">Kann ohne Standortberechtigung nicht fortgesetzt werden</string>
<string name="toast_connect_via_bluetooth_start">Verbinde über Bluetooth…</string>
@@ -458,12 +457,14 @@
<string name="blogs_rss_feeds_import_button">Importieren</string>
<string name="blogs_rss_feeds_import_hint">URL des RSS-Feeds eingeben</string>
<string name="blogs_rss_feeds_import_error">Es tut uns Leid! Es gab einen Fehler beim Importieren deines Feeds.</string>
<string name="blogs_rss_feeds_manage">RSS-Feeds verwalten</string>
<string name="blogs_rss_feeds_manage_imported">Importiert:</string>
<string name="blogs_rss_feeds_manage_author">Autor:</string>
<string name="blogs_rss_feeds_manage_updated">Letzte Aktualisierung:</string>
<string name="blogs_rss_remove_feed">Feed entfernen</string>
<string name="blogs_rss_remove_feed_dialog_message">Bist du sicher, dass du diesen Feed löschen willst?\n\nBeiträge werden von deinem Gerät entfernt, aber nicht von den Geräten anderer Personen.\n\nAlle Kontakte, für die du diesen Feed freigegeben hast, können keine Updates mehr erhalten.</string>
<string name="blogs_rss_remove_feed_ok">Aufheben</string>
<string name="blogs_rss_feeds_manage_delete_error">Der Feed konnte nicht gelöscht werden!</string>
<string name="blogs_rss_feeds_manage_empty_state">Keine RSS-Feeds vorhanden\n\nTippe auf das + Symbol, um einen Feed zu importieren</string>
<string name="blogs_rss_feeds_manage_error">Es gab ein Problem beim Laden deiner Feeds. Bitte versuche es später erneut.</string>
<!--Settings Profile Picture-->

View File

@@ -162,7 +162,6 @@
<string name="menu_item_connect_via_bluetooth">Conectar mediante Bluetooth</string>
<string name="dialog_title_connect_via_bluetooth">Conectar mediante Bluetooth</string>
<string name="dialog_message_connect_via_bluetooth">Tu contacto necesita estar cerca para que esto funcione.\n\nTú y tu contacto deberían presionar \"Iniciar\" ambos al mismo tiempo.</string>
<string name="toast_connect_via_bluetooth_already_discovering">Ya se está intentando conectar mediante Bluetooth</string>
<string name="toast_connect_via_bluetooth_not_discoverable">No se puede continuar sin Bluetooth</string>
<string name="toast_connect_via_bluetooth_no_location_permission">No se puede continuar sin permiso de ubicación</string>
<string name="toast_connect_via_bluetooth_start">Conectar mediante Bluetooth...</string>
@@ -458,12 +457,14 @@
<string name="blogs_rss_feeds_import_button">Importar</string>
<string name="blogs_rss_feeds_import_hint">Introduce la URL del canal RSS</string>
<string name="blogs_rss_feeds_import_error">¡Lo sentimos! Hubo un error importando tu canal.</string>
<string name="blogs_rss_feeds_manage">Administrar canales RSS</string>
<string name="blogs_rss_feeds_manage_imported">Importado:</string>
<string name="blogs_rss_feeds_manage_author">Autor:</string>
<string name="blogs_rss_feeds_manage_updated">Última actualización:</string>
<string name="blogs_rss_remove_feed">Eliminar canal RSS</string>
<string name="blogs_rss_remove_feed_dialog_message">¿Estás seguro de que quieres quitar este canal RSS?\n\nLos mensajes se eliminarán de tu dispositivo, pero no de los dispositivos de otras personas.\n\nEs posible que los contactos con los que hayas compartido este canal dejen de recibir actualizaciones.</string>
<string name="blogs_rss_remove_feed_ok">Eliminar</string>
<string name="blogs_rss_feeds_manage_delete_error">¡El canal no pudo ser eliminado!</string>
<string name="blogs_rss_feeds_manage_empty_state">No hay canales RSS que mostrar\n\nGolpea el icono + para importar uno</string>
<string name="blogs_rss_feeds_manage_error">Hubo un problema cargando tus canales RSS. Por favor, prueba más tarde.</string>
<!--Settings Profile Picture-->

View File

@@ -395,12 +395,14 @@
<string name="blogs_rss_feeds_import_button">Inportatu</string>
<string name="blogs_rss_feeds_import_hint">Sartu RSS jarioaren URLa</string>
<string name="blogs_rss_feeds_import_error">Sentitzen dugu! Zure jarioa inportatzean errore bat gertatu da.</string>
<string name="blogs_rss_feeds_manage">Kudeatu RSS jarioak</string>
<string name="blogs_rss_feeds_manage_imported">Inportatuta:</string>
<string name="blogs_rss_feeds_manage_author">Egilea:</string>
<string name="blogs_rss_feeds_manage_updated">Azken eguneratzea:</string>
<string name="blogs_rss_remove_feed">Kendu jarioa</string>
<string name="blogs_rss_remove_feed_dialog_message">Ziur zaude jario hau kendu nahi duzula?\n\nSarrerak zure gailutik kenduko dira baina ez besteen gailuetatik.\n\nJario hau beste inorekin partekatu baduzu agian eguneratzeak jasotzeari utziko diote.</string>
<string name="blogs_rss_remove_feed_ok">Kendu</string>
<string name="blogs_rss_feeds_manage_delete_error">Ezin izan da jarioa ezabatu!</string>
<string name="blogs_rss_feeds_manage_empty_state">Ez dago erakusteko RSS jariorik\n\nSakatu + ikonoa jario bat inportatzeko</string>
<string name="blogs_rss_feeds_manage_error">Arazo bat egon da zure jarioak kargatzean. Saiatu berriro geroago.</string>
<!--Settings Profile Picture-->

View File

@@ -24,9 +24,6 @@
<string name="setup_huawei_text">لطفا روی دکمه زیر کلیک کنید و مطمئن شوید که از Briar (برایر) در صفحه \"برنامه های محافظت شده\" محافظت می شود.</string>
<string name="setup_huawei_button">حفاظت از Briar (برایر)</string>
<string name="setup_huawei_help">اگر Briar (برایر) به فهرست برنامه های محافظت شده اضافه نشده، نمی تواند در پس زمینه مشغول به کار باشد.</string>
<string name="setup_huawei_app_launch_text">لطفا روی دکمه زیر زده، صفحه‌ی \"راه اندازی برنامه\" را باز کرده و از این که برایر (Briar) بر روی \"مدیریت دستی\" تنظیم شده باشد، اطمینان حاصل کنید.</string>
<string name="setup_huawei_app_launch_button">باز کردن تنظیمات باتری</string>
<string name="setup_huawei_app_launch_help">اگر در صفحه \"راه اندازی برنامه\"، برایر (Briar) بر روی گزینه \"مدیریت دستی\" تنظیم نشده باشد، برنامه قادر به فعالیت در پس‌زمینه نخواهد بود.</string>
<string name="warning_dozed">ناتوانی %s برای اجراء در پس زمینه</string>
<!--Login-->
<string name="enter_password">گذرواژه</string>
@@ -168,7 +165,6 @@
<string name="menu_item_connect_via_bluetooth">اتصال از طریق بلوتوث</string>
<string name="dialog_title_connect_via_bluetooth">اتصال از طریق بلوتوث</string>
<string name="dialog_message_connect_via_bluetooth">برای امکان این عملکرد، مخاطب شما باید نزدیک باشد. \n\n شما و مخاطبتان باید همزمان گزینه‌ی \"شروع\" را بفشارید.</string>
<string name="toast_connect_via_bluetooth_already_discovering">در حال تلاش برای اتصال از طریق بلوتوث</string>
<string name="toast_connect_via_bluetooth_not_discoverable">امکان ادامه بدون بلوتوث وجود ندارد</string>
<string name="toast_connect_via_bluetooth_no_location_permission">امکان ادامه بدون اجازه مکان‌یابی وجود ندارد</string>
<string name="toast_connect_via_bluetooth_start">در حال اتصال از طریق بلوتوث</string>
@@ -492,6 +488,7 @@
<string name="blogs_rss_feeds_import_button">وارد کردن</string>
<string name="blogs_rss_feeds_import_hint">آدرس خوراک RSS را وارد کنید</string>
<string name="blogs_rss_feeds_import_error">متاسفیم! وارد کردن خوراک شما با خطا مواجه شده است.</string>
<string name="blogs_rss_feeds_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>
@@ -502,6 +499,7 @@
هر مخاطبی که با آن این خوراک را به اشتراک گذاشته اید ممکن است دیگر آپدیت دریافت نکند.</string>
<string name="blogs_rss_remove_feed_ok">حذف</string>
<string name="blogs_rss_feeds_manage_delete_error">خوراک نمی تواند پاک شود!</string>
<string name="blogs_rss_feeds_manage_empty_state">هیچ خوراک RSS برای نمایش وجود ندارد
برای وارد کردن خوراک روی آیکون + ضربه بزنید</string>

View File

@@ -314,12 +314,14 @@
<string name="blogs_rss_feeds_import_button">Tuo</string>
<string name="blogs_rss_feeds_import_hint">Syötä RSS syötteen URL osoite</string>
<string name="blogs_rss_feeds_import_error">Pahoittelemme! Syötteen noutamisessa tapahtui virhe.</string>
<string name="blogs_rss_feeds_manage">Muokkaa RSS syötteitä</string>
<string name="blogs_rss_feeds_manage_imported">Tuotu:</string>
<string name="blogs_rss_feeds_manage_author">Tekijä:</string>
<string name="blogs_rss_feeds_manage_updated">Viimeksi päivitetty:</string>
<string name="blogs_rss_remove_feed">Poista syöte</string>
<string name="blogs_rss_remove_feed_dialog_message">Oletko varma, että haluat poistaa tämän syötteen?\n\nKirjoitukset poistuvat sinun laitteelta, mutta ei muiden laitteilta.\n\nKäyttäjät joiden kanssa olet jakanut tämän syötteen eivät välttämättä saa uusia päivityksiä.</string>
<string name="blogs_rss_remove_feed_ok">Poista</string>
<string name="blogs_rss_feeds_manage_delete_error">Syötteen poistaminen epäonnistui!</string>
<string name="blogs_rss_feeds_manage_empty_state">Ei RSS syötteitä\n\nNapauta + nappia lisätäksesi syötteen</string>
<string name="blogs_rss_feeds_manage_error">Syötteiden lataamisessa tapahtui virhe. Yritä myöhemmin uudelleen.</string>
<!--Settings Display-->

View File

@@ -22,9 +22,6 @@
<string name="setup_huawei_text">Veuillez toucher le bouton ci-dessous et vous assurer que Briar est protégée dans lécran « Applis protégées ».</string>
<string name="setup_huawei_button">Protéger Briar</string>
<string name="setup_huawei_help">Si Briar nest pas ajoutée à la liste des applis protégées, elle ne pourra pas fonctionner en arrière-plan.</string>
<string name="setup_huawei_app_launch_text">Veuillez toucher le bouton ci-dessous, ouvrir lécran « Lancement des applis » et vous assurer que « Gérer manuellement » est défini pour Briar.</string>
<string name="setup_huawei_app_launch_button">Ouvrez les paramètres de la pile</string>
<string name="setup_huawei_app_launch_help">Si « Gérer manuellement » nest pas défini pour Briar dans lécran « Lancement des applis », lappli ne pourra pas fonctionner en arrière-plan.</string>
<string name="warning_dozed">%s na pas pu fonctionner en arrière-plan</string>
<!--Login-->
<string name="enter_password">Mot de passe</string>
@@ -162,7 +159,6 @@
<string name="menu_item_connect_via_bluetooth">Se connecter par Bluetooth</string>
<string name="dialog_title_connect_via_bluetooth">Se connecter par Bluetooth</string>
<string name="dialog_message_connect_via_bluetooth">Afin que cela fonctionne, votre contact doit être à proximité.\n\nVotre contact et vous devriez appuyer ensemble sur « Commencer ».</string>
<string name="toast_connect_via_bluetooth_already_discovering">Tentative de connexion par Bluetooth déjà en cours</string>
<string name="toast_connect_via_bluetooth_not_discoverable">Impossible de poursuivre sans le Bluetooth</string>
<string name="toast_connect_via_bluetooth_no_location_permission">Impossible de poursuivre sans la permission de position</string>
<string name="toast_connect_via_bluetooth_start">Connexion par Bluetooth…</string>
@@ -173,7 +169,6 @@
<!--The placeholder at the end will add "Tap to learn more."-->
<string name="auto_delete_msg_you_disabled">Vos messages ne disparaîtront pas. %1$s</string>
<!--The first placeholder will show a contact's name. The second placeholder will show a duration like "7 days". The third placeholder at the end will add "Tap to learn more."-->
<string name="auto_delete_msg_contact_enabled">Les messages de %1$s disparaîtront après %2$s. %3$s</string>
<plurals name="duration_minutes">
<item quantity="one">%d minute</item>
<item quantity="other">%d minutes</item>
@@ -458,12 +453,14 @@
<string name="blogs_rss_feeds_import_button">Importer</string>
<string name="blogs_rss_feeds_import_hint">Saisir lURL du fil RSS</string>
<string name="blogs_rss_feeds_import_error">Nous sommes désolés! Une erreur est survenue lors de limportation de votre fil.</string>
<string name="blogs_rss_feeds_manage">Gérer les fils RSS</string>
<string name="blogs_rss_feeds_manage_imported">Importés :</string>
<string name="blogs_rss_feeds_manage_author">Auteur :</string>
<string name="blogs_rss_feeds_manage_updated">Dernière mise à jour :</string>
<string name="blogs_rss_remove_feed">Supprimer le fil</string>
<string name="blogs_rss_remove_feed_dialog_message">Voulez-vous vraiment supprimer ce fil?\nLes billets seront supprimés de votre appareil mais pas des appareils dautrui.\n\nLes contacts avec qui vous avez partagé ce fil pourraient ne plus en recevoir les mises à jour.</string>
<string name="blogs_rss_remove_feed_ok">Supprimer</string>
<string name="blogs_rss_feeds_manage_delete_error">Impossible de supprimer le fil!</string>
<string name="blogs_rss_feeds_manage_empty_state">Aucun fil RSS à afficher\n\nTouchez licône + pour importer un fil</string>
<string name="blogs_rss_feeds_manage_error">Un problème est survenu lors du chargement de vos fils. Veuillez réessayer plus tard.</string>
<!--Settings Profile Picture-->
@@ -560,17 +557,8 @@
<string name="cannot_load_ringtone">Impossible de charger la sonnerie</string>
<!--Conversation Settings-->
<string name="disappearing_messages_title">Messages éphémères</string>
<string name="disappearing_messages_explanation_long">Lactivation de ce paramètre fera disparaître
les messages de cette conversation automatiquement après 7\u00A0jours.
\n\nPour lexemplaire de lexpéditeur du message, le compte à rebours commence une fois quil a été remis.
Pour le destinataire, le compte à rebours commence une fois que le
message a été lu.
\n\nLes messages éphémères sont marqués par une icône de bombe.
\n\nSoyez conscient que les destinataires peuvent toujours faire des
copies des messages que vous envoyez.
\n\nSi vous changez ce paramètre, il sera appliqué à vos nouveaux messages immédiatement
et aux messages de votre contact une fois que ce contact recevra votre prochain message.
Votre contact peut aussi changer ce paramètre pour vous deux.</string>
<string name="disappearing_messages_explanation_long">dsvkjfjhgvfdkjhgv dfkjgh fkjhsgkjfdkj fhfgfhg
</string>
<string name="learn_more">En apprendre davantage</string>
<string name="disappearing_messages_summary">Faire disparaître automatiquement les futurs messages de cette conversation après 7 jours.</string>
<!--Settings Feedback-->

View File

@@ -454,12 +454,14 @@
<string name="blogs_rss_feeds_import_button">Importar</string>
<string name="blogs_rss_feeds_import_hint">Escribe o URL da fonte RSS</string>
<string name="blogs_rss_feeds_import_error">Lamentámolo! Algo fallou ao importar a fonte.</string>
<string name="blogs_rss_feeds_manage">Xestionar Fontes RSS</string>
<string name="blogs_rss_feeds_manage_imported">Importado:</string>
<string name="blogs_rss_feeds_manage_author">Autor/a:</string>
<string name="blogs_rss_feeds_manage_updated">Última actualización:</string>
<string name="blogs_rss_remove_feed">Eliminar fonte</string>
<string name="blogs_rss_remove_feed_dialog_message">Tes a certeza de querer eliminar esta fonte?\n\nAs entradas eliminaranse do teu dispositivo pero non dos dispositivos doutras persoas\n\nTodas as persoas coas que compartiches esta fonte poderían deixar de recibir actualizacións.</string>
<string name="blogs_rss_remove_feed_ok">Eliminar</string>
<string name="blogs_rss_feeds_manage_delete_error">Non se puido eliminar a fonte!</string>
<string name="blogs_rss_feeds_manage_empty_state">Sen fontes RSS que mostrar\n\nToque na icona + para importar unha fonte</string>
<string name="blogs_rss_feeds_manage_error">Aconteceu un problema ao cargar as túas fontes. Por favor, inténtao máis tarde.</string>
<!--Settings Profile Picture-->

View File

@@ -444,12 +444,14 @@
<string name="blogs_rss_feeds_import_button">ייבא</string>
<string name="blogs_rss_feeds_import_hint">הכנס את כתובת האתר של הזנת ה־RSS</string>
<string name="blogs_rss_feeds_import_error">אנחנו מצטערים! הייתה שגיאה ביבוא ההזנה שלך.</string>
<string name="blogs_rss_feeds_manage">נהל הזנות RSS</string>
<string name="blogs_rss_feeds_manage_imported">מיובא:</string>
<string name="blogs_rss_feeds_manage_author">מחבר:</string>
<string name="blogs_rss_feeds_manage_updated">עודכן לאחרונה:</string>
<string name="blogs_rss_remove_feed">הסר הזנה</string>
<string name="blogs_rss_remove_feed_dialog_message">האם אכן ברצונך להסיר הזנה זו?\n\nרשומות יוסרו ממכשירך אבל לא ממכשירים של אנשים אחרים.\n\nאנשי קשר כלשהם ששיתפת איתם הזנה זו עלולים להפסיק לקבל עדכונים.</string>
<string name="blogs_rss_remove_feed_ok">הסר</string>
<string name="blogs_rss_feeds_manage_delete_error">ההזנה לא יכלה להימחק!</string>
<string name="blogs_rss_feeds_manage_empty_state">אין הזנות RSS להראות\n\nהקש על הצלמית + כדי לייבא הזנה</string>
<string name="blogs_rss_feeds_manage_error">הייתה בעיה בטעינת ההזנות שלך. אנא נסה שוב מאוחר יותר.</string>
<!--Settings Profile Picture-->

View File

@@ -378,12 +378,14 @@
<string name="blogs_rss_feeds_import_button">आयात</string>
<string name="blogs_rss_feeds_import_hint">आरएसएस फ़ीड का यूआरएल दर्ज करें</string>
<string name="blogs_rss_feeds_import_error">हमें खेद है! आपकी फ़ीड आयात करने में एक त्रुटि हुई</string>
<string name="blogs_rss_feeds_manage">आरएसएस फ़ीड प्रबंधित करें</string>
<string name="blogs_rss_feeds_manage_imported">आयातित:</string>
<string name="blogs_rss_feeds_manage_author">लेखक:</string>
<string name="blogs_rss_feeds_manage_updated">आखरी अपडेट:</string>
<string name="blogs_rss_remove_feed">फ़ीड निकालें</string>
<string name="blogs_rss_remove_feed_dialog_message">क्या आप वाकई इस फीड को हटाना चाहते हैं? \ N \ n पोस्ट आपके डिवाइस से हटा दिए जाएंगे, लेकिन अन्य लोगों के डिवाइस से नहीं। \ N \ n आपके द्वारा इस फ़ीड को साझा करने वाले किसी भी संपर्क को अपडेट प्राप्त करना बंद हो सकता है।</string>
<string name="blogs_rss_remove_feed_ok">हटाना</string>
<string name="blogs_rss_feeds_manage_delete_error">फीड हटाया नहीं जा सका!</string>
<string name="blogs_rss_feeds_manage_empty_state">कोई आरएसएस फ़ीड दिखाने के लिए फ़ीड नहीं करता \ n \ n फ़ीड आयात करने के लिए + आइकन टैप करें</string>
<string name="blogs_rss_feeds_manage_error">आपकी फ़ीड लोड करने में एक समस्या थी बाद में पुन: प्रयास करें।</string>
<!--Settings Profile Picture-->

View File

@@ -22,9 +22,6 @@
<string name="setup_huawei_text">Kérjük érintse meg a gombot alább és ellenőrizze, hogy a Briar védett, a \"Védett alkalmazások\" képernyőn.</string>
<string name="setup_huawei_button">A Briar védelme</string>
<string name="setup_huawei_help">Ha Briar nincs hozzáadva a védett alkalmazások listájához, akkor nem képes futni a háttérben.</string>
<string name="setup_huawei_app_launch_text">Kérjük érintsd meg a gombot alább, hogy megnyitsd az \"App indítás\" képernyőt és ellenőrizd, hogy a Briar beállított \"Kézi kezelés\"-re.</string>
<string name="setup_huawei_app_launch_button">Az akkumulátor beállítások megnyitása</string>
<string name="setup_huawei_app_launch_help">Ha a Briar nincs beállítva \"Kézi kezelés\"-re az \"App indítás\" képernyőn, nem fog tudni futni a háttérben.</string>
<string name="warning_dozed">%s nem tud futni a háttérben</string>
<!--Login-->
<string name="enter_password">Jelszó</string>
@@ -162,7 +159,6 @@
<string name="menu_item_connect_via_bluetooth">Csatlakozás bluetooth-on keresztül</string>
<string name="dialog_title_connect_via_bluetooth">Csatlakozás bluetooth-on keresztül</string>
<string name="dialog_message_connect_via_bluetooth">A kapcsolatai közel kell legyenek, hogy ez működjön.\n\n Ön és a kapcsolata egyaránt meg kell nyomja a \"Start\" gombot egyidőben.</string>
<string name="toast_connect_via_bluetooth_already_discovering">Már próbálkozik csatlakozni Bluetooth-on</string>
<string name="toast_connect_via_bluetooth_not_discoverable">Nem folytatható Bluetooth nélkül</string>
<string name="toast_connect_via_bluetooth_no_location_permission">Nem folytatható hely engedélyek nélkül</string>
<string name="toast_connect_via_bluetooth_start">Csatlakozás Bluetooth-on...</string>
@@ -465,6 +461,7 @@ Kapcsolatai, akivel megosztotta ezt a blogot, lehet nem kapnak többé frissít
<string name="blogs_rss_feeds_import_button">Importálás</string>
<string name="blogs_rss_feeds_import_hint">Adja meg az RSS feed URL címét</string>
<string name="blogs_rss_feeds_import_error">Elnézését kérjük! Probléma akadt a feed-je importálásával.</string>
<string name="blogs_rss_feeds_manage">RSS feed-ek kezelés</string>
<string name="blogs_rss_feeds_manage_imported">Importálva:</string>
<string name="blogs_rss_feeds_manage_author">Szerző:</string>
<string name="blogs_rss_feeds_manage_updated">Utolsó frissítés:</string>
@@ -472,6 +469,7 @@ Kapcsolatai, akivel megosztotta ezt a blogot, lehet nem kapnak többé frissít
<string name="blogs_rss_remove_feed_dialog_message">Biztosan eltávolítja ezt a feed-et?
\n\nA bejegyzések törlődni fognak az Ön eszközéről, de nem a többi ember eszközéről.\n\nKapcsolatai, akivel megosztotta ezt a feed-et, lehet nem kapnak többé frissítést.</string>
<string name="blogs_rss_remove_feed_ok">Eltávolít</string>
<string name="blogs_rss_feeds_manage_delete_error">A feed nem törölhető!</string>
<string name="blogs_rss_feeds_manage_empty_state">Nincs megjelenítendő</string>
<string name="blogs_rss_feeds_manage_error">Hiba történt a feed-jei betöltésével. Kérjük próbálja újra később.</string>
<!--Settings Profile Picture-->

View File

@@ -22,9 +22,6 @@
<string name="setup_huawei_text">Ýttu á hnappinn hér fyrir neðan og gakktu úr skugga um að Briar sé varið á skjánum \"Varin forrit\".</string>
<string name="setup_huawei_button">Verja Briar</string>
<string name="setup_huawei_help">Ef Briar er ekki bætt á listann yfir varin forrit, getur það ekki keyrt í bakgrunni.</string>
<string name="setup_huawei_app_launch_text">Ýttu á hnappinn hér fyrir neðan, opnaðu \"Ræsing forrits\" skjáinn og gakktu úr skugga um að Briar sé stillt á \"Stýra handvirkt\".</string>
<string name="setup_huawei_app_launch_button">Opna rafhlöðustillingar</string>
<string name="setup_huawei_app_launch_help">Ef Briar er ekki stillt á \"Stýra handvirkt\" í \"Ræsing forrits\" skjánum, mun það ekki geta keyrt í bakgrunni.</string>
<string name="warning_dozed">%s gat ekki keyrt í bakgrunni</string>
<!--Login-->
<string name="enter_password">Lykilorð</string>
@@ -162,7 +159,6 @@
<string name="menu_item_connect_via_bluetooth">Tengjast í gegnum Bluetooth</string>
<string name="dialog_title_connect_via_bluetooth">Tengjast í gegnum Bluetooth</string>
<string name="dialog_message_connect_via_bluetooth">Tengiliðurinn þinn þarf að vera nálægt til að þetta virki.\n\nÞú og tengiliðurinn ættuð bæði að ýta á \"Byrja\" á sama tíma.</string>
<string name="toast_connect_via_bluetooth_already_discovering">Þegar að reyna að tengjast í gegnum Bluetooth</string>
<string name="toast_connect_via_bluetooth_not_discoverable">Get ekki haldið áfram án Bluetooth</string>
<string name="toast_connect_via_bluetooth_no_location_permission">Get ekki haldið áfram án heimildar til að nota staðsetningu</string>
<string name="toast_connect_via_bluetooth_start">Tengist í gegnum Bluetooth…</string>
@@ -458,12 +454,14 @@
<string name="blogs_rss_feeds_import_button">Flytja inn</string>
<string name="blogs_rss_feeds_import_hint">Settu inn slóðina á RSS-streymið</string>
<string name="blogs_rss_feeds_import_error">Því miður! Það kom upp villa við að flytja inn streymið.</string>
<string name="blogs_rss_feeds_manage">Sýsla með RSS-streymi</string>
<string name="blogs_rss_feeds_manage_imported">Flutt inn:</string>
<string name="blogs_rss_feeds_manage_author">Höfundur:</string>
<string name="blogs_rss_feeds_manage_updated">Síðast uppfært:</string>
<string name="blogs_rss_remove_feed">Fjarlægja streymi</string>
<string name="blogs_rss_remove_feed_dialog_message">Ertu viss um að þú viljir fjarlægja þetta streymi?\n\nFærslur verða fjarlægðar af tækinu þínu en ekki tækjum annars fólks.\n\nAllir tengiliðir sem þú hefur deilt þessu streymi með gætu hætt að fá uppfærslur.</string>
<string name="blogs_rss_remove_feed_ok">Fjarlægja</string>
<string name="blogs_rss_feeds_manage_delete_error">Ekki var hægt að eyða streyminu!</string>
<string name="blogs_rss_feeds_manage_empty_state">Engin RSS-streymi til að birta\n\nÝttu á + táknið til að flytja inn streymi</string>
<string name="blogs_rss_feeds_manage_error">Vandamál hefur komið upp með að hlaða inn streymunum þínum. Reyndu aftur síðar.</string>
<!--Settings Profile Picture-->

View File

@@ -22,9 +22,6 @@
<string name="setup_huawei_text">Premi il pulsante qua sotto e assicurati che Briar sia protetto nella schermata \"App protette\"</string>
<string name="setup_huawei_button">Proteggi Briar</string>
<string name="setup_huawei_help">Se Briar non viene aggiunto nell\'elenco di app protette, non potrà funzionare in background.</string>
<string name="setup_huawei_app_launch_text">Tocca il pulsante sotto, apri la schermata \"Esecuzione app\" e assicurati che Briar sia su \"Gestisci manualmente\".</string>
<string name="setup_huawei_app_launch_button">Apri impostazioni batteria</string>
<string name="setup_huawei_app_launch_help">Se Briar non è su \"Gestisci manualmente\" nella schermata \"Esecuzione app\", non potrà funzionare in secondo piano.</string>
<string name="warning_dozed">%s non ha potuto funzionare in background</string>
<!--Login-->
<string name="enter_password">Password</string>
@@ -133,7 +130,7 @@
<string name="allow">Abilita</string>
<string name="open">Apri</string>
<string name="change">Cambia</string>
<string name="start">Inizia</string>
<string name="start">Avvia</string>
<string name="no_data">Nessun dato</string>
<string name="ellipsis">...</string>
<string name="text_too_long">Il testo inserito è troppo lungo</string>
@@ -149,8 +146,6 @@
<string name="date_no_private_messages">Nessun messaggio.</string>
<string name="no_private_messages">Nessun messaggio da mostrare</string>
<string name="message_hint">Nuovo messaggio</string>
<string name="message_hint_auto_delete">Nuovo messaggio dissolvente</string>
<string name="message_error">Errore nell\'invio del messaggio</string>
<string name="image_caption_hint">Aggiungi una didascalia (facoltativo)</string>
<string name="image_attach">Allega immagine</string>
<string name="image_attach_error">Impossibile allegare l\'immagine/i</string>
@@ -158,41 +153,12 @@
<string name="image_attach_error_invalid_mime_type">Formato immagine non supportato: %s</string>
<string name="set_contact_alias">Cambia il nome del contatto</string>
<string name="set_contact_alias_hint">Nome contatto</string>
<string name="menu_item_disappearing_messages">Messaggi dissolventi</string>
<string name="menu_item_connect_via_bluetooth">Connessione attraverso Bluetooth</string>
<string name="dialog_title_connect_via_bluetooth">Connessione attraverso Bluetooth</string>
<string name="dialog_message_connect_via_bluetooth">Per funzionare, il tuo contatto deve essere nelle vicinanze.\n\nDovreste entrambi premere \"Inizia\" nello stesso momento.</string>
<string name="toast_connect_via_bluetooth_already_discovering">Si sta già tentanto di connettersi via Bluetooth</string>
<string name="toast_connect_via_bluetooth_not_discoverable">Impossibile continuare senza Bluetooth</string>
<string name="toast_connect_via_bluetooth_no_location_permission">Impossibile continuare senza l\'autorizzazione per la geolocalizzazione</string>
<string name="toast_connect_via_bluetooth_start">Connessione via Bluetooth…</string>
<string name="toast_connect_via_bluetooth_success">Connessione via Bluetooth riuscita</string>
<string name="toast_connect_via_bluetooth_error">Connessione via Bluetooth fallita</string>
<!--The first placeholder will show a duration like "7 days". The second placeholder at the end will add "Tap to learn more."-->
<string name="auto_delete_msg_you_enabled">I tuoi messaggi spariranno dopo %1$s. %2$s</string>
<!--The placeholder at the end will add "Tap to learn more."-->
<string name="auto_delete_msg_you_disabled">I tuoi messaggi non spariranno. %1$s</string>
<!--The first placeholder will show a contact's name. The second placeholder will show a duration like "7 days". The third placeholder at the end will add "Tap to learn more."-->
<string name="auto_delete_msg_contact_enabled">I messaggi di %1$s spariranno dopo %2$s. %3$s</string>
<plurals name="duration_minutes">
<item quantity="one">%d minuto</item>
<item quantity="other">%d minuti</item>
</plurals>
<plurals name="duration_hours">
<item quantity="one">%d ora</item>
<item quantity="other">%d ore</item>
</plurals>
<plurals name="duration_days">
<item quantity="one">%d giorno</item>
<item quantity="other">%d giorni</item>
</plurals>
<!--The first placeholder will show a contact's name. The second placeholder at the end will add "Tap to learn more."-->
<string name="auto_delete_msg_contact_disabled">I messaggi di %1$s non spariranno. %2$s</string>
<string name="tap_to_learn_more">Tocca per saperne di più.</string>
<string name="auto_delete_changed_warning_title">Messaggi dissolventi cambiati</string>
<string name="auto_delete_changed_warning_message_enabled">Dato che hai iniziato a comporre il messaggio, i messaggi dissolventi sono stati attivati.</string>
<string name="auto_delete_changed_warning_message_disabled">Dato che hai iniziato a comporre il messaggio, i messaggi dissolventi sono stati disattivati.</string>
<string name="auto_delete_changed_warning_send">Invia comunque</string>
<string name="delete_all_messages">Elimina tutti i messaggi</string>
<string name="dialog_title_delete_all_messages">Conferma l\'eliminazione dei messaggi</string>
<string name="dialog_message_delete_all_messages">Sei sicuro di voler eliminare tutti i messaggi?</string>
@@ -311,7 +277,6 @@
<string name="introduction_response_accepted_sent">Hai accettato l\'introduzione a %1$s.</string>
<string name="introduction_response_accepted_sent_info">Prima che %1$s venga aggiunto ai tuoi contatti, dovranno anche loro accettare l\'introduzione. Questo potrebbe richiedere un po\' di tempo.</string>
<string name="introduction_response_declined_sent">Hai declinato l\'introduzione a %1$s.</string>
<string name="introduction_response_declined_auto">L\'introduzione a %1$s è stata rifiutata automaticamente.</string>
<string name="introduction_response_accepted_received">%1$s ha accettato l\'introduzione a %2$s.</string>
<string name="introduction_response_declined_received">%1$s ha declinato l\'introduzione a %2$s.</string>
<string name="introduction_response_declined_received_by_introducee">%1$s dice che %2$s ha declinato l\'introduzione.</string>
@@ -358,7 +323,6 @@
</plurals>
<string name="groups_invitations_response_accepted_sent">Hai accettato l\'invito al gruppo da %s.</string>
<string name="groups_invitations_response_declined_sent">Hai rifiutato l\'invito al gruppo da %s.</string>
<string name="groups_invitations_response_declined_auto">L\'invito di %s al gruppo è stato rifiutato automaticamente.</string>
<string name="groups_invitations_response_accepted_received">%s ha accettato l\'invito al gruppo.</string>
<string name="groups_invitations_response_declined_received">%s ha rifiutato l\'invito al gruppo.</string>
<string name="sharing_status_groups">Solo il creatore può invitare nuovi membri nel gruppo. Sotto ci sono i membri correnti del gruppo.</string>
@@ -409,7 +373,6 @@
<string name="forum_invitation_already_sharing">Già in condivisione</string>
<string name="forum_invitation_response_accepted_sent">Hai accettato l\'invito al forum da %s</string>
<string name="forum_invitation_response_declined_sent">Hai declinato l\'invito al forum da %s</string>
<string name="forum_invitation_response_declined_auto">L\'invito di %s al forum è stato rifiutato automaticamente.</string>
<string name="forum_invitation_response_accepted_received">%s ha accettato il tuo invito al forum.</string>
<string name="forum_invitation_response_declined_received">%s ha declinato il tuo invito al forum.</string>
<string name="sharing_status">Stato Condivisione</string>
@@ -444,7 +407,6 @@
<string name="blogs_sharing_snackbar">Blog condiviso con i contatti selezionati</string>
<string name="blogs_sharing_response_accepted_sent">Hai accettato l\'invito al blog da %s.</string>
<string name="blogs_sharing_response_declined_sent">Hai declinato l\'invito al blog da %s.</string>
<string name="blogs_sharing_response_declined_auto">L\'invito di %s al blog è stato rifiutato automaticamente.</string>
<string name="blogs_sharing_response_accepted_received">%s ha accettato l\'invito al blog.</string>
<string name="blogs_sharing_response_declined_received">%s ha declinato l\'invito al blog.</string>
<string name="blogs_sharing_invitation_received">%1$s ha condiviso il blog \"%2$s\" con te.</string>
@@ -458,12 +420,14 @@
<string name="blogs_rss_feeds_import_button">Importa</string>
<string name="blogs_rss_feeds_import_hint">Inserire l\'URL dell\'RSS feed</string>
<string name="blogs_rss_feeds_import_error">Ci dispiace! C\'è stato un errore nell\'importazione del tuo feed.</string>
<string name="blogs_rss_feeds_manage">Gestisci gli RSS Feed</string>
<string name="blogs_rss_feeds_manage_imported">Importato:</string>
<string name="blogs_rss_feeds_manage_author">Autore:</string>
<string name="blogs_rss_feeds_manage_updated">Ultimo Aggiornamento:</string>
<string name="blogs_rss_remove_feed">Rimuovi feed</string>
<string name="blogs_rss_remove_feed_dialog_message">Sei sicuro di voler rimuovere questo feed?\n\nI post saranno rimossi dal tuo dispositivo ma non dai dispositivi delle altre persone.\n\nTutti i contatti con cui hai condiviso questo feed potrebbero smettere di ricevere aggiornamenti.</string>
<string name="blogs_rss_remove_feed_ok">Rimuovi</string>
<string name="blogs_rss_feeds_manage_delete_error">Non è stato possibile cancellare il feed!</string>
<string name="blogs_rss_feeds_manage_empty_state">Nessun feed RSS da mostrare\n\nClicca l\'icona + per importare un feed</string>
<string name="blogs_rss_feeds_manage_error">C\'è stato un problema nel caricare i tuoi feeds. Per favore riprova fra poco.</string>
<!--Settings Profile Picture-->
@@ -559,18 +523,7 @@
<string name="choose_ringtone_title">Scegli suoneria</string>
<string name="cannot_load_ringtone">Impossibile caricare la suoneria</string>
<!--Conversation Settings-->
<string name="disappearing_messages_title">Messaggi dissolventi</string>
<string name="disappearing_messages_explanation_long">L\'attivazione di questa impostazione farà sparire
automaticamente i nuovi messaggi di questa conversazione dopo 7\u00A0giorni.
\n\nIl conto alla rovescia per la copia del messaggio del mittente inizia dopo la sua consegna.
Il conto alla rovescia per il destinatario inizia dopo la lettura del messaggio.
\n\nI messaggi che spariranno sono contrassegnati da un\'icona di una bomba.
\n\nTieni presente che i destinatari possono comunque fare copie dei messaggi che invii.
\n\nSe cambi questa impostazione, verrà applicata ai tuoi nuovi messaggi immediatamente e ai messaggi
del tuo contatto una volta che riceve il tuo prossimo messaggio.
Anche il tuo contatto può cambiare questa impostazioni per entrambe le parti.</string>
<string name="learn_more">Per saperne di più</string>
<string name="disappearing_messages_summary">Fai sparire automaticamente i messaggi futuri di questa conversazione dopo 7\u00A0giorni.</string>
<!--Settings Feedback-->
<string name="send_feedback">Invia feedback</string>
<!--Link Warning-->
@@ -624,9 +577,6 @@
<string name="permission_camera_location_request_body">Per scansionare il codice QR, Briar ha bisogno di accedere alla fotocamera.\n\nPer trovare dispositivi Bluetooth, Briar ha bisogno di accedere alla tua posizione.\n\nBriar non memorizza la tua posizione, nè la condivide con terzi.</string>
<string name="permission_camera_denied_body">Hai negato l\'accesso alla fotocamera, ma questa serve per aggiungere i contatti.\n\nConsidera la possibilità di concedere l\'accesso.</string>
<string name="permission_location_denied_body">Hai negato l\'accesso alla tua posizione, ma Briar ha bisogno di questa autorizzazione per trovare i dispositivi Bluetooth.\n\nConsidera la possibilità di concedere l\'accesso.</string>
<string name="permission_location_setting_title">Impostazioni di posizione</string>
<string name="permission_location_setting_body">La geolocalizzazione del tuo dispositivo deve essere attiva per trovare altri dispositivi via Bluetooth. Attivala per continuare. Puoi disattivarla di nuovo in seguito.</string>
<string name="permission_location_setting_button">Attiva geolocalizzazione</string>
<string name="qr_code">Codice QR</string>
<string name="show_qr_code_fullscreen">Mostra codice QR a tutto schermo</string>
<!--App Locking-->

View File

@@ -369,12 +369,14 @@
<string name="blogs_rss_feeds_import_button">インポート</string>
<string name="blogs_rss_feeds_import_hint">RSSフィードのURLを入力してください</string>
<string name="blogs_rss_feeds_import_error">申し訳ありません! フィードのインポート中にエラーが発生しました。</string>
<string name="blogs_rss_feeds_manage">RSSフィードを管理</string>
<string name="blogs_rss_feeds_manage_imported">インポート済み:</string>
<string name="blogs_rss_feeds_manage_author">著者:</string>
<string name="blogs_rss_feeds_manage_updated">最終更新:</string>
<string name="blogs_rss_remove_feed">フィードを削除</string>
<string name="blogs_rss_remove_feed_dialog_message">このフィードを削除してもよろしいですか?\n\n投稿はデバイスから削除されますが、他の人のデバイスからは削除されません。\n\nこのフィードを共有した人は更新の受信を停止されます。</string>
<string name="blogs_rss_remove_feed_ok">解除</string>
<string name="blogs_rss_feeds_manage_delete_error">フィードを削除できませんでした!</string>
<string name="blogs_rss_feeds_manage_empty_state">表示するRSSフィードはありません\n\n「」アイコンをタップしてフィードをインポートします</string>
<string name="blogs_rss_feeds_manage_error">フィードの読み込み中に問題が発生しました。 後でもう一度やり直してください。</string>
<!--Settings Profile Picture-->

View File

@@ -410,12 +410,14 @@
<string name="blogs_rss_feeds_import_button">가져오기</string>
<string name="blogs_rss_feeds_import_hint">RSS 피드 URL을 입력하세요</string>
<string name="blogs_rss_feeds_import_error">죄송합니다! 피드를 불러오는 과정에서 문제가 있었습니다.</string>
<string name="blogs_rss_feeds_manage">RSS 피드 관리하기</string>
<string name="blogs_rss_feeds_manage_imported">다음을 불러왔습니다:</string>
<string name="blogs_rss_feeds_manage_author">작성자:</string>
<string name="blogs_rss_feeds_manage_updated">최종 업데이트:</string>
<string name="blogs_rss_remove_feed">피드 제거하기</string>
<string name="blogs_rss_remove_feed_dialog_message">정말로 이 피드를 제거하시겠어요?\n\n기기에서 게시물은 제거되지만 다른 사람의 기기에서는 제거되지 않습니다.\n\n이 피드를 공유하던 지인이 업데이트를 받지 못하게 될 수 있습니다. </string>
<string name="blogs_rss_remove_feed_ok">제거하기</string>
<string name="blogs_rss_feeds_manage_delete_error">피드를 삭제할 수 없었습니다!</string>
<string name="blogs_rss_feeds_manage_empty_state">보여드릴 RSS 피드가 없습니다\n\n+ 상징을 눌러 피드를 불러오세요</string>
<string name="blogs_rss_feeds_manage_error">피드를 불러오는 과정에서 문제가 있었습니다. 나중에 다시 시도해 주세요.</string>
<!--Settings Profile Picture-->

View File

@@ -22,9 +22,7 @@
<string name="setup_huawei_text">Bakstelėkite žemiau esantį mygtuką ir įsitikinkite, kad \"Apsaugotų programėlių\" rodinyje Briar yra apsaugota.</string>
<string name="setup_huawei_button">Apsaugoti Briar</string>
<string name="setup_huawei_help">Jei Briar nebus pridėta į apsaugotų programėlių sąrašą, ji negalės veikti fone.</string>
<string name="setup_huawei_app_launch_text">Bakstelėkite mygtuką žemiau, atverkite langą „Programų paleidimas (angl. App launch)“ ir įsitikinkite, kad Briar yra nustatyta į „Tvarkyti rankiniu būdu (angl. Manage manually)“.</string>
<string name="setup_huawei_app_launch_button">Atverti akumuliatoriaus nustatymus</string>
<string name="setup_huawei_app_launch_help">Jeigu „Programų paleidimo (angl. App launch)“ lange Briar nėra nustatyta į „Tvarkyti rankiniu būdu (angl. Manage manually)“, tuomet programėlė negalės veikti fone.</string>
<string name="warning_dozed">%s nepavyko pasileisti fone</string>
<!--Login-->
<string name="enter_password">Slaptažodis</string>
@@ -172,7 +170,6 @@
<string name="menu_item_connect_via_bluetooth">Prisijungti per Bluetooth</string>
<string name="dialog_title_connect_via_bluetooth">Prisijungti per Bluetooth</string>
<string name="dialog_message_connect_via_bluetooth">Norint, kad tai suveiktų, jūsų adresatas privalo būti šalia jūsų.\n\nJūs ir jūsų adresatas abu vienu metu turėtumėte paspausti „Pradėti“.</string>
<string name="toast_connect_via_bluetooth_already_discovering">Jau bandoma prisijungti per Bluetooth</string>
<string name="toast_connect_via_bluetooth_not_discoverable">Nepavyksta tęsti be Bluetooth</string>
<string name="toast_connect_via_bluetooth_no_location_permission">Nepavyksta tęsti be įrenginio vietovės leidimo</string>
<string name="toast_connect_via_bluetooth_start">Jungiamasi per Bluetooth…</string>
@@ -484,12 +481,14 @@
<string name="blogs_rss_feeds_import_button">Importuoti</string>
<string name="blogs_rss_feeds_import_hint">Įveskite RSS kanalo URL</string>
<string name="blogs_rss_feeds_import_error">Atleiskite! Importuojant jūsų kanalą, įvyko klaida.</string>
<string name="blogs_rss_feeds_manage">Tvarkyti RSS kanalus</string>
<string name="blogs_rss_feeds_manage_imported">Importuota:</string>
<string name="blogs_rss_feeds_manage_author">Autorius:</string>
<string name="blogs_rss_feeds_manage_updated">Paskutinį kartą atnaujinta:</string>
<string name="blogs_rss_remove_feed">Šalinti kanalą</string>
<string name="blogs_rss_remove_feed_dialog_message">Ar tikrai norite pašalinti šį kanalą?\n\nĮrašai bus pašalinti iš jūsų įrenginio, tačiau liks kitų žmonių įrenginiuose.\n\nBet kokie adresatai, su kuriais bendrinote šį kanalą, gali nustoti gauti atnaujinimus.</string>
<string name="blogs_rss_remove_feed_ok">Šalinti</string>
<string name="blogs_rss_feeds_manage_delete_error">Nepavyko ištrinti kanalo!</string>
<string name="blogs_rss_feeds_manage_empty_state">Nėra rodytinų RSS kanalų\n\nNorėdami importuoti kanalą, bakstelėkite + piktogramą</string>
<string name="blogs_rss_feeds_manage_error">Įkeliant jūsų kanalus, atsirado problemų. Vėliau bandykite dar kartą.</string>
<!--Settings Profile Picture-->

View File

@@ -419,12 +419,14 @@
<string name="blogs_rss_feeds_import_button">Увези</string>
<string name="blogs_rss_feeds_import_hint">Внеси URL на RSS тековник</string>
<string name="blogs_rss_feeds_import_error">Жал ни е! Настана гршка при увезувањето на вашиот тековник.</string>
<string name="blogs_rss_feeds_manage">Уредување на RSS тековници</string>
<string name="blogs_rss_feeds_manage_imported">Увезени:</string>
<string name="blogs_rss_feeds_manage_author">Автор:</string>
<string name="blogs_rss_feeds_manage_updated">Последен пат ажуриран:</string>
<string name="blogs_rss_remove_feed">Отстрани тековник</string>
<string name="blogs_rss_remove_feed_dialog_message">Дали сте сигурни дека сакате да го отстраните овој тековник?\n\nОбјавите ќе бидат отстранети од вашиот уред но не и од уредите на другите луѓе.\n\nБило кои од контактите со кои сте го споделиле овој тековник може да престанат да добиваат ажурирања.</string>
<string name="blogs_rss_remove_feed_ok">Отстрани</string>
<string name="blogs_rss_feeds_manage_delete_error">Тековникот не може да биде избришан!</string>
<string name="blogs_rss_feeds_manage_empty_state">Нема RSS тековници за прикажување\n\nДопрете ја + иконата за да увезете тековник</string>
<string name="blogs_rss_feeds_manage_error">Настана проблем при вчитувањето на вашите тековници. Ве молиме обидете се повторно подоцна.</string>
<!--Settings Profile Picture-->

View File

@@ -22,9 +22,6 @@
<string name="setup_huawei_text">အောက်ပါခလုတ်ကိုနှိပ်၍ \"ကာကွယ်မှုပေးထားသောအက်ပ်များ\" စခရင်တွင် Briar ကို ကာကွယ်ထားကြောင်း သေချာစေပါ။</string>
<string name="setup_huawei_button">Briar ကို ကာကွယ်မည်</string>
<string name="setup_huawei_help">ကာကွယ်မှုပေးထားသောအက်ပ်များစာရင်းတွင် ထည့်မထားလျှင် Briar ကို နောက်ကွယ်တွင် ဖွင့်ထားနိုင်မည်မဟုတ်ပါ။</string>
<string name="setup_huawei_app_launch_text">အောက်က ခလုတ်ကို နှိပ်၍ \"အပ္ပလီကေးရှင်း ဖွင့်ရန်\" စကင်ရင်ကို ဖွင့်ပါ၊ ပြီးလျှင် Briar ကို \"ကိုယ်တိုင်စီမံမယ်\" လို့ သတ်မှတ်ပါ။</string>
<string name="setup_huawei_app_launch_button">ဘက်ထရီအပြင်အဆင်များကို ဖွင့်ပါ</string>
<string name="setup_huawei_app_launch_help">Briar ကို \"အပ္ပလီကေးရှင်း ဖွင့်ရန်\" စကင်ရင်ပေါ်တွင် \"ကိုယ်တိုင်စီမံမယ်\" လို့မသတ်မှတ်ထားလျှင် နောက်ခံတွင် ၎င်းကို လည်ပတ်၍ မရနိုင်ပါ။</string>
<string name="warning_dozed">%s ကို နောက်ကွယ်တွင် မဖွင့်ထားနိုင်ပါ</string>
<!--Login-->
<string name="enter_password">စကားဝှက်</string>
@@ -157,7 +154,6 @@
<string name="menu_item_connect_via_bluetooth">ဘလူးတုသ် နှင့် ချိတ်မယ်</string>
<string name="dialog_title_connect_via_bluetooth">ဘလူးတုသ် နှင့် ချိတ်မယ်</string>
<string name="dialog_message_connect_via_bluetooth">လုပ်ဆောင်ချက် အောင်မြင်နိုင်ရန် သင်၏ အဆက်အသွယ်သည် အနီးအနားတွင်ရှိရပါမည်။ \n\n သင် နှင့် သင်၏ အဆက်အသွယ် နှစ်ဦးစလုံးသည် \"စတင်ရန်\" ကို တစ်ပြိုင်တည်း နှိပ်ရပါမည်။</string>
<string name="toast_connect_via_bluetooth_already_discovering">ဘလူးတုသ် နှင့် ချိတ်ဆက်ရန် ကြိုးစားနေပါသည်</string>
<string name="toast_connect_via_bluetooth_not_discoverable">ဘလူးတုသ် မပါဘဲ ဆက်လက်မလုပ်ဆောင်နိုင်ပါ</string>
<string name="toast_connect_via_bluetooth_no_location_permission">တည်နေရာသုံးခွင့် မပါဘဲ ဆက်လက်မလုပ်ဆောင်နိုင်ပါ</string>
<string name="toast_connect_via_bluetooth_start">ဘလူးတုသ် နှင့် ချိတ်ဆက်နေသည်...</string>

View File

@@ -259,11 +259,13 @@
<string name="blogs_rss_feeds_import_button">Importer</string>
<string name="blogs_rss_feeds_import_hint">Skriv inn nettadresse for RSS-strøm</string>
<string name="blogs_rss_feeds_import_error">Vi beklager! Feil under importering av strøm.</string>
<string name="blogs_rss_feeds_manage">Behandle RSS-strømmer</string>
<string name="blogs_rss_feeds_manage_imported">Importert:</string>
<string name="blogs_rss_feeds_manage_author">Forfatter:</string>
<string name="blogs_rss_feeds_manage_updated">Sist oppdatert:</string>
<string name="blogs_rss_remove_feed">Fjern strøm</string>
<string name="blogs_rss_remove_feed_ok">Fjern</string>
<string name="blogs_rss_feeds_manage_delete_error">Strømmen kunne ikke fjernes!</string>
<string name="blogs_rss_feeds_manage_error">Feil ved lasting av dine strømmer. Prøv igjen senere.</string>
<!--Settings Display-->
<string name="display_settings_title">Vis</string>

View File

@@ -420,12 +420,14 @@
<string name="blogs_rss_feeds_import_button">Importeer</string>
<string name="blogs_rss_feeds_import_hint">Voer de URL van de RSS-feed in</string>
<string name="blogs_rss_feeds_import_error">Excuses! Er trad een fout op bij het importeren van je feed.</string>
<string name="blogs_rss_feeds_manage">Beheer RSS-feeds</string>
<string name="blogs_rss_feeds_manage_imported">Geïmporteerd:</string>
<string name="blogs_rss_feeds_manage_author">Auteur:</string>
<string name="blogs_rss_feeds_manage_updated">Laatst bijgewerkt:</string>
<string name="blogs_rss_remove_feed">Verwijder feed</string>
<string name="blogs_rss_remove_feed_dialog_message">Weet je zeker dat je deze feed wil verwijderen?\n\nPosts zullen van je apparaat worden verwijderd maar niet van apparaten van andere mensen.\n\nContacten met wie je deze feed hebt gedeeld zullen geen updates meer ontvangen.</string>
<string name="blogs_rss_remove_feed_ok">Verwijderen</string>
<string name="blogs_rss_feeds_manage_delete_error">De feed kon niet worden verwijderd.</string>
<string name="blogs_rss_feeds_manage_empty_state">Geen RSS-feeds om te tonen\n\nTik op het +-icoon om een feed te importeren</string>
<string name="blogs_rss_feeds_manage_error">Er was een probleem met het laden van je feeds. Probeer het alsjeblieft later nog een keer.</string>
<!--Settings Profile Picture-->

View File

@@ -392,6 +392,7 @@ Volètz suprimir vòstre compte e ne crear un nòu?\n
<string name="blogs_rss_feeds_import_button">Importar</string>
<string name="blogs_rss_feeds_import_hint">Marcar lURL del flux RSS</string>
<string name="blogs_rss_feeds_import_error">Una error ses produisida en importar lo flux</string>
<string name="blogs_rss_feeds_manage">Gerir lo flux RSS</string>
<string name="blogs_rss_feeds_manage_imported">Importat:</string>
<string name="blogs_rss_feeds_manage_author">Autor:</string>
<string name="blogs_rss_feeds_manage_updated">Darrièra mesa a jorn:</string>
@@ -401,6 +402,7 @@ levadas de vòstre aparelh mas pas dels aparelhs del monde.\n\nTotes los
contactes quavètz partejat aqueste flux quitaràn benlèu de recebre las mesas
a jorn.</string>
<string name="blogs_rss_remove_feed_ok">Suprimir</string>
<string name="blogs_rss_feeds_manage_delete_error">Impossible de suprimir lo flux!</string>
<string name="blogs_rss_feeds_manage_empty_state">Cap de flux RSS de far veire.\n\nTocatz licòna + per nimportar un</string>
<string name="blogs_rss_feeds_manage_error">Error en cargar vòstres fluxes. Ensajatz mai tard.</string>
<!--Settings Profile Picture-->

View File

@@ -400,12 +400,14 @@
<string name="blogs_rss_feeds_import_button">Zaimportuj</string>
<string name="blogs_rss_feeds_import_hint">Wprowadź adres URL do kanału RSS</string>
<string name="blogs_rss_feeds_import_error">Przepraszamy! Wystąpił błąd podczas importowania twojego kanału RSS</string>
<string name="blogs_rss_feeds_manage">Zarządzaj kanałami RSS</string>
<string name="blogs_rss_feeds_manage_imported">Zaimportowane:</string>
<string name="blogs_rss_feeds_manage_author">Autor:</string>
<string name="blogs_rss_feeds_manage_updated">Ostatnio Zaktualizowane:</string>
<string name="blogs_rss_remove_feed">Usuń kanał RSS</string>
<string name="blogs_rss_remove_feed_dialog_message">Jesteś pewny, że chcesz usunąć ten kanał RSS?\n\nPosty będą usunięte z Twojego urządzenia, ale nie z urządzeń innych ludzi.\n\nWszystkie kontakty którym udostępniłeś ten kanał mogą przestać otrzymywać jego uaktualnienia</string>
<string name="blogs_rss_remove_feed_ok">Usuń</string>
<string name="blogs_rss_feeds_manage_delete_error">Kanał nie mógł zostać usunięty!</string>
<string name="blogs_rss_feeds_manage_empty_state">Brak RSS do wyświetlenia\n\nDotknij ikonki + aby zaimportować kanał.</string>
<string name="blogs_rss_feeds_manage_error">Wystąpił problem podczas ładowania twoich kanałów RSS. Proszę spróbować ponownie później.</string>
<!--Settings Profile Picture-->

View File

@@ -420,12 +420,14 @@
<string name="blogs_rss_feeds_import_button">Importar</string>
<string name="blogs_rss_feeds_import_hint">Entre a URL do feed RSS</string>
<string name="blogs_rss_feeds_import_error">Nós lamentamos! Houve um erro ao importar seu Feed.</string>
<string name="blogs_rss_feeds_manage">Gerenciar Feeds RSS</string>
<string name="blogs_rss_feeds_manage_imported">Importado:</string>
<string name="blogs_rss_feeds_manage_author">Autor:</string>
<string name="blogs_rss_feeds_manage_updated">Última Atualização:</string>
<string name="blogs_rss_remove_feed">Remover Feed</string>
<string name="blogs_rss_remove_feed_dialog_message">Você tem certeza que deseja remover este feed?\n\nOs posts serão removidos do seus dispositivo mas não dos dispositivos de outras pessoas.\n\nContatos com quem você tenha compartilhado este feed vão parar de receber atualizações dele.</string>
<string name="blogs_rss_remove_feed_ok">Remover</string>
<string name="blogs_rss_feeds_manage_delete_error">O Feed não pode ser deletado!</string>
<string name="blogs_rss_feeds_manage_empty_state">Nenhum feed RSS para ser exibido\n\nPressione o ícone + para importar um feed</string>
<string name="blogs_rss_feeds_manage_error">Houve um problema ao carregar seus Feeds. Por favor tente novamente.</string>
<!--Settings Profile Picture-->

View File

@@ -445,12 +445,14 @@
<string name="blogs_rss_feeds_import_button">Importă</string>
<string name="blogs_rss_feeds_import_hint">Introduceți URL-ul fluxului RSS</string>
<string name="blogs_rss_feeds_import_error">Ne pare rău! A apărut o eroare la importul fluxului dumneavoastră.</string>
<string name="blogs_rss_feeds_manage">Administrare fluxuri RSS</string>
<string name="blogs_rss_feeds_manage_imported">Importat:</string>
<string name="blogs_rss_feeds_manage_author">Autor:</string>
<string name="blogs_rss_feeds_manage_updated">Actualizat ultima dată:</string>
<string name="blogs_rss_remove_feed">Șterge flux</string>
<string name="blogs_rss_remove_feed_dialog_message">Sunteți siguri că doriți să eliminați acest flux?\n\nMesajele vor fi eliminate de pe dispozitiv, dar nu și de pe dispozitivele altor persoane.\n\nOrice persoană de contact către care ați distribuit acest flux s-ar putea sa nu mai primească actualizări.</string>
<string name="blogs_rss_remove_feed_ok">Eliminare</string>
<string name="blogs_rss_feeds_manage_delete_error">Fluxul nu a putut fi șters!</string>
<string name="blogs_rss_feeds_manage_empty_state">Nici un flux RSS de arătat\n\nAtingeți iconița + pentru a adăuga un flux</string>
<string name="blogs_rss_feeds_manage_error">A apărut o eroare la încărcarea fluxurilor dumneavoastră. Vă rugăm să încercați din nou mai târziu.</string>
<!--Settings Profile Picture-->

View File

@@ -476,12 +476,14 @@
<string name="blogs_rss_feeds_import_button">Импорт</string>
<string name="blogs_rss_feeds_import_hint">Введите URL-адрес RSS-ленты</string>
<string name="blogs_rss_feeds_import_error">Мы сожалеем! Произошла ошибка при импорте ленты.</string>
<string name="blogs_rss_feeds_manage">Управление RSS-лентами</string>
<string name="blogs_rss_feeds_manage_imported">Импортирован:</string>
<string name="blogs_rss_feeds_manage_author">Автор:</string>
<string name="blogs_rss_feeds_manage_updated">Последнее обновление:</string>
<string name="blogs_rss_remove_feed">Удалить RSS-ленту</string>
<string name="blogs_rss_remove_feed_dialog_message">Вы уверены, что хотите удалить эту ленту?\n\nПосты будут удалены только с вашего устройства.\n\nВсе контакты, с которыми вы поделились этой лентой, могут перестать получать обновления.</string>
<string name="blogs_rss_remove_feed_ok">Удалить</string>
<string name="blogs_rss_feeds_manage_delete_error">Не удалось удалить ленту!</string>
<string name="blogs_rss_feeds_manage_empty_state">Нет RSS-лент для отображения\n\nКоснитесь значка + для импорта ленты</string>
<string name="blogs_rss_feeds_manage_error">Ошибка при загрузке вашей ленты. Повторите попытку позже.</string>
<!--Settings Profile Picture-->

View File

@@ -162,7 +162,6 @@
<string name="menu_item_connect_via_bluetooth">Lidhu përmes Bluetooth-i</string>
<string name="dialog_title_connect_via_bluetooth">Lidhu përmes Bluetooth-i</string>
<string name="dialog_message_connect_via_bluetooth">Është e nevojshme që kontakti juaj të jetë atypari, që kjo të funksionojë.\n\nJu dhe kontakti juaj duhet që të shtypin “Fillo” në të njëjtën kohë.</string>
<string name="toast_connect_via_bluetooth_already_discovering">Po provohet tashmë të lidhet përmes Bluetooth-i</string>
<string name="toast_connect_via_bluetooth_not_discoverable">Smund të vazhdohet pa Bluetooth</string>
<string name="toast_connect_via_bluetooth_no_location_permission">Smund të vazhdohet pa leje vendore</string>
<string name="toast_connect_via_bluetooth_start">Po lidhet me Bluetooth…</string>
@@ -458,12 +457,14 @@
<string name="blogs_rss_feeds_import_button">Importo</string>
<string name="blogs_rss_feeds_import_hint">Jepni URL-në e prurjes RSS</string>
<string name="blogs_rss_feeds_import_error">Na ndjeni! Pati një gabim me importimin e prurjes tuaj.</string>
<string name="blogs_rss_feeds_manage">Administroni Prurje RSS</string>
<string name="blogs_rss_feeds_manage_imported">Të importuara:</string>
<string name="blogs_rss_feeds_manage_author">Autor:</string>
<string name="blogs_rss_feeds_manage_updated">Përditësuar Së Fundi:</string>
<string name="blogs_rss_remove_feed">Hiqe Prurjen</string>
<string name="blogs_rss_remove_feed_dialog_message">Jeni i sigurt se doni të hiqet kjo prurje?\n\nPostimet do të hiqen nga pajisja juaj, por jo nga pajisjet e personave të tjerë.\n\nÇfarëdo kontaktesh me të cilët e keni ndarë këtë prurje mund të reshtin së marri përditësime.</string>
<string name="blogs_rss_remove_feed_ok">Hiqe</string>
<string name="blogs_rss_feeds_manage_delete_error">S\u fshi dot prurja!</string>
<string name="blogs_rss_feeds_manage_empty_state">Ska prurje RSS për shfaqje\n\nPrekni ikonën + që të importohet një prurje</string>
<string name="blogs_rss_feeds_manage_error">Pati një problem me ngarkimin e prurjeve tuaja. Ju lutemi, riprovoni më vonë.</string>
<!--Settings Profile Picture-->

View File

@@ -340,6 +340,7 @@ Kontakti kojima ste podijelili ovaj blog će možda prestati da dobijaju novosti
<string name="blogs_rss_feeds_import_button">Uvezi</string>
<string name="blogs_rss_feeds_import_hint">Unesi URL od RSS kanala</string>
<string name="blogs_rss_feeds_import_error">Žao nam je! Došlo je do greške pri unosu vašeg kanala.</string>
<string name="blogs_rss_feeds_manage">Rukujte RSS kanalima</string>
<string name="blogs_rss_feeds_manage_imported">Uvezeno:</string>
<string name="blogs_rss_feeds_manage_author">Autor:</string>
<string name="blogs_rss_feeds_manage_updated">Zadnje ažuriranje:</string>
@@ -350,6 +351,7 @@ Postovi će biti uklonjeni sa vašeg uređaja ali ne is uređaja drugih ljudi.
Kontakti kojima ste podijelili ovaj blog će možda prestati da dobijaju novosti.</string>
<string name="blogs_rss_remove_feed_ok">Ukloni</string>
<string name="blogs_rss_feeds_manage_delete_error">Kanal nije bilo moguće ukloniti!</string>
<string name="blogs_rss_feeds_manage_empty_state">Nema RSS kanala za prikazivanje
Dotaknite + ikonu da uvezete kanal</string>

View File

@@ -420,12 +420,14 @@
<string name="blogs_rss_feeds_import_button">Importera</string>
<string name="blogs_rss_feeds_import_hint">Skriv URL till RSS-flödet</string>
<string name="blogs_rss_feeds_import_error">Tyvärr! Något gick fel när flödet skulle importeras.</string>
<string name="blogs_rss_feeds_manage">Hantera RSS-flöden</string>
<string name="blogs_rss_feeds_manage_imported">Importerade:</string>
<string name="blogs_rss_feeds_manage_author">Författare:</string>
<string name="blogs_rss_feeds_manage_updated">Senast uppdaterad:</string>
<string name="blogs_rss_remove_feed">Ta bort flöde</string>
<string name="blogs_rss_remove_feed_dialog_message">Är du säker på att du vill ta bort det här flödet?\n\nInlägg kommer att tas bort från din enhet, men inte från andras.\n\nKontakter som du har delat det här flödet med kommer kanske inte längre få uppdateringar från det.</string>
<string name="blogs_rss_remove_feed_ok">&amp;Ta bort</string>
<string name="blogs_rss_feeds_manage_delete_error">Flödet kunde ej tas bort!</string>
<string name="blogs_rss_feeds_manage_empty_state">Inga RSS-flöden\n\nTryck plus-ikonen (+) för att importera ett flöde</string>
<string name="blogs_rss_feeds_manage_error">Något gick fel när dina flöden skulle laddas. Försök ingen senare.</string>
<!--Settings Profile Picture-->

View File

@@ -400,6 +400,7 @@ Umepoteza nenosiri.</string>
<string name="blogs_rss_feeds_import_button">Ingiza</string>
<string name="blogs_rss_feeds_import_hint">Ingiza URL za RSS taarifa</string>
<string name="blogs_rss_feeds_import_error">Samahani! Kulikuwa na hitilafu wakati wakuingiza taarifa </string>
<string name="blogs_rss_feeds_manage">Simamia taarifa za RSS</string>
<string name="blogs_rss_feeds_manage_imported">Zilizoingizwa</string>
<string name="blogs_rss_feeds_manage_author">Mwandishi:</string>
<string name="blogs_rss_feeds_manage_updated">huwisho la mwisho
@@ -407,6 +408,7 @@ Umepoteza nenosiri.</string>
<string name="blogs_rss_remove_feed">Ondoa taarifa</string>
<string name="blogs_rss_remove_feed_dialog_message">Unauhakika unataka kutoa hii taarifa?\n\nChapisho lako litaondolewa kwenye kifaa chako ila sio kwenye vifaa vya watu wengine.\n\nMawasiliano yoyote utliokwisha kuyaunganisha wanaweza wasiendelea kupata taarifa. </string>
<string name="blogs_rss_remove_feed_ok">Ondoa</string>
<string name="blogs_rss_feeds_manage_delete_error">Taharifa haziwezekani kuzifuta! </string>
<string name="blogs_rss_feeds_manage_empty_state">Hakuna RSS taharifa zaku onyesha\n\nBonyeza + ikoni kuleta taharifa </string>
<string name="blogs_rss_feeds_manage_error">Kulikuwa na tatizo la kufungua taharifa . Tafathali jaribu baadae kidogo.</string>
<!--Settings Profile Picture-->

View File

@@ -22,9 +22,6 @@
<string name="setup_huawei_text">Lütfen aşağıdaki düğmeye dokunun ve Briar\'ın \"Korunan Uygulamalar\" ekranında korunduğundan emin olun.</string>
<string name="setup_huawei_button">Briar\'ı Koru</string>
<string name="setup_huawei_help">Briar korunan uygulamalar listesine eklenmezse, arka planda çalışamaz.</string>
<string name="setup_huawei_app_launch_text">Lütfen aşağıdaki düğmeye dokunun, \"Uygulama başlatma\" ekranınıın ve Briar için \"Manuel olarak yönet\" şeklinde ayarlanmış olduğundan emin olun.</string>
<string name="setup_huawei_app_launch_button">Pil Ayarlarını</string>
<string name="setup_huawei_app_launch_help">Eğer Briar, \"Uygulama Başlatma\" ekranında \"Manuel olarak yönet\" olarak ayarlanmamışsa, arka planda çalışmayabilir.</string>
<string name="warning_dozed">%s arka planda çalışamadı</string>
<!--Login-->
<string name="enter_password">Parola</string>
@@ -162,7 +159,6 @@
<string name="menu_item_connect_via_bluetooth">Bluetooth ile Bağlan</string>
<string name="dialog_title_connect_via_bluetooth">Bluetooth ile Bağlan</string>
<string name="dialog_message_connect_via_bluetooth">Bunun çalışması için kişinin yakınlarda olması gerekiyor.\n\nSizin ve kişinin \"Başlat\" düğmesine aynı anda basması gerekiyor.</string>
<string name="toast_connect_via_bluetooth_already_discovering">Zaten Bluetooth\'a bağlanmaya çalışıyor</string>
<string name="toast_connect_via_bluetooth_not_discoverable">Bluetooth olmadan devam edilemez</string>
<string name="toast_connect_via_bluetooth_no_location_permission">Konum izni olmadan devam edilemez</string>
<string name="toast_connect_via_bluetooth_start">Bluetooth ile bağlanılıyor…</string>
@@ -458,12 +454,14 @@
<string name="blogs_rss_feeds_import_button">İçe Aktar</string>
<string name="blogs_rss_feeds_import_hint">RSS beslemesi URL\'sini girin</string>
<string name="blogs_rss_feeds_import_error">Üzgünüz! RSS beslemeniz içe aktarılırken bir hata oluştu.</string>
<string name="blogs_rss_feeds_manage">RSS Beslemelerini Yönet</string>
<string name="blogs_rss_feeds_manage_imported">İçe Aktarıldı:</string>
<string name="blogs_rss_feeds_manage_author">Yazar:</string>
<string name="blogs_rss_feeds_manage_updated">Son Güncelleme:</string>
<string name="blogs_rss_remove_feed">Beslemeyi Kaldır</string>
<string name="blogs_rss_remove_feed_dialog_message">Bu beslemeyi kaldırmak istediğinizden emin misiniz?\n\nGönderiler sizin aygıtınızdan değil, diğer insanların aygıtlarından kaldırılacaktır.\n\nBu beslemeyi paylaştığınız kişiler güncellemeleri alması durabilir.</string>
<string name="blogs_rss_remove_feed_ok">Kaldır</string>
<string name="blogs_rss_feeds_manage_delete_error">Besleme silinemedi!</string>
<string name="blogs_rss_feeds_manage_empty_state">Gösterilecek RSS beslemesi yok\n\nBir beslemeyi içe aktarmak için + simgesine dokunun</string>
<string name="blogs_rss_feeds_manage_error">Beslemeleriniz yüklenirken bir hata oluştu. Lütfen daha sonra tekrar deneyin.</string>
<!--Settings Profile Picture-->

View File

@@ -400,12 +400,14 @@
<string name="blogs_rss_feeds_import_button">Імпортувати</string>
<string name="blogs_rss_feeds_import_hint">Введіть URL-посилання RSS-стрічки</string>
<string name="blogs_rss_feeds_import_error">Нам шкода! Виникла помилка під час імпорту вашої стрічки.</string>
<string name="blogs_rss_feeds_manage">Kерувати RSS-стрічками</string>
<string name="blogs_rss_feeds_manage_imported">Імпортовано:</string>
<string name="blogs_rss_feeds_manage_author">Автор:</string>
<string name="blogs_rss_feeds_manage_updated">Востаннє оновлювалося:</string>
<string name="blogs_rss_remove_feed">Видалити стрічку</string>
<string name="blogs_rss_remove_feed_dialog_message">Ви впевнені, що хочете видалити цю стрічку?\n\nДописи буде видалено з вашого пристрою, але не з пристроїв інших осіб.\n\nБудь-хто з контактів, з якими ви поділилися цією стрічкою, можуть припинити отримувати оноволення.</string>
<string name="blogs_rss_remove_feed_ok">Вилучити</string>
<string name="blogs_rss_feeds_manage_delete_error">Ця стрічка не може бути видалена!</string>
<string name="blogs_rss_feeds_manage_empty_state">Немає RSS-стрічок до відображення\n\nНатисніть на символ \"+\", щоб імпортувати стрічку</string>
<string name="blogs_rss_feeds_manage_error">Під час завантаження ваших стрічок виникла проблема. Будь ласка, спробуйте пізніше.</string>
<!--Settings Profile Picture-->

View File

@@ -157,7 +157,6 @@
<string name="menu_item_connect_via_bluetooth">通过蓝牙连接</string>
<string name="dialog_title_connect_via_bluetooth">通过蓝牙连接</string>
<string name="dialog_message_connect_via_bluetooth">你的联络人必须在附近才能起作用。\n\n你和你的联系人应该同时按“开始”。</string>
<string name="toast_connect_via_bluetooth_already_discovering">已在尝试通过蓝牙进行连接</string>
<string name="toast_connect_via_bluetooth_not_discoverable">没有蓝牙无法继续 </string>
<string name="toast_connect_via_bluetooth_no_location_permission">没有位置权限不能继续 </string>
<string name="toast_connect_via_bluetooth_start">正通过蓝牙连接 …</string>
@@ -445,12 +444,14 @@
<string name="blogs_rss_feeds_import_button">导入</string>
<string name="blogs_rss_feeds_import_hint">输入 RSS 订阅源链接</string>
<string name="blogs_rss_feeds_import_error">抱歉!导入订阅源时发生错误。</string>
<string name="blogs_rss_feeds_manage">管理 RSS 订阅源</string>
<string name="blogs_rss_feeds_manage_imported">已导入:</string>
<string name="blogs_rss_feeds_manage_author">作者:</string>
<string name="blogs_rss_feeds_manage_updated">最后更新于:</string>
<string name="blogs_rss_remove_feed">删除订阅源</string>
<string name="blogs_rss_remove_feed_dialog_message">确认要删除该订阅源吗?\n\n博文将从您的设备上移除但仍将存在于其他人的设备。\n\n那些经过您的分享而订阅该源的联系人可能不会再收到更新。</string>
<string name="blogs_rss_remove_feed_ok">删除</string>
<string name="blogs_rss_feeds_manage_delete_error">该订阅源无法被删除!</string>
<string name="blogs_rss_feeds_manage_empty_state">尚无订阅源可供显示\n\n轻按 + 号导入一个订阅源</string>
<string name="blogs_rss_feeds_manage_error">加载订阅源时出错。请稍候再试。</string>
<!--Settings Profile Picture-->

View File

@@ -362,12 +362,14 @@
<string name="blogs_rss_feeds_import_button">導入</string>
<string name="blogs_rss_feeds_import_hint">輸入 RSS 訂閱源鏈接</string>
<string name="blogs_rss_feeds_import_error">抱歉!導入訂閱源時發生錯誤。</string>
<string name="blogs_rss_feeds_manage">管理 RSS 訂閱源</string>
<string name="blogs_rss_feeds_manage_imported">已導入:</string>
<string name="blogs_rss_feeds_manage_author">作者:</string>
<string name="blogs_rss_feeds_manage_updated">最後更新於:</string>
<string name="blogs_rss_remove_feed">刪除訂閱源</string>
<string name="blogs_rss_remove_feed_dialog_message">確認要刪除該訂閱源嗎?\n\n博文將從您的裝置上移除但仍將存在於其他人的裝置。\n\n那些經過您的分享而訂閱該源的聯絡人可能不會再收到更新。</string>
<string name="blogs_rss_remove_feed_ok">刪除</string>
<string name="blogs_rss_feeds_manage_delete_error">無法刪除這訂閱源!</string>
<string name="blogs_rss_feeds_manage_empty_state">尚無訂閱源可供顯示\n\n輕按 + 號導入訂閱源</string>
<string name="blogs_rss_feeds_manage_error">加載訂閱源時出錯。請稍候再試。</string>
<!--Settings Profile Picture-->

View File

@@ -486,14 +486,14 @@
<string name="blogs_rss_feeds_import_button">Import</string>
<string name="blogs_rss_feeds_import_hint">Enter the URL of the RSS feed</string>
<string name="blogs_rss_feeds_import_error">We are sorry! There was an error importing your feed.</string>
<string name="blogs_rss_feeds_import_exists">That feed is already imported.</string>
<string name="blogs_rss_feeds">RSS Feeds</string>
<string name="blogs_rss_feeds_manage">Manage RSS Feeds</string>
<string name="blogs_rss_feeds_manage_imported">Imported:</string>
<string name="blogs_rss_feeds_manage_author">Author:</string>
<string name="blogs_rss_feeds_manage_updated">Last Updated:</string>
<string name="blogs_rss_remove_feed">Remove Feed</string>
<string name="blogs_rss_remove_feed_dialog_message">Are you sure that you want to remove this feed?\n\nPosts will be removed from your device but not from other people\'s devices.\n\nAny contacts you\'ve shared this feed with might stop receiving updates.</string>
<string name="blogs_rss_remove_feed_ok">Remove</string>
<string name="blogs_rss_feeds_manage_delete_error">The feed could not be deleted!</string>
<string name="blogs_rss_feeds_manage_empty_state">No RSS feeds to show\n\nTap the + icon to import a feed</string>
<string name="blogs_rss_feeds_manage_error">There was a problem loading your feeds. Please try again later.</string>

View File

@@ -1,7 +1,8 @@
dependencyVerification {
verify = [
'androidx.activity:activity-ktx:1.1.0:activity-ktx-1.1.0.aar:1996c36d3d2d62db5020b8ec634b5f854b1a698960c3552e1a00c69221baeabe',
'androidx.activity:activity-ktx:1.2.2:activity-ktx-1.2.2.aar:9829e13d6a6b045b03b21a330512e091dc76eb5b3ded0d88d1ab0509cf84a50e',
'androidx.activity:activity:1.2.0:activity-1.2.0.aar:ac27a810554e47b2122bce1f338934e77b173a5a9267eb35f134b6d34f931bae',
'androidx.activity:activity:1.2.2:activity-1.2.2.aar:e165fb20f006b77894d349572cc3acd2760baa8416ae4d33cb8de6a84dd6730c',
'androidx.annotation:annotation-experimental:1.0.0:annotation-experimental-1.0.0.aar:b219d2b568e7e4ba534e09f8c2fd242343df6ccbdfbbe938846f5d740e6b0b11',
'androidx.annotation:annotation:1.1.0:annotation-1.1.0.jar:d38d63edb30f1467818d50aaf05f8a692dea8b31392a049bfa991b159ad5b692',
'androidx.appcompat:appcompat-resources:1.2.0:appcompat-resources-1.2.0.aar:c470297c03ff3de1c3d15dacf0be0cae63abc10b52f021dd07ae28daa3100fe5',
@@ -22,29 +23,36 @@ dependencyVerification {
'androidx.documentfile:documentfile:1.0.0:documentfile-1.0.0.aar:865a061ef2fad16522f8433536b8d47208c46ff7c7745197dfa1eeb481869487',
'androidx.drawerlayout:drawerlayout:1.0.0:drawerlayout-1.0.0.aar:9402442cdc5a43cf62fb14f8cf98c63342d4d9d9b805c8033c6cf7e802749ac1',
'androidx.exifinterface:exifinterface:1.3.1:exifinterface-1.3.1.aar:ef168daa6eb744c8395c22b49afa5235e6099868a0377175b6d5e3cdff8d7ffc',
'androidx.fragment:fragment-ktx:1.2.5:fragment-ktx-1.2.5.aar:50f0f3b734f93829eeac7456b7cb13e5430741e555c535911a958ee4a8242bca',
'androidx.fragment:fragment-testing:1.2.5:fragment-testing-1.2.5.aar:ef3cc3387115f9187665b283e313b13a2bb8826673380317057e2972351df09c',
'androidx.fragment:fragment-ktx:1.3.3:fragment-ktx-1.3.3.aar:5f4aff678b7b70a67275abb66802e2e775c70a7be536c1dedf76335900263572',
'androidx.fragment:fragment-testing:1.3.3:fragment-testing-1.3.3.aar:632a2aeb171a373227601a543ac147be8e6d55e38a88e8d130e9391965178c13',
'androidx.fragment:fragment:1.3.0:fragment-1.3.0.aar:66db3ed2b11bb5e572a079b87cd3fae9bc5c33c373c71b25f1e3eac7607ab526',
'androidx.fragment:fragment:1.3.3:fragment-1.3.3.aar:75ed0aeac5042955d06b73fe98a854a45af10ab4f2362293f9d56ef6684f402e',
'androidx.interpolator:interpolator:1.0.0:interpolator-1.0.0.aar:33193135a64fe21fa2c35eec6688f1a76e512606c0fc83dc1b689e37add7732a',
'androidx.legacy:legacy-support-core-utils:1.0.0:legacy-support-core-utils-1.0.0.aar:a7edcf01d5b52b3034073027bc4775b78a4764bb6202bb91d61c829add8dd1c7',
'androidx.lifecycle:lifecycle-common:2.3.0:lifecycle-common-2.3.0.jar:15848fb56db32f4c7cdc72b324003183d52a4884d6bf09be708ac7f587d139b5',
'androidx.lifecycle:lifecycle-common:2.3.1:lifecycle-common-2.3.1.jar:15848fb56db32f4c7cdc72b324003183d52a4884d6bf09be708ac7f587d139b5',
'androidx.lifecycle:lifecycle-extensions:2.2.0:lifecycle-extensions-2.2.0.aar:648c8de1d10b025d524a2e46ac994fc3f6bf186826c09ec1a62d250bf1b877ae',
'androidx.lifecycle:lifecycle-livedata-core-ktx:2.2.0:lifecycle-livedata-core-ktx-2.2.0.aar:5951f882e95b7e05ceb9adfca0fa2ebd511d63ea5a00da4eae6c6d0c1903da18',
'androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.1:lifecycle-livedata-core-ktx-2.3.1.aar:6dd41c3c33daeb503fd87fbfff7043adb0be6c541a9c9e09bf531ca49520fddb',
'androidx.lifecycle:lifecycle-livedata-core:2.3.0:lifecycle-livedata-core-2.3.0.aar:89f480888f2bb8eb62d9b7b1eb34be69b59ec84b24a1b0bdbeb49973478c6da3',
'androidx.lifecycle:lifecycle-livedata-core:2.3.1:lifecycle-livedata-core-2.3.1.aar:e55d38c372460f0a03997ddc950c67227511340fd74f8634d99d29653cd81ab1',
'androidx.lifecycle:lifecycle-livedata:2.2.0:lifecycle-livedata-2.2.0.aar:d83af94860aa9f64cbdc51f40796a7cf55b116f0e6efd752e845c0104c8b16f6',
'androidx.lifecycle:lifecycle-process:2.2.0:lifecycle-process-2.2.0.aar:3a977e7778fc8418742d388409daaba7ea8fea8823d21ffb96e4c4236f715070',
'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0:lifecycle-runtime-ktx-2.2.0.aar:c29fc87694e6ce116b61207221e53ed285862a6628055790b0bcf9ce45d8cc68',
'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1:lifecycle-runtime-ktx-2.3.1.aar:7ad2987dd7f4075c0871a72cf07e9649d9cd790fc23dfab1972eca4710373873',
'androidx.lifecycle:lifecycle-runtime:2.3.0:lifecycle-runtime-2.3.0.aar:94f528fd5fb123f75b6e65d07a6ef5cd6c0e69ac604d106aaa12705282456234',
'androidx.lifecycle:lifecycle-runtime:2.3.1:lifecycle-runtime-2.3.1.aar:dd294f4a689c71ff877fd41f3b67a3a62f7760d44ce420e6130f1fc3569d8f00',
'androidx.lifecycle:lifecycle-service:2.2.0:lifecycle-service-2.2.0.aar:ca2801ffc069555afed8eddd2292130f436956452bc8bbad30fb56f8e4e382a0',
'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0:lifecycle-viewmodel-ktx-2.2.0.aar:f791001f2211947e56ad3d96d12c9ae93fc5589b88f08603f69a2265c9a7d702',
'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1:lifecycle-viewmodel-ktx-2.3.1.aar:5fb3591b6a54eeb3e204be0125d48eb987b8ea45a5048140036865482ccf9de9',
'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0:lifecycle-viewmodel-savedstate-2.3.0.aar:49f9532b5104cc1ee64900ed4f696d031d807fba726e0d5d6a52459e8fba4a1d',
'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1:lifecycle-viewmodel-savedstate-2.3.1.aar:97137a8af6a31776a14e4866ab808c7c0a791b484bdbc788bbd83e66407564c0',
'androidx.lifecycle:lifecycle-viewmodel:2.3.0:lifecycle-viewmodel-2.3.0.aar:cea8f26fa232037922b69af9cd1bde2df1211acc8b75253e425b7150a5fca59d',
'androidx.lifecycle:lifecycle-viewmodel:2.3.1:lifecycle-viewmodel-2.3.1.aar:b6db4c274a12ff85a4747e1e6669c7e98aefa2571ace9d1f1a6fa6be417ce838',
'androidx.loader:loader:1.0.0:loader-1.0.0.aar:11f735cb3b55c458d470bed9e25254375b518b4b1bad6926783a7026db0f5025',
'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0:localbroadcastmanager-1.0.0.aar:e71c328ceef5c4a7d76f2d86df1b65d65fe2acf868b1a4efd84a3f34336186d8',
'androidx.preference:preference:1.1.1:preference-1.1.1.aar:317dcbc38242aea2f6262c06d51b8a22827e98959967edd40f82600a15cb4bff',
'androidx.print:print:1.0.0:print-1.0.0.aar:1d5c7f3135a1bba661fc373fd72e11eb0a4adbb3396787826dd8e4190d5d9edd',
'androidx.recyclerview:recyclerview-selection:1.1.0-rc03:recyclerview-selection-1.1.0-rc03.aar:a548a0771c2c8ca8cf98f1f755b0eef4fac73d1697e6eeb1a6383f557e0eba13',
'androidx.recyclerview:recyclerview:1.1.0:recyclerview-1.1.0.aar:f0d2b5a67d0a91ee1b1c73ef2b636a81f3563925ddd15a1d4e1c41ec28de7a4f',
'androidx.savedstate:savedstate-ktx:1.1.0:savedstate-ktx-1.1.0.aar:e44d61347463b0fafeeb649cbcc3d7109b2eb5e11d1522e986105170cdebbf68',
'androidx.savedstate:savedstate:1.1.0:savedstate-1.1.0.aar:d60bbe44c2c08083a17c5dc678a6d6b4d0a2d664858016ab5c049cbea90a63b7',
'androidx.test.espresso:espresso-contrib:3.3.0:espresso-contrib-3.3.0.aar:f400cabdc181356acf6b210e4509dcb9649d9e2b6b6e218c60fcfc15e8a756d1',
'androidx.test.espresso:espresso-core:3.3.0:espresso-core-3.3.0.aar:23ebf6014645e0c60aec7d1ed924d4d4c848ae8c3673b7d8d06b2ec6a56cafee',
@@ -200,14 +208,14 @@ dependencyVerification {
'org.hamcrest:hamcrest-integration:1.3:hamcrest-integration-1.3.jar:70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2',
'org.hamcrest:hamcrest-library:1.3:hamcrest-library-1.3.jar:711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c',
'org.jetbrains.kotlin:kotlin-reflect:1.3.72:kotlin-reflect-1.3.72.jar:a188d9367de1c4ee9479db630985c0597b20709c83161b1430d24edb27e38c40',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.3.50:kotlin-stdlib-common-1.3.50.jar:8ce678e88e4ba018b66dacecf952471e4d7dfee156a8a819760a5a5ff29d323c',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.3.72:kotlin-stdlib-common-1.3.72.jar:5e7d1552863e480c1628b1cc39ce230ef829f5b7230106215a05acda5172203a',
'org.jetbrains.kotlin:kotlin-stdlib-common:1.4.20:kotlin-stdlib-common-1.4.20.jar:a7112c9b3cefee418286c9c9372f7af992bd1e6e030691d52f60cb36dbec8320',
'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72:kotlin-stdlib-jdk7-1.3.72.jar:40566c0c08d414b9413ba556ff7f8a0b04b98b9f0f424d122dd2088510efccc4',
'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72:kotlin-stdlib-jdk8-1.3.72.jar:133da70cfc07b56094282eac5c59bccd59f167ee2ead22e5282876d8bc10bf95',
'org.jetbrains.kotlin:kotlin-stdlib:1.3.50:kotlin-stdlib-1.3.50.jar:e6f05746ee0366d0b52825a090fac474dcf44082c9083bbb205bd16976488d6c',
'org.jetbrains.kotlin:kotlin-stdlib:1.3.72:kotlin-stdlib-1.3.72.jar:3856a7349ebacd6d1be6802b2fed9c4dc2c5a564ea92b6b945ac988243d4b16b',
'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0:kotlinx-coroutines-android-1.3.0.jar:c80aaadf041f044d324a19a73f88879dfd1e4d026b14e3230075ff9081942ae3',
'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0:kotlinx-coroutines-core-1.3.0.jar:6f3a60fea2403b80385b399952aeb3a4cf0985a45b8da04b6f31825171901a1d',
'org.jetbrains.kotlin:kotlin-stdlib:1.4.20:kotlin-stdlib-1.4.20.jar:b8ab1da5cdc89cb084d41e1f28f20a42bd431538642a5741c52bbfae3fa3e656',
'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1:kotlinx-coroutines-android-1.4.1.jar:d4cadb673b2101f1ee5fbc147956ac78b1cfd9cc255fb53d3aeb88dff11d99ca',
'org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.1:kotlinx-coroutines-core-jvm-1.4.1.jar:6d2f87764b6638f27aff12ed380db4b63c9d46ba55dc32683a650598fa5a3e22',
'org.jetbrains.trove4j:trove4j:20160824:trove4j-20160824.jar:1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7',
'org.jetbrains:annotations:13.0:annotations-13.0.jar:ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478',
'org.jmock:jmock-junit4:2.8.2:jmock-junit4-2.8.2.jar:f7ee4df4f7bd7b7f1cafad3b99eb74d579f109d5992ff625347352edb55e674c',

View File

@@ -10,7 +10,7 @@ import javax.annotation.concurrent.Immutable;
@Immutable
@NotNullByDefault
public class Feed implements Comparable<Feed> {
public class Feed {
private final String url;
private final Blog blog;
@@ -94,13 +94,4 @@ public class Feed implements Comparable<Feed> {
return false;
}
@Override
public int compareTo(Feed o) {
if (this == o) return 0;
long aTime = getAdded(), bTime = o.getAdded();
if (aTime > bTime) return -1;
if (aTime < bTime) return 1;
return 0;
}
}

View File

@@ -1,7 +1,6 @@
package org.briarproject.briar.api.feed;
import org.briarproject.bramble.api.db.DbException;
import org.briarproject.bramble.api.db.Transaction;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.bramble.api.sync.ClientId;
@@ -24,7 +23,7 @@ public interface FeedManager {
/**
* Adds an RSS feed as a new dedicated blog.
*/
Feed addFeed(String url) throws DbException, IOException;
void addFeed(String url) throws DbException, IOException;
/**
* Removes an RSS feed.
@@ -36,8 +35,4 @@ public interface FeedManager {
*/
List<Feed> getFeeds() throws DbException;
/**
* Returns a list of all added RSS feeds
*/
List<Feed> getFeeds(Transaction txn) throws DbException;
}

View File

@@ -22,7 +22,7 @@ dependencies {
testImplementation project(path: ':bramble-core', configuration: 'testOutput')
testImplementation project(path: ':bramble-api', configuration: 'testOutput')
testImplementation 'net.jodah:concurrentunit:0.4.2'
testImplementation 'junit:junit:4.12'
testImplementation 'junit:junit:4.13.1'
testImplementation "org.jmock:jmock:2.8.2"
testImplementation "org.jmock:jmock-junit4:2.8.2"
testImplementation "org.jmock:jmock-legacy:2.8.2"

View File

@@ -166,7 +166,7 @@ class FeedManagerImpl implements FeedManager, EventListener, OpenDatabaseHook,
}
@Override
public Feed addFeed(String url) throws DbException, IOException {
public void addFeed(String url) throws DbException, IOException {
// fetch syndication feed to get its metadata
SyndFeed f = fetchSyndFeed(url);
@@ -198,8 +198,6 @@ class FeedManagerImpl implements FeedManager, EventListener, OpenDatabaseHook,
} finally {
db.endTransaction(txn);
}
return updatedFeed;
}
@Override
@@ -234,11 +232,18 @@ class FeedManagerImpl implements FeedManager, EventListener, OpenDatabaseHook,
@Override
public List<Feed> getFeeds() throws DbException {
return db.transactionWithResult(true, this::getFeeds);
List<Feed> feeds;
Transaction txn = db.startTransaction(true);
try {
feeds = getFeeds(txn);
db.commitTransaction(txn);
} finally {
db.endTransaction(txn);
}
return feeds;
}
@Override
public List<Feed> getFeeds(Transaction txn) throws DbException {
private List<Feed> getFeeds(Transaction txn) throws DbException {
List<Feed> feeds = new ArrayList<>();
Group g = getLocalGroup();
try {

View File

@@ -17,7 +17,6 @@ import org.briarproject.bramble.api.sync.Message;
import org.briarproject.bramble.api.system.Clock;
import org.briarproject.bramble.api.system.TaskScheduler;
import org.briarproject.bramble.test.BrambleMockTestCase;
import org.briarproject.bramble.test.DbExpectations;
import org.briarproject.bramble.test.ImmediateExecutor;
import org.briarproject.briar.api.blog.Blog;
import org.briarproject.briar.api.blog.BlogManager;
@@ -146,14 +145,17 @@ public class FeedManagerImplTest extends BrambleMockTestCase {
BdfDictionary feedsDict =
BdfDictionary.of(new BdfEntry(KEY_FEEDS, feedList));
expectGetLocalGroup();
context.checking(new DbExpectations() {{
oneOf(db).transactionWithResult(with(true), withDbCallable(txn));
context.checking(new Expectations() {{
oneOf(db).startTransaction(true);
will(returnValue(txn));
oneOf(clientHelper).getGroupMetadataAsDictionary(txn, localGroupId);
will(returnValue(feedsDict));
if (feedList.size() == 1) {
oneOf(feedFactory).createFeed(feedDict);
will(returnValue(feed));
}
oneOf(db).commitTransaction(txn);
oneOf(db).endTransaction(txn);
}});
}

View File

@@ -20,7 +20,7 @@ dependencyVerification {
'com.squareup:javapoet:1.11.1:javapoet-1.11.1.jar:9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90',
'javax.annotation:jsr250-api:1.0:jsr250-api-1.0.jar:a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f',
'javax.inject:javax.inject:1:javax.inject-1.jar:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
'junit:junit:4.12:junit-4.12.jar:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a',
'junit:junit:4.13.1:junit-4.13.1.jar:c30719db974d6452793fe191b3638a5777005485bae145924044530ffa5f6122',
'net.jodah:concurrentunit:0.4.2:concurrentunit-0.4.2.jar:5583078e1acf91734939e985bc9e7ee947b0e93a8eef679da6bb07bbeb47ced3',
'net.ltgt.gradle.incap:incap:0.2:incap-0.2.jar:b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd',
'org.apache.ant:ant-launcher:1.9.4:ant-launcher-1.9.4.jar:7bccea20b41801ca17bcbc909a78c835d0f443f12d639c77bd6ae3d05861608d',