Compare commits

...

14 Commits

Author SHA1 Message Date
Grishka
957bc76dbb Merge branch 'l10n_master' 2023-11-23 00:27:58 +03:00
Grishka
1f5a28fb33 Add top margin to pre-reply shits 2023-11-23 00:27:24 +03:00
Grishka
045c58ce66 fix color 2023-11-22 18:26:56 +03:00
Grishka
e2dde7239f Render custom emojis in non-mutual pre-reply sheet 2023-11-22 18:06:14 +03:00
Eugen Rochko
512ad93eea New translations strings.xml (Turkish) 2023-11-22 00:00:30 +01:00
Grishka
19759023a4 Bump version 2023-11-21 22:34:51 +03:00
Grishka
714d3399ce Merge branch 'l10n_master' 2023-11-21 22:34:30 +03:00
Grishka
e1850e5282 Validate timezone and locale against what server supports
closes #654, AND-118
2023-11-21 22:31:26 +03:00
Grishka
a05c917b2c Assorted crash fixes 2023-11-21 21:46:41 +03:00
Grishka
8f3a9c265c Fix a rare crash when opening a notification 2023-11-21 21:27:43 +03:00
Grishka
6f1a33b76e Fix #741 2023-11-21 21:17:30 +03:00
Eugen Rochko
8f0451175f New translations strings.xml (Japanese) 2023-11-21 13:38:37 +01:00
Eugen Rochko
37a3a4f1c0 New translations strings.xml (Chinese Simplified) 2023-11-21 05:53:58 +01:00
Eugen Rochko
bd85746726 New translations strings.xml (Chinese Simplified) 2023-11-21 04:58:34 +01:00
17 changed files with 375 additions and 24 deletions

View File

@@ -9,8 +9,8 @@ android {
applicationId "org.joinmastodon.android"
minSdk 23
targetSdk 33
versionCode 78
versionName "2.2.2"
versionCode 80
versionName "2.2.4"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "da-rDK", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fa-rIR", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "ig-rNG", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "my-rMM", "nl-rNL", "no-rNO", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "ur-rIN", "vi-rVN", "zh-rCN", "zh-rTW"
}

View File

