From 690e612f8bb4c7a607658552c5530d9825678246 Mon Sep 17 00:00:00 2001 From: Levi Bard Date: Sun, 11 Nov 2018 19:25:45 +0100 Subject: [PATCH] Media description improvements (#898) * Enforce 420-character limit on media descriptions in the UI * Persist media descriptions with drafts * Defer media description update until after upload finishes * Make description field 2 lines for better visibility of hint text * Reuse Gson instance * Force retranslation of modified string "hint_describe_for_visually_impaired" * Add bounds check when reading serialized media descriptions --- .../keylesspalace/tusky/ComposeActivity.java | 88 +++++++++++++++---- .../tusky/SavedTootActivity.java | 1 + .../keylesspalace/tusky/TuskyApplication.java | 2 +- .../keylesspalace/tusky/db/AppDatabase.java | 9 +- .../keylesspalace/tusky/db/TootEntity.java | 10 ++- .../receiver/SendStatusBroadcastReceiver.kt | 1 + .../tusky/service/SendTootService.kt | 4 + .../tusky/util/SaveTootHelper.java | 13 ++- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-cy/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-oc/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-ta/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rMO/strings.xml | 1 - app/src/main/res/values-zh-rSG/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/strings.xml | 2 +- 30 files changed, 103 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java b/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java index ddee3f37a..b76ad7b10 100644 --- a/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java @@ -61,6 +61,7 @@ import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.Editable; +import android.text.InputFilter; import android.text.InputType; import android.text.TextUtils; import android.text.TextWatcher; @@ -172,6 +173,7 @@ public final class ComposeActivity private static final String SAVED_TOOT_UID_EXTRA = "saved_toot_uid"; private static final String SAVED_TOOT_TEXT_EXTRA = "saved_toot_text"; private static final String SAVED_JSON_URLS_EXTRA = "saved_json_urls"; + private static final String SAVED_JSON_DESCRIPTIONS_EXTRA = "saved_json_descriptions"; private static final String SAVED_TOOT_VISIBILITY_EXTRA = "saved_toot_visibility"; private static final String IN_REPLY_TO_ID_EXTRA = "in_reply_to_id"; private static final String REPLY_VISIBILITY_EXTRA = "reply_visibilty"; @@ -181,6 +183,8 @@ public final class ComposeActivity private static final String REPLYING_STATUS_CONTENT_EXTRA = "replying_status_content"; // Mastodon only counts URLs as this long in terms of status character limits static final int MAXIMUM_URL_LENGTH = 23; + // https://github.com/tootsuite/mastodon/blob/1656663/app/models/media_attachment.rb#L94 + private static final int MEDIA_DESCRIPTION_CHARACTER_LIMIT = 420; @Inject public MastodonApi mastodonApi; @@ -226,6 +230,7 @@ public final class ComposeActivity private @Px int thumbnailViewSize; private SaveTootHelper saveTootHelper; + private Gson gson = new Gson(); @Override public void onCreate(Bundle savedInstanceState) { @@ -396,6 +401,7 @@ public final class ComposeActivity String[] mentionedUsernames = null; ArrayList loadedDraftMediaUris = null; + ArrayList loadedDraftMediaDescriptions = null; inReplyToId = null; if (intent != null) { @@ -428,10 +434,16 @@ public final class ComposeActivity textEditor.setText(savedTootText); } + // try to redo a list of media String savedJsonUrls = intent.getStringExtra(SAVED_JSON_URLS_EXTRA); + String savedJsonDescriptions = intent.getStringExtra(SAVED_JSON_DESCRIPTIONS_EXTRA); if (!TextUtils.isEmpty(savedJsonUrls)) { - // try to redo a list of media - loadedDraftMediaUris = new Gson().fromJson(savedJsonUrls, + loadedDraftMediaUris = gson.fromJson(savedJsonUrls, + new TypeToken>() { + }.getType()); + } + if (!TextUtils.isEmpty(savedJsonDescriptions)) { + loadedDraftMediaDescriptions = gson.fromJson(savedJsonDescriptions, new TypeToken>() { }.getType()); } @@ -550,10 +562,14 @@ public final class ComposeActivity // These can only be added after everything affected by the media queue is initialized. if (!ListUtils.isEmpty(loadedDraftMediaUris)) { - for (String uriString : loadedDraftMediaUris) { - Uri uri = Uri.parse(uriString); + for (int mediaIndex = 0; mediaIndex < loadedDraftMediaUris.size(); ++mediaIndex) { + Uri uri = Uri.parse(loadedDraftMediaUris.get(mediaIndex)); long mediaSize = getMediaSize(getContentResolver(), uri); - pickMedia(uri, mediaSize); + String description = null; + if (loadedDraftMediaDescriptions != null && mediaIndex < loadedDraftMediaDescriptions.size()) { + description = loadedDraftMediaDescriptions.get(mediaIndex); + } + pickMedia(uri, mediaSize, description); } } else if (savedMediaQueued != null) { for (SavedQueuedMedia item : savedMediaQueued) { @@ -593,7 +609,7 @@ public final class ComposeActivity } for (Uri uri : uriList) { long mediaSize = getMediaSize(getContentResolver(), uri); - pickMedia(uri, mediaSize); + pickMedia(uri, mediaSize, null); } } else if (type.equals("text/plain")) { String action = intent.getAction(); @@ -610,6 +626,9 @@ public final class ComposeActivity } } } + for (QueuedMedia item : mediaQueued) { + item.preview.setChecked(!TextUtils.isEmpty(item.description)); + } textEditor.requestFocus(); } @@ -880,7 +899,7 @@ public final class ComposeActivity } else { mediaSize = MEDIA_SIZE_UNKNOWN; } - pickMedia(uri, mediaSize); + pickMedia(uri, mediaSize, null); currentInputContentInfo = inputContentInfo; currentFlags = flags; @@ -892,13 +911,15 @@ public final class ComposeActivity String spoilerText) { ArrayList mediaIds = new ArrayList<>(); ArrayList mediaUris = new ArrayList<>(); + ArrayList mediaDescriptions = new ArrayList<>(); for (QueuedMedia item : mediaQueued) { mediaIds.add(item.id); mediaUris.add(item.uri); + mediaDescriptions.add(item.description); } Intent sendIntent = SendTootService.sendTootIntent(this, content, spoilerText, - visibility, sensitive, mediaIds, mediaUris, inReplyToId, + visibility, sensitive, mediaIds, mediaUris, mediaDescriptions, inReplyToId, getIntent().getStringExtra(REPLYING_STATUS_CONTENT_EXTRA), getIntent().getStringExtra(REPLYING_STATUS_AUTHOR_USERNAME_EXTRA), getIntent().getStringExtra(SAVED_JSON_URLS_EXTRA), @@ -1051,8 +1072,8 @@ public final class ComposeActivity colorActive ? android.R.attr.textColorTertiary : R.attr.compose_media_button_disabled_tint); } - private void addMediaToQueue(QueuedMedia.Type type, Bitmap preview, Uri uri, long mediaSize) { - addMediaToQueue(null, type, preview, uri, mediaSize, null, null); + private void addMediaToQueue(QueuedMedia.Type type, Bitmap preview, Uri uri, long mediaSize, @Nullable String description) { + addMediaToQueue(null, type, preview, uri, mediaSize, null, description); } private void addMediaToQueue(@Nullable String id, QueuedMedia.Type type, Bitmap preview, Uri uri, @@ -1161,16 +1182,17 @@ public final class ComposeActivity ((LinearLayout.LayoutParams) imageView.getLayoutParams()).setMargins(0, margin, 0, 0); EditText input = new EditText(this); - input.setHint(R.string.hint_describe_for_visually_impaired); + input.setHint(getString(R.string.hint_describe_for_visually_impaired, MEDIA_DESCRIPTION_CHARACTER_LIMIT)); dialogLayout.addView(input); ((LinearLayout.LayoutParams) input.getLayoutParams()).setMargins(margin, margin, margin, margin); - input.setLines(1); + input.setLines(2); input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); input.setText(item.description); + input.setFilters(new InputFilter[] { new InputFilter.LengthFilter(MEDIA_DESCRIPTION_CHARACTER_LIMIT) }); DialogInterface.OnClickListener okListener = (dialog, which) -> { - mastodonApi.updateMedia(item.id, input.getText().toString()) - .enqueue(new Callback() { + Runnable updateDescription = () -> { + mastodonApi.updateMedia(item.id, input.getText().toString()).enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { Attachment attachment = response.body(); @@ -1181,13 +1203,23 @@ public final class ComposeActivity } else { showFailedCaptionMessage(); } + item.updateDescription = null; } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { showFailedCaptionMessage(); + item.updateDescription = null; } }); + }; + + if (item.readyStage == QueuedMedia.ReadyStage.UPLOADED) { + updateDescription.run(); + } else { + // media is still uploading, queue description update for when it finishes + item.updateDescription = updateDescription; + } }; AlertDialog dialog = new AlertDialog.Builder(this) @@ -1301,6 +1333,9 @@ public final class ComposeActivity public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { if (response.isSuccessful()) { onUploadSuccess(item, response.body()); + if (item.updateDescription != null) { + item.updateDescription.run(); + } } else { Log.d(TAG, "Upload request failed. " + response.message()); onUploadFailure(item, call.isCanceled()); @@ -1311,6 +1346,7 @@ public final class ComposeActivity public void onFailure(@NonNull Call call, @NonNull Throwable t) { Log.d(TAG, "Upload request failed. " + t.getMessage()); onUploadFailure(item, call.isCanceled()); + item.updateDescription = null; } }); } @@ -1355,15 +1391,15 @@ public final class ComposeActivity if (resultCode == RESULT_OK && requestCode == MEDIA_PICK_RESULT && intent != null) { Uri uri = intent.getData(); long mediaSize = getMediaSize(getContentResolver(), uri); - pickMedia(uri, mediaSize); + pickMedia(uri, mediaSize, null); } else if (resultCode == RESULT_OK && requestCode == MEDIA_TAKE_PHOTO_RESULT) { long mediaSize = getMediaSize(getContentResolver(), photoUploadUri); - pickMedia(photoUploadUri, mediaSize); + pickMedia(photoUploadUri, mediaSize, null); } } - private void pickMedia(Uri uri, long mediaSize) { + private void pickMedia(Uri uri, long mediaSize, String description) { if (mediaSize == MEDIA_SIZE_UNKNOWN) { displayTransientError(R.string.error_media_upload_opening); return; @@ -1385,7 +1421,7 @@ public final class ComposeActivity } Bitmap bitmap = getVideoThumbnail(this, uri, thumbnailViewSize); if (bitmap != null) { - addMediaToQueue(QueuedMedia.Type.VIDEO, bitmap, uri, mediaSize); + addMediaToQueue(QueuedMedia.Type.VIDEO, bitmap, uri, mediaSize, description); } else { displayTransientError(R.string.error_media_upload_opening); } @@ -1394,7 +1430,7 @@ public final class ComposeActivity case "image": { Bitmap bitmap = getImageThumbnail(contentResolver, uri, thumbnailViewSize); if (bitmap != null) { - addMediaToQueue(QueuedMedia.Type.IMAGE, bitmap, uri, mediaSize); + addMediaToQueue(QueuedMedia.Type.IMAGE, bitmap, uri, mediaSize, description); } else { displayTransientError(R.string.error_media_upload_opening); } @@ -1466,14 +1502,17 @@ public final class ComposeActivity private void saveDraftAndFinish() { ArrayList mediaUris = new ArrayList<>(); + ArrayList mediaDescriptions = new ArrayList<>(); for (QueuedMedia item : mediaQueued) { mediaUris.add(item.uri.toString()); + mediaDescriptions.add(item.description); } saveTootHelper.saveToot(textEditor.getText().toString(), contentWarningEditor.getText().toString(), getIntent().getStringExtra("saved_json_urls"), mediaUris, + mediaDescriptions, savedTootUid, inReplyToId, getIntent().getStringExtra(REPLYING_STATUS_CONTENT_EXTRA), @@ -1543,6 +1582,7 @@ public final class ComposeActivity ReadyStage readyStage; long mediaSize; String description; + Runnable updateDescription; QueuedMedia(Type type, Uri uri, ProgressImageView preview, long mediaSize, String description) { @@ -1628,6 +1668,8 @@ public final class ComposeActivity @Nullable private String savedJsonUrls; @Nullable + private String savedJsonDescriptions; + @Nullable private Collection mentionedUsernames; @Nullable private String inReplyToId; @@ -1657,6 +1699,11 @@ public final class ComposeActivity return this; } + public IntentBuilder savedJsonDescriptions(String jsonDescriptions) { + this.savedJsonDescriptions = jsonDescriptions; + return this; + } + public IntentBuilder savedVisibility(Status.Visibility savedVisibility) { this.savedVisibility = savedVisibility; return this; @@ -1704,6 +1751,9 @@ public final class ComposeActivity if (savedJsonUrls != null) { intent.putExtra(SAVED_JSON_URLS_EXTRA, savedJsonUrls); } + if (savedJsonDescriptions != null) { + intent.putExtra(SAVED_JSON_DESCRIPTIONS_EXTRA, savedJsonDescriptions); + } if (mentionedUsernames != null) { String[] usernames = mentionedUsernames.toArray(new String[0]); intent.putExtra(MENTIONED_USERNAMES_EXTRA, usernames); diff --git a/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java b/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java index b67418e62..c6d5f2a07 100644 --- a/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java @@ -163,6 +163,7 @@ public final class SavedTootActivity extends BaseActivity implements SavedTootAd .savedTootText(item.getText()) .contentWarning(item.getContentWarning()) .savedJsonUrls(item.getUrls()) + .savedJsonDescriptions(item.getDescriptions()) .inReplyToId(item.getInReplyToId()) .repyingStatusAuthor(item.getInReplyToUsername()) .replyingStatusContent(item.getInReplyToText()) diff --git a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java index 105e098e2..04ae5ab14 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java +++ b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java @@ -70,7 +70,7 @@ public class TuskyApplication extends Application implements HasActivityInjector appDatabase = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "tuskyDB") .allowMainThreadQueries() .addMigrations(AppDatabase.MIGRATION_2_3, AppDatabase.MIGRATION_3_4, AppDatabase.MIGRATION_4_5, - AppDatabase.MIGRATION_5_6, AppDatabase.MIGRATION_6_7, AppDatabase.MIGRATION_7_8) + AppDatabase.MIGRATION_5_6, AppDatabase.MIGRATION_6_7, AppDatabase.MIGRATION_7_8, AppDatabase.MIGRATION_8_9) .build(); accountManager = new AccountManager(appDatabase); serviceLocator = new ServiceLocator() { diff --git a/app/src/main/java/com/keylesspalace/tusky/db/AppDatabase.java b/app/src/main/java/com/keylesspalace/tusky/db/AppDatabase.java index b0106a449..8624d8d61 100644 --- a/app/src/main/java/com/keylesspalace/tusky/db/AppDatabase.java +++ b/app/src/main/java/com/keylesspalace/tusky/db/AppDatabase.java @@ -25,7 +25,7 @@ import android.support.annotation.NonNull; * DB version & declare DAO */ -@Database(entities = {TootEntity.class, AccountEntity.class, InstanceEntity.class}, version = 8, exportSchema = false) +@Database(entities = {TootEntity.class, AccountEntity.class, InstanceEntity.class}, version = 9, exportSchema = false) public abstract class AppDatabase extends RoomDatabase { public abstract TootDao tootDao(); @@ -98,4 +98,11 @@ public abstract class AppDatabase extends RoomDatabase { database.execSQL("ALTER TABLE `AccountEntity` ADD COLUMN `emojis` TEXT NOT NULL DEFAULT '[]'"); } }; + + public static final Migration MIGRATION_8_9 = new Migration(8, 9) { + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("ALTER TABLE `TootEntity` ADD COLUMN `descriptions` TEXT DEFAULT '[]'"); + } + }; } \ No newline at end of file diff --git a/app/src/main/java/com/keylesspalace/tusky/db/TootEntity.java b/app/src/main/java/com/keylesspalace/tusky/db/TootEntity.java index 695a5b3c3..9c304a329 100644 --- a/app/src/main/java/com/keylesspalace/tusky/db/TootEntity.java +++ b/app/src/main/java/com/keylesspalace/tusky/db/TootEntity.java @@ -40,6 +40,9 @@ public class TootEntity { @ColumnInfo(name = "urls") private final String urls; + @ColumnInfo(name = "descriptions") + private final String descriptions; + @ColumnInfo(name = "contentWarning") private final String contentWarning; @@ -57,12 +60,13 @@ public class TootEntity { @ColumnInfo(name = "visibility") private final Status.Visibility visibility; - public TootEntity(int uid, String text, String urls, String contentWarning, String inReplyToId, + public TootEntity(int uid, String text, String urls, String descriptions, String contentWarning, String inReplyToId, @Nullable String inReplyToText, @Nullable String inReplyToUsername, Status.Visibility visibility) { this.uid = uid; this.text = text; this.urls = urls; + this.descriptions = descriptions; this.contentWarning = contentWarning; this.inReplyToId = inReplyToId; this.inReplyToText = inReplyToText; @@ -86,6 +90,10 @@ public class TootEntity { return urls; } + public String getDescriptions() { + return descriptions; + } + public String getInReplyToId() { return inReplyToId; } diff --git a/app/src/main/java/com/keylesspalace/tusky/receiver/SendStatusBroadcastReceiver.kt b/app/src/main/java/com/keylesspalace/tusky/receiver/SendStatusBroadcastReceiver.kt index 78088c6b6..415e557a4 100644 --- a/app/src/main/java/com/keylesspalace/tusky/receiver/SendStatusBroadcastReceiver.kt +++ b/app/src/main/java/com/keylesspalace/tusky/receiver/SendStatusBroadcastReceiver.kt @@ -92,6 +92,7 @@ class SendStatusBroadcastReceiver : BroadcastReceiver() { false, emptyList(), emptyList(), + emptyList(), citedStatusId, null, null, diff --git a/app/src/main/java/com/keylesspalace/tusky/service/SendTootService.kt b/app/src/main/java/com/keylesspalace/tusky/service/SendTootService.kt index 112a2ef82..b68917d84 100644 --- a/app/src/main/java/com/keylesspalace/tusky/service/SendTootService.kt +++ b/app/src/main/java/com/keylesspalace/tusky/service/SendTootService.kt @@ -238,6 +238,7 @@ class SendTootService : Service(), Injectable { toot.warningText, toot.savedJsonUrls, toot.mediaUris, + toot.mediaDescriptions, toot.savedTootUid, toot.inReplyToId, toot.replyingStatusContent, @@ -274,6 +275,7 @@ class SendTootService : Service(), Injectable { sensitive: Boolean, mediaIds: List, mediaUris: List, + mediaDescriptions: List, inReplyToId: String?, replyingStatusContent: String?, replyingStatusAuthorUsername: String?, @@ -291,6 +293,7 @@ class SendTootService : Service(), Injectable { sensitive, mediaIds, mediaUris.map { it.toString() }, + mediaDescriptions, inReplyToId, replyingStatusContent, replyingStatusAuthorUsername, @@ -332,6 +335,7 @@ data class TootToSend(val text: String, val sensitive: Boolean, val mediaIds: List, val mediaUris: List, + val mediaDescriptions: List, val inReplyToId: String?, val replyingStatusContent: String?, val replyingStatusAuthorUsername: String?, diff --git a/app/src/main/java/com/keylesspalace/tusky/util/SaveTootHelper.java b/app/src/main/java/com/keylesspalace/tusky/util/SaveTootHelper.java index 87e12da0f..5fe87c520 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/SaveTootHelper.java +++ b/app/src/main/java/com/keylesspalace/tusky/util/SaveTootHelper.java @@ -32,6 +32,7 @@ public final class SaveTootHelper { private TootDao tootDao; private Context context; + private Gson gson = new Gson(); public SaveTootHelper(@NonNull TootDao tootDao, @NonNull Context context) { this.tootDao = tootDao; @@ -43,6 +44,7 @@ public final class SaveTootHelper { @NonNull String contentWarning, @Nullable String savedJsonUrls, @NonNull List mediaUris, + @NonNull List mediaDescriptions, int savedTootUid, @Nullable String inReplyToId, @Nullable String replyingStatusContent, @@ -56,28 +58,31 @@ public final class SaveTootHelper { // Get any existing file's URIs. ArrayList existingUris = null; if (!TextUtils.isEmpty(savedJsonUrls)) { - existingUris = new Gson().fromJson(savedJsonUrls, + existingUris = gson.fromJson(savedJsonUrls, new TypeToken>() { }.getType()); } String mediaUrlsSerialized = null; + String mediaDescriptionsSerialized = null; + if (!ListUtils.isEmpty(mediaUris)) { List savedList = saveMedia(mediaUris, existingUris); if (!ListUtils.isEmpty(savedList)) { - mediaUrlsSerialized = new Gson().toJson(savedList); + mediaUrlsSerialized = gson.toJson(savedList); if (!ListUtils.isEmpty(existingUris)) { deleteMedia(setDifference(existingUris, savedList)); } } else { return false; } + mediaDescriptionsSerialized = gson.toJson(mediaDescriptions); } else if (!ListUtils.isEmpty(existingUris)) { /* If there were URIs in the previous draft, but they've now been removed, those files * can be deleted. */ deleteMedia(existingUris); } - final TootEntity toot = new TootEntity(savedTootUid, content, mediaUrlsSerialized, contentWarning, + final TootEntity toot = new TootEntity(savedTootUid, content, mediaUrlsSerialized, mediaDescriptionsSerialized, contentWarning, inReplyToId, replyingStatusContent, replyingStatusAuthorUsername, @@ -102,7 +107,7 @@ public final class SaveTootHelper { public void deleteDraft(@NonNull TootEntity item){ // Delete any media files associated with the status. - ArrayList uris = new Gson().fromJson(item.getUrls(), + ArrayList uris = gson.fromJson(item.getUrls(), new TypeToken>() {}.getType()); if (uris != null) { for (String uriString : uris) { diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 93100ccae..d09a488ce 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -265,7 +265,6 @@ النشر بواسطة حساب %1$s تعذرت عملية إضافة الشرح - وصف للمعاقين بصريًا إضافة شرح حذف تجميد الحساب diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index 421f7040e..bd7d57726 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -305,7 +305,6 @@ Yn postio â chyfrif %1$s Methu gosod pennawd - Disgrifiad i bobl â nam ar y golwg Pennu pennawd Dileu Cloi cyfrif diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7fef4dd99..6a6fb8330 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -249,7 +249,6 @@ Listen Liste entfernen - Beschreibung für Menschen mit Sehbehinderung Beschreibung eingeben Fehler beim Speichern der Beschreibung Konto hinzufügen diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ae4d7ecbd..ac937007c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -300,7 +300,6 @@ Publicando con la cuenta %1$s Error al añadir leyenda - Descripción para discapacitados visuales Añadir leyenda Eliminar Proteger cuenta diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 307ef9e37..4c3c5e97d 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -305,7 +305,6 @@ پست با حساب %1$s ناتوان در تنظیم عنوان - توصیف برای ضعف دیداری تنظیم عنوان حذف قفل حساب diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d80e1a9b8..ada1bf1ca 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -268,7 +268,6 @@ Poster avec le compte %1$s Impossible de mettre la légende - Décrire pour les mal voyants Mettre une légende Supprimer le média Verrouiller le compte diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 454440d48..25d6c3eca 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -305,7 +305,6 @@ Pubblicando con l\'account %1$s Impostazione del sottotitolo non riuscita - Descrivi per persone ipovedenti Inserisci sottotitolo Rimuovi Blocca account diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 32d4621be..5701748e2 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -291,7 +291,6 @@ リストタイムライン 説明の設定に失敗しました - 視覚障害者のための説明 説明を設定 消去 アカウントをロック diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index af122bcb6..c762fad2a 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -264,7 +264,6 @@ 다음 계정으로 작성 중: %1$s 캡션 설정 실패 - 시각 장애인을 위한 설명 설명 쓰기 삭제 계정 잠금 diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 348dc3679..8634e6141 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -292,7 +292,6 @@ Aan het publiceren met account %1$s Toevoegen van beschrijving mislukt - Omschrijf dit voor mensen met een visuele beperking Beschrijving toevoegen Verwijderen Account besloten maken diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 27db30548..75ed78b11 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -299,7 +299,6 @@ Publicar amb lo compte %1$s Fracàs en apondre una legenda - Descripcion pels mal vesents Apondre una legenda Levar Clavar lo compte diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 5e280745f..343494e9c 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -300,7 +300,6 @@ Publikowanie z konta %1$s Nie udało się ustawić podpisu - Opis dla osób korzystających z ułatwień dostępności Ustaw podpis Usuń Zablokuj konto diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index ba4926245..c79f430e5 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -296,7 +296,6 @@ Postando com a conta %1$s Falha ao atribuir descrição - Descreva a imagem para deficientes visuais Escrever descrição Remover Trancar conta diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c8686f02e..7dcaba2c9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -285,7 +285,6 @@ Отправка от имени %1$s Не удалось добавить подпись - Описание для слабовидящих Добавить подпись Удалить Закрыть аккаунт diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 426ff7ea5..854e1dfb8 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -304,7 +304,6 @@ Inlägg med kontot %1$s Misslyckades med att ange bildtext - Beskriv för synskadade Ange bildtext Ta bort Lås konto diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index c1d6fb2d3..8bc7d24d4 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -288,7 +288,6 @@ %1$s கணக்குடன் பதிவிட தலைப்பை அமைக்க முடியவில்லை - பார்வையற்றவர்களுக்கான விளக்கம் தலைப்பை அமை நீக்கு கணக்கை முடக்கு diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9c54ce8ab..7e47e3d23 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -275,7 +275,6 @@ 使用帐号 %1$s 发布嘟文 设置图片标题失败。 - 为视觉障碍者提供的描述 设置图片标题 移除 保护你的帐户(锁嘟) diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 18cb7b33d..b51a3536c 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -275,7 +275,6 @@ 使用帳號 %1$s 發佈嘟文 設置圖片標題失敗。 - 為視覺障礙者提供的描述 設置圖片標題 移除 保護你的帳户(鎖嘟) diff --git a/app/src/main/res/values-zh-rMO/strings.xml b/app/src/main/res/values-zh-rMO/strings.xml index 18cb7b33d..b51a3536c 100644 --- a/app/src/main/res/values-zh-rMO/strings.xml +++ b/app/src/main/res/values-zh-rMO/strings.xml @@ -275,7 +275,6 @@ 使用帳號 %1$s 發佈嘟文 設置圖片標題失敗。 - 為視覺障礙者提供的描述 設置圖片標題 移除 保護你的帳户(鎖嘟) diff --git a/app/src/main/res/values-zh-rSG/strings.xml b/app/src/main/res/values-zh-rSG/strings.xml index 9c54ce8ab..7e47e3d23 100644 --- a/app/src/main/res/values-zh-rSG/strings.xml +++ b/app/src/main/res/values-zh-rSG/strings.xml @@ -275,7 +275,6 @@ 使用帐号 %1$s 发布嘟文 设置图片标题失败。 - 为视觉障碍者提供的描述 设置图片标题 移除 保护你的帐户(锁嘟) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e93adc35d..ca7da60c4 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -275,7 +275,6 @@ 使用帳號 %1$s 發佈嘟文 設置圖片標題失敗。 - 為視覺障礙者提供的描述 設置圖片標題 移除 保護你的帳戶(鎖嘟) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d7a799768..5af3080ec 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -305,7 +305,7 @@ Posting with account %1$s Failed to set caption - Describe for visually impaired + Describe for visually impaired\n(%d character limit) Set caption Remove Lock account