Как реализовать многоязычный в приложениях Java/Swing?

Если вы программируете на Python, это подпружиненная функция со встроенной функцией all(), примененной к списку ваших переменных (я просто буду использовать здесь логические литералы):

>>> L = [True, True, True, False, True]
>>> all(L) # True, only if all elements of L are True.
False
>>> any(L) # True, if any elements of L are True.
True

Есть ли соответствующая функция на вашем языке (C #? Java?). Если так, то это, вероятно, самый чистый подход.

5
задан m_vitaly 23 May 2009 в 17:56
поделиться

3 ответа

Ну, вам пришлось использовать ResourceBundle s. Но если вы устанавливаете свойство текста компонента, используйте вместо текста, удобочитаемого человеком, текст для RB.getString () . Тогда, если Matisse регенерирует из формы, ключ пакета останется, и локализация будет работать. Пример:

Я буду использовать это изображение со страниц Matisse:
Illustration
(источник: myeclipseide.com ) .

там вы можете увидеть текст свойства . Есть значение «Моя новая метка». Вместо этого вы можете использовать rb.getString ("myNewLabel.my.message") , где rb - это ResourceBundle . Единственная проблема должна заключаться в том, что слишком умный редактор свойств идет против вас.

7
ответ дан 13 December 2019 в 22:15
поделиться

This is how I implemented the internationalization :

  • give a name to every component which has an internationalized text
  • at runtime, take the container(frame, dialog, applet) ,iterate all the components and build an i18n key for every component using its name and all parent names.
  • for every component type(JTextField, JLable, etc) define some keys for every internationalize field(text, label, hint, etc).
  • take this i18n key and query your ResourceBundle, take the results and populate the component fields.

It works with generated code or with manual created code.

Edit: Here it is :

public void buildIds() {
    buildId(true);
    int count = getComponentCount();
    if (count == 0) {
        return;
    }
    for (int i = 0; i < count; i++) {
        Component component = getComponent(i);
        if (component instanceof AbstractComponent) {
            ((AbstractComponent) component).buildIds();
        }
    }
}

protected void buildId(boolean fireChange) {
    String prevId = this.id;
    String computedId;
    if (getName() == null) {
        computedId = ClassUtilities.shortClassName(getClass()).toLowerCase() + "_" + Long.toHexString(ID_GENERATOR.getAndIncrement());
    } else {
        java.util.List<Component> parents = null;
        Component parent = getParent();
        if (parent != null) {
            StringBuilder buider = new StringBuilder(80);
            parents = new ArrayList<Component>();
            while (parent != null) {
                if (parent.getName() != null) {
                    parents.add(parent);
                }
                parent = parent.getParent();
            }
            Collections.reverse(parents);
            if (parents.size() > 0) {
                for (Component component : parents) {
                    if (buider.length() > 0) {
                        buider.append('.');
                    }
                    buider.append(component.getName());
                }
                buider.append('.');
            }
            buider.append(name);
            computedId = buider.toString().toLowerCase();
        } else {
            computedId = name;
        }
    }
    this.id = computedId;
    if (fireChange && prevId != null && !prevId.equals(computedId)) {
        componentIdChanged(this, prevId);
    }
}
3
ответ дан 13 December 2019 в 22:15
поделиться

Я не знаю другого пути, кроме ResourceBundle.

Почему вы продолжаете восстанавливать код? Я полагаю, что после того, как вы запустили страницу, все будет хорошо, но после этого в этом уже не будет необходимости. Похоже, генерация кода - ваша настоящая проблема. Это вам ничего не спасает.

Вы пытаетесь составлять страницы из нескольких компонентов? Я могу представить себе общий верхний колонтитул, нижний колонтитул и меню, которые не нужно было бы постоянно менять. Это может быть проблема дизайна.

Spring очень хорошо поддерживает I18N. Может быть, здесь это поможет.

0
ответ дан 13 December 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: