Ресурсы локализации
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.01.05 15:56
Оценка:
Еще один чайниковый вопрос.
Насколько я понимаю стандартный способ локализации в жабе такой:
1) Создаем .properties файл. Причем для разных языков к его имени добавляем имя локали.
2) Зовем ResourceBundle.getBundle("package + имя ресурсных файлов");
3) С полученным экземпляром ResourceBundle работаем
Все хорошо, но эти чертовы .properties могут содержать только ASCII-символы. Для всех остальных следует воспользоваться утилиткой native2ascii. Что, честно говоря, ну совершенно не радует, поскольку и гемороя много, и читаемость полученного ниже плинтуса.
Но! Вроде бы как класс Properties умеет себя грузить еще и из xml, и там никаких проблем с кодировкой нет.
А теперь вопрос — можно ли как то грузить этот самый ResourceBundle из xml?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
AVK Blog
Re: Ресурсы локализации
От: Blazkowicz Россия  
Дата: 24.01.05 16:14
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Но! Вроде бы как класс Properties умеет себя грузить еще и из xml, и там никаких проблем с кодировкой нет.

AVK>А теперь вопрос — можно ли как то грузить этот самый ResourceBundle из xml?

В общем нормального способа нет, но извратиться можно:

http://forum.java.sun.com/thread.jspa?threadID=532471&amp;messageID=2567608

(Собстно первая ссылка Google + ResourceBundle + XML)

Если Java 5, то можно выкинуть парсинг XML и заменить штатными средствами.
Re: Ресурсы локализации
От: aefimov Россия
Дата: 24.01.05 16:19
Оценка: 4 (2) +1
Здравствуйте, AndrewVK, Вы писали:

AVK>Все хорошо, но эти чертовы .properties могут содержать только ASCII-символы. Для всех остальных следует воспользоваться утилиткой native2ascii. Что, честно говоря, ну совершенно не радует, поскольку и гемороя много, и читаемость полученного ниже плинтуса.


1. Если собираться АНТом то проблем никаких нет.
2. Читать полученное не нужно Т.к. редактируеш ты file_ru.cp1251.properties, например, и там все читаемо. А ANT тебе сделает из этого file_ru.properties и упакует в jarник. Это читать уже не нужно наверное.
3. Есть специальные редакторы которые кажуть читаемо а сохраняют не читаемо

Вот
Re[2]: Ресурсы локализации
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.01.05 16:26
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>В общем нормального способа нет, но извратиться можно:


Я так и знал.

B>Если Java 5, то можно выкинуть парсинг XML и заменить штатными средствами.


Можно. Тогда вопрос — стандартная механика определения имени файла по локали при этом работать будет?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
AVK Blog
Re[3]: Ресурсы локализации
От: Blazkowicz Россия  
Дата: 24.01.05 16:31
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Можно. Тогда вопрос — стандартная механика определения имени файла по локали при этом работать будет?


Да, конечно. Что делает этот класс: читает XML, загоняет в Properties, потом сохраняет Properties в обычный формат, и подсовывает этот формат созданному ResourceBundle.
Re[4]: Ресурсы локализации
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.01.05 17:01
Оценка:
Здравствуйте, 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*/
}
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
AVK Blog
Re: Ресурсы локализации
От: alkor  
Дата: 26.01.05 08:41
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Насколько я понимаю стандартный способ локализации в жабе такой:

AVK>1) Создаем .properties файл. Причем для разных языков к его имени добавляем имя локали.
...
AVK>Все хорошо, но эти чертовы .properties могут содержать только ASCII-символы. Для всех остальных следует воспользоваться утилиткой native2ascii. Что, честно говоря, ну совершенно не радует, поскольку и гемороя много, и читаемость полученного ниже плинтуса.

Используй properties файлы например в win-1251, а при билде приложения конверти их (например с помощью native2ascii таски из ant)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.