Как локализовать аннотации @Messages в NetBeans

Я хотел бы использовать аннотацию @Messages в NetBeans, чтобы упростить локализацию в моем приложении. Однако я не могу найти никакой информации о том, как добавить переводы (связки) для других языков с помощью этого механизма.

Пример действия с использованием @Messages выглядит следующим образом.

@ActionID(category = "category",
id = "AddAction")
@ActionRegistration(iconBase = "actions/action-icon.png",
displayName = "#CTL_AddAction")
@ActionReferences({
    @ActionReference(path = "Menu/Shapes", position = 160),
    @ActionReference(path = "Toolbars/Shapes", position = 5133)
})
@Messages("CTL_AddAction=Add Action")

Как сделать так, чтобы действие «Добавить» менялось в зависимости от языка?


person Rico Leuthold    schedule 25.06.2012    source источник


Ответы (1)


http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/NbBundle.Messages.html

Аннотация @Messages создаст класс Bundle.java и файл Bundle.properties. Класс Bundle.java будет включать функции для локализации, а файл Bundle.properties содержит пары ключ-значение, определяющие точные строки для корневой локали.

Для правильной локализации вам следует изучить файл Bundle.properties, а затем создать файл Bundle_fr.properties (для французского) или файл Bundle_whatever.properties, где «независимо» — это локаль, которую вы хотите добавить.

Затем, когда языковой стандарт установлен для вашего приложения, класс Bundle.java должен использовать правильный файл Bundle_xx.properties для локализации вызовов функций класса Bundle.java.

package com.testmodule;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
import org.openide.awt.ActionRegistration;
import org.openide.util.NbBundle.Messages;

@ActionID(category = "category",
id = "com.testmodule.AddAction")
@ActionRegistration(iconBase = "com/testmodule/action-icon.png",
displayName = "#CTL_AddAction")
@ActionReferences({
    @ActionReference(path = "Menu/Shapes", position = 160),
    @ActionReference(path = "Toolbars/Shapes", position = 5133)
})
@Messages({
    "CTL_AddAction=Add Action"
})
public final class AddAction implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        Locale.setDefault(Locale.FRENCH);
        System.out.println("I am action "+Bundle.CTL_AddAction());
    }
}

Мои бандлы выглядят так:

Bundle.properties
    OpenIDE-Module-Name=testmodule
Bundle_fr.properties
    OpenIDE-Module-Name=french testmodule
    CTL_AddAction=Ajouter une action
person naugler    schedule 11.07.2012
comment
Bundle.properties существует. Он также содержит другие тексты i18n. Я добавил локализованный файл свойств, однако выбранный текст является языком по умолчанию, хотя другие тексты, использующие NbBundle, получают правильный текст локали. Может быть, у вас есть рабочий пример, с которым я мог бы сравнить? - person Nasir; 11.07.2012
comment
Просто удостоверяюсь... Используете ли вы средства доступа Bundle.java для получения локализованной строки? Это должно выглядеть как Bundle.CTL_AddAction(). Я буду работать над примером... - person naugler; 11.07.2012
comment
Код, который я хочу заменить, это @Messages({CTL_AddAction=Добавить действие}). Я ожидаю, что действие «Добавить» будет автоматически заменено версией локали, но это не так. Так что либо я не понимаю магии, либо я не делаю это должным образом. У меня есть локализованный текст в Bundle_fr.properties, но он не подхватывается. Я не знаю, как еще указать сообщение с помощью аннотаций. Возможно, есть что-то очевидное, что я упускаю... - person Nasir; 11.07.2012
comment
Я добавил содержимое своих файлов Bundle.properties, а также строку для установки локали по умолчанию при выполнении действия. То, что вы видите в моем ответе на данный момент, работает на меня. Сначала мое действие отображается как «Добавить действие» (локаль по умолчанию = en, которая указывает на набор свойств по умолчанию), а затем, когда я выполняю действие, локаль изменяется, а также журнал и текст отображения действия. - person naugler; 11.07.2012
comment
Благодарю. Я думаю, что ошибка, которую я совершал, заключалась в том, что у меня были действия, определенные в подпакете, и я ожидал, что он будет искать файл Bundle.properties базовой копии. Итак, я создал новый Bundle.properties в пакете, добавил свойство OpenIDE-Module-Name, пересобрал, и он работает. Огромное спасибо :) - person Nasir; 12.07.2012
comment
Я понимаю. На самом деле я имею дело с аналогичной проблемой с моей организацией Bundle: stackoverflow.com/q/11416375/779982 - person naugler; 13.07.2012