Как заменить отсутствующее содержимое одного словаря содержимым другого словаря? - PullRequest
0 голосов
/ 03 января 2019

Итак, я делаю переводы для игры, и у меня есть разные словари.Если перевод не существует на одном языке, я хочу установить его на английский перевод.Каждый способ, которым я пытался объединить словари, оказался невероятно неэффективным.

Вот несколько сокращенных примеров

local translation-sr = {
    Buttons = {
        Confirm = "Потврди";
        Submit = "Унеси";
    };
    Countries = {
        Bloxell = "Блоксел";
        USA = "Сједињене Америчке Државе";
    };
    Firearms = {
        Manufacturers = {
            GenMot = "Џенерални Мотори";
            Intratec = "Интратек";
            TF = "ТФ Оружје";
        };
    };
};

local translation-en = {
    Buttons = {
        Confirm = "Confirm";
        Purchase = "Purchase";
        Submit = "Submit";
    };
    Countries = {
        Bloxell = "Bloxell";
        USA = "United States";
    };
    Firearms = {
        Manufacturers = {
            GenMot = "General Motors";
            Intratec = "Intratec ";
            TF = "TF Armaments";
        };
    };
    Languages = {
        Belarusian = "Belarusian";
        English = "English";
        French = "French";
        German = "German";
        Italian = "Italian";
        Russian = "Russian";
        Serbian = "Serbian";
        Spanish = "Spanish";
    };
};

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Я считаю, что вы должны использовать метатаблицу для достижения того, что вам нужно.

Я предполагаю, что вы всегда будете индексировать по английскому слову по умолчанию.С этим значением true вы можете сделать следующее.

local function default(t,k)
    return k
end

local translation_sr = {
    Button = setmetatable({
        Confirm = "Потврди",
        Submit = "Унеси",
    },
    { __index = default }),

    Countries = setmetatable({
        ["Bloxell"] = "Блоксел",
        ["United States"]= "Сједињене Америчке Државе",
    }, 
    { __index = default }),

    Firearms = {
        Manufacturers = setmetatable({
            ["General Motors"] = "Џенерални Мотори",
            ["Intratec"] = "Интратек",
            ["TF Armaments"] = "ТФ Оружје",
        }, 
        { __index = default }),
    },
}

Эта функция просто возвращает ваш ключ, которого не было в таблице.

local function default(t,k)
    return k
end

С этим ключом предполагается, что он английскийслово, которое вы использовали бы по умолчанию для возвращаемого значения для "Purchase", которое вы получите "Purchase" обратно из translation_sr.Этот метод не требует translation_en таблица

0 голосов
/ 03 января 2019

Полагаю, вы хотите сделать что-то подобное

setmetatable(translation_sr.Buttons,{__index=translation_en.Buttons})

для всех листовых подтаблиц.Вы можете сделать это вручную, если есть только несколько подтаблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...