Re: Локализация INSTEAD и квестов на другие языки

А знаете, наверное, можно использовать что-то вроде между gettext и численным каталогом. То есть присвоить каждой строке вменяемое имя, типа Academician.Angry и сделать функцию для получения строки по имени. Данные можно хранить в любом структурированном и не очень формате: от MachineObject (имя строки как msgstr) до XML (длинно) или тех же таблиц Lua (оптимально) в файле с именем translations/CODE.lua. Нигде не делается отдельных переводов под ru_RU и ru_UA, под en_GB и en_US/ B смысла в этом и правда мало.
Таким образом, исчезает зоопарк и проблемы gettext.

Re: Локализация INSTEAD и квестов на другие языки

Odyssey wrote:

И еще вопрос к Петру: что имелось в виду под "натянутой улыбкой" Академика

Что-то между 1-м и 3-м. Но на своем варианте не настаиваю. smile

Re: Локализация INSTEAD и квестов на другие языки

Electronic wrote:

А знаете, наверное, можно использовать что-то вроде между gettext и численным каталогом

Да -- варианты есть. Но кто будет делать многоязычную игру? smile

Re: Локализация INSTEAD и квестов на другие языки

Я, конечно, в Lua не профи, но такую схему сделать смогу. Я так понял, у кого-то есть наработки кота и старой истории - могу согнать в один.

Re: Локализация INSTEAD и квестов на другие языки

Electronic wrote:

Я, конечно, в Lua не профи, но такую схему сделать смогу. Я так понял, у кого-то есть наработки кота и старой истории - могу согнать в один.

Имхо проблема не в схеме, а в отсутствии переводов.

Re: Локализация INSTEAD и квестов на другие языки

Точно. На перевод пролога к oldstory у меня ушло около пяти часов sad Хотя это из-за малого опыта перевода ru->en. Пётр, я думаю осилить перевод любой из игр в одиночку будет сложновато, может быть стоит как-нибудь организовать коллективный процесс -- через wiki/svn? Чтобы всегда можно было быстро присоединиться, но и наработки не терялись?

Выкладываю то, что я успел перевести.

Re: Локализация INSTEAD и квестов на другие языки

Давайте заведем на googlecode проект с играми для instead и будем держать их в одном дереве? Я не знаю -- можно ли сделать еще один репозиторий в instead.googlecode.com. Если нет -- создадим instead-games,googlecode.com -- ты возьмешься?

58

Re: Локализация INSTEAD и квестов на другие языки

Odyssey wrote:

Выкладываю то, что я успел перевести.

Гхм... а в каком времени идёт повествование?
Во фразе "This story started the last day of Summer." есть чёткое указание на время, тут не Past Perfect, но в остальных предложениях, где нет указания на время, вроде бы надо использовать perfect время? Типа "All night I've remained wakeful. I've felt like I'm in the hot seat."
Или я чего-то путаю?

59

Re: Локализация INSTEAD и квестов на другие языки

"There is a brownish picture on its surface, your photo." -> "There is a brownish picture on its surface. It's your photo."

60 (edited by Odyssey 2009-11-12 21:14:52)

Re: Локализация INSTEAD и квестов на другие языки

Peter wrote:

Если нет -- создадим instead-games,googlecode.com -- ты возьмешься?

Можно попробовать, но сначала лучше проверить возможность создания дополнительного репозитария в проекте instead. Или еще один вариант -- TranslateWiki.

vvb wrote:

Гхм... а в каком времени идёт повествование?

Past Simple, по схеме "последовательность завершенных действий в прошлом" (ссылка, см. USE 2 A Series of Completed Actions ). Здесь нас интересуют сами факты, события, а не результат, поэтому использую не Perfect. Я не претендую на истину в последней инстанции, но для изменения моей точки зрения потребуются аргументы smile

Как ещё одно быстрое и грязное доказательство моего варианта -- гугл-запрос по точной фразе (вместе с кавычками):
"All night I remained wakeful"
"All night I've remained wakeful"
В принципе гугл не показатель, он и ошибки индексирует, но тем не менее 0 результатов -- это повод поискать другие варианты.

vvb wrote:

There is a brownish picture on its surface. It's your photo.

Согласен, у меня тоже были сомнения по поводу этого кусочка. Но разбить на два предложения не пришло в голову..

Re: Локализация INSTEAD и квестов на другие языки

