Поддержка нескольких языков

223
13 июня 2018, 19:30

Нужно создать объект(Возможно даже для каждого языка отдельный класс) который хранит в себе все сообщения. При нужде выводить пользователю сообщение в зависимости от его выбранного в настройках языка.

Мое приложение собирается поддерживать 3 языка: English Russian и Ukraine.

Решил их изобразить так.

public enum Language {
RUSSIAN(1), ENGLISH(2), UKRAINE(3);
private Integer id;
Language(Integer id) {
    this.id = id;
}
public static Language reLang(Integer id) {
    switch (id) {
        case 1:
            return RUSSIAN;
        case 2:
            return ENGLISH;
        case 3:
            return UKRAINE;
        default:
            return RUSSIAN;
    }
}
public Integer getId() {
    return id;
}
}

Выбранный язык пользователя я храню в виде числового идентификатора: Русский - 1 Английский - 2 Украинский - 3

Пример как я получаю язык пользователя.

User user = new User("UserName");
user.getLang(); // Получаю язык пользователя(enum). (Язык берется из базы данных Mysql).

Следующий этап который я прохожу это вывод сообщения пользователю. Здесь у меня возникли проблемы т.к раньше я никогда такого еще не делал (Да и реализация у меня не лучшего типа).

Я создал класс под

public class UtilChat {
    public static void message(Language lang, User user, Messages messages){
//Знаю можно было получать язык юзера здесь. а не в методе его вводить 
//отдельно
    }
}

Этим статистическим методом я собираюсь выводить пользователю сообщение на выбранном им языке. Тут у меня возник вопрос.

Каким наилучшим способом я могу хранить каждого языка сообщения?

Был вариант под каждый язык создать свой класс но до меня так и не дошло как правильно брать нужные сообщения из класс (с учетом языка).

Может есть где нибудь уже похожая реализация?

Answer 1

Как сделать поддержку нескольких языков?

Главное в разработке - это не изобретать велосипеды.

За поддержку языков в Java отвечает класс Locale.

Что такой Locale?

Еще про Locale

Подобный вопрос на ru.stackoverflow: Поддержка нескольких языков

Соответственно нужно в конфигах/properties описать поддерживаемые языки.

Где хранить тексты приложения на разных языках?

Для этого используются шаблоны. Например Apache Velocity.

То есть на каждый язык создается набор файлов-шаблонов. И в зависимости от выставленного в текущий момент времени Locale, подтягиваются шаблоны с нужным языком.

Зачем всё это нужно?

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

Answer 2
enum Lang {
    RUSSIAN(new String[]{
        "сообщение1",
        "сообщение2"
    }),
    ENGLISH(new String[]{
        "message1",
        "message2"
    });
    final String[] msg;
    private Lang(final String[] str) {
        this.msg = str;
    }
}

В каком-то главном классе, делаем свойство, которое будет меняться:

private static Lang type = Lang.RUSSIAN;

И метод, который будет возвращать сообщения:

public static String msg(final int key) {
    return type.msg[key];
}

Используем:

System.out.println(msg(0)); // сообщение1
READ ALSO
Правильно получить приходящее время

Правильно получить приходящее время

С сервера приходит ответ в котором указано время в путиСуть в том, что иногда приходит в таком виде 45 ( то есть понимается что 45 минут) А иногда...

220
Проверка данных без цикла

Проверка данных без цикла

Мне нужно обработать несколько тысяч объектов

236
JFrame ломается

JFrame ломается

Я java изучаю, поэтому если ошибка глупая, сильно не бейте

220
Java. Count в JDBC PostgreSQL

Java. Count в JDBC PostgreSQL

Подскажите, как получить количество строк в БД через ResultSet и запрос count?

200