1
0
mirror of https://github.com/TeamNewPipe/NewPipe.git synced 2024-11-22 02:53:09 +01:00

Merge pull request #8870 from Isira-Seneviratne/Locale_forLanguageTag

Use Locale.forLanguageTag().
This commit is contained in:
Isira Seneviratne 2022-11-10 19:56:34 +05:30 committed by GitHub
commit aad5e26f31
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -56,7 +56,6 @@ import java.util.stream.Collectors;
*/ */
public final class Localization { public final class Localization {
public static final String DOT_SEPARATOR = ""; public static final String DOT_SEPARATOR = "";
private static PrettyTime prettyTime; private static PrettyTime prettyTime;
@ -76,16 +75,8 @@ public final class Localization {
public static org.schabi.newpipe.extractor.localization.Localization getPreferredLocalization( public static org.schabi.newpipe.extractor.localization.Localization getPreferredLocalization(
final Context context) { final Context context) {
final String contentLanguage = PreferenceManager
.getDefaultSharedPreferences(context)
.getString(context.getString(R.string.content_language_key),
context.getString(R.string.default_localization_key));
if (contentLanguage.equals(context.getString(R.string.default_localization_key))) {
return org.schabi.newpipe.extractor.localization.Localization
.fromLocale(Locale.getDefault());
}
return org.schabi.newpipe.extractor.localization.Localization return org.schabi.newpipe.extractor.localization.Localization
.fromLocalizationCode(contentLanguage); .fromLocale(getPreferredLocale(context));
} }
public static ContentCountry getPreferredContentCountry(final Context context) { public static ContentCountry getPreferredContentCountry(final Context context) {
@ -99,22 +90,11 @@ public final class Localization {
} }
public static Locale getPreferredLocale(final Context context) { public static Locale getPreferredLocale(final Context context) {
final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); return getLocaleFromPrefs(context, R.string.content_language_key);
}
final String languageCode = sp.getString(context.getString(R.string.content_language_key), public static Locale getAppLocale(final Context context) {
context.getString(R.string.default_localization_key)); return getLocaleFromPrefs(context, R.string.app_language_key);
try {
if (languageCode.length() == 2) {
return new Locale(languageCode);
} else if (languageCode.contains("_")) {
final String country = languageCode.substring(languageCode.indexOf("_"));
return new Locale(languageCode.substring(0, 2), country);
}
} catch (final Exception ignored) {
}
return Locale.getDefault();
} }
public static String localizeNumber(final Context context, final long number) { public static String localizeNumber(final Context context, final long number) {
@ -183,13 +163,13 @@ public final class Localization {
final double value = (double) count; final double value = (double) count;
if (count >= 1000000000) { if (count >= 1000000000) {
return localizeNumber(context, round(value / 1000000000, 1)) return localizeNumber(context, round(value / 1000000000))
+ context.getString(R.string.short_billion); + context.getString(R.string.short_billion);
} else if (count >= 1000000) { } else if (count >= 1000000) {
return localizeNumber(context, round(value / 1000000, 1)) return localizeNumber(context, round(value / 1000000))
+ context.getString(R.string.short_million); + context.getString(R.string.short_million);
} else if (count >= 1000) { } else if (count >= 1000) {
return localizeNumber(context, round(value / 1000, 1)) return localizeNumber(context, round(value / 1000))
+ context.getString(R.string.short_thousand); + context.getString(R.string.short_thousand);
} else { } else {
return localizeNumber(context, value); return localizeNumber(context, value);
@ -226,21 +206,6 @@ public final class Localization {
deletedCount, shortCount(context, deletedCount)); deletedCount, shortCount(context, deletedCount));
} }
private static String getQuantity(final Context context, @PluralsRes final int pluralId,
@StringRes final int zeroCaseStringId, final long count,
final String formattedCount) {
if (count == 0) {
return context.getString(zeroCaseStringId);
}
// As we use the already formatted count
// is not the responsibility of this method handle long numbers
// (it probably will fall in the "other" category,
// or some language have some specific rule... then we have to change it)
final int safeCount = (int) MathUtils.clamp(count, Integer.MIN_VALUE, Integer.MAX_VALUE);
return context.getResources().getQuantityString(pluralId, safeCount, formattedCount);
}
public static String getDurationString(final long duration) { public static String getDurationString(final long duration) {
final String output; final String output;
@ -314,37 +279,42 @@ public final class Localization {
return prettyTime.formatUnrounded(offsetDateTime); return prettyTime.formatUnrounded(offsetDateTime);
} }
private static void changeAppLanguage(final Locale loc, final Resources res) { public static void assureCorrectAppLanguage(final Context c) {
final Resources res = c.getResources();
final DisplayMetrics dm = res.getDisplayMetrics(); final DisplayMetrics dm = res.getDisplayMetrics();
final Configuration conf = res.getConfiguration(); final Configuration conf = res.getConfiguration();
conf.setLocale(loc); conf.setLocale(getAppLocale(c));
res.updateConfiguration(conf, dm); res.updateConfiguration(conf, dm);
} }
public static Locale getAppLocale(final Context context) { private static Locale getLocaleFromPrefs(final Context context, @StringRes final int prefKey) {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
String lang = prefs.getString(context.getString(R.string.app_language_key), "en"); final String defaultKey = context.getString(R.string.default_localization_key);
final Locale loc; final String languageCode = sp.getString(context.getString(prefKey), defaultKey);
if (lang.equals(context.getString(R.string.default_localization_key))) {
loc = Locale.getDefault(); if (languageCode.equals(defaultKey)) {
} else if (lang.matches(".*-.*")) { return Locale.getDefault();
//to differentiate different versions of the language
//for example, pt (portuguese in Portugal) and pt-br (portuguese in Brazil)
final String[] localisation = lang.split("-");
lang = localisation[0];
final String country = localisation[1];
loc = new Locale(lang, country);
} else { } else {
loc = new Locale(lang); return Locale.forLanguageTag(languageCode);
} }
return loc;
} }
public static void assureCorrectAppLanguage(final Context c) { private static double round(final double value) {
changeAppLanguage(getAppLocale(c), c.getResources()); return new BigDecimal(value).setScale(1, RoundingMode.HALF_UP).doubleValue();
} }
private static double round(final double value, final int places) { private static String getQuantity(final Context context, @PluralsRes final int pluralId,
return new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue(); @StringRes final int zeroCaseStringId, final long count,
final String formattedCount) {
if (count == 0) {
return context.getString(zeroCaseStringId);
}
// As we use the already formatted count
// is not the responsibility of this method handle long numbers
// (it probably will fall in the "other" category,
// or some language have some specific rule... then we have to change it)
final int safeCount = (int) MathUtils.clamp(count, Integer.MIN_VALUE, Integer.MAX_VALUE);
return context.getResources().getQuantityString(pluralId, safeCount, formattedCount);
} }
} }