Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Локализация, из бина 
V
    Опции темы
Zamuta
Дата 17.3.2007, 04:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



Всем здрасьте...

Как доставать  ресурсы из bundle.key я уже понял, а если нужно в java коде указать какое значение выводить, то как это записать?

Например String text="#{var.key}" не проходит......


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
tux
Дата 17.3.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(Zamuta @  17.3.2007,  04:01 Найти цитируемый пост)
Как доставать  ресурсы из bundle.key я уже понял, а если нужно в java коде указать какое значение выводить, то как это записать?

Тогда придется дергать значения из properties-файла самому:
Код

Properties props = new Properties();
InputStream is = new FileInputStream("путь_к_твоему_файлу");
props.load(is);
String value = props.getProperty("var.key");

Или примерно также из ресурса используя
Код

InputStream is = this.getClass().getResourceAsStream();

Веб-фреймворки могу располагать своими средствами для чтения пропертей, в любом случае они делают это точно также.
PM MAIL Skype GTalk Jabber YIM   Вверх
Maksym
  Дата 17.3.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Цитата(tux @  17.3.2007,  11:47 Найти цитируемый пост)
Веб-фреймворки могу располагать своими средствами для чтения пропертей, в любом случае они делают это точно также. 

Например, для jsf это можно сделать с помощью такого утилитного метода:
Код

public static String getResourceString(String key) {
    FacesContext context = FacesContext.getCurrentInstance();
    java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle(
         context.getApplication().getMessageBundle(), 
         context.getViewRoot().getLocale()
    );
    String result = "";
    try {
        result = bundle.getString(key);
    } catch (MissingResourceException exc) {
        // MissingResourceException logging
    }
    return result;
}


PM MAIL   Вверх
Zamuta
Дата 17.3.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



А вообще, если сервер получает от браузера, например локаль "ru", то страница автоматически переключиться на эту локаль? Я имею в виду у java существуют такие встроенные механизмы или их нужно писать самому, например определение по сообщению о локали от браузера или по ip адресу....


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
y3u
Дата 17.3.2007, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 7
Всего: 13



есть специальные документированые способы именования файлов *.properties, чтобы доставать по локали автоматически нужный бандл. А саму локаль можно всегда достать из реквеста, если надо. Если надо каким либо еще способом ее сетапить, незавсимо от браузера, скажем, по выбору пользователя в его профайле, можно использовать ThreadLocal... Вообще, имеет смысл полчитать в инете на тему локализации приложений статейки, их сейчас много развелось. В официальном тьюториле тоже на эту тему пишут

Это сообщение отредактировал(а) y3u - 17.3.2007, 21:56


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
Zamuta
Дата 19.3.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



Хочется небольшого уточнения. В чём разница между context.getViewRoot().getLocale()  и request.getLocale() ?


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
y3u
Дата 20.3.2007, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 7
Всего: 13



Цитата(Zamuta @  19.3.2007,  19:18 Найти цитируемый пост)
request.getLocale() 

достается системная локаль из браузера. Это которая, к примеру, в винде ставится на панели управления в региональных настройках. Ну или которая в браузере настроена, к примеру в мозиле можно руками локальнастроить...

Цитата(Zamuta @  19.3.2007,  19:18 Найти цитируемый пост)
context.getViewRoot().getLocale()  

лично я не в курсе, посмотри джавадоки


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
Zamuta
Дата 20.3.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



Во всех примерах которые я нахожу в интернете и в литературе с request и response работают только внутри метода с параметрами RequestServlet request, ServletResponse response, например так:

Код

public void servise(RequestServlet request, ServletResponse response){
Locale locale = request.getLocale();
}


Теперь небольшое отступление. Локализация. Также в литературе или интернете можно найти примерно вот такой пример работы с локалями (часть кода):
Код

  public static String getDisplayString(String bundleName, String id, Object params[], Locale locale) {
        String text = null;
        ResourceBundle bundle = ResourceBundle.getBundle(bundleName, locale, getCurrentClassLoader(params));
        try {
            text = bundle.getString(id);
        } catch (MissingResourceException e) {
            text = "!! key " + id + " not found !!";
        }
        if (params != null) {
            MessageFormat mf = new MessageFormat(text, locale);
            text = mf.format(params, new StringBuffer(), null).toString();
        }
        return text;
    }


А затем вызываем этот метод и получаем нужный текст. И у меня вопрос, почему нельзя сделать просто так:
Код

RequestServlet request;
String text = getDisplayString(bundleName, "text", null, request.getLocale());   <-NullPointerException




--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
y3u
Дата 20.3.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 7
Всего: 13



 где именно падает эксцепшен-то? Если getCurrentClassLoader(params), ты туда null передаешь, то приводи код метода, но, судя по твоему коду, он падает по request.getLocale(), т.к. ты написал 
Цитата(Zamuta @  20.3.2007,  15:34 Найти цитируемый пост)
RequestServlet request;
String text = getDisplayString(bundleName, "text", null, request.getLocale());

