From f6983bba4b17f482c6e8576063cdfa7bef1036dc Mon Sep 17 00:00:00 2001 From: Jimmy Shih Date: Thu, 17 Nov 2011 14:31:37 -0800 Subject: [PATCH] Add support for singular/plural. --- MyTracks/res/values-ca/strings.xml | 13 +- MyTracks/res/values-de/strings.xml | 13 +- MyTracks/res/values-es/strings.xml | 14 +- MyTracks/res/values-fi/strings.xml | 14 +- MyTracks/res/values-fr/strings.xml | 11 +- MyTracks/res/values-it/strings.xml | 13 +- MyTracks/res/values-ja/strings.xml | 14 +- MyTracks/res/values-pl/strings.xml | 13 +- MyTracks/res/values-pt-rBR/strings.xml | 13 +- MyTracks/res/values-ru/strings.xml | 14 +- MyTracks/res/values-sv/strings.xml | 13 +- MyTracks/res/values-zh-rCN/strings.xml | 14 +- MyTracks/res/values/strings.xml | 310 ++++++++++++++---- .../apps/mytracks/ImportAllTracks.java | 4 +- .../services/tasks/StatusAnnouncerTask.java | 124 ++++--- 15 files changed, 329 insertions(+), 268 deletions(-) diff --git a/MyTracks/res/values-ca/strings.xml b/MyTracks/res/values-ca/strings.xml index 3f92a445a..f78a48027 100644 --- a/MyTracks/res/values-ca/strings.xml +++ b/MyTracks/res/values-ca/strings.xml @@ -197,20 +197,9 @@ limitations under the License. No es pot iniciar l\'enregistrament. Proveu de nou. S\'està enregistrant la ruta... Ara s\'està enregistrant una ruta nova. - hora - hores - kilòmetres per hora - kilòmetres - milles per hora - milles - minut - minuts - Sense distància My Tracks + Sense distància My Tracks per kilòmetre per milla - segon - segons - My Tracks %1$.2f %2$s en %3$s at %4$s %5$s Quant a My Tracks Benvingut diff --git a/MyTracks/res/values-de/strings.xml b/MyTracks/res/values-de/strings.xml index 861080237..c41e32754 100644 --- a/MyTracks/res/values-de/strings.xml +++ b/MyTracks/res/values-de/strings.xml @@ -208,20 +208,9 @@ limitations under the License. Fuß Std Min - Stunde - Stunden - Kilometer pro Stunde - Kilometer - Meilen pro Stunde - Meilen - Minute - Minuten - My Tracks keine Entfernung + My Tracks keine Entfernung pro Kilometer pro Meile - Sekunde - Sekunden - My Tracks %1$.2f %2$s in %3$s mit %4$s %5$s Über My Tracks Willkommen diff --git a/MyTracks/res/values-es/strings.xml b/MyTracks/res/values-es/strings.xml index b6a093e87..da4485502 100644 --- a/MyTracks/res/values-es/strings.xml +++ b/MyTracks/res/values-es/strings.xml @@ -41,7 +41,6 @@ limitations under the License. Esperando una ubicación mas exacta del GPS. Asegúrese que el cielo sea visible. Error importando el archivo %s No se encontraron archivos GPX en %s. Es posible que la tarjeta SD no sea accesible o que el directorio no contenga archivos GPX. - Importados %1$d de %2$d archivos GPX de %3$s Descripción de señal Nombre de señal Tipo de señal (por ejemplo, edificio, bache, atracción...) @@ -250,20 +249,9 @@ limitations under the License. Grabando su recorrido... Grabando un nuevo recorrido. pies - hora - horas - kilómetros por hora - kilómetros - millas por hora - millas - minuto - minutos - My Tracks sin distancia + My Tracks sin distancia por kilómetro por milla - segundo - segundos - My Tracks %1$.2f %2$s en %3$s a %4$s %5$s Sobre My Tracks Bienvenido diff --git a/MyTracks/res/values-fi/strings.xml b/MyTracks/res/values-fi/strings.xml index 53f85482c..115c4e849 100644 --- a/MyTracks/res/values-fi/strings.xml +++ b/MyTracks/res/values-fi/strings.xml @@ -44,7 +44,6 @@ limitations under the License. Odotetaan parempaa GPS-yhteyttä. Varmista että taivas on näkyvissä. Virhe tuotaessa tiedostoa %s Lähteestä %s ei löytynyt GPX-tiedostoja. SD-kortti saattaa olla lukukelvoton tai hakemistossa ei ole GPX-tiedostoja. - Tuotu %1$d GPX-tiedostoa %2$d:sta lähteestä %3$s Merkinnän kuvaus Merkinnän nimi Merkinnän tyyppi (esim. rakennus, kuoppa, nähtävyys...) @@ -250,20 +249,9 @@ limitations under the License. min/mi rpm W - tunti - tuntia - kilometriä tunnissa - kilometriä - mailia tunnissa - mailia - minuutti - minuuttia - My Tracks ei etäisyyttä + My Tracks ei etäisyyttä per kilometri per maili - sekunti - sekuntia - My Tracks %1$.2f %2$s ajassa %3$s nopeudella %4$s %5$s Tietoa My Tracksista Tervetuloa diff --git a/MyTracks/res/values-fr/strings.xml b/MyTracks/res/values-fr/strings.xml index 162c25ee0..7ae9959b3 100644 --- a/MyTracks/res/values-fr/strings.xml +++ b/MyTracks/res/values-fr/strings.xml @@ -198,18 +198,9 @@ limitations under the License. pied km/h mi/h - heure - heures - kilomètres/heure - kilomètres - miles/heure - milles - My Tracks pas de distance disponible + My Tracks pas de distance disponible par kilomètre per mile - seconde - secondes - My Tracks %1$.2f %2$s en %3$s at %4$s %5$s À propos de My Tracks Bienvenue diff --git a/MyTracks/res/values-it/strings.xml b/MyTracks/res/values-it/strings.xml index 131e275a3..78bb7d0f5 100644 --- a/MyTracks/res/values-it/strings.xml +++ b/MyTracks/res/values-it/strings.xml @@ -170,20 +170,9 @@ limitations under the License. min min/km min/mi - ora - ore - chilometri orari - chilometri - miglia orarie - miglia - minuto - minuti - Mai Tracks Distanza non disponibile + Mai Tracks Distanza non disponibile per chilometro per miglio - secondo - secondi - Mai Tracks %1$.2f %2$s in %3$s a %4$s %5$s Informazioni su My Tracks Benvenuto diff --git a/MyTracks/res/values-ja/strings.xml b/MyTracks/res/values-ja/strings.xml index f736cde23..398dcccae 100644 --- a/MyTracks/res/values-ja/strings.xml +++ b/MyTracks/res/values-ja/strings.xml @@ -42,7 +42,6 @@ limitations under the License. GPS位置精度がよくなるまで待機しています.空が見えるところにいて下さい. ファイル %s のインポートエラー %s ではGPXファイルがありません.SDカードを読み込めないかディレクトリにGPXファイルが無いかも知れません. - %3$s からGPXファイル %2$d件のうち %1$d件をインポートしました マーカー説明 マーカー名 マーカータイプ(建物、洞穴、名所...) @@ -226,20 +225,9 @@ limitations under the License. 新しいトラックを記録中です. 時 分 - 時 - 時 - キロメータ毎時 - キロメータ - マイル毎時 - マイル - 分 - 分 - My Tracks 移動していません + My Tracks 移動していません 毎キロメータ 毎マイル - 秒 - 秒 - My Tracks %1$.2f %2$s 時間 %3$s 速度/ペース %4$s %5$s My Tracksについて ようこそ diff --git a/MyTracks/res/values-pl/strings.xml b/MyTracks/res/values-pl/strings.xml index 8b769797c..03bac3213 100644 --- a/MyTracks/res/values-pl/strings.xml +++ b/MyTracks/res/values-pl/strings.xml @@ -199,20 +199,9 @@ limitations under the License. min min/km min/mi - godzina - godziny - kilometry na godzinę - kilometerów - mile na godzinę - mil - minuta - minuty - My Tracks brak odległości + My Tracks brak odległości na kilometr na milę - sekunda - sekundy - My Tracks %1$.2f %2$s w %3$s w tempie %4$s %5$s O My Tracks Witamy diff --git a/MyTracks/res/values-pt-rBR/strings.xml b/MyTracks/res/values-pt-rBR/strings.xml index 62740a36e..874d29622 100644 --- a/MyTracks/res/values-pt-rBR/strings.xml +++ b/MyTracks/res/values-pt-rBR/strings.xml @@ -159,20 +159,9 @@ limitations under the License. Gravando um novo caminho. pés h - hora - horas - kilômetros por hora - kilômetros - milhas por hora - milhas - minuto - minutos - My Tracks sem distância + My Tracks sem distância por kilômetro por milha - segundo - segundos - My Tracks %1$.2f %2$s em %3$s a %4$s %5$s Sobre My Tracks Bem-vindo diff --git a/MyTracks/res/values-ru/strings.xml b/MyTracks/res/values-ru/strings.xml index 186f57e87..dbaee87ae 100644 --- a/MyTracks/res/values-ru/strings.xml +++ b/MyTracks/res/values-ru/strings.xml @@ -43,7 +43,6 @@ limitations under the License. Ожидание сигнала GPS. Убедитесь в том, что вы находитесь под открытым небом. Ошибка импорта файла %s GPX файлы не найденны в %s. Возможно не читается SD-карта или каталог не содержит GPX файлы. - Импортировано %1$d из %2$d GPX файлов с %3$s Описание маркера Имя маркера Тип маркера (например: здание, выбоина, достопримечательность...) @@ -246,20 +245,9 @@ limitations under the License. мин/миля об/мин Вт - час - часов - километров в час - километров - миль в час - мили - минута - минут - My Tracks нет расстояния + My Tracks нет расстояния за километр за милю - секунда - секунд - Мои треки %1$.2f %2$s в %3$s на %4$s %5$s О My Tracks Добро пожаловать diff --git a/MyTracks/res/values-sv/strings.xml b/MyTracks/res/values-sv/strings.xml index 123d4df31..532248b47 100644 --- a/MyTracks/res/values-sv/strings.xml +++ b/MyTracks/res/values-sv/strings.xml @@ -169,20 +169,9 @@ limitations under the License. min min/km min/mi - timme - timmar - kilometer i timmen - kilometer - miles i timmen - miles - minut - minuter - My Tracks ingen distans + My Tracks ingen distans per kilometer per mile - sekund - sekunder - My Tracks %1$.2f %2$s på %3$s i %4$s %5$s Om My Tracks Välkommen diff --git a/MyTracks/res/values-zh-rCN/strings.xml b/MyTracks/res/values-zh-rCN/strings.xml index 05765b4e1..4f92f43fc 100644 --- a/MyTracks/res/values-zh-rCN/strings.xml +++ b/MyTracks/res/values-zh-rCN/strings.xml @@ -44,7 +44,6 @@ limitations under the License. 等待更准确的 GPS 定位. 请确定可以看见天空. 导入文件 %s 出错. 在 %s 中未找到 GPX 文件. SD 存储卡不可用或者目录中没有 GPX 文件. - 已从 %3$s 导入 %1$d 个 GPX 文件, 共 %2$d 个. 标记描述 标记名称 标记类型 (例如: 建筑, 陷坑, 景点...) @@ -227,20 +226,9 @@ limitations under the License. 现在开始记录新的轨迹. 时 分 - 小时 - 小时 - 千米每小时 - 千米 - 英里每小时 - 英里 - 分钟 - 分钟 - My Tracks 无距离 + My Tracks 无距离 每千米 每英里 - 秒 - 秒 - My Tracks %1$.2f %2$s 用时 %3$s 速度 %4$s %5$s 关于 My Tracks 欢迎 diff --git a/MyTracks/res/values/strings.xml b/MyTracks/res/values/strings.xml index 71f617dda..3337251e8 100644 --- a/MyTracks/res/values/strings.xml +++ b/MyTracks/res/values/strings.xml @@ -348,14 +348,14 @@ limitations under the License. My Tracks is run by volunteers and Googlers in their 20% time. If you would like to contribute, please visit:\n \n - http://mytracks.googlecode.com\n + http://mytracks.googlecode.com\n My Tracks allows you to record and share your GPS tracks, including statistics. - + + %1$s: the track's file path on the SD card. E.g., '/mnt/sdcard/MyTacks/gpx/1.gpx'."> Import error for file %1$s. + + %1$d GPX files + + + %1$d GPX files + + + 1 GPX file + + + %1$d GPX files + + + 2 GPX files + + + 0 GPX files + + %1$s: the SD card directory path. E.g., '/mnt/sdcard/MyTracks/gpx/'."> No GPX file found in %1$s. The SD card may be unreadable or the directory may not contain any GPX file. @@ -618,10 +648,10 @@ limitations under the License. translation_description="After importing all the tracks from the SD card, the alert message indicating success. - %1$d the number of successfully imported tracks. E.g., '5'. - %2$d the number of total tracks to be imported. E.g., '6'. - %3$s the directory path. E.g., '/mnt/sdcard/MyTracks/gpx/'."> - Imported to My Tracks %1$d of %2$d GPX files from %3$s. + %1$d the number of successfully imported tracks. E.g., '1'. + %2$s the number of GPX files in the SD card. E.g., '1 GPX file' or '2 GPX files'. + %3$s the SD card directory path. E.g., '/mnt/sdcard/MyTracks/gpx/'."> + My Tracks: Imported %1$d of %2$s from %3$s. @@ -1995,73 +2025,239 @@ limitations under the License. - - hour + + %1$d hours - - hours + + %1$d hours - - kilometers per hour + + 1 hour - - kilometers + + %1$d hours - - miles per hour + + 2 hours - - miles + + 0 hours - - minute + + %1$d minutes - - minutes + + %1$d minutes - - My Tracks no distance. + + 1 minute + + + %1$d minutes + + + 2 minutes + + + 0 minutes + hours 2 minutes per kilometer'."> per kilometer + translation_description="For voice announcement, to say 'per mile' for pace like 'two hours 2 + minutes per mile'."> per mile - - second + + %1$d seconds - - seconds + + %1$d seconds + + + 1 second + + + %1$d seconds + + + 2 seconds + + + 0 seconds + + + %1$.1f kilometers per hour + + + %1$.1f kilometers per hour + + + 1 kilometer per hour + + + %1$.1f kilometers per hour + + + 2 kilometers per hour + + + 0 kilometers per hour + + + %1$.1f miles per hour + + + %1$.1f miles per hour + + + 1 mile per hour + + + %1$.1f miles per hour + + + 2 miles per hour + + + 0 miles per hour - My Tracks total distance %1$.2f %2$s in %3$s at %4$s %5$s. + %1$s: distance string. E.g., '1 mile' or '1.2 miles', '1 kilometer', '2.2 kilometers' + %2$s: time string. E.g., '1 hour and 30 minutes' or '20 minutes 1 second' + %3$s: speed/pace string. For speed, e.g., '2.2 miles per hour', '1 kilometer per hour'. For + pace, e.g., '2 hours 1 minute per mile', '30 minutes 1 second per kilometer'."> + My Tracks total distance %1$s in %2$s at %3$s. + + + total distance %1$.2f kilometers + + + total distance %1$.2f kilometers + + + total distance 1 kilometer + + + total distance %1$.2f kilometers + + + total distance 2 kilometers + + + total distance 0 kilometers + + + total distance %1$.2f miles + + + total distance %1$.2f miles + + + total distance 1 mile + + + total distance %1$.2f miles + + + total distance 2 miles + + + total distance 0 miles + + + My Tracks total distance zero. @@ -2292,7 +2488,7 @@ limitations under the License. statistics, and graphs view. + translation_description="In the 'Welcome' page, the help content question on app navigation."> How do I see the map, statistics, and graphs view? Recording -> GPS accuracy. If the precision is too low, - at the top of the screen, you will see the message \"Waiting for a better GPS fix.\". + at the top of the screen, you will see the message \"Waiting for a better GPS fix.\". Tracks on Google My Maps and Google Fusion Tables are limited to certain sizes. diff --git a/MyTracks/src/com/google/android/apps/mytracks/ImportAllTracks.java b/MyTracks/src/com/google/android/apps/mytracks/ImportAllTracks.java index 4bd2aefbe..7c20f22e4 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/ImportAllTracks.java +++ b/MyTracks/src/com/google/android/apps/mytracks/ImportAllTracks.java @@ -128,8 +128,10 @@ public class ImportAllTracks { if (gpxFileCount == 0) { builder.setMessage(activity.getString(R.string.import_no_file, gpxPath)); } else { + String totalFiles = activity.getResources().getQuantityString( + R.plurals.importGpxFiles, gpxFileCount, gpxFileCount); builder.setMessage( - activity.getString(R.string.import_success, importSuccessCount, gpxFileCount, gpxPath)); + activity.getString(R.string.import_success, importSuccessCount, totalFiles, gpxPath)); } builder.setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() { @Override diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/tasks/StatusAnnouncerTask.java b/MyTracks/src/com/google/android/apps/mytracks/services/tasks/StatusAnnouncerTask.java index d3b1691aa..086403649 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/tasks/StatusAnnouncerTask.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/tasks/StatusAnnouncerTask.java @@ -150,66 +150,72 @@ public class StatusAnnouncerTask implements PeriodicTask { */ // @VisibleForTesting protected String getAnnouncement(TripStatistics stats) { - SharedPreferences preferences = - context.getSharedPreferences(Constants.SETTINGS_NAME, 0); boolean metricUnits = true; boolean reportSpeed = true; + SharedPreferences preferences = context.getSharedPreferences(Constants.SETTINGS_NAME, 0); if (preferences != null) { - metricUnits = - preferences.getBoolean(context.getString(R.string.metric_units_key), - true); - reportSpeed = - preferences.getBoolean(context.getString(R.string.report_speed_key), - true); + metricUnits = preferences.getBoolean(context.getString(R.string.metric_units_key), true); + reportSpeed = preferences.getBoolean(context.getString(R.string.report_speed_key), true); } - double d = stats.getTotalDistance() / 1000; - double s = stats.getAverageMovingSpeed() * 3.6; + double d = stats.getTotalDistance() / 1000; // d is in kilometers + double s = stats.getAverageMovingSpeed() * 3.6; // s is in kilometers per hour + if (d == 0) { - return context.getString(R.string.voice_no_distance); + return context.getString(R.string.voice_total_distance_zero); } - int speedLabel; - if (metricUnits) { - if (reportSpeed) { - speedLabel = R.string.voice_kilometer_per_hour; - } else { - speedLabel = R.string.voice_per_kilometer; - } - } else { - s *= UnitConversions.KMH_TO_MPH; + if (!metricUnits) { d *= UnitConversions.KM_TO_MI; - if (reportSpeed) { - speedLabel = R.string.voice_mile_per_hour; - } else { - speedLabel = R.string.voice_per_mile; - } + s *= UnitConversions.KMH_TO_MPH; } - String speed = null; - if ((s == 0) || Double.isNaN(s)) { - speed = context.getString(R.string.value_unknown); + if (!reportSpeed) { + s = 3600000.0 / s; // converts from speed to pace + } + + // Makes sure s is not NaN. + if (Double.isNaN(s)) { + s = 0; + } + + String speed; + if (reportSpeed) { + int speedId = metricUnits ? R.plurals.voiceSpeedKilometersPerHour + : R.plurals.voiceSpeedMilesPerHour; + speed = context.getResources().getQuantityString(speedId, getQuantityCount(s), s); } else { - if (reportSpeed) { - speed = String.format("%.1f", s); - } else { - double pace = 3600000.0 / s; - Log.w(Constants.TAG, - "Converted speed: " + s + " to pace: " + pace); - speed = getAnnounceTime((long) pace); - } + int perDistancelId = metricUnits ? R.string.voice_per_kilometer : R.string.voice_per_mile; + speed = getAnnounceTime((long) s) + " " + context.getString(perDistancelId); } - return context.getString(R.string.voice_template, - d, - context.getString(metricUnits - ? R.string.voice_kilometers - : R.string.voice_miles), - getAnnounceTime(stats.getMovingTime()), - speed, - context.getString(speedLabel)); - } + int totalDistanceId = metricUnits ? R.plurals.voiceTotalDistanceKilometers + : R.plurals.voiceTotalDistanceMiles; + String totalDistance = context.getResources().getQuantityString( + totalDistanceId, getQuantityCount(d), d); + return context.getString( + R.string.voice_template, totalDistance, getAnnounceTime(stats.getMovingTime()), speed); + } + + /** + * Gets the plural count to be used by getQuantityString. + * + * @param d the double value + */ + private int getQuantityCount(double d) { + if (d == 0) { + return 0; + } else if (d == 1) { + return 1; + } else if (d == 2) { + return 2; + } else { + int count = (int) d; + return count < 3 ? 3 : count; + } + } + @Override public void start() { Log.i(Constants.TAG, "Starting TTS"); @@ -331,30 +337,22 @@ public class StatusAnnouncerTask implements PeriodicTask { @VisibleForTesting String getAnnounceTime(long time) { int[] parts = StringUtils.getTimeParts(time); - String secLabel = - context.getString(parts[0] == 1 ? R.string.voice_second : R.string.voice_seconds); - String minLabel = - context.getString(parts[1] == 1 ? R.string.voice_minute : R.string.voice_minutes); - String hourLabel = - context.getString(parts[2] == 1 ? R.string.voice_hour : R.string.voice_hours); + String seconds = context.getResources().getQuantityString( + R.plurals.voiceSeconds, parts[0], parts[0]); + String minutes = context.getResources().getQuantityString( + R.plurals.voiceMinutes, parts[1], parts[1]); + String hours = context.getResources().getQuantityString( + R.plurals.voiceHours, parts[2], parts[2]); StringBuilder sb = new StringBuilder(); if (parts[2] != 0) { - sb.append(parts[2]); + sb.append(hours); sb.append(" "); - sb.append(hourLabel); - sb.append(" "); - sb.append(parts[1]); - sb.append(" "); - sb.append(minLabel); + sb.append(minutes); } else { - sb.append(parts[1]); + sb.append(minutes); sb.append(" "); - sb.append(minLabel); - sb.append(" "); - sb.append(parts[0]); - sb.append(" "); - sb.append(secLabel); + sb.append(seconds); } return sb.toString(); }