diff options
| -rw-r--r-- | main/res/values-de/strings.xml | 20 | ||||
| -rw-r--r-- | main/res/values-fr/strings.xml | 20 | ||||
| -rw-r--r-- | main/res/values-it/strings.xml | 20 | ||||
| -rw-r--r-- | main/res/values-sv/strings.xml | 20 | ||||
| -rw-r--r-- | main/res/values/strings.xml | 20 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/CompassActivity.java | 9 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/speech/TextFactory.java | 42 | ||||
| -rw-r--r-- | tests/src/cgeo/geocaching/speech/TextFactoryTest.java | 137 |
8 files changed, 253 insertions, 35 deletions
diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml index d8c0422..ef4b903 100644 --- a/main/res/values-de/strings.xml +++ b/main/res/values-de/strings.xml @@ -1095,10 +1095,22 @@ <string name="tts_service">Sprechender Kompass</string> <string name="tts_start">Starte Sprache</string> <string name="tts_stop">Stoppe Sprache</string> - <string name="tts_kilometers">%s Kilometer</string> - <string name="tts_meters">%s Meter</string> - <string name="tts_miles">%s Meilen</string> - <string name="tts_feet">%s Fuß</string> + <plurals name="tts_kilometers"> + <item quantity="one">%s Kilometer</item> + <item quantity="other">%s Kilometer</item> + </plurals> + <plurals name="tts_meters"> + <item quantity="one">%s Meter</item> + <item quantity="other">%s Meter</item> + </plurals> + <plurals name="tts_miles"> + <item quantity="one">%s Meile</item> + <item quantity="other">%s Meilen</item> + </plurals> + <plurals name="tts_feet"> + <item quantity="one">%s Fuß</item> + <item quantity="other">%s Fuß</item> + </plurals> <string name="tts_oclock">%s Uhr</string> <!-- various --> diff --git a/main/res/values-fr/strings.xml b/main/res/values-fr/strings.xml index d0f742d..70bab69 100644 --- a/main/res/values-fr/strings.xml +++ b/main/res/values-fr/strings.xml @@ -1069,10 +1069,22 @@ <string name="tts_service">Boussole parlante</string> <string name="tts_start">Commencer à parler</string> <string name="tts_stop">Arrêter de parler</string> - <string name="tts_kilometers">%s kilomètres</string> - <string name="tts_meters">%s mètres</string> - <string name="tts_miles">%s milles</string> - <string name="tts_feet">%s pieds</string> + <plurals name="tts_kilometers"> + <item quantity="one">%s kilomètre</item> + <item quantity="other">%s kilomètres</item> + </plurals> + <plurals name="tts_meters"> + <item quantity="one">%s mètre</item> + <item quantity="other">%s mètres</item> + </plurals> + <plurals name="tts_miles"> + <item quantity="one">%s mille</item> + <item quantity="other">%s milles</item> + </plurals> + <plurals name="tts_feet"> + <item quantity="one">%s pied</item> + <item quantity="other">%s pieds</item> + </plurals> <string name="tts_oclock">%s heures</string> <!-- various --> diff --git a/main/res/values-it/strings.xml b/main/res/values-it/strings.xml index c0a282c..9f1182a 100644 --- a/main/res/values-it/strings.xml +++ b/main/res/values-it/strings.xml @@ -1086,10 +1086,22 @@ <string name="tts_service">Bussola parlante</string> <string name="tts_start">Start voce</string> <string name="tts_stop">Stop voce</string> - <string name="tts_kilometers">%s chilometri</string> - <string name="tts_meters">%s metri</string> - <string name="tts_miles">%s miglia</string> - <string name="tts_feet">%s piedi</string> + <plurals name="tts_kilometers"> + <item quantity="one">%s chilometro</item> + <item quantity="other">%s chilometri</item> + </plurals> + <plurals name="tts_meters"> + <item quantity="one">%s metro</item> + <item quantity="other">%s metri</item> + </plurals> + <plurals name="tts_miles"> + <item quantity="one">%s miglio</item> + <item quantity="other">%s miglia</item> + </plurals> + <plurals name="tts_feet"> + <item quantity="one">%s piede</item> + <item quantity="other">%s piedi</item> + </plurals> <string name="tts_oclock">%s precisi</string> <!-- various --> diff --git a/main/res/values-sv/strings.xml b/main/res/values-sv/strings.xml index b7cba9a..44e812b 100644 --- a/main/res/values-sv/strings.xml +++ b/main/res/values-sv/strings.xml @@ -877,10 +877,22 @@ <string name="tts_service">Talande kompass</string> <string name="tts_start">Starta tal</string> <string name="tts_stop">Stoppa tal</string> - <string name="tts_kilometers">%s kilometer</string> - <string name="tts_meters">%s meter</string> - <string name="tts_miles">%s eng. mil</string> - <string name="tts_feet">%s fot</string> + <plurals name="tts_kilometers"> + <item quantity="one">%s kilometer</item> + <item quantity="other">%s kilometer</item> + </plurals> + <plurals name="tts_meters"> + <item quantity="one">%s meter</item> + <item quantity="other">%s meter</item> + </plurals> + <plurals name="tts_miles"> + <item quantity="one">%s eng. mil</item> + <item quantity="other">%s eng. mil</item> + </plurals> + <plurals name="tts_feet"> + <item quantity="one">%s fot</item> + <item quantity="other">%s fot</item> + </plurals> <string name="tts_oclock">Klockan %s</string> <!-- various --> diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml index 4a96646..a9d6534 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -1097,10 +1097,22 @@ <string name="tts_service">Talking compass</string> <string name="tts_start">Start talking</string> <string name="tts_stop">Stop talking</string> - <string name="tts_kilometers">%s kilometers</string> - <string name="tts_meters">%s meters</string> - <string name="tts_miles">%s miles</string> - <string name="tts_feet">%s feet</string> + <plurals name="tts_kilometers"> + <item quantity="one">%s kilometer</item> + <item quantity="other">%s kilometers</item> + </plurals> + <plurals name="tts_meters"> + <item quantity="one">%s meter</item> + <item quantity="other">%s meters</item> + </plurals> + <plurals name="tts_miles"> + <item quantity="one">%s mile</item> + <item quantity="other">%s miles</item> + </plurals> + <plurals name="tts_feet"> + <item quantity="one">%s foot</item> + <item quantity="other">%s feet</item> + </plurals> <string name="tts_oclock">%s o\'clock</string> <!-- various --> diff --git a/main/src/cgeo/geocaching/CompassActivity.java b/main/src/cgeo/geocaching/CompassActivity.java index 4f8af08..9da428d 100644 --- a/main/src/cgeo/geocaching/CompassActivity.java +++ b/main/src/cgeo/geocaching/CompassActivity.java @@ -127,8 +127,7 @@ public class CompassActivity extends AbstractActivity { final IWaypoint coordinate = coordinates.get(i); subMenu.add(0, COORDINATES_OFFSET + i, 0, coordinate.getName() + " (" + coordinate.getCoordType() + ")"); } - } - else { + } else { menu.findItem(R.id.menu_select_destination).setVisible(false); } return true; @@ -199,8 +198,7 @@ public class CompassActivity extends AbstractActivity { protected void onActivityResult(int request, int result, Intent data) { if (request == REQUEST_TTS_DATA_CHECK && result == Engine.CHECK_VOICE_DATA_PASS) { SpeechService.startService(this, dstCoords); - } - else { + } else { Log.i("TTS failed to start. Request: " + request + " result: " + result); startActivity(new Intent(Engine.ACTION_INSTALL_TTS_DATA)); } @@ -248,8 +246,7 @@ public class CompassActivity extends AbstractActivity { if (geo.getCoords() != null) { if (geo.getSatellitesVisible() >= 0) { navSatellites.setText(res.getString(R.string.loc_sat) + ": " + geo.getSatellitesFixed() + "/" + geo.getSatellitesVisible()); - } - else { + } else { navSatellites.setText(""); } navType.setText(res.getString(geo.getLocationProvider().resourceId)); diff --git a/main/src/cgeo/geocaching/speech/TextFactory.java b/main/src/cgeo/geocaching/speech/TextFactory.java index 0e13564..993f1cf 100644 --- a/main/src/cgeo/geocaching/speech/TextFactory.java +++ b/main/src/cgeo/geocaching/speech/TextFactory.java @@ -26,38 +26,62 @@ public class TextFactory { if (Settings.isUseMetricUnits()) { if (kilometers >= 5.0) { - return getString(R.string.tts_kilometers, String.valueOf(Math.round(kilometers))); + 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); - return getString(R.string.tts_kilometers, digits); + // always use the plural (9 leads to plural) + return getQuantityString(R.plurals.tts_kilometers, 9, digits); } - int meters = (int) (kilometers * 1000.0); + int meters = (int) Math.round(kilometers * 1000.0); if (meters > 50) { - return getString(R.string.tts_meters, String.valueOf(Math.round(meters / 10.0) * 10)); + meters = (int) Math.round(meters / 10.0) * 10; } - return getString(R.string.tts_meters, String.valueOf(meters)); + return getQuantityString(R.plurals.tts_meters, meters, String.valueOf(meters)); } float miles = kilometers / IConversion.MILES_TO_KILOMETER; if (miles >= 3.0) { - return getString(R.string.tts_miles, String.valueOf(Math.round(miles))); + int quantity = Math.round(miles); + return getQuantityString(R.plurals.tts_miles, 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 (precision1 == precision0) { + // this is an int - e.g. 2 miles + int quantity = (int) precision0; + return getQuantityString(R.plurals.tts_miles, quantity, String.valueOf(quantity)); + } + // this is no int - e.g. 1.7 miles String digits = String.format(Locale.getDefault(), "%.1f", miles); - return getString(R.string.tts_miles, digits); + // always use the plural (9 leads to plural) + return getQuantityString(R.plurals.tts_miles, 9, digits); } int feet = (int) (kilometers * 1000.0 * IConversion.METERS_TO_FEET); if (feet > 300) { - return getString(R.string.tts_feet, String.valueOf(Math.round(feet / 10.0) * 10)); + feet = (int) Math.round(feet / 10.0) * 10; } - return getString(R.string.tts_feet, String.valueOf(feet)); + return getQuantityString(R.plurals.tts_feet, feet, String.valueOf(feet)); } private static String getString(int resourceId, Object... formatArgs) { return cgeoapplication.getInstance().getString(resourceId, formatArgs); } + private static String getQuantityString(int resourceId, int quantity, Object... formatArgs) { + return cgeoapplication.getInstance().getResources().getQuantityString(resourceId, quantity, formatArgs); + } + private static String getDirection(Geopoint position, Geopoint target, float direction) { final int bearing = (int) position.bearingTo(target); int degrees = (int) AngleUtils.normalize(bearing - direction); diff --git a/tests/src/cgeo/geocaching/speech/TextFactoryTest.java b/tests/src/cgeo/geocaching/speech/TextFactoryTest.java new file mode 100644 index 0000000..519287a --- /dev/null +++ b/tests/src/cgeo/geocaching/speech/TextFactoryTest.java @@ -0,0 +1,137 @@ +package cgeo.geocaching.speech; + +import cgeo.geocaching.Settings; +import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.geopoint.Geopoint; + +import android.content.res.Configuration; +import android.content.res.Resources; +import android.test.AndroidTestCase; + +import java.util.Locale; + +public class TextFactoryTest extends AndroidTestCase { + + private static final Geopoint MY_POSITION = new Geopoint(15, -86); + private static final Geopoint NORTH_6100M = new Geopoint(15.054859, -86); + private static final Geopoint WEST_1MILE = new Geopoint(15, -86.014984); + private static final Geopoint SOUTH_1020M = new Geopoint(14.990827, -86); + private static final Geopoint EAST_123M = new Geopoint(15, -85.998855); + private static final Geopoint WEST_34M = new Geopoint(15, -86.000317); + private static final Geopoint EAST_1M = new Geopoint(15, -85.999990); + private static final Geopoint EAST_1FT = new Geopoint(15, -85.999996); + + private Locale defaultLocale1; + private Locale defaultLocale2; + private boolean defaultMetric; + + @Override + protected void setUp() throws Exception { + super.setUp(); + final Resources resources = cgeoapplication.getInstance().getResources(); + final Configuration config = resources.getConfiguration(); + defaultLocale1 = config.locale; + defaultLocale2 = Locale.getDefault(); + defaultMetric = Settings.isUseMetricUnits(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + setLocale(defaultLocale1, defaultLocale2, defaultMetric); + } + + public void testGetDistanceEn() { + setLocale(Locale.UK, true); + assertEquals("12 o'clock. 6 kilometers", TextFactory.getText(MY_POSITION, NORTH_6100M, 0)); + 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("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("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("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("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("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("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("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("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("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("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("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("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("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("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)); + + 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)); + } + + private static void setLocale(Locale locale, boolean metric) { + setLocale(locale, locale, metric); + } + + private static void setLocale(Locale locale1, Locale locale2, boolean metric) { + final Configuration config = new Configuration(); + config.locale = locale1; + final Resources resources = cgeoapplication.getInstance().getResources(); + resources.updateConfiguration(config, resources.getDisplayMetrics()); + + Locale.setDefault(locale2); + Settings.setUseMetricUnits(metric); + } +} |