#include <locale.h>
#include <string.h>
#include <stdio.h>

#ifdef HAVE_LANGINFO_H
#include <langinfo.h>
#endif

#if defined(MS_WINDOWS)
#include <windows.h>
#endif

#if defined(MS_WINDOWS
char*
getlang()
{
    char lang[10];


    if (GetLocaleInfo(LOCALE_USER_DEFAULT,
                      LOCALE_SISO639LANGNAME,
                      lang, sizeof(lang))){
        return lang;
    };
/*otherwise, we can get a locale from LOCALE_IDEFAULTLANGUAGE,
accessing table:
{
    0x0436: "af_ZA", # Afrikaans
    0x041c: "sq_AL", # Albanian
    0x0484: "gsw_FR",# Alsatian - France
    0x045e: "am_ET", # Amharic - Ethiopia
    0x0401: "ar_SA", # Arabic - Saudi Arabia
    0x0801: "ar_IQ", # Arabic - Iraq
    0x0c01: "ar_EG", # Arabic - Egypt
    0x1001: "ar _LY", # Arabic - Libya
 ...    0x0478: "ii_CN", # Yi - PRC
    0x046a: "yo_NG", # Yoruba - Nigeria
    0x0435: "zu_ZA", # Zulu
}
 stolen from Python locale module.
 Unfortunately, I have no idea how to store this table in C,
 and I don't know how to convert hexadecimal value string to integer.
 */
    lang[0] = '0';
    lang[1] = 'x';
    if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IDEFAULTLANGUAGE,
                      locale+2, sizeof(locale)-2)) {
        return lang;
    };
    lang[0]='\0';
    return lang;
};
char*
getencoding() {
    char encoding[10];
    sprintf(encoding, "cp%d", GetACP());
    return encoding;
};

#else

char*
_getenvlang() {
    char envlang[100];
    char envirs[4][8]={"LC_ALL", "LC_CTYPE", "LANG", "LANGUAGE"}
    unsigned char i;

    envlang[0]='\0';

    for (i=0; i<4; i++) {
        strcpy(envlang, getenv(envirs[i]));
        if(strlen(envlang)>0)
        {
            return envlang;
        }
    };
    return "C";
};

char*
getlang() {
    char env[100], lang[10];
    env=_getenvlang();
    if(env[0]=='C'){ return NULL;};
    strcpy(lang, strtok(env, _));
    return lang;
};
char*
getencoding() {
    char env[100], enc[10];
    env=_getenvlang();
    if(env[0]=='C'){return NULL};
    strcpy(lang, strtok(strchr(env, '.'), '.'));
    return lang;
};

#endif

Ну, вот что-то такое нам позволит культурно получить локаль. Дальше преобразуем: "translation/${getlang()}.lua" прямо в C (в sdl-instead/game.c) и подключить аналогично main.lua. Как сделать такое в просто instead, пока не знаю. Возможно, имеет смысл сделать функцию doi18nfile. В данный момент работаю над этим - патчи вышлю пачкой smile.

PS: Предвижу оценку моих действий - "Проделана большая работа" smile.

Re: Локализация INSTEAD и квестов на другие языки

Все-таки я пока остаюсь сторонником персонального перевода игр, так как игра не должна быть ОДНА и выбирать свой интерфейс исходя из локали, а должно быть ДВЕ игры и какая бы локаль не стояла -- я могу играть хоть в английскую, хоть в русскую.

У нас появился испанский перевод меню instead. wink Если Одиссей доделает перевод -- будет очень хорошо. wink

UPD: Испанский туториал в svn!

Re: Локализация INSTEAD и квестов на другие языки

Перевод oldstory пока не продвинулся, но хочу закоммитить то что есть в instead-games, чтобы можно было наблюдать прогресс и помогать с вариантами. В связи с чем вопрос:

Английская версия будет полностью независимой? Т.е. коммичу вместе с рисунками и музыкой?

Re: Локализация INSTEAD и квестов на другие языки

Думаю, что независимой. Не очень красиво, но пока -- проще.

65

Re: Локализация INSTEAD и квестов на другие языки

Peter wrote:

Думаю, что независимой. Не очень красиво, но пока -- проще.

По мне так независимость в данном случае идологически более верна. Просто раз не получается применить стратегию с файлами сообщений без усложнения кода, пусть будет отдельной игрой.

