Internasionalisasi (i18n) di game Flash? Apakah ada cara mudah?

8

Saya ingin menginternasionalkan beberapa teks dalam permainan flash (bukan flex) yang sedang saya kerjakan dan saya tidak dapat menemukan cara mudah untuk mencapai itu ... Saya telah menemukan beberapa perpustakaan dan solusi lain, tetapi saya mengharapkan sesuatu yang jauh lebih mudah ( sangat mudah dengan teknologi lain).

Apakah Anda memiliki pengalaman dalam hal ini? Bagaimana Anda melakukannya?

miguelSantirso
sumber
"sangat mudah dengan teknologi lain" - mana yang sudah Anda gunakan?
Kylotan
Sebagai contoh: PHP, .NET, Java ... Tapi, ok, jika saya hanya memikirkan pengembangan game, itu tidak mudah.
miguelSantirso

Jawaban:

5

Saya baru-baru ini mengembangkan Flash Game yang saya terjemahkan ke Jerman dan Inggris. Anda dapat melihatnya di sini: http://www.bioaschi.ch/?lang=en#/game . Anda dapat mengubah bahasa dengan cepat di menu pengaturan .

Untuk menerjemahkan permainan, saya menggunakan pendekatan berikut: Saya memiliki kelas Config tertulis khusus yang pada dasarnya hanya merupakan pendaftar kunci => pasangan nilai . Kelas config dapat membaca dari file XML dan juga mengirimkan peristiwa ketika suatu nilai berubah.

Untuk permainan saya membuat 2 file konfigurasi yang berbeda. Satu adalah mainkonfigurasi, dan kemudian satu file yang berisi terjemahan (disebut lang). mainKonfigurasi mereka berisi kunci yang menentukan bahasa, mis. lang = id . Dalam game saya mendengarkan perubahan acara pada tombol itu. Setiap kali itu terjadi, saya membaca / menerapkan nilai-nilai dari bahasa yang sesuai.

Berikut cuplikan kecil kode yang menunjukkan bagaimana bahasa tersebut diaktifkan di game:

Di suatu tempat dalam kode panel "Pengaturan":

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

Kemudian di tempat lain di mana teks harus dilokalisasi:

        // 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 + ".");
        }
    }

Anda dapat melihat file yang sedang dimuat oleh permainan di sini: http://www.bioaschi.ch/game/language.xml

Untuk mengganti bagian teks dengan variabel (mis. Mentransformasikannyayour score is %d menjadi your score is 10000), saya sarankan Anda menggunakan Perpustakaan Datastruktur Poligonal yang sangat baik . Ini berisi implementasi AS3 dari Sprintf .

Alih-alih memiliki semua terjemahan dalam satu file, Anda juga dapat dengan mudah memiliki satu file tunggal per bahasa.

Demi kelengkapan, berikut adalah beberapa daftar kode:

Wow, ini agaknya menjadi posting yang panjang, maaf. Pendekatan yang saya ambil agak sederhana dan tidak mencakup topik-topik internasionalisasi yang lebih rumit, seperti format tanggal , format angka atau mata uang dll. Namun untuk terjemahan sederhana ini berfungsi dengan baik.

bummzack
sumber
Ini adalah jawaban yang bagus, tetapi saya tidak dapat memilih karena saya adalah pengguna baru :( Saya akan menerima jawaban Anda jika tidak ada yang lebih baik segera.
miguelSantirso
1

Berasal dari dunia C ++, ide umum untuk mengubah bahasa dengan cepat adalah memiliki semua teks bahasa dalam memori di suatu meja, dengan setiap string (atau sprite yang berisi teks) diberi ID numerik. Semua ID adalah sama dalam bahasa yang berbeda, ditambah offset bahasa. Sebagai contoh:

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

const STRING_HELLO_WORLD: int = 0;

var StringTable: array / * dari string * /; StringTable [STRING_HELLO_WORLD + LANG_EN] = "Halo, Dunia!" StringTable [STRING_HELLO_WORLD + LANG_DE] = "Halo, Veldt!"

Ini membutuhkan waktu pengaturan yang cukup, memang, tetapi hanya perlu dilakukan sekali.

Kemudian, dalam kode Anda, Anda cukup mereferensikan tabel menggunakan string dan offset bahasa saat ini: myObject.text = StringTable [STRING_HELLO_WORLD + currentLanguage];

Ian Schreiber
sumber
Saya telah melihat sesuatu yang serupa pada game yang dikirimkan, kecuali data biasanya dibaca dari spreadsheet Excel, satu bahasa per kolom.
Kylotan
0

Ikat komponen Anda ke objek flash.utils.Dictionary. Kamus pada dasarnya adalah array asosiatif. Jika Anda bertukar satu dengan yang lain, dan binding Anda ada di tempatnya, tampilan akan berubah secara otomatis. Gunakan dapat menempatkan informasi tanggal format dll ada dua. Saya juga memperkenalkan sistem "nomor id" yang tidak populer dan tidak ramah. Ini karena ketika Anda benar-benar menjelajahi aplikasi internasionalisasi / multibahasa, Anda akan menemukan bahwa beberapa kata bahasa Inggris menerjemahkan berbeda tergantung pada konteks (dalam bahasa Prancis atau Spanyol itu sangat umum).

kosmoknot
sumber