Как реализовать функцию перевода в ZK с EL - PullRequest
1 голос
/ 29 марта 2020

В моем веб-приложении есть умный переводчик Java, поэтому я не могу использовать простой i18n на основе Label в ZK. Вместо этого должен быть вызван мой метод умного переводчика с двумя параметрами - ключом и языком, но текущий язык должен быть получен из некоторой области веб-приложения.

Было бы очень полезно иметь функцию EL

<textbox value="${x:translate('some.i18n.key')}"/>

, который вызывает мой метод интеллектуального переводчика с заданным параметром String и текущим языковым кодом из сеанса.

Что я мог сделать, это определить метод с 2 параметрами translate

 <?xel-method prefix="x" name="translate"
     class="mypackage.Translator"
     signature="java.lang.Class translate(java.lang.String,java.lang.String)"?>

и используйте его как

 <textbox value="${x:translate('qqq',sessionScope.get('LANGUAGE'))}"/>

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

 <textbox value="${x:translate('qqq',LANGUAGE)}"/>

или, возможно, выбрать вместо более короткой клавиши LANGUAGE, но меня интересует более компактная форма.

Можно ли определить такая функция, которая получает этот второй параметр неявно? Или как-то вызвать метод объекта в области видимости сеанса / рабочего стола / страницы из EL?

Ответы [ 3 ]

2 голосов
/ 30 марта 2020

Мы используем шаблон MVVM с ZK, и перевод был одной из областей, где ссылки zk попадают в ваши модели представления. Чтобы уменьшить его влияние, мы сделали:

Создали интерфейс переводчика:

public interface Translator {
    String translate(String key);

    // used where the string to be translation includes placeholders
    // total_qty=Total qty: {1}
    String translate(String key, String... params);
}

и реализацию переводчика:

public class ZKTranslator implements Translator {

    @Override
    public String translate(String s) {
        String translation = Labels.getLabel(s);
        if (translation == null)
            return s;
        return translation;
    }

    @Override
    public String translate(String key, String... params) {
        String translation = Labels.getLabel(key, params);
        if (translation == null)
            return key;
        return translation;
    }
}

Эта реализация может ссылаться на сеанс для получения язык или, может быть (и предпочтительнее), язык передается ZKTranslator при инициализации.

Затем он используется следующим образом. На ваш взгляд модель:

public class SomeScreenVM {
    private Translator translator;

    @Init
    public void init() {
        // get language from session possibly
        translator = new ZKTranslator(); // or new ZKTtanslator(language);
    }

    public String translate(String s) {
        return translator.translate(s);
    }
}

А в вашем файле zul:

<window viewModel="@id('vm')" @init('com.example.SomeScreenVM')>
    <label value="@load(vm.translate('hello'))"/>
</window>
0 голосов
/ 30 марта 2020

Я могу (пропустить) использовать поддержку карты EL для вызова нестатического c однопараметрического метода объекта.

Во-первых, мне нужен объект-транслятор, реализующий java.util.Map который может перевести строку в методе get():

    public class Translator implements Map<String, String> {

        private String language;

        public Translator(String language) {
            super();
            this.language = language;
        }

        @Override
        public String get(Object arg0) {
            return translate(arg0.toString(), language);
        }
        ...
    }

Тогда я могу поместить переводчик в область рабочего стола и использовать его в EL:

<zscript>
    desktopScope.put("tr",new mypackage.Translator(sessionScope.get("language")));
</zscript>

 <textbox value="${tr.some_key}"/>
 <textbox value="${tr['some.hierarchical.key']}"/>

Это действительно не совсем понятное решение, но делает работу с файлами ZUL довольно простой.

0 голосов
/ 30 марта 2020

Пользовательские теги - это решение, которое вам нужно. Он существует в ЗК: https://www.zkoss.org/wiki/ZUML_Reference/ZUML/Processing_Instructions/taglib/Custom_Taglib

...