Skip to content

Commit bf7d95b

Browse files
author
Lukas Koebis
committed
Push Translation
added locale/language detection localeIdentifier gets automatically populated whenever an installation is saved/updated
1 parent 56d7970 commit bf7d95b

File tree

2 files changed

+63
-7
lines changed

2 files changed

+63
-7
lines changed

Parse/src/main/java/com/parse/ParseInstallation.java

+51-7
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
import android.content.Context;
1212
import android.content.pm.PackageInfo;
1313
import android.content.pm.PackageManager;
14+
import android.text.TextUtils;
1415

1516
import java.util.Arrays;
1617
import java.util.Collections;
1718
import java.util.List;
19+
import java.util.Locale;
1820
import java.util.TimeZone;
1921

2022
import bolts.Continuation;
@@ -36,12 +38,13 @@ public class ParseInstallation extends ParseObject {
3638
private static final String KEY_DEVICE_TOKEN = "deviceToken";
3739
private static final String KEY_PUSH_TYPE = "pushType";
3840
private static final String KEY_TIME_ZONE = "timeZone";
41+
private static final String KEY_LOCALE = "localeIdentifier";
3942
private static final String KEY_APP_VERSION = "appVersion";
4043
/* package */ static final String KEY_CHANNELS = "channels";
4144

4245
private static final List<String> READ_ONLY_FIELDS = Collections.unmodifiableList(
4346
Arrays.asList(KEY_DEVICE_TYPE, KEY_INSTALLATION_ID, KEY_DEVICE_TOKEN, KEY_PUSH_TYPE,
44-
KEY_TIME_ZONE, KEY_APP_VERSION, KEY_APP_NAME, KEY_PARSE_VERSION,
47+
KEY_TIME_ZONE, KEY_LOCALE, KEY_APP_VERSION, KEY_APP_NAME, KEY_PARSE_VERSION,
4548
KEY_APP_IDENTIFIER));
4649

4750
// TODO(mengyan): Inject into ParseInstallationInstanceController
@@ -108,6 +111,7 @@ public String getInstallationId() {
108111
updateTimezone();
109112
updateVersionInfo();
110113
updateDeviceInfo();
114+
updateLocaleIdentifier();
111115
}
112116
}
113117

