mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-11 18:29:05 +01:00
Compare commits
11 Commits
alpha-1.2.
...
release-1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
62cca1335f | ||
|
|
11a18859fb | ||
|
|
1116a7e125 | ||
|
|
415b315292 | ||
|
|
9818ec2b66 | ||
|
|
372516646d | ||
|
|
72e721b0d3 | ||
|
|
6599093611 | ||
|
|
dceeecf1fe | ||
|
|
ace0b9a3d8 | ||
|
|
7c45c90de9 |
@@ -15,8 +15,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 29
|
||||
versionCode 10219
|
||||
versionName "1.2.19"
|
||||
versionCode 10220
|
||||
versionName "1.2.20"
|
||||
consumerProguardFiles 'proguard-rules.txt'
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
Bridge obfs4 192.95.36.142:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=1
|
||||
Bridge obfs4 38.229.1.78:80 C8CBDB2464FC9804A69531437BCF2BE31FDD2EE4 cert=Hmyfd2ev46gGY7NoVxA9ngrPF2zCZtzskRTzoWXbxNkzeVnGFPWmrTtILRyqCTjHR+s9dg iat-mode=1
|
||||
Bridge obfs4 38.229.33.83:80 0BAC39417268B96B9F514E7F63FA6FBA1A788955 cert=VwEFpk9F/UN9JED7XpG1XOjm/O8ZCXK80oPecgWnNDZDv5pdkhq1OpbAH0wNqOT6H6BmRQ iat-mode=1
|
||||
Bridge obfs4 37.218.245.14:38224 D9A82D2F9C2F65A18407B1D2B764F130847F8B5D cert=bjRaMrr1BRiAW8IE9U5z27fQaYgOhX1UCmOpg2pFpoMvo6ZgQMzLsaTzzQNTlm7hNcb+Sg iat-mode=0
|
||||
Bridge obfs4 85.31.186.98:443 011F2599C0E9B27EE74B353155E244813763C3E5 cert=ayq0XzCwhpdysn5o0EyDUbmSOx3X/oTEbzDMvczHOdBJKlvIdHHLJGkZARtT4dcBFArPPg iat-mode=0
|
||||
Bridge obfs4 144.217.20.138:80 FB70B257C162BF1038CA669D568D76F5B7F0BABB cert=vYIV5MgrghGQvZPIi1tJwnzorMgqgmlKaB77Y3Z9Q/v94wZBOAXkW+fdx4aSxLVnKO+xNw iat-mode=0
|
||||
Bridge obfs4 85.31.186.26:443 91A6354697E6B02A386312F68D82CF86824D3606 cert=PBwr+S8JTVZo6MPdHnkTwXJPILWADLqfMGoVvhZClMq/Urndyd42BwX9YFJHZnBB3H0XCw iat-mode=0
|
||||
Bridge obfs4 193.11.166.194:27015 2D82C2E354D531A68469ADF7F878FA6060C6BACA cert=4TLQPJrTSaDffMK7Nbao6LC7G9OW/NHkUwIdjLSS3KYf0Nv4/nQiiI8dY2TcsQx01NniOg iat-mode=0
|
||||
Bridge obfs4 193.11.166.194:27020 86AC7B8D430DAC4117E9F42C9EAED18133863AAF cert=0LDeJH4JzMDtkJJrFphJCiPqKx7loozKN7VNfuukMGfHO0Z8OGdzHVkhVAOfo1mUdv9cMg iat-mode=0
|
||||
Bridge obfs4 193.11.166.194:27025 1AE2C08904527FEA90C4C4F8C1083EA59FBC6FAF cert=ItvYZzW5tn6v3G4UnQa6Qz04Npro6e81AP70YujmK/KXwDFPTs3aHXcHp4n8Vt6w/bv8cA iat-mode=0
|
||||
|
||||
@@ -26,8 +26,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 29
|
||||
versionCode 10219
|
||||
versionName "1.2.19"
|
||||
versionCode 10220
|
||||
versionName "1.2.20"
|
||||
applicationId "org.briarproject.briar.android"
|
||||
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
|
||||
@@ -6,7 +6,6 @@ public interface RequestCodes {
|
||||
int REQUEST_INTRODUCTION = 2;
|
||||
int REQUEST_GROUP_INVITE = 3;
|
||||
int REQUEST_SHARE_FORUM = 4;
|
||||
int REQUEST_WRITE_BLOG_POST = 5;
|
||||
int REQUEST_SHARE_BLOG = 6;
|
||||
int REQUEST_RINGTONE = 7;
|
||||
int REQUEST_PERMISSION_CAMERA_LOCATION = 8;
|
||||
|
||||
@@ -176,10 +176,22 @@ abstract class BaseViewModel extends DbViewModel implements EventListener {
|
||||
return result == null ? null : result.getItems();
|
||||
}
|
||||
|
||||
/**
|
||||
* Call this after {@link ListUpdate#getPostAddedWasLocal()} was processed.
|
||||
* This prevents it from getting processed again.
|
||||
*/
|
||||
@UiThread
|
||||
void resetLocalUpdate() {
|
||||
LiveResult<ListUpdate> value = blogPosts.getValue();
|
||||
if (value == null) return;
|
||||
ListUpdate result = value.getResultOrNull();
|
||||
result.postAddedWasLocal = null;
|
||||
}
|
||||
|
||||
static class ListUpdate {
|
||||
|
||||
@Nullable
|
||||
private final Boolean postAddedWasLocal;
|
||||
private Boolean postAddedWasLocal;
|
||||
private final List<BlogPostItem> items;
|
||||
|
||||
ListUpdate(@Nullable Boolean postAddedWasLocal,
|
||||
|
||||
@@ -6,9 +6,11 @@ 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.bramble.api.sync.MessageId;
|
||||
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;
|
||||
import org.briarproject.briar.android.fragment.BaseFragment.BaseFragmentListener;
|
||||
import org.briarproject.briar.android.sharing.BlogSharingStatusActivity;
|
||||
|
||||
@@ -19,6 +21,7 @@ import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static org.briarproject.briar.android.blog.BlogPostFragment.POST_ID;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
@@ -45,7 +48,10 @@ public class BlogActivity extends BriarActivity
|
||||
Intent i = getIntent();
|
||||
GroupId groupId =
|
||||
new GroupId(requireNonNull(i.getByteArrayExtra(GROUP_ID)));
|
||||
viewModel.setGroupId(groupId);
|
||||
// Get post info from intent
|
||||
@Nullable byte[] postId = i.getByteArrayExtra(POST_ID);
|
||||
|
||||
viewModel.setGroupId(groupId, postId == null);
|
||||
|
||||
setContentView(R.layout.activity_fragment_container_toolbar);
|
||||
Toolbar toolbar = setUpCustomToolbar(false);
|
||||
@@ -66,7 +72,14 @@ public class BlogActivity extends BriarActivity
|
||||
);
|
||||
|
||||
if (state == null) {
|
||||
showInitialFragment(BlogFragment.newInstance(groupId));
|
||||
if (postId == null) {
|
||||
showInitialFragment(BlogFragment.newInstance(groupId));
|
||||
} else {
|
||||
MessageId messageId = new MessageId(postId);
|
||||
BaseFragment f =
|
||||
BlogPostFragment.newInstance(groupId, messageId);
|
||||
showInitialFragment(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,6 @@ import static android.widget.Toast.LENGTH_SHORT;
|
||||
import static com.google.android.material.snackbar.Snackbar.LENGTH_LONG;
|
||||
import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
|
||||
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_SHARE_BLOG;
|
||||
import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_WRITE_BLOG_POST;
|
||||
|
||||
@UiThread
|
||||
@MethodsNotNullByDefault
|
||||
@@ -134,7 +133,7 @@ public class BlogFragment extends BaseFragment
|
||||
if (itemId == R.id.action_write_blog_post) {
|
||||
Intent i = new Intent(getActivity(), WriteBlogPostActivity.class);
|
||||
i.putExtra(GROUP_ID, groupId.getBytes());
|
||||
startActivityForResult(i, REQUEST_WRITE_BLOG_POST);
|
||||
startActivity(i);
|
||||
return true;
|
||||
} else if (itemId == R.id.action_blog_share) {
|
||||
Intent i = new Intent(getActivity(), ShareBlogActivity.class);
|
||||
@@ -160,10 +159,7 @@ public class BlogFragment extends BaseFragment
|
||||
public void onActivityResult(int request, int result,
|
||||
@Nullable Intent data) {
|
||||
super.onActivityResult(request, result, data);
|
||||
|
||||
if (request == REQUEST_WRITE_BLOG_POST && result == RESULT_OK) {
|
||||
displaySnackbar(R.string.blogs_blog_post_created, true);
|
||||
} else if (request == REQUEST_SHARE_BLOG && result == RESULT_OK) {
|
||||
if (request == REQUEST_SHARE_BLOG && result == RESULT_OK) {
|
||||
displaySnackbar(R.string.blogs_sharing_snackbar, false);
|
||||
}
|
||||
}
|
||||
@@ -184,6 +180,7 @@ public class BlogFragment extends BaseFragment
|
||||
displaySnackbar(R.string.blogs_blog_post_received,
|
||||
true);
|
||||
}
|
||||
viewModel.resetLocalUpdate();
|
||||
list.showData();
|
||||
});
|
||||
}
|
||||
@@ -191,7 +188,7 @@ public class BlogFragment extends BaseFragment
|
||||
@Override
|
||||
public void onBlogPostClick(BlogPostItem post) {
|
||||
BlogPostFragment f =
|
||||
BlogPostFragment.newInstance(groupId, post.getId(), false);
|
||||
BlogPostFragment.newInstance(groupId, post.getId());
|
||||
showNextFragment(f);
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,6 @@ public class BlogPostFragment extends BaseFragment
|
||||
private static final Logger LOG = getLogger(TAG);
|
||||
|
||||
static final String POST_ID = "briar.POST_ID";
|
||||
static final String IS_FEED = "briar.IS_FEED";
|
||||
|
||||
protected BlogViewModel viewModel;
|
||||
private final Handler handler = new Handler(Looper.getMainLooper());
|
||||
@@ -57,13 +56,11 @@ public class BlogPostFragment extends BaseFragment
|
||||
@Inject
|
||||
ViewModelProvider.Factory viewModelFactory;
|
||||
|
||||
static BlogPostFragment newInstance(GroupId blogId, MessageId postId,
|
||||
boolean isFeed) {
|
||||
static BlogPostFragment newInstance(GroupId blogId, MessageId postId) {
|
||||
BlogPostFragment f = new BlogPostFragment();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putByteArray(GROUP_ID, blogId.getBytes());
|
||||
bundle.putByteArray(POST_ID, postId.getBytes());
|
||||
bundle.putBoolean(IS_FEED, isFeed);
|
||||
f.setArguments(bundle);
|
||||
return f;
|
||||
}
|
||||
@@ -85,13 +82,12 @@ public class BlogPostFragment extends BaseFragment
|
||||
new GroupId(requireNonNull(args.getByteArray(GROUP_ID)));
|
||||
MessageId postId =
|
||||
new MessageId(requireNonNull(args.getByteArray(POST_ID)));
|
||||
boolean isFeed = args.getBoolean(IS_FEED);
|
||||
|
||||
View view = inflater.inflate(R.layout.fragment_blog_post, container,
|
||||
false);
|
||||
progressBar = view.findViewById(R.id.progressBar);
|
||||
progressBar.setVisibility(VISIBLE);
|
||||
ui = new BlogPostViewHolder(view, true, this, isFeed);
|
||||
ui = new BlogPostViewHolder(view, true, this, false);
|
||||
LifecycleOwner owner = getViewLifecycleOwner();
|
||||
viewModel.loadBlogPost(groupId, postId).observe(owner, result ->
|
||||
result.onError(this::handleException)
|
||||
|
||||
@@ -16,8 +16,6 @@ import org.briarproject.briar.android.view.AuthorView;
|
||||
import org.briarproject.briar.api.blog.BlogCommentHeader;
|
||||
import org.briarproject.briar.api.blog.BlogPostHeader;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import androidx.annotation.UiThread;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
@@ -81,15 +79,15 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder {
|
||||
return "blogPost" + id.hashCode();
|
||||
}
|
||||
|
||||
void bindItem(@Nullable BlogPostItem item) {
|
||||
if (item == null) return;
|
||||
|
||||
void bindItem(BlogPostItem item) {
|
||||
setTransitionName(item.getId());
|
||||
if (!fullText) {
|
||||
layout.setClickable(true);
|
||||
layout.setOnClickListener(v -> listener.onBlogPostClick(item));
|
||||
}
|
||||
|
||||
boolean isReblog = item instanceof BlogCommentItem;
|
||||
|
||||
// author and date
|
||||
BlogPostHeader post = item.getPostHeader();
|
||||
author.setAuthor(post.getAuthor(), post.getAuthorInfo());
|
||||
@@ -97,7 +95,7 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder {
|
||||
author.setPersona(
|
||||
item.isRssFeed() ? AuthorView.RSS_FEED : AuthorView.NORMAL);
|
||||
// TODO make author clickable more often #624
|
||||
if (authorClickable) {
|
||||
if (authorClickable && !isReblog) {
|
||||
author.setAuthorClickable(v -> listener.onAuthorClick(item));
|
||||
} else {
|
||||
author.setAuthorNotClickable();
|
||||
@@ -126,19 +124,21 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
// comments
|
||||
commentContainer.removeAllViews();
|
||||
if (item instanceof BlogCommentItem) {
|
||||
onBindComment((BlogCommentItem) item);
|
||||
if (isReblog) {
|
||||
onBindComment((BlogCommentItem) item, authorClickable);
|
||||
} else {
|
||||
reblogger.setVisibility(GONE);
|
||||
}
|
||||
}
|
||||
|
||||
private void onBindComment(BlogCommentItem item) {
|
||||
private void onBindComment(BlogCommentItem item, boolean authorClickable) {
|
||||
// reblogger
|
||||
reblogger.setAuthor(item.getAuthor(), item.getAuthorInfo());
|
||||
reblogger.setDate(item.getTimestamp());
|
||||
if (!fullText) {
|
||||
if (authorClickable) {
|
||||
reblogger.setAuthorClickable(v -> listener.onAuthorClick(item));
|
||||
} else {
|
||||
reblogger.setAuthorNotClickable();
|
||||
}
|
||||
reblogger.setVisibility(VISIBLE);
|
||||
reblogger.setPersona(REBLOGGER);
|
||||
|
||||
@@ -111,11 +111,11 @@ class BlogViewModel extends BaseViewModel {
|
||||
* Set this before calling any other methods.
|
||||
*/
|
||||
@UiThread
|
||||
public void setGroupId(GroupId groupId) {
|
||||
public void setGroupId(GroupId groupId, boolean loadAllPosts) {
|
||||
if (this.groupId == groupId) return; // configuration change
|
||||
this.groupId = groupId;
|
||||
loadBlog(groupId);
|
||||
loadBlogPosts(groupId);
|
||||
if (loadAllPosts) loadBlogPosts(groupId);
|
||||
loadSharingContacts(groupId);
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ import android.view.ViewGroup;
|
||||
|
||||
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.ActivityComponent;
|
||||
import org.briarproject.briar.android.blog.BaseViewModel.ListUpdate;
|
||||
@@ -29,6 +30,7 @@ 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 org.briarproject.briar.android.activity.BriarActivity.GROUP_ID;
|
||||
import static org.briarproject.briar.android.blog.BlogPostFragment.POST_ID;
|
||||
|
||||
@MethodsNotNullByDefault
|
||||
@ParametersNotNullByDefault
|
||||
@@ -108,6 +110,7 @@ public class FeedFragment extends BaseFragment
|
||||
} else if (wasLocal != null) {
|
||||
showSnackBar(R.string.blogs_blog_post_received);
|
||||
}
|
||||
viewModel.resetLocalUpdate();
|
||||
list.showData();
|
||||
});
|
||||
}
|
||||
@@ -145,16 +148,14 @@ public class FeedFragment extends BaseFragment
|
||||
|
||||
@Override
|
||||
public void onBlogPostClick(BlogPostItem post) {
|
||||
BaseFragment f = BlogPostFragment
|
||||
.newInstance(post.getGroupId(), post.getId(), true);
|
||||
showNextFragment(f);
|
||||
Intent i = getBlogActivityIntent(post.getGroupId());
|
||||
i.putExtra(POST_ID, post.getId().getBytes());
|
||||
requireContext().startActivity(i);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAuthorClick(BlogPostItem post) {
|
||||
Intent i = new Intent(requireContext(), BlogActivity.class);
|
||||
i.putExtra(GROUP_ID, post.getGroupId().getBytes());
|
||||
i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
|
||||
Intent i = getBlogActivityIntent(post.getGroupId());
|
||||
requireContext().startActivity(i);
|
||||
}
|
||||
|
||||
@@ -169,6 +170,13 @@ public class FeedFragment extends BaseFragment
|
||||
return TAG;
|
||||
}
|
||||
|
||||
private Intent getBlogActivityIntent(GroupId groupId) {
|
||||
Intent i = new Intent(requireContext(), BlogActivity.class);
|
||||
i.putExtra(GROUP_ID, groupId.getBytes());
|
||||
i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
|
||||
return i;
|
||||
}
|
||||
|
||||
private void showSnackBar(int stringRes) {
|
||||
int firstVisible =
|
||||
layoutManager.findFirstCompletelyVisibleItemPosition();
|
||||
|
||||
@@ -135,9 +135,10 @@ public class AuthorView extends ConstraintLayout {
|
||||
}
|
||||
|
||||
public void setAuthorNotClickable() {
|
||||
setClickable(false);
|
||||
setBackgroundResource(0);
|
||||
setOnClickListener(null);
|
||||
setClickable(false);
|
||||
setFocusable(false);
|
||||
setBackgroundResource(0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -16,27 +16,18 @@
|
||||
android:id="@+id/rebloggerView"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/listitem_vertical_margin"
|
||||
android:layout_marginLeft="@dimen/listitem_vertical_margin"
|
||||
android:layout_marginTop="@dimen/listitem_vertical_margin"
|
||||
android:layout_marginEnd="@dimen/listitem_vertical_margin"
|
||||
android:layout_marginRight="@dimen/listitem_vertical_margin"
|
||||
android:layout_marginBottom="@dimen/listitem_horizontal_margin"
|
||||
android:padding="@dimen/listitem_vertical_margin"
|
||||
app:layout_constraintEnd_toStartOf="@+id/commentView"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:persona="reblogger" />
|
||||
app:persona="reblogger"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<org.briarproject.briar.android.view.AuthorView
|
||||
android:id="@+id/authorView"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/listitem_vertical_margin"
|
||||
android:layout_marginLeft="@dimen/listitem_vertical_margin"
|
||||
android:layout_marginTop="@dimen/listitem_vertical_margin"
|
||||
android:layout_marginEnd="@dimen/listitem_vertical_margin"
|
||||
android:layout_marginRight="@dimen/listitem_vertical_margin"
|
||||
android:layout_marginBottom="@dimen/listitem_horizontal_margin"
|
||||
android:padding="@dimen/listitem_vertical_margin"
|
||||
app:layout_constraintEnd_toStartOf="@+id/commentView"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/rebloggerView" />
|
||||
|
||||
@@ -536,6 +536,7 @@
|
||||
<string name="optional_contact_email">Deine E-Mail-Adresse (optional)</string>
|
||||
<string name="include_debug_report_crash">Anonymisierte Daten über den Absturz anhängen</string>
|
||||
<string name="include_debug_report_feedback">Anonymisierte Daten über dieses Gerät anhängen</string>
|
||||
<string name="dev_report_user_info">Benutzerinformation</string>
|
||||
<string name="dev_report_basic_info">Basisinformationen</string>
|
||||
<string name="dev_report_device_info">Geräteinformationen</string>
|
||||
<string name="dev_report_stacktrace">Stacktrace</string>
|
||||
|
||||
@@ -536,6 +536,7 @@
|
||||
<string name="optional_contact_email">Tu correo electrónico (opcional)</string>
|
||||
<string name="include_debug_report_crash">Incluir datos anónimos sobre la falla</string>
|
||||
<string name="include_debug_report_feedback">Incluir datos anónimos sobre este dispositivo</string>
|
||||
<string name="dev_report_user_info">Información de usuario</string>
|
||||
<string name="dev_report_basic_info">Información básica</string>
|
||||
<string name="dev_report_device_info">Información del dispositivo</string>
|
||||
<string name="dev_report_stacktrace">Traza de pila</string>
|
||||
|
||||
@@ -467,6 +467,7 @@
|
||||
<!--Settings Profile Picture-->
|
||||
<string name="change_profile_picture">برای تغییر تصویر نمایه خود اینجا را لمس کنید.</string>
|
||||
<string name="dialog_confirm_profile_picture_title">تغییر تصویر نمایه</string>
|
||||
<string name="dialog_confirm_profile_picture_remark">تنها مخاطبین شما میتوانند این تصویر را مشاهده کنند.</string>
|
||||
<string name="change_profile_picture_failed_message">تاسفیم اما هنگام بروزرسانی تصویر نمایه شما مشکلی رخ داد.</string>
|
||||
<!--Settings Display-->
|
||||
<string name="pref_language_title">زبان و منطقه</string>
|
||||
@@ -575,6 +576,7 @@
|
||||
<string name="optional_contact_email">آدرس ایمیل شما (اختیاری)</string>
|
||||
<string name="include_debug_report_crash">قرار دادن داده های ناشناس مربوط به خرابی</string>
|
||||
<string name="include_debug_report_feedback">قرار دادن داده های ناشناس درباره این دستگاه</string>
|
||||
<string name="dev_report_user_info">اطلاعات کاربر</string>
|
||||
<string name="dev_report_basic_info">اطلاعات پایه</string>
|
||||
<string name="dev_report_device_info">اطلاعات دستگاه</string>
|
||||
<string name="dev_report_stacktrace">Stacktrace</string>
|
||||
|
||||
@@ -536,6 +536,7 @@
|
||||
<string name="optional_contact_email">Votre adresse courriel (facultative)</string>
|
||||
<string name="include_debug_report_crash">Inclure des données anonymes concernant le plantage</string>
|
||||
<string name="include_debug_report_feedback">Inclure des données anonymes concernant cet appareil</string>
|
||||
<string name="dev_report_user_info">Renseignements sur l’utilisateur</string>
|
||||
<string name="dev_report_basic_info">Renseignements de base</string>
|
||||
<string name="dev_report_device_info">Renseignements sur l’appareil</string>
|
||||
<string name="dev_report_stacktrace">Trace d’appels</string>
|
||||
|
||||
@@ -556,6 +556,7 @@
|
||||
<string name="optional_contact_email">Jūsų el. pašto adresas (nebūtina)</string>
|
||||
<string name="include_debug_report_crash">Įtraukti anoniminius duomenis apie strigtį</string>
|
||||
<string name="include_debug_report_feedback">Įtraukti anoniminius duomenis apie šį įrenginį</string>
|
||||
<string name="dev_report_user_info">Naudotojo informacija</string>
|
||||
<string name="dev_report_basic_info">Pagrindinė informacija</string>
|
||||
<string name="dev_report_device_info">Įrenginio informacija</string>
|
||||
<string name="dev_report_stacktrace">Dėklo pėdsakas</string>
|
||||
|
||||
@@ -219,9 +219,9 @@
|
||||
<string name="copy_button">Копировать</string>
|
||||
<string name="share_button">Поделиться</string>
|
||||
<string name="send_link_title">Обмен ссылками</string>
|
||||
<string name="add_contact_choose_nickname">Выберите ник</string>
|
||||
<string name="add_contact_choose_a_nickname">Введите ник</string>
|
||||
<string name="nickname_intro">Дайте вашему контакту ник. Увидеть его сможете только вы.</string>
|
||||
<string name="add_contact_choose_nickname">Выберите псевдоним</string>
|
||||
<string name="add_contact_choose_a_nickname">Введите псевдоним</string>
|
||||
<string name="nickname_intro">Дайте вашему контакту псевдоним. Увидеть его сможете только вы.</string>
|
||||
<string name="your_link">Передайте эту ссылку контакту, который вы хотите добавить.</string>
|
||||
<string name="link_clip_label">Ссылка Briar</string>
|
||||
<string name="link_copied_toast">Ссылка скопирована</string>
|
||||
@@ -236,7 +236,7 @@
|
||||
<string name="dialog_title_remove_pending_contact">Подтвердите удаление</string>
|
||||
<string name="dialog_message_remove_pending_contact">Этот контакт находится в процессе добавления. Если вы удалите его сейчас, он не будет добавлен.</string>
|
||||
<string name="own_link_error">Введите ссылку вашего контакта, а не свою</string>
|
||||
<string name="nickname_missing">Пожалуйста, введите ник</string>
|
||||
<string name="nickname_missing">Пожалуйста, введите псевдоним</string>
|
||||
<string name="invalid_link">Неправильная ссылка</string>
|
||||
<string name="unsupported_link">Эта ссылка из более новой версии Briar. Пожалуйста, обновитесь до последней версии и попробуйте снова.</string>
|
||||
<string name="intent_own_link">Вы открыли свою собственную ссылку. Используйте контакт, который вы хотите добавить!</string>
|
||||
@@ -558,6 +558,7 @@
|
||||
<string name="optional_contact_email">Ваш адрес email (необязательно)</string>
|
||||
<string name="include_debug_report_crash">Включить анонимные данные о сбое</string>
|
||||
<string name="include_debug_report_feedback">Включить анонимные данные об этом устройстве</string>
|
||||
<string name="dev_report_user_info">Информация о пользователе</string>
|
||||
<string name="dev_report_basic_info">Основная информация</string>
|
||||
<string name="dev_report_device_info">Информация об устройстве</string>
|
||||
<string name="dev_report_stacktrace">Трассировки стека</string>
|
||||
|
||||
@@ -536,6 +536,7 @@
|
||||
<string name="optional_contact_email">E-posta adresiniz (isteğe bağlı)</string>
|
||||
<string name="include_debug_report_crash">Çökme ile ilgili anonim verileri ekle</string>
|
||||
<string name="include_debug_report_feedback">Bu aygıtla ilgili anonim verileri ekle</string>
|
||||
<string name="dev_report_user_info">Kullanıcı bilgisi</string>
|
||||
<string name="dev_report_basic_info">Temel bilgi</string>
|
||||
<string name="dev_report_device_info">Aygıt bilgisi</string>
|
||||
<string name="dev_report_stacktrace">Yığın izleme</string>
|
||||
|
||||
@@ -526,6 +526,7 @@
|
||||
<string name="optional_contact_email">您的邮箱地址(选填)</string>
|
||||
<string name="include_debug_report_crash">包含关于本次崩溃的匿名数据</string>
|
||||
<string name="include_debug_report_feedback">包含关于本设备的匿名数据</string>
|
||||
<string name="dev_report_user_info">用户信息</string>
|
||||
<string name="dev_report_basic_info">基础信息</string>
|
||||
<string name="dev_report_device_info">设备信息</string>
|
||||
<string name="dev_report_stacktrace">堆栈追踪</string>
|
||||
|
||||
Reference in New Issue
Block a user