Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Интернационализация (http://www.flasher.ru/forum/showthread.php?t=194391)

stasuss 13.02.2013 08:49

Интернационализация
 
Всем привет.

Подскажите как проще и удобнее делать интернационализацию в приложении. Т.е. возможность выбора языка для вывода сообщений и надписей.

caseyryan 13.02.2013 09:01

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

stasuss 13.02.2013 09:13

ооо. а можно по подробнее? какие такие пакеты? package? по словам "языковой пакет actionscript" гугл какую то ерунду выдает...

caseyryan 13.02.2013 09:25

Ну, например создать какой-то класс, на подобие абстрактной фабрики, который будет принимать для инициализации ксласс с каким-то интерфейсом, например
Код AS3:

package language {
 
        public class LangPack {
 
                private static var _langPack:ILang;
 
                public static function setLanguage(langPack:ILang):void {
                        _langPack = langPack;
                }
                public static function getList():Array {
                        if (!_langPack) throw "сначала передайте языковой пакет через setLanguage()";
                        return _langPack.getList();
                }
        }
 
}

сам интерфейс
Код AS3:

package language {
 
        public interface ILang  {
                function getList():Array;
        }
}

и два примера языковых пакетов:
Код AS3:

package language {
 
        public class RusPack implements ILang {
 
                private var _list:Array = ["главное меню", "выбор языка"];
 
                public function getList():Array {
                        return _list;
                }
 
        }
 
}

и английский
Код AS3:

package language {
 
        public class EngPack implements ILang {
 
                private var _list:Array = ["main menu", "select language"];
 
                public function getList():Array {
                        return _list;
                }
 
        }
 
}

потом где-то инициализируем пакет
Код AS3:

LangPack.setLanguage(new RusPack());
_mainMenu.text = LangPack.getList()[0]; // если передан русский пакет, будет выдавать надпись "главное меню", если английский "main menu"

Ну, типа того, надеюсь идея ясна
Для смены языка будет нужно опять передать в метод setLanguage новый экземпляр
Код AS3:

LangPack.setLanguage(new EngPack());

ну или даже так, для наглядности
Код AS3:

LangPack.setLanguage(new EngPack() as ILang);


stasuss 13.02.2013 10:23

огромное спасибо)

alatar 13.02.2013 13:12

Поищите по ключевым словам as3 i18n.
Вот, например, первое попавшееся.

-De- 13.02.2013 16:54

Более использующийся термин "локализация".
http://www.flasher.ru/forum/showthre...E7%E0%F6%E8%FF

alatar 13.02.2013 17:09

Это все-таки несколько разные термины. И ТС выбрал верный из них.
Цитата:

Internationalization is the process of designing a software application so that it can be adapted to various languages and regions without engineering changes. Localization is the process of adapting internationalized software for a specific region or language by adding locale-specific components and translating text.

iflamberg 13.02.2013 17:17

Я. например, не оперирую большими текстами для перевода, поэтому у себя сделал очень просто. У меня есть translations.xml с такой структурой:
Код:

<translations>
        <t ru="Подтвердить" en="Confirm" />
        <t ru="Отмена" en="Cancel" />
        <t ru="Вы действительно хотите удалить это сохранение?" en="Delete savegame?" />
        <t ru="Инвентарь" en="Inventory" />
        <t ru="Купить" en="Buy" />
        <t ru="Продать" en="Sell" />
        <t ru="Сбросить" en="Reset" />
</translations>

Есть вот такая функция пакета:
Код:

package engine {
        public function t(str:String):String {
                if (Main.DEFAULT_LANG == Main.curLang) return str;
                var list:XMLList = Main.translations.t.(@[Main.DEFAULT_LANG] == str);
                return list.length()?list[0].@[Main.curLang]:str;
        }
}

и в коде мне остается только добавить что-нибудь типа:
Код AS3:

btnReset.label = t("Сбросить");

или даже
Код AS3:

btnReset.label = t(btnReset.label);

Меня устраивает.

expl 13.02.2013 21:50

Цитата:

_mainMenu.text = LangPack.getList()[0];
Выбирать текст по индексу? 0_o
Хранить в масссиве? Получается из середины ставший лишним текст удалили - всё съехало.
В Notepad++, вроде так и сделано, но есть же более человеческие способы

У нас статическая локализация представлена txt-файлом(все языки в одном файле), в котором текст хранится в TSV(разделенные табом значения).
TSV, потому что легко копипастить в Excel(по неясным причинам в других форматах переводчики работать не умеют)
Т.к. формат текстовый - он легко мержится
Пробовали сразу хранить в xls, но ручной мержинг доводит до белого коленья
Представляет текст типа:
Код:

        ru        en
menuName        Меню        Menu
okButton        OK        OK
cancelButton        Отмена        Cancel

По этому txt-файлу скриптом (у нас на haXe, но можно хоть на Haskell) генерятся:
- по xml-файлу на язык
- as3-файл Localization.as, с набором методов(утрировано):
Код AS3:

public class Localization {
    private static _texts:Object;
    public static setParsedFromXmlTexts(texts:Object):void { _texts = texts }
    public static menuName():String { return _texts["menuName"] }
    public static okButton():String { return _texts["okButton"] }
    public static cancelButton():String { return _texts["cancelButton"] }
}

Если Localization.get("menuName") писать руками - начинаются бесконечные поиски описки, неиспользуемые ключи тяжело найти, постоянные перепроверки и вообще муторное занятие
А так - Localization.menuName() - и всё! Если ключ пропал - компилятор скажет.

При отдаче переводчикам содержимое txt-файла копируется в Excel
Сам файл (т.к. TSV править мягко говоря неудобно) - редактируется в самопальном редакторе на C# (подходящий несамопальный не нагуглили). Внешне это похоже на правку таблиц в том же Excel. При сохранении автоматом запускает скрипт, генерирующий xml и as.

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


Часовой пояс GMT +4, время: 18:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.