Re: Локализация INSTEAD и квестов на другие языки

В общем, есть такие мысли:
  * В 1.2.0 появилась функция gamefile (пока не док-на) которая позволяет подгружать игры по частям;
  * Есть переменная LANG, определяющая язык интерфейса;
  * Есть возможность задавать имя игры в виде: --$Name(ru):По русски$

Теоретически (на тестах) это позволяет делать разные main.lua для разных языков.

-- $Name:Cuba$
-- $Name(ru):Куба$
if LANG == "ru" then
    gamefile("main1.lua", true)
else
    gamefile("part2.lua", true)
end

Но еще более правильно было бы написать скрипт на луа, который:
* Выдергивает все строки из *.lua
* Создает файл со строками.

Потом человек переводит те строки, которые нужно и запускает скрипт на lua,
который создаст *.lua с замененными строками и схема сводится к своему началу (несколько main для разных языков)

Такая схема намного менне сложная чем gettext (сложная - в смысле применения ее к if играм). Скрипт пока писать нет времени. Может, когда-нибудь кто-нибудь вернется к этому обсуждению. smile

Re: Локализация INSTEAD и квестов на другие языки

Вопрос автору: почему вы выбрали файлы перевода INSTEAD создавать в формате ini, а не в широко распространённом в open-source po (gettext)? Спасибо!

Re: Локализация INSTEAD и квестов на другие языки

Из-за простоты. Тогда уже инстед собирался в вин, по-моему. Проше было сделать свое маленькое, чем тащить gettext. Как gettext сработал бы в винде -- вопрос. Также можно спросить -- почему не qt/gtk а SDL. smile

Код для разбора строк в настройках уже был, надо было просто его использовать для перевода.

Re: Локализация INSTEAD и квестов на другие языки

Пётр, а почему английская версия квантового кота находится отдельно от русской. В INSTEAD нет функции выбора языка игры при загрузке?

Re: Локализация INSTEAD и квестов на другие языки

В 1.2.0 можно (раньше -- нельзя) -- но тут вопрос творческий, так как язык интерфейса не должен быть равен языку игры.  Ну и вроде логичней как с литературой. Но ясности нет пока.

Английский кот так и не доперевели все-равно. smile

Re: Локализация INSTEAD и квестов на другие языки

То есть, выйдет версия кота с обеими языками для 1.2.0?

Re: Локализация INSTEAD и квестов на другие языки

Кот пока не переведен все-равно, только 1-я часть, sad Так что вряд-ли.

Вот Кайлет может выйдет на 2-х языках.
Также - Escape TheToilet -- в том случае если автор его переведет -- а он хотел это сделать, и с английским у него нормально.

73 (edited by kerber 2012-10-24 11:16:58)

Re: Локализация INSTEAD и квестов на другие языки

Может быть для мультиязычных проектов имеет смысл создать несколько файлов со строками:
например strings-rus.lua, strings-en.lua.

strings-rus.lua:

hello = "Привет!"
bye = "До свидания."

strings-en.lua:

hello = "Hello!"
bye = "Goodbye."

В main.lua прописать при сборке нужный strings - файл, при написании кода используя переменные hello и bye вместо собственно строк.

Для выдирания строк из уже готового main.lua и замены их переменными можно написать софтинку. На php к примеру.

Функционал примерно следующий:
1) Задание правила для генерации имён переменных;
2)Задание регулярки для поиска строк;
3)Что-то ещё?

74

Re: Локализация INSTEAD и квестов на другие языки

как быть в предлагаемом случае с тем, что в русской, и, скажем, в английской версии код будет отличаться?
пример -- Зеркало, где в 4 части идут стихи на русском, в которых есть кодовое слово. мало того, что придётся переделывать стих, так код поплывёт. может придётся ещё вносить изменения (не могу спойлерить, но ПРИДЁТСЯ).
другой пример -- Звёздное Наследие. там тоже есть стихи на русском. и тоже не просто так. а там зашифровано важное. при трансформации стиха на английский поплывёт всё.
вывод -- разноязычные коды игры МОГУТ отличаться.
значит текущий вариант, когда есть
part_1.lua
part_1_eng.lua
part_1_ita.lua
....
меня вполне устраивает

Re: Локализация INSTEAD и квестов на другие языки

lang = "ru";

if lang == "ru" then
...
end