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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> много-язычные программы, интересно, кто-как делает.... 
:(
    Опции темы
firedrago
Дата 7.11.2005, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 2
Всего: 3



Всем привет,
собственно вопрос - кто как реализует мулти-язычность в своих программах.
я то одно решение сделал, но если там добавить еще один язык - можно замучаться....
зарание благодарен за идеи!

мда у меня сделано так:
Код

public interface IDictionary {

    public static final int LANGUAGE_DE = 0;
    public static final int LANGUAGE_RU = 1;
    
    public static final int ADDRESS = 0;
    public static final int INVOICEADDRESS = 1;
    public static final int DELIVERYADDRESS = 2;
    public static final int OTHERS = 3;
    public static final int BANK_ACCOUNTS = 4;
    public static final int COMPANY =5;
    public static final int STREET = 6;
    public static final int ZIP = 7;
    public static final int CITY = 8;
    public static final int COUNTRY = 9;
    public static final int TEL = 10;
    public static final int FAX = 11;
        // и т.д.
}


Код

public class Dictionary implements IDictionary {

    public static String get(int word, int language) {
        String res[] = new String[] {"", ""};
        
        if(word == ADDRESS) { res = new String[]{"Adresse", "Адрес"}; }
        if(word == INVOICEADDRESS) { res = new String[]{"Rechnungsadresse", "Адрес для счета"}; }
        if(word == DELIVERYADDRESS) { res = new String[]{"Lieferadresse", "Адрес поставки"}; }
        if(word == OTHERS) { res = new String[]{"Sonstiges", "Другое"}; }
        if(word == BANK_ACCOUNTS) { res = new String[]{"Bankverbindungen", "Банковские счета"}; }
        if(word == COMPANY) { res = new String[]{"Firma", "Фирма"}; }
        if(word == STREET) { res = new String[]{"Strasse", "Улица"}; }
        if(word == ZIP) { res = new String[]{"PLZ", "Индекс"}; }
        if(word == CITY) { res = new String[]{"Ort", "Город"}; }
        if(word == COUNTRY) { res = new String[]{"Land", "Страна"}; }
        if(word == TEL) { res = new String[]{"Tel", "Тел"}; }
        if(word == FAX) { res = new String[]{"Fax", "Факс"}; }
                // и т.д.
                return res[language];
    }    
}


Код

       int lang = // по надобности Dictionary.LANGUAGE_DE или Dictionary.LANGUAGE_RU
       Dictionary.get(Dictionary.CITY, lang);


Это сообщение отредактировал(а) firedrago - 7.11.2005, 20:32
PM MAIL   Вверх
sergejzr
Дата 7.11.2005, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



  • в файлах language_язык.lng хранить данные по типу:

    english_word1 _tabulator_ слово1_на_другом_языке
    english_word2 _tabulator_ слово2_на_другом_языке
  • В проге используем Hashtable Это самое удобное.
  • В функции переключения языка зачитываем файл и складываем в Hashtable слова

    Hashtable.put(english_word1,слово1_на_другом_языке);
  • По всей проге достаём:
    Hashtable.get(english_word1);

изменять легко. Скопировал файл language_eng.lng, переименовал в language_rus.lng и меняй выражения на русские. В самой программе тоже всё наглядно Hashtable.get("hello"); возвратит слово "hello" на предварительно выбранном языке.

Хотя удобнее - таблица в базе вместо файла, но не во всех приложениях хочется БД за собой таскать..smile








--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
firedrago
Дата 7.11.2005, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 2
Всего: 3



а хранение всего словаря в памяти - это вроде не самое умное решение... или?
у меня раньше были попытки хранения всей информации в базе, потом в xml.... потом я все на static переделал.....

Это сообщение отредактировал(а) firedrago - 7.11.2005, 20:59
PM MAIL   Вверх
sergejzr
Дата 7.11.2005, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



В твоём коде будет выглядеть без подгрузки файла примерно так:
Код

public interface IDictionary {

    public static final int LANGUAGE_DE = 0;
    public static final int LANGUAGE_RU = 1;

        // и т.д.
}


Код

public class Dictionary implements IDictionary {
private static Hashtable dic_de=new Hashtable();
private static Hashtable dic_rus=new Hashtable();
private static Hashtable dic_cur;
public static switchLanguage(int language)
{
  switch(language)
  {
    case LANGUAGE_DE: dic_cur=dic_de; break;
    case LANGUAGE_RU: dic_cur=dic_ru; break;
  }
}
public static init()
{
dic_ru.put("Adresse", "Адрес");
dic_de.put("Adresse", "Adresse");

dic_ru.put("city", "Город");
dic_de.put("city", "Stadt");

//и так далее
}
    public static String get(String word, int language)
    {
                  switch(language)
                {
                  case LANGUAGE_DE: return dic_de.get(word); 
                  case LANGUAGE_RU: return dic_ru.get(word);
                 }
    }  

    public static String get(String word)
    {
              return dic_cur.get(word); 
    }     
}


Код

       int lang = // по надобности Dictionary.LANGUAGE_DE или Dictionary.LANGUAGE_RU
       Dictionary.init();
       Dictionary.get("city", lang);
       //или 
       Dictionary.switchLanguage(lang);
       Dictionary.get("city");
    
       

Добавлено @ 20:49
Цитата
а хранение всего словоря в памяти - это вроде не самое умное решение... или?

Это нормальное решение. Весь словарь русского языка займёт в памяти мегов 5, а в твоей программе величина будет настолько ничтожнойб что ей можно просто пренебреч. Да и потом тебе так и так в памяти все слова минимум один раз надо ведь хранить smile
База будет тормозить, если будешь туда за каждым словом лазить.

Короче ИМХО оптимальное решение я предложил уже smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
firedrago
Дата 7.11.2005, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 2
Всего: 3



понял, пасиб! smile
PM MAIL   Вверх
Stampede
Дата 7.11.2005, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Цитата(firedrago @ 7.11.2005, 20:40)
а хранение всего словаря в памяти - это вроде не самое умное решение... или?


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

sergej.z тебе все правильно рассказал. Единственная вещь, которую я хотел добавить (почему-то об этом всегда забывают сказать), это вот что:

Правильнее использовать параметризованные шаблоны сообщений, потому что в большинстве случаев именно это и требуется. Например, есть такой фрагмент пользовательского диалога:

"You have 15 item(s) in the Projects folder you are about to remove. Would you like to keep a copy of them in the Removed folder?"

Поскольку мы не знаем наперед, сколько записей и в какой папке там лежит у нашего юзера, то для удобства локализации хорошо бы эти вещи хранить как переменные:

"В папке $2, которую вы собираетесь удалить, находится $1 записей. Хотите сохранить их копию в папке Удаленные?"

Как именовать переменные, как искейпить комбинации символов и пр. - это уже все не усмотрение разработчиков.

Успехов! smile



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
firedrago
Дата 7.11.2005, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 2
Всего: 3



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

smile а я и не говорю, что я умный smile иначе не спрашивал бы....

за мысль с шаблонами - спасибо!
PM MAIL   Вверх
LSD
Дата 7.11.2005, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



И мои 5 копеек smile
Для этих целей предназачен ResourceBundle, например пишем ResourceBundle resourceBundle = ResourceBundle.getBundle("ru.vingrad.util.Hunter") получаем ResourceBundle для текущей системной локали (можно и для произвольной). Повторные вызовы будут возвращать тот же самый ResourceBundle, так что лишняя память использоваться не будет. Получить значени тоже просто: resourceBundle.getString(<key>). ResourceBundle позиционируется Sun-ом как средсво хранения языковых ресурсов и они сами используют его для локализации своих компонент. Локализации можно легко добавлять после разработки приложения, поддержка осуществляется на уровне JDK.
В своих приложенияя я использую ResourceBundle и вам советую smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
sergejzr
Дата 8.11.2005, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



LSD хорошая штука smile Спасибо, не знал, а ведь следовало бы smile
Проблема только с его заполнением, как я понимаю, тут необходимо спецприложение?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
firedrago
Дата 8.11.2005, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 2
Всего: 3



@LSD
это явно то что я хотел услышать..... только как-то оно сильно просто, что аж ничего не понятно.... smile пошел разбираться....
PM MAIL   Вверх
LSD
Дата 8.11.2005, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(sergej @ 8.11.2005, 00:01)
Проблема только с его заполнением, как я понимаю, тут необходимо спецприложение?

Не совсем. ResourceBundle может быть в виде класса (наследуется от ListResourceBundle), там главное заполнить массив ключ-значение. Или в виде файла properties, эти файлы долны быть в кодировке ISO 8859-1, поэтому все национальные символы надо писать в виде escape-последовательностей (\u0000), но в составе JDK есть утилита native2ascii которая может делать подобные преобразования.



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
firedrago
Дата 8.11.2005, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 2
Всего: 3



красота этот ResourceBundle, да еще и в eclipse есть такая удобная штука для него.... smile

а вот еще plugin для eclipse и jbuildera Properties Editor как-раз что б native2ascii не мучать......

эх красота.... вот, что значит знание.....
Еще раз всем спасибо!

Это сообщение отредактировал(а) firedrago - 8.11.2005, 02:42
PM MAIL   Вверх
firedrago
Дата 8.11.2005, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 2
Всего: 3



@LSD,
а как из практики лучше делать один properties файл на class, package или всю программу? smile
PM MAIL   Вверх
LSD
Дата 8.11.2005, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Загрузка каждого ResourceBundle требует времени и дополнительную память на служебные данные. Так что хранить одну строку в одном ResourceBundle неразумно.
Но и использование одного ResourceBundle на всю программу тоже может иметь негативняе последствия, так если приложение модульное и часть модулей в данный момент не используется, то их ресурсы все равно будут подгружаться, лишняя трата времени и памяти.
По возможности надо стараться объединять ресурсы, но не в ущерб модульности. Например один ResourceBundle, на один модуль. Если приложение простенькое то можно обойтись и одним ResourceBundle.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
firedrago
Дата 8.11.2005, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 2
Всего: 3



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

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

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


 




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


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

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