From 6dfda6b7474b51d41e65219718c0ca6b93b2a9dc Mon Sep 17 00:00:00 2001 From: koem Date: Thu, 20 Jun 2013 10:28:26 -0600 Subject: plurals for direction, singulars for distances --- main/res/values-de/strings.xml | 5 ++ main/res/values-fr/strings.xml | 5 ++ main/res/values-it/strings.xml | 9 ++- main/res/values-sv/strings.xml | 11 ++- main/res/values/strings.xml | 5 ++ main/src/cgeo/geocaching/speech/TextFactory.java | 82 +++++++++++---------- .../cgeo/geocaching/speech/TextFactoryTest.java | 84 +++++++++++++--------- 7 files changed, 126 insertions(+), 75 deletions(-) diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml index ef4b903..a41fa40 100644 --- a/main/res/values-de/strings.xml +++ b/main/res/values-de/strings.xml @@ -1095,22 +1095,27 @@ Sprechender Kompass Starte Sprache Stoppe Sprache + ein Kilometer %s Kilometer %s Kilometer + ein Meter %s Meter %s Meter + eine Meile %s Meile %s Meilen + ein Fuß %s Fuß %s Fuß + ein Uhr %s Uhr diff --git a/main/res/values-fr/strings.xml b/main/res/values-fr/strings.xml index 70bab69..c2b2001 100644 --- a/main/res/values-fr/strings.xml +++ b/main/res/values-fr/strings.xml @@ -1069,22 +1069,27 @@ Boussole parlante Commencer à parler Arrêter de parler + un kilomètre %s kilomètre %s kilomètres + un mètre %s mètre %s mètres + un mille %s mille %s milles + un pied %s pied %s pieds + une heure %s heures diff --git a/main/res/values-it/strings.xml b/main/res/values-it/strings.xml index 9f1182a..5a9c107 100644 --- a/main/res/values-it/strings.xml +++ b/main/res/values-it/strings.xml @@ -1086,24 +1086,29 @@ Bussola parlante Start voce Stop voce + uno chilometro %s chilometro %s chilometri + uno metro %s metro %s metri + uno miglio %s miglio %s miglia + uno piede %s piede %s piedi - %s precisi - + a ore una + a ore %s + Copiato nella clipboard diff --git a/main/res/values-sv/strings.xml b/main/res/values-sv/strings.xml index 44e812b..92b65e4 100644 --- a/main/res/values-sv/strings.xml +++ b/main/res/values-sv/strings.xml @@ -877,24 +877,29 @@ Talande kompass Starta tal Stoppa tal + ett kilometer %s kilometer %s kilometer + ett meter %s meter %s meter + ett engelsk mil - %s eng. mil - %s eng. mil + %s engelsk mil + %s engelsk mil + ett fot %s fot %s fot + Klockan ett Klockan %s - + Kopierat till urklipp diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml index a9d6534..f5dfcb9 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -1097,22 +1097,27 @@ Talking compass Start talking Stop talking + one kilometer %s kilometer %s kilometers + one meter %s meter %s meters + one mile %s mile %s miles + one foot %s foot %s feet + one o\'clock %s o\'clock diff --git a/main/src/cgeo/geocaching/speech/TextFactory.java b/main/src/cgeo/geocaching/speech/TextFactory.java index 993f1cf..d4f3a48 100644 --- a/main/src/cgeo/geocaching/speech/TextFactory.java +++ b/main/src/cgeo/geocaching/speech/TextFactory.java @@ -25,53 +25,56 @@ public class TextFactory { float kilometers = position.distanceTo(target); if (Settings.isUseMetricUnits()) { - if (kilometers >= 5.0) { - int quantity = Math.round(kilometers); - return getQuantityString(R.plurals.tts_kilometers, quantity, String.valueOf(quantity)); - } - if (kilometers >= 1.0) { - float precision1 = Math.round(kilometers * 10.0f) / 10.0f; - float precision0 = Math.round(kilometers); - if (precision1 == precision0) { - // this is an int - e.g. 2 kilometers - int quantity = (int) precision0; - return getQuantityString(R.plurals.tts_kilometers, quantity, String.valueOf(quantity)); - } - // this is no int - e.g. 1.7 kilometers - String digits = String.format(Locale.getDefault(), "%.1f", kilometers); - // always use the plural (9 leads to plural) - return getQuantityString(R.plurals.tts_kilometers, 9, digits); - } - int meters = (int) Math.round(kilometers * 1000.0); - if (meters > 50) { - meters = (int) Math.round(meters / 10.0) * 10; - } - return getQuantityString(R.plurals.tts_meters, meters, String.valueOf(meters)); + return getDistance(kilometers, (int) (kilometers * 1000.0), + 5.0f, 1.0f, 50, + R.plurals.tts_kilometers, R.string.tts_one_kilometer, + R.plurals.tts_meters, R.string.tts_one_meter); } + return getDistance(kilometers / IConversion.MILES_TO_KILOMETER, + (int) (kilometers * 1000.0 * IConversion.METERS_TO_FEET), + 3.0f, 0.2f, 300, + R.plurals.tts_miles, R.string.tts_one_mile, + R.plurals.tts_feet, R.string.tts_one_foot); + } - float miles = kilometers / IConversion.MILES_TO_KILOMETER; - if (miles >= 3.0) { - int quantity = Math.round(miles); - return getQuantityString(R.plurals.tts_miles, quantity, String.valueOf(quantity)); + private static String getDistance(float farDistance, int nearDistance, + float farFarAway, float farNearAway, int nearFarAway, + int farId, int farOneId, int nearId, int nearOneId) { + if (farDistance >= farFarAway) { + // example: "5 kilometers" - always without decimal digits + int quantity = Math.round(farDistance); + if (quantity == 1) { + return getString(farOneId, quantity, String.valueOf(quantity)); + } + return getQuantityString(farId, quantity, String.valueOf(quantity)); } - if (miles >= 0.2) { // approx 1000 ft - float precision1 = Math.round(miles * 10.0f) / 10.0f; - float precision0 = Math.round(miles); + if (farDistance >= farNearAway) { + // example: "2.2 kilometers" - decimals if necessary + float precision1 = Math.round(farDistance * 10.0f) / 10.0f; + float precision0 = Math.round(farDistance); if (precision1 == precision0) { - // this is an int - e.g. 2 miles + // this is an int - e.g. 2 kilometers int quantity = (int) precision0; - return getQuantityString(R.plurals.tts_miles, quantity, String.valueOf(quantity)); + if (quantity == 1) { + return getString(farOneId, quantity, String.valueOf(quantity)); + } + return getQuantityString(farId, quantity, String.valueOf(quantity)); } - // this is no int - e.g. 1.7 miles - String digits = String.format(Locale.getDefault(), "%.1f", miles); + // this is no int - e.g. 1.7 kilometers + String digits = String.format(Locale.getDefault(), "%.1f", farDistance); // always use the plural (9 leads to plural) - return getQuantityString(R.plurals.tts_miles, 9, digits); + return getQuantityString(farId, 9, digits); } - int feet = (int) (kilometers * 1000.0 * IConversion.METERS_TO_FEET); - if (feet > 300) { - feet = (int) Math.round(feet / 10.0) * 10; + // example: "34 meters" + int quantity = nearDistance; + if (quantity > nearFarAway) { + // example: "120 meters" - rounded to 10 meters + quantity = (int) Math.round(quantity / 10.0) * 10; } - return getQuantityString(R.plurals.tts_feet, feet, String.valueOf(feet)); + if (quantity == 1) { + return getString(nearOneId, quantity, String.valueOf(quantity)); + } + return getQuantityString(nearId, quantity, String.valueOf(quantity)); } private static String getString(int resourceId, Object... formatArgs) { @@ -90,6 +93,9 @@ public class TextFactory { if (hours == 0) { hours = 12; } + if (hours == 1) { + return getString(R.string.tts_one_oclock, String.valueOf(hours)); + } return getString(R.string.tts_oclock, String.valueOf(hours)); } } diff --git a/tests/src/cgeo/geocaching/speech/TextFactoryTest.java b/tests/src/cgeo/geocaching/speech/TextFactoryTest.java index 519287a..fbf36b3 100644 --- a/tests/src/cgeo/geocaching/speech/TextFactoryTest.java +++ b/tests/src/cgeo/geocaching/speech/TextFactoryTest.java @@ -43,82 +43,102 @@ public class TextFactoryTest extends AndroidTestCase { public void testGetDistanceEn() { setLocale(Locale.UK, true); - assertEquals("12 o'clock. 6 kilometers", TextFactory.getText(MY_POSITION, NORTH_6100M, 0)); + assertEquals("one o'clock. 6 kilometers", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); assertEquals("9 o'clock. 1.6 kilometers", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); - assertEquals("6 o'clock. 1 kilometer", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("6 o'clock. one kilometer", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); assertEquals("3 o'clock. 120 meters", TextFactory.getText(MY_POSITION, EAST_123M, 0)); assertEquals("11 o'clock. 34 meters", TextFactory.getText(MY_POSITION, WEST_34M, 290)); - assertEquals("9 o'clock. 1 meter", TextFactory.getText(MY_POSITION, EAST_1M, 180)); + assertEquals("9 o'clock. one meter", TextFactory.getText(MY_POSITION, EAST_1M, 180)); assertEquals("12 o'clock. 0 meters", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); setLocale(Locale.UK, false); - assertEquals("12 o'clock. 4 miles", TextFactory.getText(MY_POSITION, NORTH_6100M, 0)); - assertEquals("9 o'clock. 1 mile", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("one o'clock. 4 miles", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("9 o'clock. one mile", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); assertEquals("6 o'clock. 0.6 miles", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); assertEquals("3 o'clock. 400 feet", TextFactory.getText(MY_POSITION, EAST_123M, 0)); assertEquals("11 o'clock. 111 feet", TextFactory.getText(MY_POSITION, WEST_34M, 290)); - assertEquals("9 o'clock. 1 foot", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); + assertEquals("9 o'clock. one foot", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); assertEquals("12 o'clock. 0 feet", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); } public void testGetDistanceDe() { setLocale(Locale.GERMANY, true); - assertEquals("12 Uhr. 6 Kilometer", TextFactory.getText(MY_POSITION, NORTH_6100M, 0)); + assertEquals("ein Uhr. 6 Kilometer", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); assertEquals("9 Uhr. 1,6 Kilometer", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); - assertEquals("6 Uhr. 1 Kilometer", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("6 Uhr. ein Kilometer", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); assertEquals("3 Uhr. 120 Meter", TextFactory.getText(MY_POSITION, EAST_123M, 0)); assertEquals("11 Uhr. 34 Meter", TextFactory.getText(MY_POSITION, WEST_34M, 290)); - assertEquals("9 Uhr. 1 Meter", TextFactory.getText(MY_POSITION, EAST_1M, 180)); + assertEquals("9 Uhr. ein Meter", TextFactory.getText(MY_POSITION, EAST_1M, 180)); assertEquals("12 Uhr. 0 Meter", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); setLocale(Locale.GERMANY, false); - assertEquals("12 Uhr. 4 Meilen", TextFactory.getText(MY_POSITION, NORTH_6100M, 0)); - assertEquals("9 Uhr. 1 Meile", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("ein Uhr. 4 Meilen", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("9 Uhr. eine Meile", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); assertEquals("6 Uhr. 0,6 Meilen", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); assertEquals("3 Uhr. 400 Fuß", TextFactory.getText(MY_POSITION, EAST_123M, 0)); assertEquals("11 Uhr. 111 Fuß", TextFactory.getText(MY_POSITION, WEST_34M, 290)); - assertEquals("9 Uhr. 1 Fuß", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); + assertEquals("9 Uhr. ein Fuß", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); assertEquals("12 Uhr. 0 Fuß", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); } public void testGetDistanceFr() { setLocale(Locale.FRANCE, true); - assertEquals("12 heures. 6 kilomètres", TextFactory.getText(MY_POSITION, NORTH_6100M, 0)); + assertEquals("une heure. 6 kilomètres", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); assertEquals("9 heures. 1,6 kilomètres", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); - assertEquals("6 heures. 1 kilomètre", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("6 heures. un kilomètre", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); assertEquals("3 heures. 120 mètres", TextFactory.getText(MY_POSITION, EAST_123M, 0)); assertEquals("11 heures. 34 mètres", TextFactory.getText(MY_POSITION, WEST_34M, 290)); - assertEquals("9 heures. 1 mètre", TextFactory.getText(MY_POSITION, EAST_1M, 180)); + assertEquals("9 heures. un mètre", TextFactory.getText(MY_POSITION, EAST_1M, 180)); assertEquals("12 heures. 0 mètre", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); setLocale(Locale.FRANCE, false); - assertEquals("12 heures. 4 milles", TextFactory.getText(MY_POSITION, NORTH_6100M, 0)); - assertEquals("9 heures. 1 mille", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("une heure. 4 milles", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("9 heures. un mille", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); assertEquals("6 heures. 0,6 milles", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); assertEquals("3 heures. 400 pieds", TextFactory.getText(MY_POSITION, EAST_123M, 0)); assertEquals("11 heures. 111 pieds", TextFactory.getText(MY_POSITION, WEST_34M, 290)); - assertEquals("9 heures. 1 pied", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); + assertEquals("9 heures. un pied", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); assertEquals("12 heures. 0 pied", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); } public void testGetDistanceIt() { setLocale(Locale.ITALY, true); - assertEquals("12 precisi. 6 chilometri", TextFactory.getText(MY_POSITION, NORTH_6100M, 0)); - assertEquals("9 precisi. 1,6 chilometri", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); - assertEquals("6 precisi. 1 chilometro", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); - assertEquals("3 precisi. 120 metri", TextFactory.getText(MY_POSITION, EAST_123M, 0)); - assertEquals("11 precisi. 34 metri", TextFactory.getText(MY_POSITION, WEST_34M, 290)); - assertEquals("9 precisi. 1 metro", TextFactory.getText(MY_POSITION, EAST_1M, 180)); - assertEquals("12 precisi. 0 metri", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + assertEquals("a ore una. 6 chilometri", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("a ore 9. 1,6 chilometri", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("a ore 6. uno chilometro", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("a ore 3. 120 metri", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("a ore 11. 34 metri", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("a ore 9. uno metro", TextFactory.getText(MY_POSITION, EAST_1M, 180)); + assertEquals("a ore 12. 0 metri", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); setLocale(Locale.ITALY, false); - assertEquals("12 precisi. 4 miglia", TextFactory.getText(MY_POSITION, NORTH_6100M, 0)); - assertEquals("9 precisi. 1 miglio", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); - assertEquals("6 precisi. 0,6 miglia", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); - assertEquals("3 precisi. 400 piedi", TextFactory.getText(MY_POSITION, EAST_123M, 0)); - assertEquals("11 precisi. 111 piedi", TextFactory.getText(MY_POSITION, WEST_34M, 290)); - assertEquals("9 precisi. 1 piede", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); - assertEquals("12 precisi. 0 piedi", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + assertEquals("a ore una. 4 miglia", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("a ore 9. uno miglio", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("a ore 6. 0,6 miglia", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("a ore 3. 400 piedi", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("a ore 11. 111 piedi", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("a ore 9. uno piede", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); + assertEquals("a ore 12. 0 piedi", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + } + + public void testGetDistanceSv() { + setLocale(new Locale("sv", "SE"), true); + assertEquals("Klockan ett. 6 kilometer", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("Klockan 9. 1,6 kilometer", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("Klockan 6. ett kilometer", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("Klockan 3. 120 meter", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("Klockan 11. 34 meter", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("Klockan 9. ett meter", TextFactory.getText(MY_POSITION, EAST_1M, 180)); + assertEquals("Klockan 12. 0 meter", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); + + setLocale(new Locale("sv", "SE"), false); + assertEquals("Klockan ett. 4 engelsk mil", TextFactory.getText(MY_POSITION, NORTH_6100M, 330)); + assertEquals("Klockan 9. ett engelsk mil", TextFactory.getText(MY_POSITION, WEST_1MILE, 0)); + assertEquals("Klockan 6. 0,6 engelsk mil", TextFactory.getText(MY_POSITION, SOUTH_1020M, 0)); + assertEquals("Klockan 3. 400 fot", TextFactory.getText(MY_POSITION, EAST_123M, 0)); + assertEquals("Klockan 11. 111 fot", TextFactory.getText(MY_POSITION, WEST_34M, 290)); + assertEquals("Klockan 9. ett fot", TextFactory.getText(MY_POSITION, EAST_1FT, 180)); + assertEquals("Klockan 12. 0 fot", TextFactory.getText(MY_POSITION, MY_POSITION, 0)); } private static void setLocale(Locale locale, boolean metric) { -- cgit v1.1