62 // Assumption: CLDR has only one non-Base module. |
62 // Assumption: CLDR has only one non-Base module. |
63 private final LocaleDataMetaInfo nonBaseMetaInfo; |
63 private final LocaleDataMetaInfo nonBaseMetaInfo; |
64 |
64 |
65 // parent locales map |
65 // parent locales map |
66 private static volatile Map<Locale, Locale> parentLocalesMap; |
66 private static volatile Map<Locale, Locale> parentLocalesMap; |
|
67 // language aliases map |
|
68 private static volatile Map<String,String> langAliasesMap; |
|
69 // cache to hold locale to locale mapping for language aliases. |
|
70 private static final Map<Locale, Locale> langAliasesCache; |
67 static { |
71 static { |
68 parentLocalesMap = new ConcurrentHashMap<>(); |
72 parentLocalesMap = new ConcurrentHashMap<>(); |
|
73 langAliasesMap = new ConcurrentHashMap<>(); |
|
74 langAliasesCache = new ConcurrentHashMap<>(); |
69 // Assuming these locales do NOT have irregular parent locales. |
75 // Assuming these locales do NOT have irregular parent locales. |
70 parentLocalesMap.put(Locale.ROOT, Locale.ROOT); |
76 parentLocalesMap.put(Locale.ROOT, Locale.ROOT); |
71 parentLocalesMap.put(Locale.ENGLISH, Locale.ENGLISH); |
77 parentLocalesMap.put(Locale.ENGLISH, Locale.ENGLISH); |
72 parentLocalesMap.put(Locale.US, Locale.US); |
78 parentLocalesMap.put(Locale.US, Locale.US); |
73 } |
79 } |
158 locs[index++] = Locale.forLanguageTag(tag); |
164 locs[index++] = Locale.forLanguageTag(tag); |
159 } |
165 } |
160 return locs; |
166 return locs; |
161 } |
167 } |
162 |
168 |
|
169 private Locale applyAliases(Locale loc) { |
|
170 if (langAliasesMap.isEmpty()) { |
|
171 langAliasesMap = baseMetaInfo.getLanguageAliasMap(); |
|
172 } |
|
173 Locale locale = langAliasesCache.get(loc); |
|
174 if (locale == null) { |
|
175 String locTag = loc.toLanguageTag(); |
|
176 Locale aliasLocale = langAliasesMap.containsKey(locTag) |
|
177 ? Locale.forLanguageTag(langAliasesMap.get(locTag)) : loc; |
|
178 langAliasesCache.putIfAbsent(loc, aliasLocale); |
|
179 return aliasLocale; |
|
180 } else { |
|
181 return locale; |
|
182 } |
|
183 } |
|
184 |
163 @Override |
185 @Override |
164 protected Set<String> createLanguageTagSet(String category) { |
186 protected Set<String> createLanguageTagSet(String category) { |
165 // Assume all categories support the same set as AvailableLocales |
187 // Assume all categories support the same set as AvailableLocales |
166 // in CLDR adapter. |
188 // in CLDR adapter. |
167 category = "AvailableLocales"; |
189 category = "AvailableLocales"; |
192 } |
214 } |
193 |
215 |
194 // Implementation of ResourceBundleBasedAdapter |
216 // Implementation of ResourceBundleBasedAdapter |
195 @Override |
217 @Override |
196 public List<Locale> getCandidateLocales(String baseName, Locale locale) { |
218 public List<Locale> getCandidateLocales(String baseName, Locale locale) { |
197 List<Locale> candidates = super.getCandidateLocales(baseName, locale); |
219 List<Locale> candidates = super.getCandidateLocales(baseName, applyAliases(locale)); |
198 return applyParentLocales(baseName, candidates); |
220 return applyParentLocales(baseName, candidates); |
199 } |
221 } |
200 |
222 |
201 private List<Locale> applyParentLocales(String baseName, List<Locale> candidates) { |
223 private List<Locale> applyParentLocales(String baseName, List<Locale> candidates) { |
202 // check irregular parents |
224 // check irregular parents |