properly handle <plurals>

<plurals> handles the grammar needed for numbers/quantities in various
languages.  Like in a number of slavic languages, numbers ending in 0,
1 or others have separate grammar.  In English, there is just 1 and
then all the rest (0 days, 2 days, 3 days, etc). <plurals> does not
handle multiple strings for different quantities, like having a
different string for each number case.  For that, we have to do it in
Java and have multiple <strings>

!472
This commit is contained in:
Hans-Christoph Steiner 2017-04-18 17:17:05 +02:00
parent 77e3d6a6f1
commit cfabd2a2c3
19 changed files with 55 additions and 13 deletions

View File

@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.annotation.DrawableRes;
@ -404,7 +405,14 @@ public class AppDetailsRecyclerViewAdapter
}
if (app.lastUpdated != null) {
int daysSince = Utils.daysSince(app.lastUpdated);
lastUpdateView.setText(lastUpdateView.getContext().getResources().getQuantityString(R.plurals.details_last_update_days, daysSince, daysSince));
String text;
Resources resources = lastUpdateView.getContext().getResources();
if (daysSince < 1) {
text = resources.getString(R.string.details_last_updated_today);
} else {
text = resources.getQuantityString(R.plurals.details_last_update_days, daysSince, daysSince);
}
lastUpdateView.setText(text);
lastUpdateView.setVisibility(View.VISIBLE);
} else {
lastUpdateView.setVisibility(View.GONE);

View File

@ -7,6 +7,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.graphics.Outline;
import android.net.Uri;
import android.os.Build;
@ -26,10 +27,8 @@ import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import org.fdroid.fdroid.AppDetails2;
import org.fdroid.fdroid.AppUpdateStatusManager;
import org.fdroid.fdroid.R;
@ -273,9 +272,9 @@ public class AppListItemController extends RecyclerView.ViewHolder {
/**
* The app name {@link TextView} is used for a few reasons:
* * Display name + summary of the app (most common).
* * If downloading, mention that it is downloading instead of showing the summary.
* * If downloaded and ready to install, mention that it is ready to update/install.
* <li> Display name + summary of the app (most common).
* <li> If downloading, mention that it is downloading instead of showing the summary.
* <li> If downloaded and ready to install, mention that it is ready to update/install.
*/
private void configureAppName(@NonNull App app) {
if (isReadyToInstall(app)) {
@ -284,7 +283,16 @@ public class AppListItemController extends RecyclerView.ViewHolder {
if (app.lastUpdated != null) {
long ageInMillis = System.currentTimeMillis() - app.lastUpdated.getTime();
int ageInDays = (int) (ageInMillis / 1000 / 60 / 60 / 24);
String age = activity.getResources().getQuantityString(R.plurals.app_list__age__released_x_days_ago, ageInDays, ageInDays);
Resources resources = activity.getResources();
String age;
if (ageInDays == 0) {
age = resources.getString(R.string.app_list__age__released_today);
} else if (ageInDays == 1) {
age = resources.getString(R.string.app_list__age__released_yesterday);
} else {
age = resources.getQuantityString(R.plurals.app_list__age__released_x_days_ago,
ageInDays, ageInDays);
}
name.setText(appName + "\n" + age);
} else {
name.setText(appName);

View File

@ -1,6 +1,7 @@
package org.fdroid.fdroid.views.main;
import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
@ -14,7 +15,6 @@ import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.UpdateService;
import org.fdroid.fdroid.Utils;
@ -123,7 +123,14 @@ class WhatsNewViewBinder implements LoaderManager.LoaderCallbacks<Cursor> {
emptyStateText.append(activity.getString(R.string.latest__empty_state__never_updated));
} else {
int daysSince = Utils.daysSince(lastUpdate);
emptyStateText.append(activity.getResources().getQuantityString(R.plurals.details_last_update_days, daysSince, daysSince));
Resources resources = activity.getResources();
String text;
if (daysSince < 1) {
text = resources.getString(R.string.details_last_updated_today);
} else {
text = resources.getQuantityString(R.plurals.details_last_update_days, daysSince, daysSince);
}
emptyStateText.append(text);
}
}

View File

@ -415,7 +415,7 @@ corréu colos detalles p\'ayudar a iguar esti problema?</string>
<item quantity="one">Baxar anovamientu pa %1$d aplicación.</item>
<item quantity="other">Baxar anovamientos pa %1$d aplicaciones.</item>
</plurals>
<string name="details_last_updated_today">Anovóse güei</string>
<plurals name="details_last_update_days">
<item quantity="one">Anovóse güei</item>
<item quantity="other">Anovóse hai %1$s día</item>

View File

@ -434,6 +434,7 @@ https://developer.android.com/guide/topics/resources/string-resource.html#Plural
<string name="app_list__name__downloaded_and_ready_to_update">Actualitzeu %1$s</string>
<string name="app_list__name__downloaded_and_ready_to_install">Instal·leu %1$s</string>
<string name="app_list__name__downloading_in_progress">Descarregant %1$s</string>
<string name="app_list__age__released_yesterday">Publicat ahir</string>
<plurals name="app_list__age__released_x_days_ago">
<item quantity="one">Publicat ahir</item>
<item quantity="other">Publicat fa %1$s dies</item>
@ -454,6 +455,7 @@ https://developer.android.com/guide/topics/resources/string-resource.html#Plural
<string name="details_new_in_version">Novetats a la versió %s</string>
<string name="antifeatureswarning">Aquesta app conté característiques que potser no us agradarien.</string>
<string name="details_last_updated_today">Actualitzades avui</string>
<plurals name="details_last_update_days">
<item quantity="one">Actualitzades avui</item>
<item quantity="other">Actualitzades fa %1$s dies</item>

View File

@ -442,6 +442,7 @@ Bitte eine andere Kategorie wählen oder die Paketquellen aktualisieren.</string
<string name="antifeatureswarning">Diese Anwendung hat Merkmale, die Ihnen nicht gefallen könnten.</string>
<string name="antifeatures">Unfreie Merkmale</string>
<string name="details_last_updated_today">Heute aktualisiert</string>
<plurals name="details_last_update_days">
<item quantity="one">Heute aktualisiert</item>
<item quantity="other">Vor %1$d Tagen aktualisiert</item>

View File

@ -448,6 +448,7 @@ Provu elekti alian kategorion aŭ ĝisdatigi viajn deponejojn por atingi freŝan
<string name="antifeatureswarning">Ĉi tiu aplikaĵo enhavas eblojn, kiujn vi eble ne ŝatas.</string>
<string name="antifeatures">Fiebloj</string>
<string name="details_last_updated_today">Ĝisdatigita hodiaŭ</string>
<plurals name="details_last_update_days">
<item quantity="one">Ĝisdatigita hodiaŭ</item>
<item quantity="other">Ĝisdatigita antaŭ %1$s tagoj</item>

View File

@ -433,6 +433,8 @@ detalles para ayudarnos a arreglar el problema?</string>
<string name="app_list__name__downloaded_and_ready_to_update">Actualizar %1$s</string>
<string name="app_list__name__downloaded_and_ready_to_install">Instalar %1$s</string>
<string name="app_list__name__downloading_in_progress">Descargando %1$s</string>
<string name="app_list__age__released_today">publicada hoy</string>
<string name="app_list__age__released_yesterday">publicada ayer</string>
<plurals name="app_list__age__released_x_days_ago">
<item quantity="one">publicada ayer</item>
<item quantity="other">publicada hace %1$d días</item>
@ -454,6 +456,7 @@ detalles para ayudarnos a arreglar el problema?</string>
<string name="antifeatureswarning">Est app contiene características que podrían no gustarte.</string>
<string name="antifeatures">Características no-libres</string>
<string name="details_last_updated_today">Actualizada hoy</string>
<plurals name="details_last_update_days">
<item quantity="one">Actualizada hoy</item>
<item quantity="other">Actualizadas hace %1$s días</item>

View File

@ -461,7 +461,7 @@ konpontzen laguntzeko?</string>
<item quantity="one">" Bi hauek berdina badira ere, Androiden dokumentazioak gutxienez bata zein bestea zehaztea aholkatzen du: https://developer.android.com/guide/topics/resources/string-resource.html#Plurals "</item>
<item quantity="other">" Ikusi guztiak %d "</item>
</plurals>
<string name="details_last_updated_today">Gaur eguneratua</string>
<plurals name="details_last_update_days">
<item quantity="one">Gaur eguneratua</item>
<item quantity="other">Orain dela %1$s egun eguneratua</item>

View File

@ -449,6 +449,7 @@
<item quantity="one">今日更新</item>
<item quantity="other"/>
</plurals>
<string name="details_last_updated_today">今日更新</string>
<string name="app_list__name__successfully_installed">%1$s を正常にインストールしました</string>
<string name="nearby_splash__download_apps_from_people_nearby">インターネットがありませんか? 近くの人からアプリをダウンロードしてください!</string>
<string name="nearby_splash__find_people_button">近くの人を見つける</string>

View File

@ -422,6 +422,7 @@ i en e-post for å fikse problemet?</string>
<string name="app_list__name__downloaded_and_ready_to_update">Oppdater %1$s</string>
<string name="app_list__name__downloaded_and_ready_to_install">Installer %1$s</string>
<string name="app_list__name__downloading_in_progress">Henter %1$s</string>
<string name="app_list__age__released_yesterday">Utgitt i går</string>
<plurals name="app_list__age__released_x_days_ago">
<item quantity="one">Utgitt i går</item>
<item quantity="other">Utgitt for %1$d dager siden</item>
@ -446,6 +447,7 @@ i en e-post for å fikse problemet?</string>
<item quantity="one">" Vis alle %d "</item>
<item quantity="other">" Vis alle %d "</item>
</plurals>
<string name="details_last_updated_today">Oppdatert i dag</string>
<plurals name="details_last_update_days">
<item quantity="one">Oppdatert i dag</item>

View File

@ -447,6 +447,7 @@ Uwaga: Wszystkie poprzednio zainstalowane aplikacje zostaną na urządzeniu.</st
<string name="antifeatureswarning">Ta aplikacja zawiera funkcje, których możesz nie lubić.</string>
<string name="antifeatures">Niepożądane funkcje</string>
<string name="details_last_updated_today">Uaktualniono dzisiaj</string>
<plurals name="details_last_update_days">
<item quantity="one">Uaktualniono dzisiaj</item>
<item quantity="few">Uaktualniono %1$s dni temu</item>

View File

@ -463,6 +463,7 @@ com os detalhes para ajudar a corrigir o problema?</string>
<string name="nearby_splash__find_people_button">Encontrar pessoas perto de mim</string>
<string name="nearby_splash__both_parties_need_fdroid">Ambas as partes precisam de %1$s para usar perto.</string>
<string name="details_last_updated_today">Atualizado hoje</string>
<plurals name="details_last_update_days">
<item quantity="one">Atualizados %1$s dias atrás</item>
<item quantity="other">Atualizados %1$s dias atrás</item>

View File

@ -466,6 +466,7 @@ Gostaria de nos enviar um e-mail com os detalhes do erro?</string>
<string name="tts_category_name">Categoria %1$s</string>
<string name="details_last_updated_today">Atualizado hoje</string>
<plurals name="details_last_update_days">
<item quantity="one">Atualizada há %1$s dia</item>
<item quantity="other">Atualizada há %1$s dias</item>

View File

@ -388,6 +388,7 @@ Nota: Toate
<item quantity="few">Vezi toate cele %1$d aplicații din categoria %2$s</item>
<item quantity="other">Vezi toate cele %1$d de aplicații din categoria %2$s</item>
</plurals>
<string name="details_last_updated_today">Actualizate azi</string>
<plurals name="details_last_update_days">
<item quantity="one">Actualizate azi</item>
<item quantity="few">Actualizate acum %1$s zile</item>

View File

@ -410,6 +410,7 @@
<string name="notification_title_summary_downloading">Загрузка…</string>
<string name="notification_title_summary_downloading_update">Загрузка обновления…</string>
<string name="notification_action_update">Обновить</string>
<string name="details_last_updated_today">Обновлено сегодня</string>
<plurals name="details_last_update_days">
<item quantity="one">Обновлено %1$s дня назад</item>
<item quantity="few">Обновлено %1$s дня назад</item>

View File

@ -454,6 +454,7 @@ Depes
<string name="antifeatureswarning">Custa aplicatzione tenet funtzionalidades chi ti diant pòdere non agradare.</string>
<string name="antifeatures">Anti-funtzionalidades</string>
<string name="details_last_updated_today">Agiornadu oe</string>
<plurals name="details_last_update_days">
<item quantity="one">Agiornadu oe</item>
<item quantity="other">Agiornadu %1$s dies faghet</item>

View File

@ -402,6 +402,7 @@ a pomôť tak vyriešiť problém?</string>
<string name="app_list__name__downloaded_and_ready_to_install">Inštalovať %1$s</string>
<string name="app_list__name__downloading_in_progress">Sťahovanie %1$s</string>
<string name="app_list__name__successfully_installed">%1$s úspešne nainštalovaná</string>
<string name="app_list__age__released_yesterday">Vydané pred dňom</string>
<plurals name="app_list__age__released_x_days_ago">
<item quantity="one">Vydané pred dňom</item>
<item quantity="few">Vydané pred %1$d dňami</item>

View File

@ -72,6 +72,8 @@
<string name="app_list__name__downloaded_and_ready_to_install">Install %1$s</string>
<string name="app_list__name__downloading_in_progress">Downloading %1$s</string>
<string name="app_list__name__successfully_installed">%1$s successfully installed</string>
<string name="app_list__age__released_today">Released today</string>
<string name="app_list__age__released_yesterday">Released yesterday</string>
<plurals name="app_list__age__released_x_days_ago">
<item quantity="one">Released %1$d day ago</item>
<item quantity="other">Released %1$d days ago</item>
@ -473,12 +475,12 @@
<string name="tts_category_name">Category %1$s</string>
<plurals name="tts_view_all_in_category">
<item quantity="one">View the single one app in the %2$s category</item>
<item quantity="one">View %1$d app in the %2$s category</item>
<item quantity="other">View all %1$d apps from the %2$s category</item>
</plurals>
<string name="details_last_updated_today">Updated today</string>
<plurals name="details_last_update_days">
<item quantity="zero">Updated today</item>
<item quantity="one">Updated %1$s day ago</item>
<item quantity="other">Updated %1$s days ago</item>
</plurals>