1 /* GENERATED SOURCE. DO NOT MODIFY. */ 2 // © 2016 and later: Unicode, Inc. and others. 3 // License & terms of use: http://www.unicode.org/copyright.html#License 4 /* 5 ******************************************************************************* 6 * Copyright (C) 2009-2014, International Business Machines Corporation and * 7 * others. All Rights Reserved. * 8 ******************************************************************************* 9 */ 10 package ohos.global.icu.impl.locale; 11 12 import java.util.Collections; 13 import java.util.Map.Entry; 14 import java.util.Set; 15 import java.util.SortedMap; 16 import java.util.SortedSet; 17 import java.util.TreeMap; 18 import java.util.TreeSet; 19 20 /** 21 * @hide exposed on OHOS 22 */ 23 public class UnicodeLocaleExtension extends Extension { 24 public static final char SINGLETON = 'u'; 25 26 private static final SortedSet<String> EMPTY_SORTED_SET = new TreeSet<String>(); 27 private static final SortedMap<String, String> EMPTY_SORTED_MAP = new TreeMap<String, String>(); 28 29 private SortedSet<String> _attributes = EMPTY_SORTED_SET; 30 private SortedMap<String, String> _keywords = EMPTY_SORTED_MAP; 31 32 public static final UnicodeLocaleExtension CA_JAPANESE; 33 public static final UnicodeLocaleExtension NU_THAI; 34 35 static { 36 CA_JAPANESE = new UnicodeLocaleExtension(); 37 CA_JAPANESE._keywords = new TreeMap<String, String>(); 38 CA_JAPANESE._keywords.put("ca", "japanese"); 39 CA_JAPANESE._value = "ca-japanese"; 40 41 NU_THAI = new UnicodeLocaleExtension(); 42 NU_THAI._keywords = new TreeMap<String, String>(); 43 NU_THAI._keywords.put("nu", "thai"); 44 NU_THAI._value = "nu-thai"; 45 } 46 UnicodeLocaleExtension()47 private UnicodeLocaleExtension() { 48 super(SINGLETON); 49 } 50 UnicodeLocaleExtension(SortedSet<String> attributes, SortedMap<String, String> keywords)51 UnicodeLocaleExtension(SortedSet<String> attributes, SortedMap<String, String> keywords) { 52 this(); 53 if (attributes != null && attributes.size() > 0) { 54 _attributes = attributes; 55 } 56 if (keywords != null && keywords.size() > 0) { 57 _keywords = keywords; 58 } 59 60 if (_attributes.size() > 0 || _keywords.size() > 0) { 61 StringBuilder sb = new StringBuilder(); 62 for (String attribute : _attributes) { 63 sb.append(LanguageTag.SEP).append(attribute); 64 } 65 for (Entry<String, String> keyword : _keywords.entrySet()) { 66 String key = keyword.getKey(); 67 String value = keyword.getValue(); 68 69 sb.append(LanguageTag.SEP).append(key); 70 if (value.length() > 0) { 71 sb.append(LanguageTag.SEP).append(value); 72 } 73 } 74 _value = sb.substring(1); // skip leading '-' 75 } 76 } 77 getUnicodeLocaleAttributes()78 public Set<String> getUnicodeLocaleAttributes() { 79 return Collections.unmodifiableSet(_attributes); 80 } 81 getUnicodeLocaleKeys()82 public Set<String> getUnicodeLocaleKeys() { 83 return Collections.unmodifiableSet(_keywords.keySet()); 84 } 85 getUnicodeLocaleType(String unicodeLocaleKey)86 public String getUnicodeLocaleType(String unicodeLocaleKey) { 87 return _keywords.get(unicodeLocaleKey); 88 } 89 isSingletonChar(char c)90 public static boolean isSingletonChar(char c) { 91 return (SINGLETON == AsciiUtil.toLower(c)); 92 } 93 isAttribute(String s)94 public static boolean isAttribute(String s) { 95 // 3*8alphanum 96 return (s.length() >= 3) && (s.length() <= 8) && AsciiUtil.isAlphaNumericString(s); 97 } 98 isKey(String s)99 public static boolean isKey(String s) { 100 // key = alphanum alpha ; 101 return (s.length() == 2) && AsciiUtil.isAlphaNumeric(s.charAt(0)) && 102 AsciiUtil.isAlpha(s.charAt(1)); 103 } 104 isTypeSubtag(String s)105 public static boolean isTypeSubtag(String s) { 106 // 3*8alphanum 107 return (s.length() >= 3) && (s.length() <= 8) && AsciiUtil.isAlphaNumericString(s); 108 } 109 isType(String s)110 public static boolean isType(String s) { 111 // sequence of type subtags delimited by '-' 112 int startIdx = 0; 113 boolean sawSubtag = false; 114 while (true) { 115 int idx = s.indexOf(LanguageTag.SEP, startIdx); 116 String subtag = idx < 0 ? s.substring(startIdx) : s.substring(startIdx, idx); 117 if (!isTypeSubtag(subtag)) { 118 return false; 119 } 120 sawSubtag = true; 121 if (idx < 0) { 122 break; 123 } 124 startIdx = idx + 1; 125 } 126 return sawSubtag && startIdx < s.length(); 127 } 128 } 129