-/*\r
- * international text\r
- *\r
- * License : The MIT License\r
- * Copyright(c) 2010 MikuToga Partners\r
- */\r
-\r
-package jp.sourceforge.mikutoga.corelib;\r
-\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Locale;\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-/**\r
- * 多言語のバリアントを持つ文字列情報。\r
- * <ul>\r
- * <li>プライマリ:識別子にはこちらを使う。基本は日本語。\r
- * <li>グローバル:基本は英語。UCS Basic-Latinオンリーの貧弱な言語環境でも\r
- * 読める文字列が望ましい。\r
- * <li>その他:必要に応じて好きな言語を。\r
- * </ul>\r
- */\r
-public class I18nText implements CharSequence {\r
-\r
- /** プライマリ言語のロケール。 */\r
- public static final Locale LOCALE_PRIMARY = Locale.JAPANESE;\r
- /** プライマリ言語の言語コード。 */\r
- public static final String CODE639_PRIMARY = LOCALE_PRIMARY.getLanguage();\r
-\r
- /** グローバル言語のロケール。 */\r
- public static final Locale LOCALE_GLOBAL = Locale.ENGLISH;\r
- /** グローバル言語の言語コード。 */\r
- public static final String CODE639_GLOBAL = LOCALE_GLOBAL.getLanguage();\r
-\r
- static{\r
- assert CODE639_PRIMARY.equals("ja");\r
- assert CODE639_GLOBAL .equals("en");\r
- }\r
-\r
- private final Map<String, String> nameMap = new HashMap<String, String>();\r
-\r
- /**\r
- * コンストラクタ。\r
- */\r
- public I18nText(){\r
- super();\r
- return;\r
- }\r
-\r
- /**\r
- * プライマリ文字列の登録。\r
- * @param seq プライマリ文字列。nullの場合は削除動作\r
- */\r
- public void setPrimaryText(CharSequence seq){\r
- setText(CODE639_PRIMARY, seq);\r
- return;\r
- }\r
-\r
- /**\r
- * グローバル文字列の登録。\r
- * @param seq グローバル文字列。nullの場合は削除動作\r
- */\r
- public void setGlobalText(CharSequence seq){\r
- setText(CODE639_GLOBAL, seq);\r
- return;\r
- }\r
-\r
- /**\r
- * 任意のロケールに関連付けられた文字列の登録。\r
- * @param locale ロケール\r
- * @param seq 文字列。nullの場合は削除動作\r
- * @throws NullPointerException ロケール引数がnull\r
- */\r
- public void setText(Locale locale, CharSequence seq)\r
- throws NullPointerException{\r
- String code639 = locale.getLanguage();\r
- setText(code639, seq);\r
- return;\r
- }\r
-\r
- /**\r
- * 任意の言語コードに関連付けられた文字列の登録。\r
- * @param code639 ISO639言語コード\r
- * @param seq 文字列。nullの場合は削除動作\r
- * @throws NullPointerException 言語コードがnull\r
- */\r
- public void setText(String code639, CharSequence seq)\r
- throws NullPointerException{\r
- if(code639 == null) throw new NullPointerException();\r
-\r
- if(seq != null){\r
- String text = seq.toString();\r
- this.nameMap.put(code639, text);\r
- }else{\r
- this.nameMap.remove(code639);\r
- }\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * 言語コードに応じた文字列を返す。\r
- * @param code639 ISO639言語コード\r
- * @return 文字列。見つからなければnullを返す。\r
- * @throws NullPointerException 引数がnull\r
- */\r
- public String getText(String code639) throws NullPointerException{\r
- if(code639 == null) throw new NullPointerException();\r
- String result = this.nameMap.get(code639);\r
- return result;\r
- }\r
-\r
- /**\r
- * ロケールに応じた文字列を返す。\r
- * @param locale ロケール\r
- * @return 文字列。見つからなければnullを返す。\r
- * @throws NullPointerException 引数がnull\r
- */\r
- public String getText(Locale locale) throws NullPointerException{\r
- String code639 = locale.getLanguage();\r
- String result = getText(code639);\r
- return result;\r
- }\r
-\r
- /**\r
- * プライマリ文字列を返す。\r
- * @return 文字列。見つからなければnullを返す。\r
- */\r
- public String getPrimaryText(){\r
- String result = getText(CODE639_PRIMARY);\r
- return result;\r
- }\r
-\r
- /**\r
- * グローバル文字列を返す。\r
- * @return 文字列。見つからなければnullを返す。\r
- */\r
- public String getGlobalText(){\r
- String result = getText(CODE639_GLOBAL);\r
- return result;\r
- }\r
-\r
- /**\r
- * プライマリ文字列を返す。\r
- * 見つからなければグローバル文字列を返す。\r
- * それでも見つからなければ空文字列を返す。\r
- * @return 文字列\r
- */\r
- public String getText(){\r
- String result;\r
-\r
- result = getPrimaryText();\r
-\r
- if(result == null){\r
- result = getGlobalText();\r
- }\r
-\r
- if(result == null){\r
- result = "";\r
- }\r
-\r
- return result;\r
- }\r
-\r
- /**\r
- * 実行環境のデフォルトロケールに応じた文字列を返す。\r
- * 見つからなければグローバル文字列、プライマリ文字列の順に返す。\r
- * それでも見つからなければ適当な言語コードの文字列を返す。\r
- * それでも見つからなければ空文字列を返す。\r
- * デフォルトロケールの確認はその都度行われる。\r
- * @return 文字列\r
- */\r
- public String getLocalizedText(){\r
- Locale locale = Locale.getDefault();\r
- String langCode = locale.getLanguage();\r
-\r
- String result;\r
-\r
- result = this.nameMap.get(langCode);\r
-\r
- if(result == null){\r
- result = this.nameMap.get(CODE639_GLOBAL);\r
- }\r
-\r
- if(result == null){\r
- result = this.nameMap.get(CODE639_PRIMARY);\r
- }\r
-\r
- if(result == null){\r
- Set<String> langSet = this.nameMap.keySet();\r
- Iterator<String> it = langSet.iterator();\r
- while(it.hasNext()){\r
- String lang = it.next();\r
- result = this.nameMap.get(lang);\r
- if(result != null) break;\r
- }\r
- }\r
-\r
- if(result == null){\r
- result = "";\r
- }\r
-\r
- return result;\r
- }\r
-\r
- /**\r
- * 全言語の文字列を削除する。\r
- */\r
- public void removeAllText(){\r
- this.nameMap.clear();\r
- return;\r
- }\r
-\r
- /**\r
- * 登録済みの全ISO639言語コードリストを返す。\r
- * 優先度はプライマリ、グローバル、その他の順。\r
- * @return 全ISO639言語コード\r
- */\r
- public List<String> lang639CodeList(){\r
- Set<String> set = this.nameMap.keySet();\r
- List<String> result = new ArrayList<String>(set.size());\r
-\r
- for(String lang : set){\r
- if(lang.equals(CODE639_PRIMARY)) result.add(lang);\r
- }\r
-\r
- for(String lang : set){\r
- if(lang.equals(CODE639_GLOBAL)) result.add(lang);\r
- }\r
-\r
- for(String lang : set){\r
- if(lang.equals(CODE639_PRIMARY)) continue;\r
- if(lang.equals(CODE639_GLOBAL)) continue;\r
- result.add(lang);\r
- }\r
-\r
- return result;\r
- }\r
-\r
- /**\r
- * プライマリ文字列が登録されているか判定する。\r
- * @return 登録されていればtrue\r
- */\r
- public boolean hasPrimaryText(){\r
- boolean result = this.nameMap.containsKey(CODE639_PRIMARY);\r
- return result;\r
- }\r
-\r
- /**\r
- * グローバル文字列が登録されているか判定する。\r
- * @return 登録されていればtrue\r
- */\r
- public boolean hasGlobalText(){\r
- boolean result = this.nameMap.containsKey(CODE639_GLOBAL);\r
- return result;\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * {@link #getText()}に準ずる。\r
- * @param index {@inheritDoc}\r
- * @return {@inheritDoc}\r
- */\r
- @Override\r
- public char charAt(int index){\r
- String text = getText();\r
- char result = text.charAt(index);\r
- return result;\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * {@link #getText()}に準ずる。\r
- * @return {@inheritDoc}\r
- */\r
- @Override\r
- public int length(){\r
- String text = getText();\r
- int result = text.length();\r
- return result;\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * {@link #getText()}に準ずる。\r
- * @param start {@inheritDoc}\r
- * @param end {@inheritDoc}\r
- * @return {@inheritDoc}\r
- */\r
- @Override\r
- public CharSequence subSequence(int start, int end){\r
- String text = getText();\r
- CharSequence result = text.subSequence(start, end);\r
- return result;\r
- }\r
-\r
- /**\r
- * {@inheritDoc}\r
- * {@link #getText()}に準ずる。\r
- * @return {@inheritDoc}\r
- */\r
- @Override\r
- public String toString(){\r
- return getText();\r
- }\r
-\r
-}\r
+/*
+ * international text
+ *
+ * License : The MIT License
+ * Copyright(c) 2010 MikuToga Partners
+ */
+
+package jp.sourceforge.mikutoga.corelib;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 多言語のバリアントを持つ文字列情報。
+ * <ul>
+ * <li>プライマリ:識別子にはこちらを使う。基本は日本語。
+ * <li>グローバル:基本は英語。UCS Basic-Latinオンリーの貧弱な言語環境でも
+ * 読める文字列が望ましい。
+ * <li>その他:必要に応じて好きな言語を。
+ * </ul>
+ */
+public class I18nText implements CharSequence {
+
+ /** プライマリ言語のロケール。 */
+ public static final Locale LOCALE_PRIMARY = Locale.JAPANESE;
+ /** プライマリ言語の言語コード。 */
+ public static final String CODE639_PRIMARY = LOCALE_PRIMARY.getLanguage();
+
+ /** グローバル言語のロケール。 */
+ public static final Locale LOCALE_GLOBAL = Locale.ENGLISH;
+ /** グローバル言語の言語コード。 */
+ public static final String CODE639_GLOBAL = LOCALE_GLOBAL.getLanguage();
+
+ static{
+ assert CODE639_PRIMARY.equals("ja");
+ assert CODE639_GLOBAL .equals("en");
+ }
+
+ private final Map<String, String> nameMap = new HashMap<String, String>();
+
+ /**
+ * コンストラクタ。
+ */
+ public I18nText(){
+ super();
+ return;
+ }
+
+ /**
+ * プライマリ文字列の登録。
+ * @param seq プライマリ文字列。nullの場合は削除動作
+ */
+ public void setPrimaryText(CharSequence seq){
+ setText(CODE639_PRIMARY, seq);
+ return;
+ }
+
+ /**
+ * グローバル文字列の登録。
+ * @param seq グローバル文字列。nullの場合は削除動作
+ */
+ public void setGlobalText(CharSequence seq){
+ setText(CODE639_GLOBAL, seq);
+ return;
+ }
+
+ /**
+ * 任意のロケールに関連付けられた文字列の登録。
+ * @param locale ロケール
+ * @param seq 文字列。nullの場合は削除動作
+ * @throws NullPointerException ロケール引数がnull
+ */
+ public void setText(Locale locale, CharSequence seq)
+ throws NullPointerException{
+ String code639 = locale.getLanguage();
+ setText(code639, seq);
+ return;
+ }
+
+ /**
+ * 任意の言語コードに関連付けられた文字列の登録。
+ * @param code639 ISO639言語コード
+ * @param seq 文字列。nullの場合は削除動作
+ * @throws NullPointerException 言語コードがnull
+ */
+ public void setText(String code639, CharSequence seq)
+ throws NullPointerException{
+ if(code639 == null) throw new NullPointerException();
+
+ if(seq != null){
+ String text = seq.toString();
+ this.nameMap.put(code639, text);
+ }else{
+ this.nameMap.remove(code639);
+ }
+
+ return;
+ }
+
+ /**
+ * 言語コードに応じた文字列を返す。
+ * @param code639 ISO639言語コード
+ * @return 文字列。見つからなければnullを返す。
+ * @throws NullPointerException 引数がnull
+ */
+ public String getText(String code639) throws NullPointerException{
+ if(code639 == null) throw new NullPointerException();
+ String result = this.nameMap.get(code639);
+ return result;
+ }
+
+ /**
+ * ロケールに応じた文字列を返す。
+ * @param locale ロケール
+ * @return 文字列。見つからなければnullを返す。
+ * @throws NullPointerException 引数がnull
+ */
+ public String getText(Locale locale) throws NullPointerException{
+ String code639 = locale.getLanguage();
+ String result = getText(code639);
+ return result;
+ }
+
+ /**
+ * プライマリ文字列を返す。
+ * @return 文字列。見つからなければnullを返す。
+ */
+ public String getPrimaryText(){
+ String result = getText(CODE639_PRIMARY);
+ return result;
+ }
+
+ /**
+ * グローバル文字列を返す。
+ * @return 文字列。見つからなければnullを返す。
+ */
+ public String getGlobalText(){
+ String result = getText(CODE639_GLOBAL);
+ return result;
+ }
+
+ /**
+ * プライマリ文字列を返す。
+ * 見つからなければグローバル文字列を返す。
+ * それでも見つからなければ空文字列を返す。
+ * @return 文字列
+ */
+ public String getText(){
+ String result;
+
+ result = getPrimaryText();
+
+ if(result == null){
+ result = getGlobalText();
+ }
+
+ if(result == null){
+ result = "";
+ }
+
+ return result;
+ }
+
+ /**
+ * 実行環境のデフォルトロケールに応じた文字列を返す。
+ * 見つからなければグローバル文字列、プライマリ文字列の順に返す。
+ * それでも見つからなければ適当な言語コードの文字列を返す。
+ * それでも見つからなければ空文字列を返す。
+ * デフォルトロケールの確認はその都度行われる。
+ * @return 文字列
+ */
+ public String getLocalizedText(){
+ Locale locale = Locale.getDefault();
+ String langCode = locale.getLanguage();
+
+ String result;
+
+ result = this.nameMap.get(langCode);
+
+ if(result == null){
+ result = this.nameMap.get(CODE639_GLOBAL);
+ }
+
+ if(result == null){
+ result = this.nameMap.get(CODE639_PRIMARY);
+ }
+
+ if(result == null){
+ Set<String> langSet = this.nameMap.keySet();
+ Iterator<String> it = langSet.iterator();
+ while(it.hasNext()){
+ String lang = it.next();
+ result = this.nameMap.get(lang);
+ if(result != null) break;
+ }
+ }
+
+ if(result == null){
+ result = "";
+ }
+
+ return result;
+ }
+
+ /**
+ * 全言語の文字列を削除する。
+ */
+ public void removeAllText(){
+ this.nameMap.clear();
+ return;
+ }
+
+ /**
+ * 登録済みの全ISO639言語コードリストを返す。
+ * 優先度はプライマリ、グローバル、その他の順。
+ * @return 全ISO639言語コード
+ */
+ public List<String> lang639CodeList(){
+ Set<String> set = this.nameMap.keySet();
+ List<String> result = new ArrayList<String>(set.size());
+
+ for(String lang : set){
+ if(lang.equals(CODE639_PRIMARY)) result.add(lang);
+ }
+
+ for(String lang : set){
+ if(lang.equals(CODE639_GLOBAL)) result.add(lang);
+ }
+
+ for(String lang : set){
+ if(lang.equals(CODE639_PRIMARY)) continue;
+ if(lang.equals(CODE639_GLOBAL)) continue;
+ result.add(lang);
+ }
+
+ return result;
+ }
+
+ /**
+ * プライマリ文字列が登録されているか判定する。
+ * @return 登録されていればtrue
+ */
+ public boolean hasPrimaryText(){
+ boolean result = this.nameMap.containsKey(CODE639_PRIMARY);
+ return result;
+ }
+
+ /**
+ * グローバル文字列が登録されているか判定する。
+ * @return 登録されていればtrue
+ */
+ public boolean hasGlobalText(){
+ boolean result = this.nameMap.containsKey(CODE639_GLOBAL);
+ return result;
+ }
+
+ /**
+ * {@inheritDoc}
+ * {@link #getText()}に準ずる。
+ * @param index {@inheritDoc}
+ * @return {@inheritDoc}
+ */
+ @Override
+ public char charAt(int index){
+ String text = getText();
+ char result = text.charAt(index);
+ return result;
+ }
+
+ /**
+ * {@inheritDoc}
+ * {@link #getText()}に準ずる。
+ * @return {@inheritDoc}
+ */
+ @Override
+ public int length(){
+ String text = getText();
+ int result = text.length();
+ return result;
+ }
+
+ /**
+ * {@inheritDoc}
+ * {@link #getText()}に準ずる。
+ * @param start {@inheritDoc}
+ * @param end {@inheritDoc}
+ * @return {@inheritDoc}
+ */
+ @Override
+ public CharSequence subSequence(int start, int end){
+ String text = getText();
+ CharSequence result = text.subSequence(start, end);
+ return result;
+ }
+
+ /**
+ * {@inheritDoc}
+ * {@link #getText()}に準ずる。
+ * @return {@inheritDoc}
+ */
+ @Override
+ public String toString(){
+ return getText();
+ }
+
+}