OSDN Git Service

・ AboutボックスでHTMLが表示できなかった問題の修正
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / util / LocalizedTextResource.java
1 package charactermanaj.util;\r
2 \r
3 import java.io.BufferedReader;\r
4 import java.io.IOException;\r
5 import java.io.InputStream;\r
6 import java.io.InputStreamReader;\r
7 import java.net.URL;\r
8 import java.nio.charset.Charset;\r
9 import java.util.Locale;\r
10 \r
11 /**\r
12  * リソース名を指定してローカライズされたテキストを取得するための抽象実装.<br>\r
13  * リソースの取得部は派生クラスにて実装する必要がある.<br>\r
14  * \r
15  * @author seraphy\r
16  */\r
17 public abstract class LocalizedTextResource {\r
18 \r
19         /**\r
20          * リソース名を指定して、テキストファイルを読み込んで、その文字列を返す.<br>\r
21          * リソースは現在のデフォルトロケールを優先で検索されます.<br>\r
22          * ファイルエンコーディングを引数csで指定する.<br>\r
23          * \r
24          * @param name\r
25          *            リソース名\r
26          * @param cs\r
27          *            ファイルのエンコーディング\r
28          * @return ファイルの内容(テキスト)\r
29          */\r
30         public String getText(String name, Charset cs) {\r
31                 return getText(name, cs, Locale.getDefault());\r
32         }\r
33 \r
34         /**\r
35          * リソース名と文字コードを指定して、ロケールに対応する文字列を取得する.<br>\r
36          * リソースがなければ実行時例外が発生する.\r
37          * \r
38          * @param name\r
39          *            リソース名\r
40          * @param cs\r
41          *            文字コード\r
42          * @param locale\r
43          *            取得するロケール\r
44          * @return テキスト\r
45          */\r
46         public String getText(String name, Charset cs, Locale locale) {\r
47                 ResourceNames resourceNames = createResourceNames(name, locale);\r
48                 String text = loadText(resourceNames, cs);\r
49                 if (text == null) {\r
50                         throw new RuntimeException("resource not found: " + resourceNames);\r
51                 }\r
52                 return text;\r
53         }\r
54 \r
55         /**\r
56          * リソース名とロケールを指定して読み込む実リソース名のグループを作成して返す.\r
57          * \r
58          * @param name\r
59          *            リソース名\r
60          * @param locale\r
61          *            ロケール\r
62          * @return リソース名グループ(優先順)\r
63          */\r
64         protected ResourceNames createResourceNames(String name, Locale locale) {\r
65                 if (name == null || name.length() == 0 || locale == null) {\r
66                         throw new IllegalArgumentException();\r
67                 }\r
68 \r
69                 String language = locale.getLanguage();\r
70                 String country = locale.getCountry();\r
71                 String variant = locale.getVariant();\r
72 \r
73                 int extpos = name.lastIndexOf(".");\r
74                 int folderpos = name.lastIndexOf("/");\r
75 \r
76                 String basename;\r
77                 String ext;\r
78                 if (folderpos > extpos) {\r
79                         basename = name;\r
80                         ext = "";\r
81                 } else {\r
82                         basename = name.substring(0, extpos);\r
83                         ext = name.substring(extpos);\r
84                 }\r
85 \r
86                 String[] resourceNamesStr = {\r
87                                 basename + "_" + language + "_" + country + "_" + variant + ext,\r
88                                 basename + "_" + language + "_" + country + ext,\r
89                                 basename + "_" + language + ext, basename + ext,};\r
90 \r
91                 return new ResourceNames(resourceNamesStr);\r
92         }\r
93 \r
94         /**\r
95          * リソース名グループを指定して、リソースをテキストとして取得する.<br>\r
96          * リソース名グループの優先順にリソースの取得を試みて最初に成功したものを返す.<br>\r
97          * ひとつも成功しなければnullが返される.<br>\r
98          * \r
99          * @param resourceNames\r
100          *            リソース名グループ\r
101          * @param cs\r
102          *            文字コード\r
103          * @return リソースのテキスト\r
104          */\r
105         protected String loadText(ResourceNames resourceNames, Charset cs) {\r
106                 if (resourceNames == null || cs == null) {\r
107                         throw new IllegalArgumentException();\r
108                 }\r
109 \r
110                 for (String resourceName : resourceNames) {\r
111                         URL url = getResource(resourceName);\r
112                         if (url == null) {\r
113                                 // リソースがなければ次の候補へスキップする.\r
114                                 continue;\r
115                         }\r
116                         StringBuilder buf = new StringBuilder();\r
117                         try {\r
118                                 InputStream is = url.openStream();\r
119                                 try {\r
120                                         BufferedReader rd = new BufferedReader(\r
121                                                         new InputStreamReader(is, cs));\r
122                                         try {\r
123                                                 int ch;\r
124                                                 while ((ch = rd.read()) != -1) {\r
125                                                         buf.append((char) ch);\r
126                                                 }\r
127                                         } finally {\r
128                                                 rd.close();\r
129                                         }\r
130                                 } finally {\r
131                                         is.close();\r
132                                 }\r
133                         } catch (IOException ex) {\r
134                                 throw new RuntimeException("resource loading error: " + ex, ex);\r
135                         }\r
136                         // 1つでも成功すれば、それで終了する.\r
137                         return buf.toString();\r
138                 }\r
139                 // 一つも成功しなかった場合\r
140                 return null;\r
141         }\r
142 \r
143         /**\r
144          * リソース名からリソースを取得する.<br>\r
145          * 存在しなければnullを返す.<br>\r
146          * \r
147          * @param resourceName\r
148          *            リソース名\r
149          * @return リソース、またはnull\r
150          */\r
151         protected abstract URL getResource(String resourceName);\r
152 }\r