@@ -6,6 +6,7 @@ import android.app.Fragment;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.BadParcelableException;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
@@ -36,6 +37,8 @@ import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
public class MainActivity extends FragmentStackActivity{
private static final String TAG="MainActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState){
UiUtils.setUserPreferredTheme(this);
@@ -193,8 +196,14 @@ public class MainActivity extends FragmentStackActivity{
fragment.setArguments(args);
showFragmentClearingBackStack(fragment);
if(intent.getBooleanExtra("fromNotification", false) && intent.hasExtra("notification")){
Notification notification=Parcels.unwrap(intent.getParcelableExtra("notification"));
showFragmentForNotification(notification, session.getID());
// Parcelables might not be compatible across app versions so this protects against possible crashes
// when a notification was received, then the app was updated, and then the user opened the notification
try{
Notification notification=Parcels.unwrap(intent.getParcelableExtra("notification"));
showFragmentForNotification(notification, session.getID());
}catch(BadParcelableException x){
Log.w(TAG, x);
}
}else if(intent.getBooleanExtra("compose", false)){
showCompose();
}else if(Intent.ACTION_VIEW.equals(intent.getAction())){

View File

@@ -248,6 +248,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
@Override
public void photoViewerDismissed(){
currentPhotoViewer=null;
gridHolder.itemView.setHasTransientState(false);
}
@Override
@@ -259,6 +260,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
return gridHolder.getViewController(index);
}
});
gridHolder.itemView.setHasTransientState(true);
}
@Override
@@ -659,7 +661,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
new NonMutualPreReplySheet(getActivity(), notAgain->{
GlobalUserPreferences.optOutOfPreReplySheet(GlobalUserPreferences.PreReplySheetType.NON_MUTUAL, notAgain ? null : status.account, accountID);
proceed.run();
}, status.account).show();
}, status.account, accountID).show();
}else if(!GlobalUserPreferences.isOptedOutOfPreReplySheet(GlobalUserPreferences.PreReplySheetType.OLD_POST, null, null) &&
status.createdAt.isBefore(Instant.now().minus(90, ChronoUnit.DAYS))){
new OldPostPreReplySheet(getActivity(), notAgain->{

View File

@@ -314,6 +314,8 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
}
private void markAsRead(){
if(data.isEmpty())
return;
String id=data.get(0).id;
if(ObjectIdComparator.INSTANCE.compare(id, realUnreadMarker)>0){
new SaveMarkers(null, id).exec(accountID);

View File

@@ -1,18 +1,15 @@
package org.joinmastodon.android.fragments.onboarding;
import android.app.ProgressDialog;
import android.graphics.Typeface;
import android.os.Build;
import android.os.Bundle;
import android.os.LocaleList;
import android.text.Editable;
import android.text.Html;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.style.TypefaceSpan;
import android.text.style.URLSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -46,10 +43,13 @@ import org.jsoup.select.NodeVisitor;
import org.parceler.Parcels;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import androidx.annotation.Nullable;
@@ -58,7 +58,6 @@ import me.grishka.appkit.api.APIRequest;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
import me.grishka.appkit.fragments.ToolbarFragment;
import me.grishka.appkit.utils.V;
import me.grishka.appkit.views.FragmentRootLinearLayout;
public class SignupFragment extends ToolbarFragment{
@@ -79,6 +78,7 @@ public class SignupFragment extends ToolbarFragment{
private ProgressDialog progressDialog;
private HashSet<EditText> errorFields=new HashSet<>();
private ElevationOnScrollListener onScrollListener;
private Set<String> serverSupportedTimezones, serverSupportedLocales;
@Override
public void onCreate(Bundle savedInstanceState){
@@ -87,6 +87,8 @@ public class SignupFragment extends ToolbarFragment{
instance=Parcels.unwrap(getArguments().getParcelable("instance"));
createAppAndGetToken();
setTitle(R.string.signup_title);
serverSupportedTimezones=Arrays.stream(getResources().getStringArray(R.array.server_supported_timezones)).collect(Collectors.toSet());
serverSupportedLocales=Arrays.stream(getResources().getStringArray(R.array.server_supported_locales)).collect(Collectors.toSet());
}
@Nullable
@@ -190,7 +192,34 @@ public class SignupFragment extends ToolbarFragment{
edit.setError(null);
}
errorFields.clear();
new RegisterAccount(username, email, password.getText().toString(), getResources().getConfiguration().locale.getLanguage(), reason.getText().toString(), ZoneId.systemDefault().getId())
String locale=null;
String timezone=ZoneId.systemDefault().getId();
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){
LocaleList localeList=getResources().getConfiguration().getLocales();
for(int i=0;i<localeList.size();i++){
Locale l=localeList.get(i);
if(serverSupportedLocales.contains(l.toLanguageTag())){
locale=l.toLanguageTag();
break;
}else if(serverSupportedLocales.contains(l.getLanguage())){
locale=l.getLanguage();
break;
}
}
}else{
Locale l=getResources().getConfiguration().locale;
if(serverSupportedLocales.contains(l.toLanguageTag())){
locale=l.toLanguageTag();
}else if(serverSupportedLocales.contains(l.getLanguage())){
locale=l.getLanguage();
}
}
if(!serverSupportedTimezones.contains(timezone))
timezone=null;
new RegisterAccount(username, email, password.getText().toString(), locale, reason.getText().toString(), timezone)
.setCallback(new Callback<>(){
@Override
public void onSuccess(Token result){

View File

@@ -153,7 +153,7 @@ public class SettingsMainFragment extends BaseSettingsFragment<Void>{
}
private void onManageAccountsClick(ListItem<?> item){
new AccountSwitcherSheet(getActivity(), null).show();
new AccountSwitcherSheet(getActivity(), null).setOnLoggedOutCallback(()->loggedOut=true).show();
}
private void onLogOutClick(ListItem<?> item_){

View File

@@ -60,6 +60,7 @@ public class AccountSwitcherSheet extends BottomSheet{
private UsableRecyclerView list;
private List<WrappedAccount> accounts;
private ListImageLoaderWrapper imgLoader;
private Runnable onLoggedOutCallback;
public AccountSwitcherSheet(@NonNull Activity activity, @Nullable HomeFragment fragment){
super(activity);
@@ -95,6 +96,11 @@ public class AccountSwitcherSheet extends BottomSheet{
UiUtils.getThemeColor(activity, R.attr.colorM3Primary), 0.05f)), !UiUtils.isDarkTheme());
}
public AccountSwitcherSheet setOnLoggedOutCallback(Runnable onLoggedOutCallback){
this.onLoggedOutCallback=onLoggedOutCallback;
return this;
}
private void confirmLogOut(String accountID){
AccountSession session=AccountSessionManager.getInstance().getAccount(accountID);
new M3AlertDialogBuilder(activity)
@@ -113,7 +119,10 @@ public class AccountSwitcherSheet extends BottomSheet{
}
private void logOut(String accountID){
String activeAccount=AccountSessionManager.getInstance().getLastActiveAccountID();
AccountSessionManager.get(accountID).logOut(activity, ()->{
if(accountID.equals(activeAccount) && onLoggedOutCallback!=null)
onLoggedOutCallback.run();
dismiss();
((MainActivity)activity).restartHomeFragment();
});
@@ -133,6 +142,8 @@ public class AccountSwitcherSheet extends BottomSheet{
AccountSessionManager.getInstance().removeAccount(session.getID());
sessions.remove(session);
if(sessions.isEmpty()){
if(onLoggedOutCallback!=null)
onLoggedOutCallback.run();
progress.dismiss();
Nav.goClearingStack(activity, SplashFragment.class, null);
dismiss();
@@ -144,6 +155,8 @@ public class AccountSwitcherSheet extends BottomSheet{
AccountSessionManager.getInstance().removeAccount(session.getID());
sessions.remove(session);
if(sessions.isEmpty()){
if(onLoggedOutCallback!=null)
onLoggedOutCallback.run();
progress.dismiss();
Nav.goClearingStack(activity, SplashFragment.class, null);
dismiss();

View File

@@ -12,6 +12,7 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.ui.text.HtmlParser;
import org.joinmastodon.android.ui.utils.UiUtils;
@@ -25,7 +26,7 @@ public class NonMutualPreReplySheet extends PreReplySheet{
private boolean fullBioShown=false;
@SuppressLint("DefaultLocale")
public NonMutualPreReplySheet(@NonNull Context context, ResultListener resultListener, Account account){
public NonMutualPreReplySheet(@NonNull Context context, ResultListener resultListener, Account account, String accountID){
super(context, resultListener);
icon.setImageResource(R.drawable.ic_waving_hand_24px);
title.setText(R.string.non_mutual_sheet_title);
@@ -55,11 +56,16 @@ public class NonMutualPreReplySheet extends PreReplySheet{
name.setEllipsize(TextUtils.TruncateAt.END);
name.setTextAppearance(R.style.m3_title_medium);
name.setTextColor(UiUtils.getThemeColor(context, R.attr.colorM3OnSurface));
name.setText(account.displayName);
if(AccountSessionManager.get(accountID).getLocalPreferences().customEmojiInNames){
name.setText(HtmlParser.parseCustomEmoji(account.displayName, account.emojis));
UiUtils.loadCustomEmojiInTextView(name);
}else{
name.setText(account.displayName);
}
name.setGravity(Gravity.CENTER_VERTICAL | Gravity.START);
nameAndFields.addView(name, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, V.dp(24)));
if(!TextUtils.isEmpty(account.note)){
String strippedBio=HtmlParser.stripAndRemoveInvisibleSpans(account.note);
CharSequence strippedBio=HtmlParser.parseCustomEmoji(HtmlParser.stripAndRemoveInvisibleSpans(account.note), account.emojis);
TextView bioShort=new TextView(context);
bioShort.setTextAppearance(R.style.m3_body_medium);
bioShort.setTextColor(UiUtils.getThemeColor(context, R.attr.colorM3Secondary));
@@ -85,6 +91,8 @@ public class NonMutualPreReplySheet extends PreReplySheet{
bioShort.setVisibility(View.VISIBLE);
}
});
UiUtils.loadCustomEmojiInTextView(bioShort);
UiUtils.loadCustomEmojiInTextView(bioFull);
}else{
TextView username=new TextView(context);
username.setTextAppearance(R.style.m3_body_medium);

View File

@@ -5,6 +5,7 @@ import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -13,6 +14,7 @@ import org.joinmastodon.android.R;
import org.joinmastodon.android.ui.utils.UiUtils;
import androidx.annotation.NonNull;
import me.grishka.appkit.utils.V;
import me.grishka.appkit.views.BottomSheet;
public abstract class PreReplySheet extends BottomSheet{
@@ -26,6 +28,8 @@ public abstract class PreReplySheet extends BottomSheet{
View content=context.getSystemService(LayoutInflater.class).inflate(R.layout.sheet_pre_reply, null);
setContentView(content);
FrameLayout.LayoutParams lp=(FrameLayout.LayoutParams) content.getLayoutParams();
lp.topMargin=V.dp(72);
setNavigationBarBackground(new ColorDrawable(UiUtils.alphaBlendColors(UiUtils.getThemeColor(context, R.attr.colorM3Surface),
UiUtils.getThemeColor(context, R.attr.colorM3Primary), 0.05f)), !UiUtils.isDarkTheme());

View File

@@ -181,6 +181,8 @@ public class ToolbarDropdownMenuController{
public void resizeOnNextFrame(){
if(currentTransition!=null)
currentTransition.cancel();
if(windowView==null)
return;
int origBottom=menuContainer.getBottom();
menuContainer.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
@Override

View File

@@ -173,6 +173,7 @@ public class ReorderableLinearLayout extends LinearLayout implements CustomViewH
else
bottomSibling=null;
dragListener.onSwapItems(prevIndex, index);
final View draggedView=this.draggedView;
draggedView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
@Override
public boolean onPreDraw(){

View File

@@ -98,7 +98,7 @@ public class WrappingLinearLayout extends ViewGroup{
xOffset+=mlp.leftMargin+mlp.rightMargin;
}
firstInRow=false;
}else{
}else if(currentRowIndex<rowHeights.size()-1){
xOffset=rtl ? getPaddingRight() : getPaddingLeft();
yOffset+=rowHeight+verticalGap;
currentRowIndex++;

View File

@@ -48,6 +48,7 @@
android:layout_below="@id/title"
android:layout_toEndOf="@id/icon"
android:textAppearance="@style/m3_body_medium"
android:textColor="?colorM3OnSurfaceVariant"
tools:text="@string/non_mutual_sheet_text"/>
<LinearLayout

View File

@@ -599,6 +599,7 @@
<string name="list_no_members">まだメンバーがいません</string>
<string name="list_find_users">追加したいユーザーを探す</string>
<string name="reply_to_user">%s に返信</string>
<string name="posted_at">%s に投稿しました</string>
<string name="non_mutual_sheet_title">新しい関係を始めよう!</string>
<string name="non_mutual_sheet_text">相互フォローでない誰かに返信しようとしているようです。素晴らしい第一印象を与えましょう。</string>
<string name="got_it">了解</string>

View File

@@ -159,17 +159,17 @@
<string name="signup_title">Hesap oluştur</string>
<string name="display_name">Ad</string>
<string name="username">Kullanıcı adı</string>
<string name="email">Eposta</string>
<string name="email">E-Posta</string>
<string name="password">Parola</string>
<string name="confirm_password">Parolayı doğrula</string>
<string name="password_note">Daha güçlü parolalar için parolanıza büyük harfler, özel karakterler ve sayılar ekleyin.</string>
<string name="category_general">Genel</string>
<string name="confirm_email_title">E-posta gelen kutunuzu kontrol edin</string>
<string name="confirm_email_title">E-Posta gelen kutunuzu kontrol edin</string>
<!-- %s is the email address -->
<string name="confirm_email_subtitle">%s adresini doğrulamak için size gönderdiğimiz bağlantıya dokunun. Hemen burada bekleyeceğiz.</string>
<string name="confirm_email_didnt_get">Bağlantı gelmedi mi?</string>
<string name="resend">Yeniden gönder</string>
<string name="open_email_app">Eposta uygulamasını</string>
<string name="open_email_app">E-Posta uygulamasını</string>
<string name="resent_email">Onay epostası gönderildi</string>
<string name="compose_hint">Aklınızdan geçenleri yazın veya yapıştırın</string>
<string name="content_warning">İçerik uyarısı</string>
@@ -181,12 +181,12 @@
<string name="recent_searches">Son aramalar</string>
<string name="skip">Atla</string>
<string name="notification_type_follow">Yeni takipçiler</string>
<string name="notification_type_favorite">Favoriler</string>
<string name="notification_type_favorite">Gözdeler</string>
<string name="notification_type_reblog">Yinelemeler</string>
<string name="notification_type_mention">Bahsetmeler</string>
<string name="notification_type_poll">Anketler</string>
<string name="choose_account">Hesap seç</string>
<string name="err_not_logged_in">Lütfen önce Mastodon\'da oturum açın</string>
<string name="err_not_logged_in">Lütfen önce Mastodonda oturum açın</string>
<plurals name="cant_add_more_than_x_attachments">
<item quantity="one">%d adetten fazla medya ekleyemezsiniz</item>
<item quantity="other">%d adetten fazla medya ekleyemezsiniz</item>
@@ -245,10 +245,10 @@
<string name="downloading">İndiriliyor…</string>
<string name="no_app_to_handle_action">Bu eylemi gerçekleştirebilecek bir uygulama bulunmuyor</string>
<string name="local_timeline">Yerel</string>
<string name="trending_posts_info_banner">Bunlar, Mastodon\'da ilgi gören gönderilerdir.</string>
<string name="trending_posts_info_banner">Bunlar, Mastodon\'da ilgi gören gönderiler.</string>
<string name="trending_links_info_banner">Bunlar Mastodon\'da konuşulan haberler.</string>
<!-- %s is the server domain -->
<string name="local_timeline_info_banner">Bunlar, sunucunuzdaki (%s) tüm kullanıcıların gönderileridir.</string>
<string name="local_timeline_info_banner">Bunlar, sunucunuzdaki (%s) tüm kullanıcıların gönderileri.</string>
<string name="recommended_accounts_info_banner">Takip ettiğiniz hesaplara göre bu hesapları beğenebilirsiniz.</string>
<string name="see_new_posts">Yeni gönderiler</string>
<string name="load_missing_posts">Daha fazlası</string>
@@ -620,10 +620,34 @@
<string name="no_lists_title">Ev beslemenizi Listeler ile düzenleyin</string>
<string name="no_lists_subtitle">Sizinki burada görüntülenecek</string>
<string name="manage_accounts">Hesap ekleme veya değiştirme</string>
<plurals name="x_posts_recently">
<item quantity="one">%,d son zamanlardaki yayın</item>
<item quantity="other">%,d yakın zamanda gönderilerim</item>
</plurals>
<string name="create_list">Liste oluştur</string>
<string name="step_x_of_y">Step %1$d ile %2$d</string>
<string name="create">Oluştur</string>
<string name="manage_list_members">Liste üyelerini yönet</string>
<string name="list_no_members">Henüz üye yok.</string>
<string name="list_find_users">Eklenecek kullanıcıları bul</string>
<string name="reply_to_user">Yanıtla %s</string>
<string name="posted_at">%s tarafından gönderildi</string>
<string name="non_mutual_sheet_title">Merhaba, yeni bağlantı!</string>
<string name="non_mutual_sheet_text">Görünüşe göre henüz ortak bağlantınız olmayan birine yanıt vermek üzeresiniz. Harika bir ilk izlenim bırakınız.</string>
<string name="got_it">Anladım</string>
<string name="dont_remind_again">Bana tekrar hatırlatmayınız.</string>
<!-- %s is a time interval ("5 months") -->
<string name="old_post_sheet_title">Bu gönderi %s eski</string>
<string name="old_post_sheet_text">Hâlâ yanıt verebilirsiniz, ancak konuyla ilgili olmayabilir.</string>
<string name="more_than_two_years">2 yıldan fazla süredir</string>
<string name="non_mutual_title1">Saygılı ve ilgili &amp; plunuz</string>
<string name="non_mutual_text1">Yanıtınızın nazik ve konuyla ilgili olduğundan emin olunuz.</string>
<string name="non_mutual_title2">Nezaketle sarıl</string>
<string name="non_mutual_text2">Olumlu bir yaklaşım her zaman takdir edilir.</string>
<string name="non_mutual_title3">ık olunuz</string>
<string name="non_mutual_text3">Herkesin konuşma tarzı kendine özgüdür. Uyum sağlamaya hazır olunuz.</string>
<string name="make_profile_discoverable">Profilimi keşfedilebilir hale getiriniz</string>
<string name="discoverability">Keşfedebilirlik</string>
<string name="discoverability_help">Mastodon\'da keşfedilebilirliği tercih ettiğinizde, gönderileriniz arama sonuçlarında ve trendlerde görünebilir.\n\nProfiliniz sizinle benzer ilgi alanlarına sahip kişilere önerilebilir.\n\nBirisi sizi isminizle ararsa, devre dışı bırakma işlemi profilinizi gizlemez.</string>
<string name="app_version_copied">Sürüm numarası panoya kopyalandı</string>
</resources>

View File

@@ -105,7 +105,7 @@
<string name="log_out">注销</string>
<string name="add_account">添加账户</string>
<string name="search_hint">搜索</string>
<string name="hashtags">话题</string>
<string name="hashtags">标签</string>
<string name="news">新闻</string>
<string name="for_you">推荐关注</string>
<string name="all_notifications">全部</string>
@@ -546,8 +546,26 @@
<string name="settings_privacy">隐私与可达性</string>
<string name="settings_discoverable">在发现算法中展示您的个人资料和嘟文</string>
<string name="settings_indexable">将您的公开嘟文纳入搜索范围</string>
<string name="error_playing_video">播放视频出错</string>
<string name="timeline_following">主页</string>
<string name="lists">列表</string>
<string name="followed_hashtags">关注的标签</string>
<string name="manage_hashtags">管理标签</string>
<!-- Screen reader description for the menu on the home timeline screen -->
<string name="dropdown_menu">下拉菜单</string>
<string name="edit_list">编辑列表</string>
<string name="list_members">列表成员</string>
<!-- %s is the name of the list -->
<string name="list_exclusive_subtitle">列表成员不显示在主页时间线上,以免重复看到嘟文</string>
<string name="list_name">列表名</string>
<string name="remove">移除</string>
<!-- %s is a username -->
<string name="confirm_remove_list_member">移除成员?</string>
<string name="manage_accounts">管理账户</string>
<string name="create_list">创建列表</string>
<string name="create">创建</string>
<string name="dont_remind_again">不再提醒</string>
<!-- %s is a time interval ("5 months") -->
<string name="non_mutual_title1">保持尊重 &amp; 切题</string>
<string name="non_mutual_text1">确保您的回复礼貌且切题。</string>
</resources>

View File

@@ -0,0 +1,237 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="server_supported_timezones" translatable="false">
<item>Africa/Algiers</item>
<item>Africa/Cairo</item>
<item>Africa/Casablanca</item>
<item>Africa/Harare</item>
<item>Africa/Johannesburg</item>
<item>Africa/Monrovia</item>
<item>Africa/Nairobi</item>
<item>America/Argentina/Buenos_Aires</item>
<item>America/Bogota</item>
<item>America/Caracas</item>
<item>America/Chicago</item>
<item>America/Chihuahua</item>
<item>America/Denver</item>
<item>America/Godthab</item>
<item>America/Guatemala</item>
<item>America/Guyana</item>
<item>America/Halifax</item>
<item>America/Indiana/Indianapolis</item>
<item>America/Juneau</item>
<item>America/La_Paz</item>
<item>America/Lima</item>
<item>America/Los_Angeles</item>
<item>America/Mazatlan</item>
<item>America/Mexico_City</item>
<item>America/Monterrey</item>
<item>America/Montevideo</item>
<item>America/New_York</item>
<item>America/Phoenix</item>
<item>America/Puerto_Rico</item>
<item>America/Regina</item>
<item>America/Santiago</item>
<item>America/Sao_Paulo</item>
<item>America/St_Johns</item>
<item>America/Tijuana</item>
<item>Asia/Almaty</item>
<item>Asia/Baghdad</item>
<item>Asia/Baku</item>
<item>Asia/Bangkok</item>
<item>Asia/Chongqing</item>
<item>Asia/Colombo</item>
<item>Asia/Dhaka</item>
<item>Asia/Hong_Kong</item>
<item>Asia/Irkutsk</item>
<item>Asia/Jakarta</item>
<item>Asia/Jerusalem</item>
<item>Asia/Kabul</item>
<item>Asia/Kamchatka</item>
<item>Asia/Karachi</item>
<item>Asia/Kathmandu</item>
<item>Asia/Kolkata</item>
<item>Asia/Krasnoyarsk</item>
<item>Asia/Kuala_Lumpur</item>
<item>Asia/Kuwait</item>
<item>Asia/Magadan</item>
<item>Asia/Muscat</item>
<item>Asia/Novosibirsk</item>
<item>Asia/Rangoon</item>
<item>Asia/Riyadh</item>
<item>Asia/Seoul</item>
<item>Asia/Shanghai</item>
<item>Asia/Singapore</item>
<item>Asia/Srednekolymsk</item>
<item>Asia/Taipei</item>
<item>Asia/Tashkent</item>
<item>Asia/Tbilisi</item>
<item>Asia/Tehran</item>
<item>Asia/Tokyo</item>
<item>Asia/Ulaanbaatar</item>
<item>Asia/Urumqi</item>
<item>Asia/Vladivostok</item>
<item>Asia/Yakutsk</item>
<item>Asia/Yekaterinburg</item>
<item>Asia/Yerevan</item>
<item>Atlantic/Azores</item>
<item>Atlantic/Cape_Verde</item>
<item>Atlantic/South_Georgia</item>
<item>Australia/Adelaide</item>
<item>Australia/Brisbane</item>
<item>Australia/Canberra</item>
<item>Australia/Darwin</item>
<item>Australia/Hobart</item>
<item>Australia/Melbourne</item>
<item>Australia/Perth</item>
<item>Australia/Sydney</item>
<item>Etc/GMT+12</item>
<item>Etc/UTC</item>
<item>Europe/Amsterdam</item>
<item>Europe/Athens</item>
<item>Europe/Belgrade</item>
<item>Europe/Berlin</item>
<item>Europe/Bratislava</item>
<item>Europe/Brussels</item>
<item>Europe/Bucharest</item>
<item>Europe/Budapest</item>
<item>Europe/Copenhagen</item>
<item>Europe/Dublin</item>
<item>Europe/Helsinki</item>
<item>Europe/Istanbul</item>
<item>Europe/Kaliningrad</item>
<item>Europe/Kiev</item>
<item>Europe/Lisbon</item>
<item>Europe/Ljubljana</item>
<item>Europe/London</item>
<item>Europe/Madrid</item>
<item>Europe/Minsk</item>
<item>Europe/Moscow</item>
<item>Europe/Paris</item>
<item>Europe/Prague</item>
<item>Europe/Riga</item>
<item>Europe/Rome</item>
<item>Europe/Samara</item>
<item>Europe/Sarajevo</item>
<item>Europe/Skopje</item>
<item>Europe/Sofia</item>
<item>Europe/Stockholm</item>
<item>Europe/Tallinn</item>
<item>Europe/Vienna</item>
<item>Europe/Vilnius</item>
<item>Europe/Volgograd</item>
<item>Europe/Warsaw</item>
<item>Europe/Zagreb</item>
<item>Europe/Zurich</item>
<item>Pacific/Apia</item>
<item>Pacific/Auckland</item>
<item>Pacific/Chatham</item>
<item>Pacific/Fakaofo</item>
<item>Pacific/Fiji</item>
<item>Pacific/Guadalcanal</item>
<item>Pacific/Guam</item>
<item>Pacific/Honolulu</item>
<item>Pacific/Majuro</item>
<item>Pacific/Midway</item>
<item>Pacific/Noumea</item>
<item>Pacific/Pago_Pago</item>
<item>Pacific/Port_Moresby</item>
<item>Pacific/Tongatapu</item>
</string-array>
<string-array name="server_supported_locales" translatable="false">
<item>af</item>
<item>an</item>
<item>ar</item>
<item>ast</item>
<item>be</item>
<item>bg</item>
<item>bn</item>
<item>br</item>
<item>bs</item>
<item>ca</item>
<item>ckb</item>
<item>co</item>
<item>cs</item>
<item>cy</item>
<item>da</item>
<item>de</item>
<item>el</item>
<item>en</item>
<item>en-GB</item>
<item>eo</item>
<item>es</item>
<item>es-AR</item>
<item>es-MX</item>
<item>et</item>
<item>eu</item>
<item>fa</item>
<item>fi</item>
<item>fo</item>
<item>fr</item>
<item>fr-QC</item>
<item>fy</item>
<item>ga</item>
<item>gd</item>
<item>gl</item>
<item>he</item>
<item>hi</item>
<item>hr</item>
<item>hu</item>
<item>hy</item>
<item>id</item>
<item>ig</item>
<item>io</item>
<item>is</item>
<item>it</item>
<item>ja</item>
<item>ka</item>
<item>kab</item>
<item>kk</item>
<item>kn</item>
<item>ko</item>
<item>ku</item>
<item>kw</item>
<item>la</item>
<item>lt</item>
<item>lv</item>
<item>mk</item>
<item>ml</item>
<item>mr</item>
<item>ms</item>
<item>my</item>
<item>nl</item>
<item>nn</item>
<item>no</item>
<item>oc</item>
<item>pa</item>
<item>pl</item>
<item>pt-BR</item>
<item>pt-PT</item>
<item>ro</item>
<item>ru</item>
<item>sa</item>
<item>sc</item>
<item>sco</item>
<item>si</item>
<item>sk</item>
<item>sl</item>
<item>sq</item>
<item>sr</item>
<item>sr-Latn</item>
<item>sv</item>
<item>szl</item>
<item>ta</item>
<item>te</item>
<item>th</item>
<item>tr</item>
<item>tt</item>
<item>ug</item>
<item>uk</item>
<item>ur</item>
<item>vi</item>
<item>zgh</item>
<item>zh-CN</item>
<item>zh-HK</item>
<item>zh-TW</item>
</string-array>
</resources>