@@ -165,8 +169,8 @@ public Task<Void> then(Task<Void> task) throws Exception {
165169
// time zones from devices reporting other formats.
166170
private void updateTimezone() {
167171
String zone = TimeZone.getDefault().getID();
168-
if ((zone.indexOf('/') > 0 || zone.equals("GMT")) && !zone.equals(get("timeZone"))) {
169-
performPut("timeZone", zone);
172+
if ((zone.indexOf('/') > 0 || zone.equals("GMT")) && !zone.equals(get(KEY_TIME_ZONE))) {
173+
performPut(KEY_TIME_ZONE, zone);
170174
}
171175
}
172176

@@ -180,25 +184,65 @@ private void updateVersionInfo() {
180184
String appVersion = pkgInfo.versionName;
181185
String appName = pm.getApplicationLabel(pm.getApplicationInfo(packageName, 0)).toString();
182186

183-
if (packageName != null && !packageName.equals(get("appIdentifier"))) {
187+
if (packageName != null && !packageName.equals(get(KEY_APP_IDENTIFIER))) {
184188
performPut(KEY_APP_IDENTIFIER, packageName);
185189
}
186-
if (appName != null && !appName.equals(get("appName"))) {
190+
if (appName != null && !appName.equals(get(KEY_APP_NAME))) {
187191
performPut(KEY_APP_NAME, appName);
188192
}
189-
if (appVersion != null && !appVersion.equals(get("appVersion"))) {
193+
if (appVersion != null && !appVersion.equals(get(KEY_APP_VERSION))) {
190194
performPut(KEY_APP_VERSION, appVersion);
191195
}
192196
} catch (PackageManager.NameNotFoundException e) {
193197
PLog.w(TAG, "Cannot load package info; will not be saved to installation");
194198
}
195199

196-
if (!VERSION_NAME.equals(get("parseVersion"))) {
200+
if (!VERSION_NAME.equals(get(KEY_PARSE_VERSION))) {
197201
performPut(KEY_PARSE_VERSION, VERSION_NAME);
198202
}
199203
}
200204
}
201205

206+
/*
207+
* Save locale in the following format:
208+
* [language code]-[country code]
209+
*
210+
* The language codes are two-letter lowercase ISO language codes (such as "en") as defined by
211+
* <a href="http://en.wikipedia.org/wiki/ISO_639-1">ISO 639-1</a>.
212+
* The country codes are two-letter uppercase ISO country codes (such as "US") as defined by
213+
* <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3">ISO 3166-1</a>.
214+
*
215+
* Note that Java uses several deprecated two-letter codes. The Hebrew ("he") language
216+
* code is rewritten as "iw", Indonesian ("id") as "in", and Yiddish ("yi") as "ji". This
217+
* rewriting happens even if you construct your own {@code Locale} object, not just for
218+
* instances returned by the various lookup methods.
219+
*/
220+
private void updateLocaleIdentifier() {
221+
final Locale locale = Locale.getDefault();
222+
223+
String language = locale.getLanguage();
224+
String country = locale.getCountry();
225+
226+
if (TextUtils.isEmpty(language)) {
227+
return;
228+
}
229+
230+
// rewrite depreciated two-letter codes
231+
if (language.equals("iw")) language = "he"; // Hebrew
232+
if (language.equals("in")) language = "id"; // Indonesian
233+
if (language.equals("ji")) language = "yi"; // Yiddish
234+
235+
String localeString = language;
236+
237+
if (!TextUtils.isEmpty(country)) {
238+
localeString = String.format(Locale.US, "%s-%s", language, country);
239+
}
240+
241+
if (!localeString.equals(get(KEY_LOCALE))) {
242+
performPut(KEY_LOCALE, localeString);
243+
}
244+
}
245+
202246
// TODO(mengyan): Move to ParseInstallationInstanceController
203247
/* package */ void updateDeviceInfo() {
204248
updateDeviceInfo(ParsePlugins.get().installationId());

Parse/src/test/java/com/parse/ParseInstallationTest.java

+12
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.robolectric.res.builder.RobolectricPackageManager;
2424

2525
import java.util.Arrays;
26+
import java.util.Locale;
2627
import java.util.TimeZone;
2728

2829
import bolts.Task;
@@ -46,17 +47,25 @@ public class ParseInstallationTest {
4647
private static final String KEY_APP_NAME = "appName";
4748
private static final String KEY_APP_IDENTIFIER = "appIdentifier";
4849
private static final String KEY_TIME_ZONE = "timeZone";
50+
private static final String KEY_LOCALE_IDENTIFIER = "localeIdentifier";
4951
private static final String KEY_APP_VERSION = "appVersion";
5052

53+
private Locale defaultLocale;
54+
5155
@Before
5256
public void setUp() {
5357
ParseObject.registerSubclass(ParseInstallation.class);
58+
59+
defaultLocale = Locale.getDefault();
60+
Locale.setDefault(new Locale("en", "US"));
5461
}
5562

5663
@After
5764
public void tearDown() {
5865
ParseObject.unregisterSubclass(ParseInstallation.class);
5966
ParseCorePlugins.getInstance().reset();
67+
68+
Locale.setDefault(defaultLocale);
6069
}
6170

6271
@Test
@@ -71,6 +80,7 @@ public void testImmutableKeys() {
7180
"deviceTokenLastModified",
7281
"pushType",
7382
"timeZone",
83+
"localeIdentifier",
7484
"appVersion"
7585
};
7686

@@ -184,6 +194,8 @@ public void testUpdateBeforeSave() throws Exception {
184194
// Make sure we update device info
185195
assertEquals("android", installation.getString(KEY_DEVICE_TYPE));
186196
assertEquals(installationId.get(), installation.getString(KEY_INSTALLATION_ID));
197+
// Make sure we update the locale identifier
198+
assertEquals("en-US", installation.getString(KEY_LOCALE_IDENTIFIER));
187199
}
188200

189201
// TODO(mengyan): Add other testUpdateBeforeSave cases to cover all branches

0 commit comments

Comments
 (0)