diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-12-09 14:12:32 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2020-12-09 14:12:32 +0300 |
commit | 51e3a19d817190fd6fcf0d4595c6db8414e1a21b (patch) | |
tree | e7bfa77fc269d1823baaaa28bc11e8f1ec54c219 | |
parent | 728dc8b0424ef02cc32da36b0320184e04f4ec7a (diff) | |
parent | 61506f9d29daf0559fa12c70a25a45a4c6d83fa1 (diff) |
Merge branch 'master' into webview-markdown
15 files changed, 313 insertions, 70 deletions
diff --git a/app/src/androidTest/java/it/niedermann/nextcloud/deck/util/AttachmentUtilTest.java b/app/src/androidTest/java/it/niedermann/nextcloud/deck/util/AttachmentUtilTest.java new file mode 100644 index 000000000..a72f74ec1 --- /dev/null +++ b/app/src/androidTest/java/it/niedermann/nextcloud/deck/util/AttachmentUtilTest.java @@ -0,0 +1,50 @@ +package it.niedermann.nextcloud.deck.util; + +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import it.niedermann.nextcloud.deck.model.Attachment; +import it.niedermann.nextcloud.deck.model.ocs.Version; + +import static org.junit.Assert.assertEquals; + +@RunWith(AndroidJUnit4.class) +public class AttachmentUtilTest { + + @Test + public void testGetThumbnailUrl() { + final Version versionThatDoesSupportFileAttachments = new Version("1.3.0", 1, 3, 0); + final Version versionThatDoesNotSupportFileAttachments = new Version("1.2.0", 1, 2, 0); + final String accountUrl = "https://example.com"; + + // TODO depends on https://github.com/nextcloud/deck/pull/2638 +// final Attachment attachment1 = new Attachment(); +// attachment1.setFileId("1337"); +// final String thumbnailUrl1 = AttachmentUtil.getThumbnailUrl(versionThatDoesSupportFileAttachments, accountUrl, -1L, attachment1, 500); +// assertEquals("https://example.com/index.php/core/preview?fileId=1337&x=500&y=500", thumbnailUrl1); +// +// final Attachment attachment2 = new Attachment(); +// attachment2.setFileId("0815"); +// final String thumbnailUrl2 = AttachmentUtil.getThumbnailUrl(versionThatDoesSupportFileAttachments, accountUrl, 0L, attachment2, 4711); +// assertEquals("https://example.com/index.php/core/preview?fileId=0815&x=4711&y=4711", thumbnailUrl2); + + // Given there is an invalid fileId... + final Attachment attachment3 = new Attachment(); + attachment3.setId(999L); + attachment3.setFileId(""); + final String thumbnailUrl3 = AttachmentUtil.getThumbnailUrl(versionThatDoesSupportFileAttachments, accountUrl, 15L, attachment3, 205); + // ... a fallback to the attachment itself should be returned + assertEquals("https://example.com/index.php/apps/deck/cards/15/attachment/999", thumbnailUrl3); + + // Given the server version does not support file attachments yet... + final Attachment attachment4 = new Attachment(); + attachment4.setId(111L); + attachment4.setFileId("222"); + final String thumbnailUrl4 = AttachmentUtil.getThumbnailUrl(versionThatDoesNotSupportFileAttachments, accountUrl, 333L, attachment4, 444); + // ... a fallback to the attachment itself should be returned + assertEquals("https://example.com/index.php/apps/deck/cards/333/attachment/111", thumbnailUrl4); + } + +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/Attachment.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/Attachment.java index 5e3b988ef..7eabcbe70 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/Attachment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/Attachment.java @@ -2,6 +2,7 @@ package it.niedermann.nextcloud.deck.model; import androidx.room.Entity; import androidx.room.ForeignKey; +import androidx.room.Ignore; import androidx.room.Index; import java.io.Serializable; @@ -35,6 +36,9 @@ public class Attachment extends AbstractRemoteEntity implements Comparable<Attac private String extension; private String filename; private String localPath; + // TODO should probably be a Long... depends on https://github.com/nextcloud/deck/pull/2638 + @Ignore + private String fileId; public long getCardId() { return cardId; @@ -140,6 +144,22 @@ public class Attachment extends AbstractRemoteEntity implements Comparable<Attac this.localPath = localPath; } + /** + * TODO depends on https://github.com/nextcloud/deck/pull/2638 + */ + @Ignore + public String getFileId() { + return this.fileId; + } + + /** + * TODO depends on https://github.com/nextcloud/deck/pull/2638 + */ + @Ignore + public void setFileId(String fileId) { + this.fileId = fileId; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/Version.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/Version.java index c04512ad2..cfd973831 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/Version.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/Version.java @@ -10,12 +10,14 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.model.Attachment; import it.niedermann.nextcloud.deck.model.ocs.comment.DeckComment; public class Version implements Comparable<Version> { private static final Pattern NUMBER_EXTRACTION_PATTERN = Pattern.compile("[0-9]+"); private static final Version VERSION_1_0_0 = new Version("1.0.0", 1, 0, 0); private static final Version VERSION_1_0_3 = new Version("1.0.3", 1, 0, 3); + private static final Version VERSION_1_3_0 = new Version("1.3.0", 1, 3, 0); @Nullable private static Version VERSION_MINIMUM_SUPPORTED; @@ -155,6 +157,22 @@ public class Version implements Comparable<Version> { } /** + * Before {@link #VERSION_1_3_0} all {@link Attachment}s have been stored in a special folder at the server. + * Starting with {@link #VERSION_1_3_0} {@link Attachment}s can be stored as regular files, allowing for example to make use of server side thumbnail generation. + * <p> + * Since the migration takes a long time, it does not happen on upgrading the server app but step by step via a cronjob. + * Therefore this method is just an indicator, that it is possible that {@link Attachment}s are stored as files, but it is no guarantee that all {@link Attachment}s already have been migrated to files. + * + * @return whether or not the server supports file attachments + * @see <a href="https://github.com/nextcloud/deck/pull/2638">documentation in PR</a> + */ + public boolean supportsFileAttachments() { + return false; +// TODO depends on https://github.com/nextcloud/deck/pull/2638 +// return isGreaterOrEqualTo(VERSION_1_3_0); + } + + /** * Title max length has been increased from 100 to 255 characters beginning with server {@link Version} 1.0.0 * * @return the number of characters that the title fields of cards allow @@ -165,6 +183,7 @@ public class Version implements Comparable<Version> { ? 255 : 100; } + /** * URL to view a card in the web interface has been changed in {@link Version} 1.0.0 * diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/attachments/AttachmentAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/attachments/AttachmentAdapter.java index b17b34137..c7d32bd37 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/attachments/AttachmentAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/attachments/AttachmentAdapter.java @@ -1,43 +1,31 @@ package it.niedermann.nextcloud.deck.ui.attachments; import android.content.Context; -import android.graphics.drawable.Drawable; -import android.os.Build; import android.view.LayoutInflater; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.FragmentActivity; import androidx.recyclerview.widget.RecyclerView; -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.DataSource; -import com.bumptech.glide.load.engine.GlideException; -import com.bumptech.glide.request.RequestListener; -import com.bumptech.glide.request.target.Target; - +import java.util.ArrayList; import java.util.List; -import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.databinding.ItemAttachmentBinding; import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.model.Attachment; -import it.niedermann.nextcloud.deck.util.AttachmentUtil; -import it.niedermann.nextcloud.deck.util.MimeTypeUtil; public class AttachmentAdapter extends RecyclerView.Adapter<AttachmentViewHolder> { private final Account account; private final long cardRemoteId; @NonNull - private List<Attachment> attachments; - private Context context; + private final List<Attachment> attachments = new ArrayList<>(); @SuppressWarnings("WeakerAccess") public AttachmentAdapter(@NonNull Account account, long cardRemoteId, @NonNull List<Attachment> attachments) { super(); - this.attachments = attachments; + this.attachments.clear(); + this.attachments.addAll(attachments); this.account = account; this.cardRemoteId = cardRemoteId; } @@ -45,43 +33,13 @@ public class AttachmentAdapter extends RecyclerView.Adapter<AttachmentViewHolder @NonNull @Override public AttachmentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - this.context = parent.getContext(); - return new AttachmentViewHolder(ItemAttachmentBinding.inflate(LayoutInflater.from(context), parent, false)); + final Context context = parent.getContext(); + return new AttachmentViewHolder(context, ItemAttachmentBinding.inflate(LayoutInflater.from(context), parent, false)); } @Override public void onBindViewHolder(@NonNull AttachmentViewHolder holder, int position) { - final Attachment attachment = attachments.get(position); - final String uri = AttachmentUtil.getRemoteOrLocalUrl(account.getUrl(), cardRemoteId, attachment); - if (MimeTypeUtil.isImage(attachment.getMimetype())) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - holder.binding.preview.setTransitionName(context.getString(R.string.transition_attachment_preview, String.valueOf(attachment.getLocalId()))); - } - holder.binding.preview.setImageResource(R.drawable.ic_image_grey600_24dp); - Glide.with(context) - .load(uri) - .listener(new RequestListener<Drawable>() { - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, - Target<Drawable> target, boolean isFirstResource) { - if (context instanceof FragmentActivity) { - ((FragmentActivity) context).supportStartPostponedEnterTransition(); - } - return false; - } - - @Override - public boolean onResourceReady(Drawable resource, Object model, - Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { - if (context instanceof FragmentActivity) { - ((FragmentActivity) context).supportStartPostponedEnterTransition(); - } - return false; - } - }) - .error(R.drawable.ic_image_grey600_24dp) - .into(holder.binding.preview); - } + holder.bind(account, attachments.get(position), cardRemoteId); } @Override diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/attachments/AttachmentViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/attachments/AttachmentViewHolder.java index 584a57d1d..6f4fe3c74 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/attachments/AttachmentViewHolder.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/attachments/AttachmentViewHolder.java @@ -1,15 +1,72 @@ package it.niedermann.nextcloud.deck.ui.attachments; +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.os.Build; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.engine.GlideException; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.target.Target; + +import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.databinding.ItemAttachmentBinding; +import it.niedermann.nextcloud.deck.model.Account; +import it.niedermann.nextcloud.deck.model.Attachment; +import it.niedermann.nextcloud.deck.util.AttachmentUtil; +import it.niedermann.nextcloud.deck.util.MimeTypeUtil; public class AttachmentViewHolder extends RecyclerView.ViewHolder { - public ItemAttachmentBinding binding; + @NonNull + private final Context parentContext; + @NonNull + private final ItemAttachmentBinding binding; @SuppressWarnings("WeakerAccess") - public AttachmentViewHolder(ItemAttachmentBinding binding) { + public AttachmentViewHolder(@NonNull Context parentContext, @NonNull ItemAttachmentBinding binding) { super(binding.getRoot()); + this.parentContext = parentContext; this.binding = binding; } + + public void bind(@NonNull Account account, @NonNull Attachment attachment, long cardRemoteId) { + if (MimeTypeUtil.isImage(attachment.getMimetype())) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + binding.preview.setTransitionName(parentContext.getString(R.string.transition_attachment_preview, String.valueOf(attachment.getLocalId()))); + } + binding.preview.setImageResource(R.drawable.ic_image_grey600_24dp); + binding.preview.post(() -> { + final String uri = AttachmentUtil.getThumbnailUrl(account.getServerDeckVersionAsObject(), account.getUrl(), cardRemoteId, attachment, binding.preview.getWidth()); + Glide.with(parentContext) + .load(uri) + .listener(new RequestListener<Drawable>() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, + Target<Drawable> target, boolean isFirstResource) { + if (parentContext instanceof FragmentActivity) { + ((FragmentActivity) parentContext).supportStartPostponedEnterTransition(); + } + return false; + } + + @Override + public boolean onResourceReady(Drawable resource, Object model, + Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { + if (parentContext instanceof FragmentActivity) { + ((FragmentActivity) parentContext).supportStartPostponedEnterTransition(); + } + return false; + } + }) + .error(R.drawable.ic_image_grey600_24dp) + .into(binding.preview); + }); + } + } }
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/ImageAttachmentViewHolder.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/ImageAttachmentViewHolder.java index e3139295f..3c95da1b7 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/ImageAttachmentViewHolder.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/attachments/ImageAttachmentViewHolder.java @@ -18,7 +18,7 @@ import it.niedermann.nextcloud.deck.model.Attachment; import it.niedermann.nextcloud.deck.util.AttachmentUtil; public class ImageAttachmentViewHolder extends AttachmentViewHolder { - private ItemAttachmentImageBinding binding; + private final ItemAttachmentImageBinding binding; @SuppressWarnings("WeakerAccess") public ImageAttachmentViewHolder(ItemAttachmentImageBinding binding) { @@ -37,16 +37,17 @@ public class ImageAttachmentViewHolder extends AttachmentViewHolder { } public void bind(@NonNull Account account, @NonNull MenuInflater menuInflater, @NonNull FragmentManager fragmentManager, Long cardRemoteId, Attachment attachment, @Nullable View.OnClickListener onClickListener, @ColorInt int mainColor) { - @Nullable final String uri = AttachmentUtil.getRemoteOrLocalUrl(account.getUrl(), cardRemoteId, attachment); + super.bind(menuInflater, fragmentManager, cardRemoteId, attachment, onClickListener, mainColor, AttachmentUtil.getRemoteOrLocalUrl(account.getUrl(), cardRemoteId, attachment)); - super.bind(menuInflater, fragmentManager, cardRemoteId, attachment, onClickListener, mainColor, uri); + getPreview().post(() -> { + @Nullable final String uri = AttachmentUtil.getThumbnailUrl(account.getServerDeckVersionAsObject(), account.getUrl(), cardRemoteId, attachment, getPreview().getWidth()); + Glide.with(getPreview().getContext()) + .load(uri) + .placeholder(R.drawable.ic_image_grey600_24dp) + .error(R.drawable.ic_image_grey600_24dp) + .into(getPreview()); + }); - getPreview().setImageResource(R.drawable.ic_image_grey600_24dp); - Glide.with(getPreview().getContext()) - .load(uri) - .placeholder(R.drawable.ic_image_grey600_24dp) - .error(R.drawable.ic_image_grey600_24dp) - .into(getPreview()); itemView.setOnClickListener(onClickListener); } }
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/util/AttachmentUtil.java b/app/src/main/java/it/niedermann/nextcloud/deck/util/AttachmentUtil.java index 2baec8e92..ef3e14b37 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/util/AttachmentUtil.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/util/AttachmentUtil.java @@ -10,6 +10,7 @@ import android.widget.Toast; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.Px; import java.io.File; import java.io.FileNotFoundException; @@ -20,6 +21,7 @@ import java.io.InputStream; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.model.Attachment; +import it.niedermann.nextcloud.deck.model.ocs.Version; /** * Created by stefan on 07.03.20. @@ -31,7 +33,19 @@ public class AttachmentUtil { } /** - * @return {@link AttachmentUtil#getRemoteUrl} or {@link Attachment#getLocalPath()} as fallback in case this {@param attachment} has not yet been synced. + * @return a link to the thumbnail of the given {@link Attachment}. + * If a thumbnail is not available (see {@link Version#supportsFileAttachments()}), a link to + * the {@link Attachment} itself will be returned instead. + */ + public static String getThumbnailUrl(@NonNull Version version, @NonNull String accountUrl, @NonNull Long cardRemoteId, @NonNull Attachment attachment, @Px int previewSize) { + return version.supportsFileAttachments() && !TextUtils.isEmpty(String.valueOf(attachment.getFileId())) + ? accountUrl + "/index.php/core/preview?fileId=" + attachment.getFileId() + "&x=" + previewSize + "&y=" + previewSize + : getRemoteOrLocalUrl(accountUrl, cardRemoteId, attachment); + } + + /** + * @return {@link AttachmentUtil#getRemoteUrl} or {@link Attachment#getLocalPath()} as fallback + * in case this {@param attachment} has not yet been synced. */ @Nullable public static String getRemoteOrLocalUrl(@NonNull String accountUrl, @Nullable Long cardRemoteId, @NonNull Attachment attachment) { diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 47d282f56..07f9eb0f3 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -294,4 +294,13 @@ <string name="take_photo">Vyfotit</string> <string name="take_photo_switch_camera">Přepnout kameru</string> <string name="take_photo_toggle_torch">Vyp/zap. přisvícení</string> + <string name="show_all_contacts">Zobrazit všechny kontakty</string> + <string name="show_all_files">Zobrazit všechny soubory</string> + <string name="recent">Nedávné</string> + <string name="upload_a_new_attachment">Nahrát novou přílohu</string> + <string name="contacts">Kontakty</string> + <string name="downloads">Stažené</string> + <string name="files">Soubory</string> + <string name="gallery">Galerie</string> + <string name="simple_attach">přiložit</string> </resources> diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 207c9cbbd..763c1f02f 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -295,4 +295,5 @@ <string name="files">Archivos</string> <string name="gallery">Galería</string> <string name="simple_attach">adjuntar</string> - </resources> + <string name="add_stack_widget">Agregar lista de widget</string> +</resources> diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index cbcd78001..c98042618 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -288,10 +288,12 @@ <string name="take_photo_toggle_torch">Allumer la lampe</string> <string name="show_all_contacts">Afficher toutes les contacts</string> <string name="show_all_files">Afficher tous les fichiers</string> + <string name="recent">Récent</string> <string name="upload_a_new_attachment">Envoyer une nouvelle pièce jointe</string> <string name="contacts">Contacts</string> <string name="downloads">Téléchargements</string> <string name="files">Fichiers</string> <string name="gallery">Galerie</string> <string name="simple_attach">joindre</string> - </resources> + <string name="add_stack_widget">Ajouter un widget liste</string> +</resources> diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 4833e9788..e6f882727 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -279,4 +279,5 @@ <string name="simple_clone">Klónozás</string> <string name="user_avatar">Felhasználói avatar</string> <string name="simple_unassign">Elvétel</string> - </resources> + <string name="add_stack_widget">Lista felületi elem hozzáadása</string> +</resources> diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 934c292b4..57642a08e 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -109,6 +109,7 @@ <string name="no_lists_yet">まだリストがありません</string> <string name="do_you_want_to_save_your_changes">変更を保存しますか?</string> <string name="do_you_want_to_archive_all_cards_of_the_list">%1$s の全カードをアーカイブしますか?</string> + <string name="do_you_want_to_archive_all_cards_of_the_filtered_list">%1$s のフィルターされた全カードをアーカイブしますか?</string> <plurals name="do_you_want_to_delete_the_current_list"> <item quantity="other">このリストの%1$dのカードすべてが完全に削除されます。</item> </plurals> @@ -271,4 +272,25 @@ <string name="project_type_room">トークルーム</string> <string name="simple_move">移動</string> <string name="cannot_upload_files_without_permission">権限が無いためアップロードできません</string> - </resources> + <string name="clone_cards">カードを複製</string> + <string name="simple_clone">複製</string> + <string name="user_avatar">ユーザーのアバター</string> + <string name="simple_unassign">割り当てを解除</string> + <string name="simple_contact">連絡先</string> + <string name="simple_file">ファイル</string> + <string name="simple_camera">カメラ</string> + <string name="min_api_21">この機能には少なくともAndroid5以上が必要です。</string> + <string name="take_photo">写真を撮る</string> + <string name="take_photo_switch_camera">カメラ切替</string> + <string name="take_photo_toggle_torch">フラッシュを切替</string> + <string name="show_all_contacts">すべての連絡先を表示</string> + <string name="show_all_files">すべてのファイルを表示</string> + <string name="recent">最近</string> + <string name="upload_a_new_attachment">新しい添付をアップロードする</string> + <string name="contacts">連絡先</string> + <string name="downloads">ダウンロード</string> + <string name="files">ファイル</string> + <string name="gallery">ギャラリー</string> + <string name="simple_attach">参加</string> + <string name="add_stack_widget">リストのウィジェットを追加</string> +</resources> diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 1b00ad169..da6a79cdc 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -109,6 +109,7 @@ <string name="no_lists_yet">리스트 없음</string> <string name="do_you_want_to_save_your_changes">변경된 사항을 저장하시겠습니까?</string> <string name="do_you_want_to_archive_all_cards_of_the_list">모든 %1$s카드들을 보관 하시겠습니까?</string> + <string name="do_you_want_to_archive_all_cards_of_the_filtered_list">필터링된 %1$s 카드를 모두 보관하시겠습니까?</string> <plurals name="do_you_want_to_delete_the_current_list"> <item quantity="other">이 리스트의 모든 %1$d카드가 영구적으로 지워집니다.</item> </plurals> @@ -205,7 +206,7 @@ <string name="error_dialog_title">세상에 - 무슨일이야?</string> <string name="error_dialog_tip_token_mismatch_retry">앱을 종료하고 다시 시작해주십시오. 아마 Nextcloud에 잘못된 연결이 있었을 것입니다.</string> - <string name="error_dialog_tip_clear_storage_might_help">이슈가 지속되면 Nextcloud와 Nextcloud Deck라는 두 앱을 스토리지에서 지워 이 문제를 해결하십시오.ㅣ</string> + <string name="error_dialog_tip_clear_storage_might_help">이슈가 지속되면 Nextcloud와 Nextcloud Deck라는 두 앱을 스토리지에서 지워 이 문제를 해결하십시오.</string> <string name="error_dialog_tip_database_upgrade_failed">데이터베이스 업그레이드 실패. 오류를 보고하고 정상적인 앱사용을 위해 저장소를 정리하세요.</string> <string name="error_dialog_tip_clear_storage">저장공간을 비우기 위해 app info를 열고 Storage → Clear storage를 선택해주십시오.</string> <string name="error_dialog_tip_files_outdated">당신의 Nextcloud 앱은 예전 버전입니다. Play Store나 F-Droid에 가서 최신 버전을 다운로드 하십시오.</string> @@ -214,6 +215,17 @@ <string name="error_dialog_timeout_instance">서버로부터 응답이 없습니다. 당신의 인스턴스가 잘 작동하는지 확인해 주십시오.</string> <string name="error_dialog_timeout_toggle">네트워크 연결을 확인하십시오. 종종 모바일데이터나 와이파이를 껐다가 키는 것이 도움이 될 것입니다.</string> <string name="error_dialog_check_server">서버의 응답이 틀렸습니다. 덱에 접근할 수 있는지 웹인터페이스로 확인해 주세요.</string> + <string name="error_dialog_check_server_logs">Nextcloud 설정에 문제가 있습니다. 서버 로그 파일을 살펴보시기 바랍니다.</string> + <string name="error_dialog_check_maintenance">Nextcloud 인스턴스가 현재 유지 보수 모드에 있지 않은지 확인해 주세요.</string> + <string name="error_dialog_insufficient_storage">Nextcloud 인스턴스에 사용 가능한 스토리지가 남아 있지 않습니다. 클라우드에 로컬 변경사항을 동기화하려면 일부 파일을 삭제해 주십시오.</string> + <string name="error_dialog_we_need_info">귀하를 돕기 위해 다음 기술 정보가 필요합니다.</string> + <string name="error_dialog_redirect">서버가 HTTP 302 상태 코드로 응답했습니다. 이는 서버에 Deck 앱을 설치하지 않았거나 잘못 구성되었음을 의미합니다. 이 문제는 .htaccess 파일의 사용자 지정 재정의 또는 OID Client와 같은 Nextcloud 앱에서 발생할 수 있습니다.</string> + <string name="error_dialog_version_not_parsable">서버 측 Deck 앱의 버전을 확인할 수 없습니다. 설치 및 활성화되어 있는지 확인하십시오.</string> + <string name="error_dialog_account_might_not_be_authorized">Nextcloud 앱의 계정이 더 이상 인증되지 않을 수 있습니다.</string> + <string name="error_dialog_user_not_found_in_database">현재 사용자가 데이터베이스에 있는 사용자와 일치하지 않습니다. Nextcloud 인스턴스에서 LDAP을 사용하는 경우 Nextcloud 앱에 이전 사용자 ID가 저장되었을 수 있습니다.</string> + <string name="error_dialog_capabilities_not_parsable">서버의 기능을 가져올 수 없습니다. 서버가 제대로 실행되고 다른 클라이언트 앱이 Nextcloud에 액세스할 수 있는지 확인하십시오.</string> + <string name="error_dialog_attachment_upload_failed">첨부 파일을 업로드 할 수 없습니다. 다른 방법으로 공유하시고 저희에게 이 버그에 대해 알려주세요.</string> + <string name="error_dialog_tip_disable_battery_optimizations">Nextcloud 및 Deck 앱에 대한 모든 배터리 최적화를 비활성화해 주십시오.</string> <string name="error_action_open_deck_info">앱 정보 열기</string> <string name="error_action_open_network">네트워크 환경설정</string> <string name="error_action_server_logs">서버 기록</string> @@ -227,15 +239,57 @@ <string name="manage_accounts">계정 관리</string> <string name="manage_list">목록 관리</string> <string name="simple_reply">답장</string> + <string name="error_while_uploading_attachment">%1$s 첨부 파일을 업로드하는 동안 오류가 발생했습니다.</string> <string name="append_text_to_description">설명에 추가</string> <string name="add_text_as_comment">댓글로 추가하기</string> + <string name="progress_count">%2$d의 %1$d</string> + <plurals name="progress_error_count"> + <item quantity="other">업로드하는 동안 %1$d 오류가 발생했습니다.</item> + </plurals> <string name="simple_report">보고</string> <string name="error_action_open_battery_settings">배터리 설정</string> + <string name="move_warning">카드를 다른 보드로 옮길 때 댓글이나 첨부 파일을 전송할 수 없습니다.</string> <string name="clone_board">게시판 복제</string> <string name="cloning_board">%1$s 복제중...</string> <string name="successfully_cloned_board">%1$s이(가) 성공적으로 복제되었습니다.</string> + <string name="attachment_does_not_yet_exist">첨부 파일이 아직 Deck에 없습니다.</string> + <string name="card_does_not_yet_exist">카드가 아직 Deck에 없습니다.</string> + <string name="widget_stack_title">목록</string> + <string name="widget_stack_header_icon">위젯 헤더 아이콘</string> + <string name="widget_stack_placeholder_icon">위젯 자리 표시 아이콘</string> + <string name="select_stack">목록 선택</string> + <string name="project_type_deck_board">Deck 보드</string> + <string name="project_type_deck_card">Deck 카드</string> <string name="project_type_file">파일</string> <string name="projects_title">프로젝트</string> + <plurals name="resources_count"> + <item quantity="other">%1$d 자원</item> + </plurals> + <string name="no_assigned_label">할당된 태그 없음</string> + <string name="single_card">단일 카드</string> + <string name="project_type_room">대화방</string> <string name="simple_move">이동</string> - </resources> + <string name="cannot_upload_files_without_permission">권한 없이 파일을 업로드할 수 없습니다.</string> + <string name="clone_cards">복제 카드</string> + <string name="simple_clone">복제</string> + <string name="user_avatar">사용자 아바타</string> + <string name="simple_unassign">할당 해제</string> + <string name="simple_contact">연락처</string> + <string name="simple_file">파일</string> + <string name="simple_camera">카메라</string> + <string name="min_api_21">이 기능을 사용하려면 적어도 Android 5가 필요합니다.</string> + <string name="take_photo">사진 찍기</string> + <string name="take_photo_switch_camera">카메라 전환</string> + <string name="take_photo_toggle_torch">토치 전환</string> + <string name="show_all_contacts">모든 연락처 보기</string> + <string name="show_all_files">모든 파일 보기</string> + <string name="recent">최근 항목</string> + <string name="upload_a_new_attachment">새 첨부 파일 업로드</string> + <string name="contacts">연락처</string> + <string name="downloads">다운로드</string> + <string name="files">파일</string> + <string name="gallery">갤러리</string> + <string name="simple_attach">첨부하기</string> + <string name="add_stack_widget">목록 위젯 추가</string> +</resources> diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d676dc2d6..bd5a1dd6b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -109,6 +109,7 @@ <string name="no_lists_yet">Нет ни одного списка</string> <string name="do_you_want_to_save_your_changes">Сохранить изменения?</string> <string name="do_you_want_to_archive_all_cards_of_the_list">Вы хотите архивировать все карточки из %1$s?</string> + <string name="do_you_want_to_archive_all_cards_of_the_filtered_list">Переместить в архив все отобранные в списке «%1$s» карточки?</string> <plurals name="do_you_want_to_delete_the_current_list"> <item quantity="one">Это действие безвозвратно удалит %1$d карточку этого списка.</item> <item quantity="few">Это действие безвозвратно удалит %1$d карточки этого списка.</item> @@ -211,7 +212,8 @@ <string name="error_dialog_title">О нет, что теперь? 🙁</string> <string name="error_dialog_tip_token_mismatch_retry">Попробуйте принудительно закрыть приложение и запустить его снова. Это могло быть связано с некорректным подключением к приложению Nextcloud.</string> - <string name="error_dialog_tip_clear_storage_might_help">Если проблема повторяется, попробуйте для её решения очистить хранилище приложений Nextcloud и Nextcloud Карточки.</string> + <string name="error_dialog_tip_clear_storage_might_help">Если проблема повторяется, попробуйте для её решения очистить хранилища данных приложений Nextcloud и Nextcloud Карточки.</string> + <string name="error_dialog_tip_database_upgrade_failed">Не удалось выполнить обновление базы данных. Сообщите об этой ошибке разработчикам. Чтобы продолжить использовать приложение, требуется выполнить очистку данных приложения.</string> <string name="error_dialog_tip_clear_storage">Для очистки хранилища на откройте приложение «Настройки» и выберите Приложения → Nextcloud / Nextcloud Deck → Хранилище → Очистить хранилище</string> <string name="error_dialog_tip_files_outdated">Ваше приложение Nextcloud устарело. Установите новую версию с Play Store или F-Droid.</string> <string name="error_dialog_tip_files_force_stop">Похоже, что с приложением Nextcloud ведёт себя неожиданным образом. Попробуйте принудительно остановить приложения Nextcloud и Nextcloud Карточки. </string> @@ -225,6 +227,8 @@ <string name="error_dialog_we_need_info">Требуется следующая техническая информация от вас:</string> <string name="error_dialog_redirect">На запрос сервер вернул код состояния HTTP 302, что означает, что приложение Карточки либо не установлено, либо сервер настроен неверно. Такое поведение может являться следствием замены стандартного файла .htaccess администратором сервера или приложением Nextcloud, таким как OID Client.</string> <string name="error_dialog_version_not_parsable">Не удалось определить серверную версию приложения Карточки. Убедитесь, что приложение установлено и включено на сервере.</string> + <string name="error_dialog_account_might_not_be_authorized">Учётная запись из приложения Nextcloud не может использована для авторизации.</string> + <string name="error_dialog_user_not_found_in_database">Данные о текущем пользователе отличаются от сохранённых в базе данных приложения. Это может произойти при использовании каталогов LDAP на сервере Nextcloud.</string> <string name="error_dialog_capabilities_not_parsable">Не удалось получить параметры совместимости сервера. Убедитесь, что сервер работоспособен и у других приложений-клиентов имеется доступ.</string> <string name="error_dialog_attachment_upload_failed">Ошибка передачи вложения на сервер. Используйте другой способ публикации и сообщите разработчикам об этой ошибке.</string> <string name="error_dialog_tip_disable_battery_optimizations">Пожалуйста отключите все оптимизации аккумулятора для приложений Nextcloud и Deck.</string> @@ -245,6 +249,12 @@ <string name="append_text_to_description">Добавить в описание</string> <string name="add_text_as_comment">Добавить как комментарий</string> <string name="progress_count">%1$d из %2$d</string> + <plurals name="progress_error_count"> + <item quantity="one">Во время передачи произошла %1$d ошибка</item> + <item quantity="few">Во время передачи произошло %1$d ошибки</item> + <item quantity="many">Во время передачи произошло %1$d ошибок</item> + <item quantity="other">Во время передачи произошло %1$d ошибки</item> + </plurals> <string name="simple_report">Сообщить</string> <string name="error_action_open_battery_settings">Настройки аккумулятора</string> <string name="move_warning">нет ни одного комментария или вложения, которые можно перенести при перемещении карточки на другую доску</string> @@ -256,6 +266,7 @@ <string name="widget_stack_title">Список</string> <string name="widget_stack_header_icon">иконка заголовка виджета</string> + <string name="widget_stack_placeholder_icon">Подстановочный значок виджета</string> <string name="select_stack">Выберите список</string> <string name="project_type_deck_board">Доска</string> <string name="project_type_deck_card">Карточка</string> @@ -269,5 +280,28 @@ </plurals> <string name="no_assigned_label">Метки не присвоены</string> <string name="single_card">Отдельная карточка</string> + <string name="project_type_room">Комната конференции</string> <string name="simple_move">Переместить</string> - </resources> + <string name="cannot_upload_files_without_permission">Отсутствуют права для загрузки файла</string> + <string name="clone_cards">Скопировать карточку</string> + <string name="simple_clone">Скопировать</string> + <string name="user_avatar">Изображение профиля</string> + <string name="simple_unassign">Отменить назначение</string> + <string name="simple_contact">Контакт</string> + <string name="simple_file">Файл</string> + <string name="simple_camera">Камера</string> + <string name="min_api_21">Эта возможность поддерживается на Android версии 5 и старше</string> + <string name="take_photo">Сделать фотографию</string> + <string name="take_photo_switch_camera">Переключить камеру</string> + <string name="take_photo_toggle_torch">Подсветка</string> + <string name="show_all_contacts">Показать все контакты</string> + <string name="show_all_files">Показать всё файлы</string> + <string name="recent">Недавние</string> + <string name="upload_a_new_attachment">Загрузить вложение</string> + <string name="contacts">Контакты</string> + <string name="downloads">Загрузки</string> + <string name="files">Файлы</string> + <string name="gallery">Галерея</string> + <string name="simple_attach">вложить</string> + <string name="add_stack_widget">Добавить виджет списка</string> +</resources> diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 09994fec5..77e23ca7c 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -303,4 +303,5 @@ <string name="files">Datoteke</string> <string name="gallery">Galerija</string> <string name="simple_attach">pripni</string> - </resources> + <string name="add_stack_widget">Dodaj gradnik seznama</string> +</resources> |