diff options
author | Stefan Niedermann <info@niedermann.it> | 2021-09-17 14:24:06 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2021-09-17 14:24:51 +0300 |
commit | ff2cab8f5c932ce50480728c008d83d66ce37f5b (patch) | |
tree | 72212515710393cd3351afbe4f65a2fd84edad48 | |
parent | b6afb118548475fb2f44aaf562d76d7cc9019d33 (diff) |
#1348 Make translations easier by removing HTML markup from strings
Signed-off-by: Stefan Niedermann <info@niedermann.it>
6 files changed, 69 insertions, 41 deletions
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentContributingTab.java b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentContributingTab.java index 2e17e45d..90a9a3bc 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentContributingTab.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentContributingTab.java @@ -1,6 +1,9 @@ package it.niedermann.owncloud.notes.about; +import static it.niedermann.owncloud.notes.shared.util.SupportUtil.setTextWithURL; + import android.os.Bundle; +import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -17,9 +20,9 @@ public class AboutFragmentContributingTab extends Fragment { @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final var binding = FragmentAboutContributionTabBinding.inflate(inflater, container, false); - SupportUtil.setHtml(binding.aboutSource, R.string.about_source, getString(R.string.url_source)); - SupportUtil.setHtml(binding.aboutIssues, R.string.about_issues, getString(R.string.url_issues)); - SupportUtil.setHtml(binding.aboutTranslate, R.string.about_translate, getString(R.string.url_translations)); + setTextWithURL(binding.aboutSource, getResources(), R.string.about_source, R.string.url_source, R.string.url_source); + setTextWithURL(binding.aboutIssues, getResources(), R.string.about_issues, R.string.url_issues, R.string.url_issues); + setTextWithURL(binding.aboutTranslate, getResources(), R.string.about_translate, R.string.url_translations, R.string.url_translations); return binding.getRoot(); } }
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentCreditsTab.java b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentCreditsTab.java index f92ca9ee..028bfa4e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentCreditsTab.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentCreditsTab.java @@ -1,6 +1,11 @@ package it.niedermann.owncloud.notes.about; +import static it.niedermann.owncloud.notes.shared.util.SupportUtil.setTextWithURL; +import static it.niedermann.owncloud.notes.shared.util.SupportUtil.strong; +import static it.niedermann.owncloud.notes.shared.util.SupportUtil.url; + import android.os.Bundle; +import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -11,16 +16,16 @@ import androidx.fragment.app.Fragment; import it.niedermann.owncloud.notes.BuildConfig; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.databinding.FragmentAboutCreditsTabBinding; -import it.niedermann.owncloud.notes.shared.util.SupportUtil; public class AboutFragmentCreditsTab extends Fragment { @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final var binding = FragmentAboutCreditsTabBinding.inflate(inflater, container, false); - SupportUtil.setHtml(binding.aboutVersion, R.string.about_version, "v" + BuildConfig.VERSION_NAME); - SupportUtil.setHtml(binding.aboutMaintainer, R.string.about_maintainer); - SupportUtil.setHtml(binding.aboutTranslators, R.string.about_translators_transifex, getString(R.string.url_translations)); + binding.aboutVersion.setText(getString(R.string.about_version, strong(BuildConfig.VERSION_NAME))); + binding.aboutMaintainer.setText(url(getString(R.string.about_maintainer), getString(R.string.url_maintainer))); + binding.aboutMaintainer.setMovementMethod(new LinkMovementMethod()); + setTextWithURL(binding.aboutTranslators, getResources(), R.string.about_translators_transifex, R.string.about_translators_transifex_label, R.string.url_translations); return binding.getRoot(); } }
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentLicenseTab.java b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentLicenseTab.java index da8cbbd4..10cc02c7 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentLicenseTab.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentLicenseTab.java @@ -1,5 +1,7 @@ package it.niedermann.owncloud.notes.about; +import static it.niedermann.owncloud.notes.shared.util.SupportUtil.setTextWithURL; + import android.content.Intent; import android.content.res.ColorStateList; import android.net.Uri; @@ -17,21 +19,17 @@ import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.branding.BrandedFragment; import it.niedermann.owncloud.notes.branding.BrandingUtil; import it.niedermann.owncloud.notes.databinding.FragmentAboutLicenseTabBinding; -import it.niedermann.owncloud.notes.shared.util.SupportUtil; public class AboutFragmentLicenseTab extends BrandedFragment { private FragmentAboutLicenseTabBinding binding; - private void openLicense() { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.url_license)))); - } - @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentAboutLicenseTabBinding.inflate(inflater, container, false); - binding.aboutAppLicenseButton.setOnClickListener((v) -> openLicense()); - SupportUtil.setHtml(binding.aboutIconsDisclaimer, R.string.about_icons_disclaimer, getString(R.string.about_app_icon_author)); + setTextWithURL(binding.aboutIconsDisclaimerAppIcon, getResources(), R.string.about_icons_disclaimer_app_icon, R.string.about_app_icon_author_link_label, R.string.url_about_icon_author); + setTextWithURL(binding.aboutIconsDisclaimerMdiIcons, getResources(), R.string.about_icons_disclaimer_mdi_icons, R.string.about_icons_disclaimer_mdi, R.string.url_about_icons_disclaimer_mdi); + binding.aboutAppLicenseButton.setOnClickListener((v) -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.url_license))))); return binding.getRoot(); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java index 27fec716..d914c13f 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/SupportUtil.java @@ -1,31 +1,42 @@ package it.niedermann.owncloud.notes.shared.util; +import android.content.res.Resources; +import android.graphics.Typeface; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.Spanned; import android.text.method.LinkMovementMethod; +import android.text.style.StyleSpan; +import android.text.style.URLSpan; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.core.text.HtmlCompat; +import androidx.annotation.StringRes; -/** - * Some helper functionality in alike the Android support library. - * Currently, it offers methods for working with HTML string resources. - */ public class SupportUtil { private SupportUtil() { throw new UnsupportedOperationException("Do not instantiate this util class."); } - /** - * Fills a {@link TextView} with HTML content and activates links in that {@link TextView}. - * - * @param view The {@link TextView} which should be filled. - * @param stringId The string resource containing HTML tags (escaped by <code><</code>) - * @param formatArgs Arguments for the string resource. - */ - public static void setHtml(@NonNull TextView view, int stringId, Object... formatArgs) { - view.setText(HtmlCompat.fromHtml( - view.getResources().getString(stringId, formatArgs), HtmlCompat.FROM_HTML_MODE_LEGACY)); - view.setMovementMethod(LinkMovementMethod.getInstance()); + public static SpannableString strong(@NonNull CharSequence text) { + final var spannable = new SpannableString(text); + spannable.setSpan(new StyleSpan(Typeface.BOLD), 0, spannable.length(), 0); + return spannable; + } + + public static SpannableString url(@NonNull CharSequence text, @NonNull String target) { + final var spannable = new SpannableString(text); + spannable.setSpan(new URLSpan(target), 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + return spannable; + } + + public static void setTextWithURL(@NonNull TextView textView, @NonNull Resources resources, @StringRes int containerTextId, @StringRes int linkLabelId, @StringRes int urlId) { + final String linkLabel = resources.getString(linkLabelId); + final String finalText = resources.getString(containerTextId, linkLabel); + final var spannable = new SpannableString(finalText); + spannable.setSpan(new URLSpan(resources.getString(urlId)), finalText.indexOf(linkLabel), finalText.indexOf(linkLabel) + linkLabel.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + textView.setText(spannable); + textView.setMovementMethod(new LinkMovementMethod()); } } diff --git a/app/src/main/res/layout/fragment_about_license_tab.xml b/app/src/main/res/layout/fragment_about_license_tab.xml index 6afaa763..24e6163f 100644 --- a/app/src/main/res/layout/fragment_about_license_tab.xml +++ b/app/src/main/res/layout/fragment_about_license_tab.xml @@ -39,11 +39,17 @@ android:text="@string/about_icons_disclaimer_title" /> <TextView - android:id="@+id/about_icons_disclaimer" - style="?android:attr/editTextPreferenceStyle" + android:id="@+id/about_icons_disclaimer_app_icon" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="10dp" + android:text="@string/about_icons_disclaimer_app_icon" /> + + <TextView + android:id="@+id/about_icons_disclaimer_mdi_icons" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" - android:text="@string/about_icons_disclaimer" /> + android:text="@string/about_icons_disclaimer_mdi_icons" /> </LinearLayout> </ScrollView>
\ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d5b03716..4977b691 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -59,29 +59,35 @@ <string name="url_issues" translatable="false">https://github.com/stefan-niedermann/nextcloud-notes/issues/new/choose</string> <string name="url_license" translatable="false">https://github.com/stefan-niedermann/nextcloud-notes/blob/master/LICENSE</string> <string name="url_translations" translatable="false">https://www.transifex.com/nextcloud/nextcloud/</string> + <string name="url_maintainer" translatable="false">https://www.niedermann.it/</string> + <string name="url_about_icon_author" translatable="false">https://github.com/nextcloud/notes/blob/76d15214f80f2bf7ea08427bff73ad145128f090/img/notes.svg</string> + <string name="url_about_icons_disclaimer_mdi" translatable="false">https://materialdesignicons.com/</string> <string name="about_version_title">Version</string> <string name="about_version">You are currently using <strong>%1$s</strong></string> <string name="about_maintainer_title">Maintainer</string> - <string name="about_maintainer" translatable="false"><a href="https://www.niedermann.it/">Niedermann IT-Dienstleistungen</a></string> + <string name="about_maintainer" translatable="false">Niedermann IT-Dienstleistungen</string> <string name="about_developers_title">Developers</string> <string name="about_developers" translatable="false">Stefan Niedermann, Kristof Hamann, HeaDBanGer84, Felix Edelmann, Daniel Bailey</string> <string name="about_translators_title">Translators</string> - <string name="about_translators_transifex">Nextcloud community on <a href="%1$s">Transifex</a></string> + <string name="about_translators_transifex">Nextcloud community on %1$s</string> + <string name="about_translators_transifex_label" translatable="false">Transifex</string> <string name="about_testers_title">Testers</string> <string name="about_testers" translatable="false">Jan C. Borchardt</string> <string name="about_source_title">Source code</string> - <string name="about_source">This project is hosted on GitHub: <a href="%1$s">%1$s</a></string> + <string name="about_source">This project is hosted on GitHub: %1$s</string> <string name="about_issues_title">Issues</string> - <string name="about_issues">You can report bugs, enhancement proposals and feature requests at the GitHub issue tracker: <a href="%1$s">%1$s</a></string> + <string name="about_issues">You can report bugs, enhancement proposals and feature requests at the GitHub issue tracker: %1$s</string> <string name="about_translate_title">Translate</string> - <string name="about_translate">Join the Nextcloud team on Transifex and help us to translate this app: <a href="%1$s">%1$s</a></string> + <string name="about_translate">Join the Nextcloud team on Transifex and help us to translate this app: %1$s</string> <string name="about_app_license_title">App license</string> <string name="about_app_license">This application is licensed under the GNU GENERAL PUBLIC LICENSE v3+.</string> <string name="about_app_license_button">View license</string> - <string name="about_app_icon_author" translatable="false"><a href="http://jancborchardt.net/">Jan C. Borchardt</a> (<a href="https://github.com/nextcloud/notes/blob/76d15214f80f2bf7ea08427bff73ad145128f090/img/notes.svg">GitHub</a>)</string> + <string name="about_app_icon_author_link_label" translatable="false">GitHub</string> <string name="about_icons_disclaimer_title">Icons</string> - <string name="about_icons_disclaimer"><p>Original icon made by %1$s.</p><p>All further icons used by this app are <a href="https://materialdesignicons.com/">Material Design Icons</a> made by Google Inc. and licensed under the Apache 2.0 License.</p></string> + <string name="about_icons_disclaimer_app_icon">For the original icon see %1$s.</string> + <string name="about_icons_disclaimer_mdi_icons">All further icons used by this app are %1$s made by Google Inc. and licensed under the Apache 2.0 License.</string> + <string name="about_icons_disclaimer_mdi">Material Design Icons</string> <string name="about_credits_tab_title">Credits</string> <string name="about_contribution_tab_title">Contribution</string> <string name="about_license_tab_title">License</string> @@ -298,7 +304,6 @@ <string name="simple_next">Next</string> <string name="simple_prev">Previous</string> <string name="simple_backup">Backup</string> - <string name="simple_repair">Repair</string> <string name="backup">We detected an irrecoverably state of the app. Please backup your unsynchronized changes and clear the storage of the Notes app.</string> <string name="settings_notes_path_description">Folder to store your notes in your Nextcloud</string> <string-array name="settings_file_suffixes"> |