Изменить стиль страницы

1 import javax.microedition.midlet.MIDlet;

2

3 import javax.microedition.Icdui.Display;

4 import javax.microedition.Icdui.Displayable;

5 import javax.microedition.Icdui.Form;

6

7 import java.io.DatalnputStream;

8 import Java.io.InputStream;

9 import Java.io.InputStreamReader;

10 import Java. io. EOFException;

11 import Java.io.lOException;

12 import Java.io.Reader;

13 import Java.io.UTFDataFormatException;

14 import Java.io.UnsupportedEncodingException;

15

16 import Java.util.Hashtable;

17

18 /**

19 Вторая версия приложения HSNDemo.

20

21 <р>Эта версия'также дехонстрирует простой способ определения

22 локализованных ресурсов. Она считывает файл, который является

23 частью файла JAR приложения (не файла JAD)

24 для загрузки локализованных ресурсов. Файл

25 состоит из набора пар «ключ-значение», одной на строку,

26 которые представляют локализованные строки.

27 MID-лет должен затем проанализировать содержимое файла

28 и создать внутреннюю хэшированную таблицу для поиска.

29

30 <р>Этот подход требует слишком много усилий по обработке

31 потока, который содержит файл

32 локализованных ресурсов. Более того, этот подход

33 не отвечает за локализацию ресурсов, которые

34 не являются строками.

35 */

36 public class I18NDemo2 extends MIDlet

