OSDN Git Service

1.105.3-SNAPSHOT版開発開始
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / corelib / I18nText.java
index 50e2fb7..001fa45 100644 (file)
-/*\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();
+    }
+
+}