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

Чтобы локализовать приложение Movilizer (обеспечить многоязычную поддержку), я использую следующий метод для замены заполнителей экрана:

$global:setPlaceholders = function(key)
{
    fieldNames = getMasterdata($masterdata:"localisation", key);
    fieldNames = fieldNames["data"];

    for(entry : fieldNames)
    {
        setPlaceholder(concat("%", entry, "%"), fieldNames[entry]);
    }
};

<answer ... >
    <text>%KEY%</text>
</answer>
<onEnterAssignment>
    call($global:setPlaceholders)("process1.screen1");
</onEnterAssignment>

с локализованными MasterData

<MovilizerRequest ... >
  <masterdataPoolUpdate pool="localisation">
    <update key="InventoryManagement.StartScreen" group="DEFAULT">
    <language language="en_us"> 
        <data>
            <entry name="KEY">
                <valstr>Entry</valstr>
            </entry>
        </data>
    </language>

    <language language="de"> 
        <data>
            <entry name="KEY">
                <valstr>Eingabe</valstr>
            </entry>
        </data>
    </language>
    </update>
  </masterdataPoolUpdate>
</MovilizerRequest>

Есть ли лучший, более стандартный способ локализации приложений Movilizer?

1 ответ

Решение

Другие полезные методы с точки зрения задач локализации:

    $global:getLocale = function(pool, key)
    {
        fieldNames = getMasterdata($masterdata:"localisation", pool);
        fieldNames = fieldNames["data"];

        return fieldNames[key];
    };
    $global:getLocaleWithReplacement = function(pool, key, replacement)
    {
        fieldNames = getMasterdata($masterdata:"localisation", pool);
        fieldNames = fieldNames["data"];
        locale = fieldNames[key];
        locale = strReplace(locale, "%1%", replacement);
        return locale;
    };
    $global:getLocaleWithReplacementArray = function(pool, key, replacement)
    {
        fieldNames = getMasterdata($masterdata:"localisation", pool);
        fieldNames = fieldNames["data"];
        locale = fieldNames[key];
        for(i : replacement)
        {
            placeholder = concat("%", i, "%");
            locale = strReplace(locale, placeholder, replacement[i]);
        }
        return locale;
    };
    $global:getLocalizedList = function(pool, key)
    {
        fieldNames = getMasterdata($masterdata:"localisation", pool);
        fieldNames = fieldNames["data"];

        filterValues = fieldNames[key];
        filterValues = strtokenarray(filterValues, ";");

        for(i : filterValues)
        {
            filter[i] = filterValues[i];
        }
        return filter;
    };

На лету переключение языков

Хорошо, если требуется переключение языка без переконфигурирования и синхронизации, решение не так уж далеко от того, что описано здесь. Что нужно сделать, это:

  1. создать и установить глобальную языковую переменную

  2. отрегулируйте MasterData таким образом, чтобы у вас было несколько языковых вложенных массивов в части данных ключа, и соответственно измените методы.

Вам даже не нужно будет менять подпись метода.

Локализация имен Movelet работает следующим образом:

<nameExpression>
  call($global:getLocaleWithReplacementArray)("process.movelet", "MOVELET_TITLE", {0 : $global:amount;1 : $global:unit})
</nameExpression>
Другие вопросы по тегам