/* */ package com.ibm.icu.impl.locale; /* */ /* */ import java.util.ArrayList; /* */ import java.util.Collections; /* */ import java.util.HashMap; /* */ import java.util.List; /* */ import java.util.Map; /* */ import java.util.Set; /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ public class LanguageTag /* */ { /* */ private static final boolean JDKIMPL = false; /* */ public static final String SEP = "-"; /* */ public static final String PRIVATEUSE = "x"; /* 24 */ public static String UNDETERMINED = "und"; /* */ /* */ /* */ public static final String PRIVUSE_VARIANT_PREFIX = "lvariant"; /* */ /* */ /* 30 */ private String _language = ""; /* 31 */ private String _script = ""; /* 32 */ private String _region = ""; /* 33 */ private String _privateuse = ""; /* */ /* 35 */ private List<String> _extlangs = Collections.emptyList(); /* 36 */ private List<String> _variants = Collections.emptyList(); /* 37 */ private List<String> _extensions = Collections.emptyList(); /* */ /* */ /* */ /* 41 */ private static final Map<AsciiUtil.CaseInsensitiveKey, String[]> GRANDFATHERED = new HashMap(); /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ static /* */ { /* 76 */ String[][] entries = { { "art-lojban", "jbo" }, { "cel-gaulish", "xtg-x-cel-gaulish" }, { "en-GB-oed", "en-GB-x-oed" }, { "i-ami", "ami" }, { "i-bnn", "bnn" }, { "i-default", "en-x-i-default" }, { "i-enochian", "und-x-i-enochian" }, { "i-hak", "hak" }, { "i-klingon", "tlh" }, { "i-lux", "lb" }, { "i-mingo", "see-x-i-mingo" }, { "i-navajo", "nv" }, { "i-pwn", "pwn" }, { "i-tao", "tao" }, { "i-tay", "tay" }, { "i-tsu", "tsu" }, { "no-bok", "nb" }, { "no-nyn", "nn" }, { "sgn-BE-FR", "sfb" }, { "sgn-BE-NL", "vgt" }, { "sgn-CH-DE", "sgg" }, { "zh-guoyu", "cmn" }, { "zh-hakka", "hak" }, { "zh-min", "nan-x-zh-min" }, { "zh-min-nan", "nan" }, { "zh-xiang", "hsn" } }; /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 105 */ for (String[] e : entries) { /* 106 */ GRANDFATHERED.put(new AsciiUtil.CaseInsensitiveKey(e[0]), e); /* */ } /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ public static LanguageTag parse(String languageTag, ParseStatus sts) /* */ { /* 159 */ if (sts == null) { /* 160 */ sts = new ParseStatus(); /* */ } else { /* 162 */ sts.reset(); /* */ } /* */ /* */ /* */ /* */ /* 168 */ String[] gfmap = (String[])GRANDFATHERED.get(new AsciiUtil.CaseInsensitiveKey(languageTag)); /* 169 */ StringTokenIterator itr; StringTokenIterator itr; if (gfmap != null) /* */ { /* 171 */ itr = new StringTokenIterator(gfmap[1], "-"); /* */ } else { /* 173 */ itr = new StringTokenIterator(languageTag, "-"); /* */ } /* */ /* 176 */ LanguageTag tag = new LanguageTag(); /* */ /* */ /* 179 */ if (tag.parseLanguage(itr, sts)) { /* 180 */ tag.parseExtlangs(itr, sts); /* 181 */ tag.parseScript(itr, sts); /* 182 */ tag.parseRegion(itr, sts); /* 183 */ tag.parseVariants(itr, sts); /* 184 */ tag.parseExtensions(itr, sts); /* */ } /* 186 */ tag.parsePrivateuse(itr, sts); /* */ /* 188 */ if ((!itr.isDone()) && (!sts.isError())) { /* 189 */ String s = itr.current(); /* 190 */ sts._errorIndex = itr.currentStart(); /* 191 */ if (s.length() == 0) { /* 192 */ sts._errorMsg = "Empty subtag"; /* */ } else { /* 194 */ sts._errorMsg = ("Invalid subtag: " + s); /* */ } /* */ } /* */ /* 198 */ return tag; /* */ } /* */ /* */ /* */ /* */ /* */ private boolean parseLanguage(StringTokenIterator itr, ParseStatus sts) /* */ { /* 206 */ if ((itr.isDone()) || (sts.isError())) { /* 207 */ return false; /* */ } /* */ /* 210 */ boolean found = false; /* */ /* 212 */ String s = itr.current(); /* 213 */ if (isLanguage(s)) { /* 214 */ found = true; /* 215 */ this._language = s; /* 216 */ sts._parseLength = itr.currentEnd(); /* 217 */ itr.next(); /* */ } /* */ /* 220 */ return found; /* */ } /* */ /* */ private boolean parseExtlangs(StringTokenIterator itr, ParseStatus sts) { /* 224 */ if ((itr.isDone()) || (sts.isError())) { /* 225 */ return false; /* */ } /* */ /* 228 */ boolean found = false; /* */ /* 230 */ while (!itr.isDone()) { /* 231 */ String s = itr.current(); /* 232 */ if (!isExtlang(s)) { /* */ break; /* */ } /* 235 */ found = true; /* 236 */ if (this._extlangs.isEmpty()) { /* 237 */ this._extlangs = new ArrayList(3); /* */ } /* 239 */ this._extlangs.add(s); /* 240 */ sts._parseLength = itr.currentEnd(); /* 241 */ itr.next(); /* */ /* 243 */ if (this._extlangs.size() == 3) { /* */ break; /* */ } /* */ } /* */ /* */ /* 249 */ return found; /* */ } /* */ /* */ private boolean parseScript(StringTokenIterator itr, ParseStatus sts) { /* 253 */ if ((itr.isDone()) || (sts.isError())) { /* 254 */ return false; /* */ } /* */ /* 257 */ boolean found = false; /* */ /* 259 */ String s = itr.current(); /* 260 */ if (isScript(s)) { /* 261 */ found = true; /* 262 */ this._script = s; /* 263 */ sts._parseLength = itr.currentEnd(); /* 264 */ itr.next(); /* */ } /* */ /* 267 */ return found; /* */ } /* */ /* */ private boolean parseRegion(StringTokenIterator itr, ParseStatus sts) { /* 271 */ if ((itr.isDone()) || (sts.isError())) { /* 272 */ return false; /* */ } /* */ /* 275 */ boolean found = false; /* */ /* 277 */ String s = itr.current(); /* 278 */ if (isRegion(s)) { /* 279 */ found = true; /* 280 */ this._region = s; /* 281 */ sts._parseLength = itr.currentEnd(); /* 282 */ itr.next(); /* */ } /* */ /* 285 */ return found; /* */ } /* */ /* */ private boolean parseVariants(StringTokenIterator itr, ParseStatus sts) { /* 289 */ if ((itr.isDone()) || (sts.isError())) { /* 290 */ return false; /* */ } /* */ /* 293 */ boolean found = false; /* */ /* 295 */ while (!itr.isDone()) { /* 296 */ String s = itr.current(); /* 297 */ if (!isVariant(s)) { /* */ break; /* */ } /* 300 */ found = true; /* 301 */ if (this._variants.isEmpty()) { /* 302 */ this._variants = new ArrayList(3); /* */ } /* 304 */ this._variants.add(s); /* 305 */ sts._parseLength = itr.currentEnd(); /* 306 */ itr.next(); /* */ } /* */ /* 309 */ return found; /* */ } /* */ /* */ private boolean parseExtensions(StringTokenIterator itr, ParseStatus sts) { /* 313 */ if ((itr.isDone()) || (sts.isError())) { /* 314 */ return false; /* */ } /* */ /* 317 */ boolean found = false; /* */ /* 319 */ while (!itr.isDone()) { /* 320 */ String s = itr.current(); /* 321 */ if (!isExtensionSingleton(s)) break; /* 322 */ int start = itr.currentStart(); /* 323 */ String singleton = s; /* 324 */ StringBuilder sb = new StringBuilder(singleton); /* */ /* 326 */ itr.next(); /* 327 */ while (!itr.isDone()) { /* 328 */ s = itr.current(); /* 329 */ if (!isExtensionSubtag(s)) break; /* 330 */ sb.append("-").append(s); /* 331 */ sts._parseLength = itr.currentEnd(); /* */ /* */ /* */ /* 335 */ itr.next(); /* */ } /* */ /* 338 */ if (sts._parseLength <= start) { /* 339 */ sts._errorIndex = start; /* 340 */ sts._errorMsg = ("Incomplete extension '" + singleton + "'"); /* 341 */ break; /* */ } /* */ /* 344 */ if (this._extensions.size() == 0) { /* 345 */ this._extensions = new ArrayList(4); /* */ } /* 347 */ this._extensions.add(sb.toString()); /* 348 */ found = true; /* */ } /* */ /* */ /* */ /* 353 */ return found; /* */ } /* */ /* */ private boolean parsePrivateuse(StringTokenIterator itr, ParseStatus sts) { /* 357 */ if ((itr.isDone()) || (sts.isError())) { /* 358 */ return false; /* */ } /* */ /* 361 */ boolean found = false; /* */ /* 363 */ String s = itr.current(); /* 364 */ if (isPrivateusePrefix(s)) { /* 365 */ int start = itr.currentStart(); /* 366 */ StringBuilder sb = new StringBuilder(s); /* */ /* 368 */ itr.next(); /* 369 */ while (!itr.isDone()) { /* 370 */ s = itr.current(); /* 371 */ if (!isPrivateuseSubtag(s)) { /* */ break; /* */ } /* 374 */ sb.append("-").append(s); /* 375 */ sts._parseLength = itr.currentEnd(); /* */ /* 377 */ itr.next(); /* */ } /* */ /* 380 */ if (sts._parseLength <= start) /* */ { /* 382 */ sts._errorIndex = start; /* 383 */ sts._errorMsg = "Incomplete privateuse"; /* */ } else { /* 385 */ this._privateuse = sb.toString(); /* 386 */ found = true; /* */ } /* */ } /* */ /* 390 */ return found; /* */ } /* */ /* */ public static LanguageTag parseLocale(BaseLocale baseLocale, LocaleExtensions localeExtensions) { /* 394 */ LanguageTag tag = new LanguageTag(); /* */ /* 396 */ String language = baseLocale.getLanguage(); /* 397 */ String script = baseLocale.getScript(); /* 398 */ String region = baseLocale.getRegion(); /* 399 */ String variant = baseLocale.getVariant(); /* */ /* 401 */ boolean hasSubtag = false; /* */ /* 403 */ String privuseVar = null; /* */ /* 405 */ if ((language.length() > 0) && (isLanguage(language))) /* */ { /* */ /* 408 */ if (language.equals("iw")) { /* 409 */ language = "he"; /* 410 */ } else if (language.equals("ji")) { /* 411 */ language = "yi"; /* 412 */ } else if (language.equals("in")) { /* 413 */ language = "id"; /* */ } /* 415 */ tag._language = language; /* */ } /* */ /* 418 */ if ((script.length() > 0) && (isScript(script))) { /* 419 */ tag._script = canonicalizeScript(script); /* 420 */ hasSubtag = true; /* */ } /* */ /* 423 */ if ((region.length() > 0) && (isRegion(region))) { /* 424 */ tag._region = canonicalizeRegion(region); /* 425 */ hasSubtag = true; /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 436 */ if (variant.length() > 0) { /* 437 */ List<String> variants = null; /* 438 */ StringTokenIterator varitr = new StringTokenIterator(variant, "_"); /* 439 */ while (!varitr.isDone()) { /* 440 */ String var = varitr.current(); /* 441 */ if (!isVariant(var)) { /* */ break; /* */ } /* 444 */ if (variants == null) { /* 445 */ variants = new ArrayList(); /* */ } /* */ /* */ /* */ /* 450 */ variants.add(canonicalizeVariant(var)); /* */ /* 452 */ varitr.next(); /* */ } /* 454 */ if (variants != null) { /* 455 */ tag._variants = variants; /* 456 */ hasSubtag = true; /* */ } /* 458 */ if (!varitr.isDone()) /* */ { /* 460 */ StringBuilder buf = new StringBuilder(); /* 461 */ while (!varitr.isDone()) { /* 462 */ String prvv = varitr.current(); /* 463 */ if (!isPrivateuseSubtag(prvv)) { /* */ break; /* */ } /* */ /* 467 */ if (buf.length() > 0) { /* 468 */ buf.append("-"); /* */ } /* */ /* 471 */ prvv = AsciiUtil.toLowerString(prvv); /* */ /* 473 */ buf.append(prvv); /* 474 */ varitr.next(); /* */ } /* 476 */ if (buf.length() > 0) { /* 477 */ privuseVar = buf.toString(); /* */ } /* */ } /* */ } /* */ /* 482 */ List<String> extensions = null; /* 483 */ String privateuse = null; /* */ /* 485 */ Set<Character> locextKeys = localeExtensions.getKeys(); /* 486 */ for (Character locextKey : locextKeys) { /* 487 */ Extension ext = localeExtensions.getExtension(locextKey); /* 488 */ if (isPrivateusePrefixChar(locextKey.charValue())) { /* 489 */ privateuse = ext.getValue(); /* */ } else { /* 491 */ if (extensions == null) { /* 492 */ extensions = new ArrayList(); /* */ } /* 494 */ extensions.add(locextKey.toString() + "-" + ext.getValue()); /* */ } /* */ } /* */ /* 498 */ if (extensions != null) { /* 499 */ tag._extensions = extensions; /* 500 */ hasSubtag = true; /* */ } /* */ /* */ /* 504 */ if (privuseVar != null) { /* 505 */ if (privateuse == null) { /* 506 */ privateuse = "lvariant-" + privuseVar; /* */ } else { /* 508 */ privateuse = privateuse + "-" + "lvariant" + "-" + privuseVar.replace("_", "-"); /* */ } /* */ } /* */ /* 512 */ if (privateuse != null) { /* 513 */ tag._privateuse = privateuse; /* */ } /* */ /* 516 */ if ((tag._language.length() == 0) && ((hasSubtag) || (privateuse == null))) /* */ { /* */ /* */ /* 520 */ tag._language = UNDETERMINED; /* */ } /* */ /* 523 */ return tag; /* */ } /* */ /* */ /* */ /* */ /* */ public String getLanguage() /* */ { /* 531 */ return this._language; /* */ } /* */ /* */ public List<String> getExtlangs() { /* 535 */ return Collections.unmodifiableList(this._extlangs); /* */ } /* */ /* */ public String getScript() { /* 539 */ return this._script; /* */ } /* */ /* */ public String getRegion() { /* 543 */ return this._region; /* */ } /* */ /* */ public List<String> getVariants() { /* 547 */ return Collections.unmodifiableList(this._variants); /* */ } /* */ /* */ public List<String> getExtensions() { /* 551 */ return Collections.unmodifiableList(this._extensions); /* */ } /* */ /* */ public String getPrivateuse() { /* 555 */ return this._privateuse; /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ public static boolean isLanguage(String s) /* */ { /* 568 */ return (s.length() >= 2) && (s.length() <= 8) && (AsciiUtil.isAlphaString(s)); /* */ } /* */ /* */ /* */ public static boolean isExtlang(String s) /* */ { /* 574 */ return (s.length() == 3) && (AsciiUtil.isAlphaString(s)); /* */ } /* */ /* */ public static boolean isScript(String s) /* */ { /* 579 */ return (s.length() == 4) && (AsciiUtil.isAlphaString(s)); /* */ } /* */ /* */ /* */ public static boolean isRegion(String s) /* */ { /* 585 */ return ((s.length() == 2) && (AsciiUtil.isAlphaString(s))) || ((s.length() == 3) && (AsciiUtil.isNumericString(s))); /* */ } /* */ /* */ /* */ /* */ public static boolean isVariant(String s) /* */ { /* 592 */ int len = s.length(); /* 593 */ if ((len >= 5) && (len <= 8)) { /* 594 */ return AsciiUtil.isAlphaNumericString(s); /* */ } /* 596 */ if (len == 4) { /* 597 */ return (AsciiUtil.isNumeric(s.charAt(0))) && (AsciiUtil.isAlphaNumeric(s.charAt(1))) && (AsciiUtil.isAlphaNumeric(s.charAt(2))) && (AsciiUtil.isAlphaNumeric(s.charAt(3))); /* */ } /* */ /* */ /* */ /* 602 */ return false; /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ public static boolean isExtensionSingleton(String s) /* */ { /* 612 */ return (s.length() == 1) && (AsciiUtil.isAlphaString(s)) && (!AsciiUtil.caseIgnoreMatch("x", s)); /* */ } /* */ /* */ /* */ public static boolean isExtensionSingletonChar(char c) /* */ { /* 618 */ return isExtensionSingleton(String.valueOf(c)); /* */ } /* */ /* */ public static boolean isExtensionSubtag(String s) /* */ { /* 623 */ return (s.length() >= 2) && (s.length() <= 8) && (AsciiUtil.isAlphaNumericString(s)); /* */ } /* */ /* */ public static boolean isPrivateusePrefix(String s) /* */ { /* 628 */ return (s.length() == 1) && (AsciiUtil.caseIgnoreMatch("x", s)); /* */ } /* */ /* */ public static boolean isPrivateusePrefixChar(char c) /* */ { /* 633 */ return AsciiUtil.caseIgnoreMatch("x", String.valueOf(c)); /* */ } /* */ /* */ public static boolean isPrivateuseSubtag(String s) /* */ { /* 638 */ return (s.length() >= 1) && (s.length() <= 8) && (AsciiUtil.isAlphaNumericString(s)); /* */ } /* */ /* */ /* */ /* */ /* */ public static String canonicalizeLanguage(String s) /* */ { /* 646 */ return AsciiUtil.toLowerString(s); /* */ } /* */ /* */ public static String canonicalizeExtlang(String s) { /* 650 */ return AsciiUtil.toLowerString(s); /* */ } /* */ /* */ public static String canonicalizeScript(String s) { /* 654 */ return AsciiUtil.toTitleString(s); /* */ } /* */ /* */ public static String canonicalizeRegion(String s) { /* 658 */ return AsciiUtil.toUpperString(s); /* */ } /* */ /* */ public static String canonicalizeVariant(String s) { /* 662 */ return AsciiUtil.toLowerString(s); /* */ } /* */ /* */ public static String canonicalizeExtension(String s) { /* 666 */ return AsciiUtil.toLowerString(s); /* */ } /* */ /* */ public static String canonicalizeExtensionSingleton(String s) { /* 670 */ return AsciiUtil.toLowerString(s); /* */ } /* */ /* */ public static String canonicalizeExtensionSubtag(String s) { /* 674 */ return AsciiUtil.toLowerString(s); /* */ } /* */ /* */ public static String canonicalizePrivateuse(String s) { /* 678 */ return AsciiUtil.toLowerString(s); /* */ } /* */ /* */ public static String canonicalizePrivateuseSubtag(String s) { /* 682 */ return AsciiUtil.toLowerString(s); /* */ } /* */ /* */ public String toString() { /* 686 */ StringBuilder sb = new StringBuilder(); /* */ /* 688 */ if (this._language.length() > 0) { /* 689 */ sb.append(this._language); /* */ /* 691 */ for (String extlang : this._extlangs) { /* 692 */ sb.append("-").append(extlang); /* */ } /* */ /* 695 */ if (this._script.length() > 0) { /* 696 */ sb.append("-").append(this._script); /* */ } /* */ /* 699 */ if (this._region.length() > 0) { /* 700 */ sb.append("-").append(this._region); /* */ } /* */ /* 703 */ for (String variant : this._extlangs) { /* 704 */ sb.append("-").append(variant); /* */ } /* */ /* 707 */ for (String extension : this._extensions) { /* 708 */ sb.append("-").append(extension); /* */ } /* */ } /* 711 */ if (this._privateuse.length() > 0) { /* 712 */ if (sb.length() > 0) { /* 713 */ sb.append("-"); /* */ } /* 715 */ sb.append(this._privateuse); /* */ } /* */ /* 718 */ return sb.toString(); /* */ } /* */ } /* Location: C:\Users\Ethan\Desktop\FontZip\FontTool\sfnttool.jar!\com\ibm\icu\impl\locale\LanguageTag.class * Java compiler version: 5 (49.0) * JD-Core Version: 0.7.1 */