37 {

38 // Файл, который содержит ресурсы для

39 // активной локальной настройки.

40 private String resourceFile;

41

42 // Региональная настройка, указанная для выполнения данного

43 // MID-лета.

44 private String locale;

45

46 // Символьная кодировка, установленная по умолчанию,

47 // используемая данной платформой.

48 private String encoding;

49

50 // HashTable, которая содержит локализованные

51 // ресурсы.

52 private Hashtable resources = new Hashtable ();

53

54 // Displayable. Этот компонент отображается

55 // на экране.

56 private HelloForm2 form;

57

58 // Экземпляр Display. Данный объект управляет всеми

59 // компонентами Displayable данного MID-лета.

60 private Display display;

61

62 // Экземпляр данного MID-лета.

63 private static I18NDemo2 instance;

64

65 /**

66 Конструктор No-arg.

67 */

68 public I18NDemo2()

69 {

70 super();

71 instance = this;

72 }

73

74 /*"

75 Получает экземпляр данного класса, который существует

76 в действующем приложении.

77

78 @выдает экземпляр, созданный при запуске

79 приложения…

80 */

81 public static I18NDemo2 getlnstance ()

82 {

83 return instance;

84 {

85

86 /**

87 Запускает MID-лет. Получает текущее название

88 региональной настройки. Использует его для создания

89 имени файла, который содержит локализованные

90 ресурсы региональной настройки. Файл ресурса

91 находится в файле JAR приложения.

92 */

93 public void startApp()

94 {

95 // Извлекает региональную настройку из программного

96 // обеспечения AMS. Региональная настройка должна быть

97 // установлена до выполнения данного MID-лета.

98 locale =

99 System.getProperty("microedition.locale");

100

101 // Названия файлов локализованных ресурсов, соответствующих

102 // форме: <язык>_<страна>.txt.

103 // Создает строку имени файла и передает ее в

104 // метод, который открывает файл и извлекает

105 // содержимое.

106 resourceFile = locale +".txt";

107 int status = loadResources(resourceFile);

108

109 if (status < 0)

110 {

111 quit();

112 return;

113 }

114

115 // Создаем элемент Displayable. Получаем

116 // локализованную String, которая представляет

117 // заголовок Form.

118 String formTitle = getResource ("title");

119 form = new HelloForm2(formTitle);

120

121 // Это приложение просто отображает одну.

122 // форму, созданную выше.

123 display = Display.getDisplay (this);

124 display.setCurrent(form);

125 }

126

127 /**

128 Загружает определенные пользователем ресурсы приложения

129 из указанного файла. Файл является частью файла JAR

130 приложения, расположенного на реальном устройстве.

131 J2MEWTK хранит файл в файле JAR приложения, расположенном

132 в директории приложения bin/.

133

134 @param file — имя определенного пользователем файла

135 ресурса приложения.

136 */

137 private int loadResources(String file)

138 {

139. Class с = getClass ();

140

141 if (file == null)

142 {

143 return -1;

144 }

145 InputStream is = null;

146 is = с. getResourceAsStream(file);

147 if (is == null)

148 {

149 return -1;

150 }

151 Reader reader = new InputStreamReader(is);

152 processStream(reader);

153 return 0;

154 }

155

156 /**

157

158 */

159 private void processStream(Reader stream)

160 {

161 if (stream == null)

162 {

163 return;

164 }

165 StringBuffer key = new StringBuffer();;

166 StringBuffer value = new StringBuffer ();;

167 while (true)

168 {

169 // Считываем строку. Предполагается, что каждая строка

170 // содержит ключ и значение,

171 // отделенные двоеточием. Если -1, значит

172 // мы достигли конца файла.

173 key.deletef(), key.length());

174 value.delete(0, value.length());

175 int status = readLine(key, value, stream);

176 if (status == -1)

177 {

178 break;

179 }

180

181 // Вставляем этот ресурс в хэшированную таблицу

182 // ресурсов приложения.

183 resources.put(key, value);

184 }

185 }

186

187 /**

188 Считывает и обрабатывает следующую не пустую строку

189 из потока. Формат строки ожидается следующий

190 <ключ>[\t]*:[и]*<значение>, где

191 <ключ> and <значение> являются метками, состоящими

192 из буквенных символов или знаков пунктуации, но не

193 из пустых знаков пробела.

194 */

195 private int readLine(StringBuffer key,

196 StringBuffer value,

197 Reader stream)

198 {

199 if (key == null || value == null ||

200 stream == null)

201 {

202 return -1;

203 }

204

205 try

206 {

207 char c;

208 while (true)

209 {

210 // Пропускаем символы новой строки.

211 while (true)

212 {

213 с = (char) stream.read ();

214 if (c == r\n')

215 {

216 continue;

217 }

218 break;

219 }

220

221 if (lisWhiteSpace(c) Si!isDelimeter(c))

222 {

223 key.append(c);

224 }

225

226 // Пропускаем впередиидущий пробел.

227 while (true)

228 {

229 с = (char) stream.read();

230 if (isWhiteSpace (c))

231 {

232 continue;

233 }

234 break;

235 }

236

237 if (lisWhiteSpace(c) S&!isDelimeter(c))

238 {

239 key.append (с);

240 }

241

242 // Считываем ключ.

243 while (true)

244 {

245 с = (char) stream.read();

246 if (isWhiteSpace(c) II isDeliraeter(c))

247 {

248 break;

249 }

250 else

251 {

252 key.append(c);

253 }

254 }

255

256 // Пропускаем пробел, идущий перед или

257 // после символа.

258 while (true)

259 {

260 с = (char) stream.read();

261 if (isWhiteSpace(c) II isDelimeter(c))

262 {

263 continue;

264 }

265 value.append(c);

266 break;

267 }

268

269 // Считываем остальную часть значения метки.

270 while (true)

271 {

272 с = (char) stream.read();

273 if (c == \n')

274 {

275 break;

276 }

277 else

278 {

279 value.append(c);

280 }

281 }

282 break;

283 }

284 }

285 catch (lOException ioe)

286 {

287 ioe.printStackTrace();

288 return -1;

289 }

290 return 0;

291 }

292

293 /**

294

295 */

296 private boolean isWhiteSpace(char c)

297 {

298 if (c == И с == \t')

299 {

300 return true;

301 }

302 else

303 {

304 return false;

305 }

306 }

307

308 /**

309

310 */

311 private boolean isDelimeter(char c)

312 {

313 if (c ==:)

314 {

315 return true;

316 }

317 return false;

318 }

319

320 /**