Skip to content

Commit f45966d

Browse files
authored
Merge pull request #910 from Isira-Seneviratne/Locale_forLanguageTag
Add compat Locale.forLanguageTag() implementation.
2 parents d5437e0 + 3b80547 commit f45966d

3 files changed

Lines changed: 50 additions & 36 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/localization/Localization.java

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package org.schabi.newpipe.extractor.localization;
22

33
import org.schabi.newpipe.extractor.exceptions.ParsingException;
4-
5-
import javax.annotation.Nonnull;
6-
import javax.annotation.Nullable;
4+
import org.schabi.newpipe.extractor.utils.LocaleCompat;
75

86
import java.io.Serializable;
97
import java.util.ArrayList;
@@ -14,6 +12,9 @@
1412
import java.util.Map;
1513
import java.util.Objects;
1614

15+
import javax.annotation.Nonnull;
16+
import javax.annotation.Nullable;
17+
1718
public class Localization implements Serializable {
1819
public static final Localization DEFAULT = new Localization("en", "GB");
1920

@@ -38,19 +39,7 @@ public static List<Localization> listFrom(final String... localizationCodeList)
3839
* @param localizationCode a localization code, formatted like {@link #getLocalizationCode()}
3940
*/
4041
public static Localization fromLocalizationCode(final String localizationCode) {
41-
final int indexSeparator = localizationCode.indexOf("-");
42-
43-
final String languageCode;
44-
final String countryCode;
45-
if (indexSeparator != -1) {
46-
languageCode = localizationCode.substring(0, indexSeparator);
47-
countryCode = localizationCode.substring(indexSeparator + 1);
48-
} else {
49-
languageCode = localizationCode;
50-
countryCode = null;
51-
}
52-
53-
return new Localization(languageCode, countryCode);
42+
return fromLocale(LocaleCompat.forLanguageTag(localizationCode));
5443
}
5544

5645
public Localization(@Nonnull final String languageCode, @Nullable final String countryCode) {

extractor/src/main/java/org/schabi/newpipe/extractor/stream/SubtitlesStream.java

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.schabi.newpipe.extractor.MediaFormat;
44
import org.schabi.newpipe.extractor.services.youtube.ItagItem;
5+
import org.schabi.newpipe.extractor.utils.LocaleCompat;
56

67
import java.util.Locale;
78

@@ -230,26 +231,7 @@ private SubtitlesStream(@Nonnull final String id,
230231
final boolean autoGenerated,
231232
@Nullable final String manifestUrl) {
232233
super(id, content, isUrl, mediaFormat, deliveryMethod, manifestUrl);
233-
234-
/*
235-
* Locale.forLanguageTag only for Android API >= 21
236-
* Locale.Builder only for Android API >= 21
237-
* Country codes doesn't work well without
238-
*/
239-
final String[] splits = languageCode.split("-");
240-
switch (splits.length) {
241-
case 2:
242-
this.locale = new Locale(splits[0], splits[1]);
243-
break;
244-
case 3:
245-
// Complex variants don't work!
246-
this.locale = new Locale(splits[0], splits[1], splits[2]);
247-
break;
248-
default:
249-
this.locale = new Locale(splits[0]);
250-
break;
251-
}
252-
234+
this.locale = LocaleCompat.forLanguageTag(languageCode);
253235
this.code = languageCode;
254236
this.format = mediaFormat;
255237
this.autoGenerated = autoGenerated;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.schabi.newpipe.extractor.utils;
2+
3+
import java.util.Locale;
4+
5+
/**
6+
* This class contains a simple implementation of {@link Locale#forLanguageTag(String)} for Android
7+
* API levels below 21 (Lollipop). This is needed as core library desugaring does not backport that
8+
* method as of this writing.
9+
*
10+
* Relevant issue: https://issuetracker.google.com/issues/171182330
11+
*/
12+
public final class LocaleCompat {
13+
private LocaleCompat() {
14+
}
15+
16+
// Source: The AndroidX LocaleListCompat class's private forLanguageTagCompat() method.
17+
// Use Locale.forLanguageTag() on Android API level >= 21 / Java instead.
18+
public static Locale forLanguageTag(final String str) {
19+
if (str.contains("-")) {
20+
final String[] args = str.split("-", -1);
21+
if (args.length > 2) {
22+
return new Locale(args[0], args[1], args[2]);
23+
} else if (args.length > 1) {
24+
return new Locale(args[0], args[1]);
25+
} else if (args.length == 1) {
26+
return new Locale(args[0]);
27+
}
28+
} else if (str.contains("_")) {
29+
final String[] args = str.split("_", -1);
30+
if (args.length > 2) {
31+
return new Locale(args[0], args[1], args[2]);
32+
} else if (args.length > 1) {
33+
return new Locale(args[0], args[1]);
34+
} else if (args.length == 1) {
35+
return new Locale(args[0]);
36+
}
37+
} else {
38+
return new Locale(str);
39+
}
40+
41+
throw new IllegalArgumentException("Can not parse language tag: [" + str + "]");
42+
}
43+
}

0 commit comments

Comments
 (0)