1 package charactermanaj.util;
\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
8 import java.nio.charset.Charset;
\r
9 import java.util.Locale;
\r
12 * リソース名を指定してローカライズされたテキストを取得するための抽象実装.<br>
\r
13 * リソースの取得部は派生クラスにて実装する必要がある.<br>
\r
17 public abstract class LocalizedTextResource {
\r
20 * リソース名を指定して、テキストファイルを読み込んで、その文字列を返す.<br>
\r
21 * リソースは現在のデフォルトロケールを優先で検索されます.<br>
\r
22 * ファイルエンコーディングを引数csで指定する.<br>
\r
28 * @return ファイルの内容(テキスト)
\r
30 public String getText(String name, Charset cs) {
\r
31 return getText(name, cs, Locale.getDefault());
\r
35 * リソース名と文字コードを指定して、ロケールに対応する文字列を取得する.<br>
\r
36 * リソースがなければ実行時例外が発生する.
\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
50 throw new RuntimeException("resource not found: " + resourceNames);
\r
56 * リソース名とロケールを指定して読み込む実リソース名のグループを作成して返す.
\r
62 * @return リソース名グループ(優先順)
\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
69 String language = locale.getLanguage();
\r
70 String country = locale.getCountry();
\r
71 String variant = locale.getVariant();
\r
73 int extpos = name.lastIndexOf(".");
\r
74 int folderpos = name.lastIndexOf("/");
\r
78 if (folderpos > extpos) {
\r
82 basename = name.substring(0, extpos);
\r
83 ext = name.substring(extpos);
\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
91 return new ResourceNames(resourceNamesStr);
\r
95 * リソース名グループを指定して、リソースをテキストとして取得する.<br>
\r
96 * リソース名グループの優先順にリソースの取得を試みて最初に成功したものを返す.<br>
\r
97 * ひとつも成功しなければnullが返される.<br>
\r
99 * @param resourceNames
\r
103 * @return リソースのテキスト
\r
105 protected String loadText(ResourceNames resourceNames, Charset cs) {
\r
106 if (resourceNames == null || cs == null) {
\r
107 throw new IllegalArgumentException();
\r
110 for (String resourceName : resourceNames) {
\r
111 URL url = getResource(resourceName);
\r
113 // リソースがなければ次の候補へスキップする.
\r
116 StringBuilder buf = new StringBuilder();
\r
118 InputStream is = url.openStream();
\r
120 BufferedReader rd = new BufferedReader(
\r
121 new InputStreamReader(is, cs));
\r
124 while ((ch = rd.read()) != -1) {
\r
125 buf.append((char) ch);
\r
133 } catch (IOException ex) {
\r
134 throw new RuntimeException("resource loading error: " + ex, ex);
\r
136 // 1つでも成功すれば、それで終了する.
\r
137 return buf.toString();
\r
144 * リソース名からリソースを取得する.<br>
\r
145 * 存在しなければnullを返す.<br>
\r
147 * @param resourceName
\r
149 * @return リソース、またはnull
\r
151 protected abstract URL getResource(String resourceName);
\r