View Javadoc
1   package com.github.mygreen.cellformatter.lang;
2   
3   import java.util.Locale;
4   import java.util.Map;
5   import java.util.concurrent.ConcurrentHashMap;
6   
7   
8   /**
9    * Microsoftで使用しているロケールを表現するクラス。
10   * <ul>
11   *  <li><a href="https://msdn.microsoft.com/ja-jp/library/cc392381.aspx" target="_blank">ロケール ID (LCID) の一覧</a></li>
12   *  <li><a href="https://msdn.microsoft.com/ja-jp/goglobal/bb964664.aspx" target="_blank">Locale IDs Assigned by Microsoft</a></li>
13   * </ul>
14   * 
15   * @version 0.5
16   * @author T.TSUCHIE
17   *
18   */
19  public class MSLocale {
20      
21      private static final MessageResolvergeResolver.html#MessageResolver">MessageResolver messageResolver = new MessageResolver("com.github.mygreen.cellformatter.locale");
22      
23      /**
24       * 既知(プロパティファイル)に定義したのロケールはキャッシュする。
25       * ・キー:id(10進数)
26       * ・値:既知のロケール。
27       */
28      private static Map<Integer, MSLocale> KNOWN_LOCALES = new ConcurrentHashMap<>();
29      
30      /** 日本語 */
31      public static final MSLocale JAPANESE = MSLocale.createKnownLocale(0x0411);
32      
33      /** 英語 (米国) */
34      public static final MSLocale US = MSLocale.createKnownLocale(0x0409);
35      
36      /** 英語 (英国) */
37      public static final MSLocale UK = MSLocale.createKnownLocale(0x0809);
38      
39      /** 英語 (カナダ) */
40      public static final MSLocale CANADA = MSLocale.createKnownLocale(0x2809);
41      
42      /** ドイツ語 */
43      public static final MSLocale GERMAN = MSLocale.createKnownLocale(0x0407);
44      
45      /** フランス語 */
46      public static final MSLocale FRENCE = MSLocale.createKnownLocale(0x040C);
47      
48      /** フランス語(カナダ) */
49      public static final MSLocale CANADA_FRENCH = MSLocale.createKnownLocale(0x0C0C);
50      
51      /** イタリア語 */
52      public static final MSLocale ITALY = MSLocale.createKnownLocale(0x0410);
53      
54      /** 韓国語 */
55      public static final MSLocale KOREA = MSLocale.createKnownLocale(0x0412);
56      
57      /** 中国語(中華人民共和国) */
58      public static final MSLocale PRC = MSLocale.createKnownLocale(0x0804);
59      
60      /** 中国語(台湾) */
61      public static final MSLocale TAIWAN = MSLocale.createKnownLocale(0x0404);
62      
63      /** ID - 10進値 */
64      private final int id;
65      
66      /** ID - 16進値(10進数を元に設定する) */
67      private final String hexId;
68      
69      /** 言語コード */
70      private String code;
71      
72      /** 言語名 */
73      private String language;
74      
75      /** 国 / 地域 */
76      private String country;
77      
78      /** 名称 */
79      private String name;
80      
81      /** Javaのロケール */
82      private Locale locale;
83      
84      /**
85       * 既知のIDかどうか。
86       * <p>プロパティファイルに定義されているかで確認する。
87       * @since 0.5
88       * @param id ロケールID(10進数)。
89       */
90      public static boolean isKnownById(int id) {
91          final String hexId = Utils.supplyZero(Integer.toHexString(id).toUpperCase(), 4);
92          
93          String code = messageResolver.getMessage(String.format("locale.%s.code", hexId));
94          return Utils.isNotEmpty(code);
95      }
96      
97      /**
98       * IDを指定してインスタンスを作成する。
99       * @param id ロケールID(10進数)
100      */
101     public MSLocale(final int id) {
102         this.id = id;
103         
104         // IDを16進数に変換する
105         final String hexId = Utils.supplyZero(Integer.toHexString(id).toUpperCase(), 4);
106         this.hexId = hexId;
107         
108     }
109     
110     /**
111      * 既知の言語を組み立てる。
112      * <p>プロパティファイルに定義されている情報を元に作成する。
113      * @since 0.5
114      * @param id 10進数の言語ID
115      * @return 不明なIDの場合は、nullを返す。
116      */
117     public static MSLocale createKnownLocale(final int id) {
118         
119         if(KNOWN_LOCALES.containsKey(id)) {
120             return KNOWN_LOCALES.get(id);
121         }
122         
123         final MSLocaleatter/lang/MSLocale.html#MSLocale">MSLocale locale = new MSLocale(id);
124         
125         // IDを16進数に変換する
126         final String hexId = Utils.supplyZero(Integer.toHexString(id).toUpperCase(), 4);
127         
128         String code = messageResolver.getMessage(String.format("locale.%s.code", hexId));
129         if(Utils.isEmpty(code)) {
130             return null;
131         }
132         
133         locale.code = code;
134         locale.language = messageResolver.getMessage(String.format("locale.%s.language", hexId));
135         locale.country = messageResolver.getMessage(String.format("locale.%s.country", hexId));
136         locale.name = messageResolver.getMessage(String.format("locale.%s.name", hexId));
137         
138         // Javaのロケールの設定
139         String jid = messageResolver.getMessage(String.format("locale.%s.jid", hexId));
140         if(Utils.isNotEmpty(jid)) {
141             locale.locale = parseLocale(jid);
142         }
143         
144         // キャッシュに登録する。
145         KNOWN_LOCALES.put(id, locale);
146         
147         return locale;
148         
149     }
150     
151     private static Locale parseLocale(final String jid) {
152         
153         String[] split = jid.split("_");
154         if(split.length == 1) {
155             return new Locale(split[0]);
156             
157         } if(split.length == 2) {
158             return new Locale(split[0], split[1]);
159             
160         } else if(split.length == 3) {
161             return new Locale(split[0], split[2]);
162             
163         }
164         
165         return null;
166         
167     }
168     
169     /**
170      * システムの日付用のロケールの場合。
171      * <p>16進数の値が'F800'のとき。
172      * @return
173      */
174     public boolean isSystemDate() {
175         return getHexId().equalsIgnoreCase("F800");
176     }
177     
178     /**
179      * システムの時刻用のロケールの場合。
180      * <p>16進数の値が'F400'のとき。
181      * @return
182      */
183     public boolean isSystemTime() {
184         return getHexId().equalsIgnoreCase("F400");
185     }
186     
187     /**
188      * IDを取得する。10進数の数値
189      * @return
190      */
191     public int getId() {
192         return id;
193     }
194     
195     /**
196      * 16進数のIDを取得する。
197      * ・大文字、4桁に整形されている。
198      * @return
199      */
200     public String getHexId() {
201         return hexId;
202     }
203     
204     /**
205      * コードの取得
206      * @return
207      */
208     public String getCode() {
209         return code;
210     }
211     
212     /**
213      * 言語コードを取得する
214      * @return
215      */
216     public String getLanguage() {
217         return language;
218     }
219     
220     /**
221      * 国コードを取得する
222      * @return
223      */
224     public String getCountry() {
225         return country;
226     }
227     
228     /**
229      * 名称を取得する。
230      * @return
231      */
232     public String getName() {
233         return name;
234     }
235     
236     /**
237      * 指定したロケールの名称を取得する。
238      * @param locale
239      * @return
240      */
241     public String getName(final Locale locale) {
242         return messageResolver.getMessage(locale, String.format("locale.%s.name", hexId));
243     }
244     
245     /**
246      * 対応するJavaのロケールを取得する。
247      * <p>存在しない場合は、nullを返す。
248      * @return
249      */
250     public Locale getLocale() {
251         return locale;
252     }
253     
254     @Override
255     public int hashCode() {
256         final int prime = 31;
257         int result = 1;
258         result = prime * result + id;
259         return result;
260     }
261     
262     @Override
263     public boolean equals(Object obj) {
264         if(this == obj)
265             return true;
266         if(obj == null)
267             return false;
268         if(getClass() != obj.getClass())
269             return false;
270         MSLocale./../../../../com/github/mygreen/cellformatter/lang/MSLocale.html#MSLocale">MSLocale other = (MSLocale) obj;
271         if(id != other.id)
272             return false;
273         return true;
274     }
275     
276 }