Еще один чайниковый вопрос.
Насколько я понимаю стандартный способ локализации в жабе такой:
1) Создаем .properties файл. Причем для разных языков к его имени добавляем имя локали.
2) Зовем ResourceBundle.getBundle("package + имя ресурсных файлов");
3) С полученным экземпляром ResourceBundle работаем
Все хорошо, но эти чертовы .properties могут содержать только ASCII-символы. Для всех остальных следует воспользоваться утилиткой native2ascii. Что, честно говоря, ну совершенно не радует, поскольку и гемороя много, и читаемость полученного ниже плинтуса.
Но! Вроде бы как класс Properties умеет себя грузить еще и из xml, и там никаких проблем с кодировкой нет.
А теперь вопрос — можно ли как то грузить этот самый ResourceBundle из xml?
Здравствуйте, AndrewVK, Вы писали:
AVK>Но! Вроде бы как класс Properties умеет себя грузить еще и из xml, и там никаких проблем с кодировкой нет. AVK>А теперь вопрос — можно ли как то грузить этот самый ResourceBundle из xml?
В общем нормального способа нет, но извратиться можно:
Здравствуйте, AndrewVK, Вы писали:
AVK>Все хорошо, но эти чертовы .properties могут содержать только ASCII-символы. Для всех остальных следует воспользоваться утилиткой native2ascii. Что, честно говоря, ну совершенно не радует, поскольку и гемороя много, и читаемость полученного ниже плинтуса.
1. Если собираться АНТом то проблем никаких нет.
2. Читать полученное не нужно Т.к. редактируеш ты file_ru.cp1251.properties, например, и там все читаемо. А ANT тебе сделает из этого file_ru.properties и упакует в jarник. Это читать уже не нужно наверное.
3. Есть специальные редакторы которые кажуть читаемо а сохраняют не читаемо
Здравствуйте, AndrewVK, Вы писали:
AVK>Можно. Тогда вопрос — стандартная механика определения имени файла по локали при этом работать будет?
Да, конечно. Что делает этот класс: читает XML, загоняет в Properties, потом сохраняет Properties в обычный формат, и подсовывает этот формат созданному ResourceBundle.
Здравствуйте, Blazkowicz, Вы писали:
B>Да, конечно. Что делает этот класс: читает XML, загоняет в Properties, потом сохраняет Properties в обычный формат, и подсовывает этот формат созданному ResourceBundle.
Вобщем сделал, но как то это через задницу — парсить текстовик, потом опять в текстовик преобразовывать.
Если кому интересно вот правленый код под 5.0:
package com.parus.dss.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Properties;
public class XmlResourceBundleClassLoader extends ClassLoader {
protected static XmlResourceBundleClassLoader RESOURCEBUNDLECLASSLOADER = new XmlResourceBundleClassLoader();
private static final String PROPERTIES_SUFFIX = ".properties";
private static final int PROPERTIES_SUFFIX_LENGTH = PROPERTIES_SUFFIX.length();
private static final String XML_SUFFIX = ".xml";
protected XmlResourceBundleClassLoader() {
}
public static XmlResourceBundleClassLoader getInstance() {
return RESOURCEBUNDLECLASSLOADER;
}
public InputStream getResourceAsStream(String resource) {
InputStream is = null;
try {
is = super.getResourceAsStream(resource);
} catch (Exception e) {
}
if (is != null) {
return is;
}
try {
is = getXmlStream(resource);
return is;
} catch (Exception e) {
}
return null;
}
private InputStream getXmlStream(String resource) {
try {
Properties properties = new Properties();
InputStream is = this.getClass().getClassLoader().getResourceAsStream(fixResourceName(resource));
properties.loadFromXML(is);
is.close();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
properties.store(baos, null);
byte[] data = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(data);
return bais;
} catch (Exception e) {
Exception e2 = e;
}
return null;
}
private String fixResourceName(String resource) {
if (!resource.endsWith(PROPERTIES_SUFFIX)) {
return (resource + XML_SUFFIX);
} else {
int lengthWithoutSuffix = resource.length() - PROPERTIES_SUFFIX_LENGTH;
return (resource.substring(0, lengthWithoutSuffix) + XML_SUFFIX);
}
}
/*public static void main(String[] args) {
ResourceBundle rb = ResourceBundle.getBundle("LanguageResource",
new Locale("ru", "ru"), XmlResourceBundleClassLoader.getInstance());
String hhh = rb.getString("key1");
} // main*/
}
Здравствуйте, AndrewVK, Вы писали:
AVK>Насколько я понимаю стандартный способ локализации в жабе такой: AVK>1) Создаем .properties файл. Причем для разных языков к его имени добавляем имя локали.
... AVK>Все хорошо, но эти чертовы .properties могут содержать только ASCII-символы. Для всех остальных следует воспользоваться утилиткой native2ascii. Что, честно говоря, ну совершенно не радует, поскольку и гемороя много, и читаемость полученного ниже плинтуса.
Используй properties файлы например в win-1251, а при билде приложения конверти их (например с помощью native2ascii таски из ant)