Quốc tế hóa (i18n) trong các trò chơi Flash? Có đường nào dễ đi không?


8

Tôi muốn quốc tế hóa một số văn bản trong trò chơi flash (không phải flex) Tôi đang làm việc và tôi không thể tìm thấy một cách dễ dàng để đạt được điều đó ... Tôi đã tìm thấy một số thư viện và các giải pháp khác, nhưng tôi mong đợi một thứ dễ dàng hơn nhiều ( nó thực sự dễ dàng với các công nghệ khác).

Bạn có kinh nghiệm trong việc này? Bạn làm nó như thế nào?


"Nó thực sự dễ dàng với các công nghệ khác" - bạn đã sử dụng những công nghệ nào khác?
Kylotan

Ví dụ: PHP, .NET, Java ... Nhưng, ok, nếu tôi chỉ nghĩ về phát triển trò chơi, nó không dễ dàng như vậy.
MiguelSantirso

Câu trả lời:


5

Gần đây tôi đã phát triển một Trò chơi Flash mà tôi đã dịch sang tiếng Đức và tiếng Anh. Bạn có thể xem tại đây: http://www.bioaschi.ch/?lang=en#/game . Bạn có thể thay đổi ngôn ngữ một cách nhanh chóng trong menu cài đặt .

Để dịch trò chơi, tôi đã sử dụng cách tiếp cận sau: Tôi có một lớp Cấu hình được viết tùy chỉnh về cơ bản chỉ là một sổ đăng ký của các cặp khóa => giá trị . Lớp cấu hình có thể đọc từ tệp XML và cũng gửi các sự kiện khi giá trị thay đổi.

Đối với trò chơi, tôi đã tạo 2 tập tin cấu hình khác nhau. Một là maincấu hình, và sau đó một tệp chứa các bản dịch (được gọi lang). Họ maincấu hình chứa một khóa chỉ định ngôn ngữ, ví dụ. lang = vi . Trong trò chơi tôi lắng nghe sự kiện thay đổi trên phím đó. Bất cứ khi nào điều đó xảy ra, tôi đọc / áp dụng các giá trị từ ngôn ngữ thích hợp.

Đây là một đoạn mã nhỏ cho biết cách ngôn ngữ được chuyển đổi trong trò chơi:

Một nơi nào đó trong mã bảng "Cài đặt":

Config.getConfig('main').setValue('lang', 'de'); // or 'en'

Sau đó, bất cứ nơi nào khác mà văn bản cần được bản địa hóa:

        // this is in the construtor or some init method
        ...
        var cfg:Config = Config.getConfig('main');
        cfg.addEventListener(ConfigEvent.CONFIG_CHANGE, onConfigChange);

        updateText(cfg.getValue('lang', 'en') + '.');
    }

    private function updateText(langns:String) : void {
        var langCfg:Config = Config.getConfig('lang');
        this.title.htmlText = langCfg.getValue(langns + "credits.TITLE", "<title>");
        this.text.htmlText = langCfg.getValue(langns + "credits.TEXT", "<text>");
        _btnClose.label = langCfg.getValue(langns + 'highscore.CLOSE', 'X');
    }

    private function onConfigChange(evt:ConfigEvent) : void {
        if(evt.key == 'lang'){
            updateText(evt.value + ".");
        }
    }

Bạn có thể xem tập tin đang được trò chơi tải ở đây: http://www.bioaschi.ch/game/lingu.xml

Để thay thế các phần của văn bản bằng các biến (ví dụ: your score is %dchuyển đổi thành your score is 10000), tôi khuyên bạn nên sử dụng Thư viện dữ liệu đa giác tuyệt vời . Nó chứa một triển khai AS3 của Sprintf .

Thay vì có tất cả các bản dịch trong một tệp, bạn cũng có thể dễ dàng có một tệp duy nhất cho mỗi ngôn ngữ.

Để hoàn thiện, đây là một số danh sách mã:

Wow, đây là một bài viết dài, tôi xin lỗi. Cách tiếp cận tôi thực hiện khá đơn giản và không bao gồm các chủ đề phức tạp hơn về quốc tế hóa, như định dạng ngày , định dạng số hoặc tiền tệ, v.v ... Đối với các bản dịch đơn giản, nó chỉ hoạt động tốt.


Đây là một câu trả lời hay, nhưng tôi không thể đánh giá cao vì tôi là người dùng mới :( Tôi sẽ chấp nhận câu trả lời của bạn nếu không có gì tốt hơn sớm.
MiguelSantirso

1

Đến từ thế giới C ++, ý tưởng chung để thay đổi ngôn ngữ một cách nhanh chóng là để tất cả văn bản ngôn ngữ trong bộ nhớ ở một nơi nào đó, với mỗi chuỗi (hoặc sprite chứa văn bản) được gán một ID số. Tất cả các ID đều giống nhau ở các ngôn ngữ khác nhau, cộng với ngôn ngữ bù. Ví dụ:

const LANG_EN: int = 0; const LANG_DE: int = 1000;

const STRING_HELLO_WORLD: int = 0;

var StringTable: mảng / * của chuỗi * /; StringTable [STRING_HELLO_WORLD + LANG_EN] = "Xin chào, thế giới!" StringTable [STRING_HELLO_WORLD + LANG_DE] = "Hallo, Veldt!"

Điều này cần thời gian thiết lập đáng kể, được cấp, nhưng nó chỉ phải được thực hiện một lần.

Sau đó, trong mã của bạn, bạn chỉ cần tham chiếu bảng bằng cách sử dụng chuỗi và ngôn ngữ hiện tại bù: myObject.text = StringTable [STRING_HELLO_WORLD + currentL Language];


Tôi đã thấy một cái gì đó tương tự trên các trò chơi được vận chuyển, ngoại trừ dữ liệu thường được đọc từ bảng tính Excel, một ngôn ngữ trên mỗi cột.
Kylotan

0

Liên kết các thành phần của bạn với một đối tượng flash.utils.Dixi. Một từ điển về cơ bản là một mảng kết hợp. Nếu bạn trao đổi cái này với cái khác và các ràng buộc của bạn được đặt ra, các khung nhìn sẽ tự động thay đổi. Sử dụng có thể đặt định dạng ngày vv thông tin có hai. Tôi cũng đã giới thiệu một hệ thống "id số" không phổ biến và không thân thiện. Điều này là do khi bạn thực sự khám phá các ứng dụng quốc tế / đa ngôn ngữ, bạn sẽ thấy rằng một số từ tiếng Anh dịch khác nhau tùy theo ngữ cảnh (trong tiếng Pháp hoặc tiếng Tây Ban Nha, nó rất phổ biến).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.