Реквест и респонз в сервлет передает вебконтейнер, а ты тут объявляешь переменную, но не инициализируешь ее никак, поэтому она у тебя null, а если у null дергать какие-либо методы, то будет падать NullPointerException...


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
Zamuta
Дата 20.3.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



Падает на request.getLocale(). С сервлетами никогда не работал, поэтому и спотыкаюсь. Как можно в моём случае просто получить локаль request.getLocale(). 


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
y3u
Дата 20.3.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 7
Всего: 13



без кода сказать сложно, я не экстрасенс  smile 

ну, во-первых, посмотри, может в твоем классике, если ты наследуешься от чего-нить, присутствует соответствующий метод getRequest() или getServletRequest() или getHttpServletRequest() - что-то в этом роде.
Во-вторых, есил не найдешь, либо приведи, таки полный код, либо псмотри во всякого рода контекстах и пр., если используются, может из них как-то можно подцепить реквест... Обычно все дело заканчивается сервлетом и каким нибудь методом doGet(...) или doPost(...), где и реквест и респоз папрметрами приходят


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
Zamuta
Дата 20.3.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



В том то и дело что я работаю с jsf и как такового сервлетного кода в моих классах нет. А сейчас встал вопрос локализации. Чтобы отобразить страницу на текущем языке юзера нужно получить его локаль. 

Привожу пример кода класса отвечающего работу с локалями:
класслоадер:
Код

 protected static ClassLoader getCurrentClassLoader(Object defaultObject) {
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        if (loader == null) {
            loader = defaultObject.getClass().getClassLoader();
        }
        return loader;
    }


Получатель строки из bundl'a:
Код

 public static String getDisplayString(String bundleName, String id, Object params[], Locale locale) {
        String text = null;
        ResourceBundle bundle = ResourceBundle.getBundle(bundleName, locale, getCurrentClassLoader(params));
        try {
            text = bundle.getString(id);
        } catch (MissingResourceException e) {
            text = "!! key " + id + " not found !!";
        }
        if (params != null) {
            MessageFormat mf = new MessageFormat(text, locale);
            text = mf.format(params, new StringBuffer(), null).toString();
        }
        return text;
    }


Ещё раз повторюсь, реквестов у меня в коде нет, а как с ними работать пока не понял. Пробую так, не бейте сильно   smile :
Код

public class Getlocale {
    
    /** Creates a new instance of Getlocale */
    public Getlocale() {
    }
    FilterConfig config = null;
    ServletContext servletContext = null;
    public static Locale locale;
    
    public void init(FilterConfig filterConfig) throws ServletException {
        config = filterConfig;
        servletContext = config.getServletContext();
    }
    
    public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
               
        HttpServletRequest httpRequest = (HttpServletRequest)request;
        HttpServletResponse httpResponse = (HttpServletResponse)response;
            
        locale = request.getLocale();
    }
    
    public void destroy() {
    }
}


А потом из этого класса тяну Getlocale.locale, возвращает null....


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
Maksym
Дата 20.3.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Цитата(Zamuta @  19.3.2007,  19:18 Найти цитируемый пост)
Хочется небольшого уточнения. В чём разница между context.getViewRoot().getLocale()  и request.getLocale() ? 

Это я привел пример для jsf. Taм есть context.getViewRoot().getLocale(). Oтсюда ее берет и jsf resourceBudle механизм.

Это сообщение отредактировал(а) Maksym - 20.3.2007, 17:40
PM MAIL   Вверх
Zamuta
Дата 20.3.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 18.1.2006

Репутация: 4
Всего: 6



Maksym, но из context.getViewRoot().getLocale() мы же не сможем получить локаль установленную в браузере юзера?


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
Maksym
  Дата 20.3.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Zamuta
Думаю что сможем. Вот, что говорит документация:
Цитата

javax.faces.component
Class UIViewRoot
public java.util.Locale getLocale()

    Return the Locale to be used in localizing the response being created for this view.

    Algorithm:

    If we have a locale ivar, return it. If we have a value binding for "locale", get its value. If the value is null, return the result of calling ViewHandler.calculateLocale(javax.faces.context.FacesContext). If the value is an instance of java.util.Locale return it. If the value is a String, convert it to a java.util.Locale and return it. If there is no value binding for "locale", return the result of calling ViewHandler.calculateLocale(javax.faces.context.FacesContext).

    Returns:
        The current Locale obtained by executing the above algorithm.

Цитата

javax.faces.application
Class ViewHandler

public abstract java.util.Locale calculateLocale(javax.faces.context.FacesContext context)

    Returns an appropriate Locale to use for this and subsequent requests for the current client.

    Parameters:
        context - FacesContext for the current request 
    Throws:
        java.lang.NullPointerException - if context is null

то есть исходная локаль во UIViewRoot устанавливается исходя из request'а пользователя (что логично). В дальнейшем она может быть переключена програмно (по кнопочке сменить язык интерфейса, например)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0993 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.