Praktik terbaik untuk pelokalan dan globalisasi string dan label [tertutup]

124

Saya adalah anggota tim dengan lebih dari 20 pengembang. Setiap pengembang bekerja pada modul terpisah (mendekati 10 modul). Dalam setiap modul kami mungkin memiliki setidaknya 50 formulir CRUD, yang berarti saat ini kami memiliki hampir 500 tombol tambah , tombol simpan , tombol edit , dll.

Namun, karena kami ingin mengglobalisasikan aplikasi kami, kami harus dapat menerjemahkan teks dalam aplikasi kami. Misalnya, di mana-mana, kata add harus menjadi ajouter untuk pengguna bahasa Prancis.

Apa yang kami lakukan sampai sekarang, adalah untuk setiap tampilan di UI atau Lapisan Presentasi, kami memiliki kamus pasangan kunci / nilai terjemahan. Kemudian saat merender tampilan, kami menerjemahkan teks dan string yang diperlukan menggunakan kamus ini. Namun, pendekatan ini, kami telah menemukan sekitar 500 menambahkan dalam 500 kamus. Ini berarti kami telah melanggar prinsip KERING.

Di sisi lain, jika kita memusatkan string umum, seperti meletakkan add di satu tempat, dan meminta pengembang untuk menggunakannya di mana-mana, kita menghadapi masalah tidak yakin apakah string sudah didefinisikan dalam kamus terpusat atau belum.

Satu opsi lain mungkin tidak memiliki kamus terjemahan dan menggunakan layanan terjemahan online seperti Google Translate, Bing Translator, dll.

Masalah lain yang kami temui adalah bahwa beberapa pengembang di bawah tekanan untuk menyelesaikan proyek tepat waktu tidak dapat mengingat kunci terjemahan . Misalnya, untuk teks tombol tambah, pengembang menggunakan tambah sementara pengembang lain menggunakan baru , dll.

Apa praktik terbaik, atau metode paling terkenal untuk globalisasi dan pelokalan sumber daya string aplikasi?

Mouneer
sumber
2
The bicara dengan Alex Sexton pada topik Client Side Internasionalisasi dari konferensi JS Uni Eropa adalah awal yang baik.
Minko Gechev

Jawaban:

51

Sejauh yang saya tahu, ada perpustakaan bagus yang disebut localeplanetPelokalan dan Internasionalisasi dalam JavaScript. Selain itu, saya pikir ini asli dan tidak memiliki ketergantungan ke perpustakaan lain (misalnya jQuery)

Berikut situs perpustakaannya: http://www.localeplanet.com/

Lihat juga artikel oleh Mozilla ini, Anda dapat menemukan metode dan algoritme yang sangat bagus untuk terjemahan sisi klien: http://blog.mozilla.org/webdev/2011/10/06/i18njs-internationalize-your-javascript-with- a-little-help-from-json-and-the-server /

Bagian umum dari semua artikel / pustaka itu adalah bahwa mereka menggunakan i18nkelas dan getmetode (dalam beberapa hal juga mendefinisikan nama fungsi yang lebih kecil seperti _) untuk mengambil / mengonversi keyke value. Dalam penjelasan saya keyberarti string yang ingin Anda terjemahkan dan valuemakna string yang diterjemahkan.
Kemudian, Anda hanya perlu dokumen JSON untuk menyimpan keydan value.

Sebagai contoh:

var _ = document.webL10n.get;
alert(_('test'));

Dan di sini JSON:

{ test: "blah blah" }

Saya percaya menggunakan solusi perpustakaan populer saat ini adalah pendekatan yang baik.

Afshin Mehrabani
sumber
1
Jangan tersinggung tapi bukankah ini yang sudah dicoba Afshin? Masalahnya adalah bahwa pengembang yang berbeda mengalami kesulitan mengingat kunci mana yang akan digunakan. Saya setuju dengan bahwa metode yang Anda jelaskan adalah cara yang tepat. Saya tidak melihat bagaimana bisa sebaliknya. Terima kasih untuk tautannya yang bagus btw.
Spock
47

Ketika Anda dihadapkan pada sebuah masalah untuk dipecahkan (dan sejujurnya, siapa yang tidak sekarang ini?), Strategi dasar yang biasanya diambil oleh kita para komputer disebut “bagi dan taklukkan”. Ini berjalan seperti ini:

  • Konseptualisasikan masalah spesifik sebagai sekumpulan sub-masalah yang lebih kecil.
  • Selesaikan setiap masalah yang lebih kecil.
  • Gabungkan hasil menjadi solusi dari masalah spesifik.

Tapi “bagi dan taklukkan” bukanlah satu-satunya strategi yang mungkin. Kami juga dapat mengambil pendekatan yang lebih umum:

  • Konseptualisasikan masalah khusus sebagai kasus khusus dari masalah yang lebih umum.
  • Entah bagaimana memecahkan masalah umum.
  • Sesuaikan solusi dari masalah umum dengan masalah spesifik.

- Eric Lippert

Saya yakin sudah banyak solusi untuk masalah ini dalam bahasa sisi server seperti ASP.Net/C#.

Saya telah menjelaskan beberapa aspek utama dari masalah tersebut

  • Masalah : Kami hanya perlu memuat data untuk bahasa yang diinginkan

    Solusi : Untuk tujuan ini kami menyimpan data ke file terpisah untuk setiap bahasa

ex. res.de.js, res.fr.js, res.en.js, res.js (untuk bahasa default)

  • Masalah: File sumber daya untuk setiap halaman harus dipisahkan sehingga kami hanya mendapatkan data yang kami butuhkan

    Solusi : Kita bisa menggunakan beberapa alat yang sudah ada seperti https://github.com/rgrove/lazyload

  • Masalah: Kami membutuhkan struktur pasangan kunci / nilai untuk menyimpan data kami

    Solusi : Saya menyarankan objek javascript, bukan string / string air. Kita bisa mendapatkan keuntungan dari Intellisense dari IDE

  • Masalah: Anggota umum harus disimpan dalam file publik dan semua halaman harus mengaksesnya

    Solusi : Untuk tujuan ini saya membuat folder di root aplikasi web bernama Global_Resources dan folder untuk menyimpan file global untuk setiap sub folder yang kami beri nama 'Local_Resources'

  • Masalah: Setiap anggota subsistem / subfolder / modul harus mengganti anggota Global_Resources pada cakupan mereka

    Solusi : Saya mempertimbangkan satu file untuk masing-masing

Struktur Aplikasi

root/
    Global_Resources/
        default.js
        default.fr.js
    UserManagementSystem/
        Local_Resources/
            default.js
            default.fr.js
            createUser.js
        Login.htm
        CreateUser.htm

Kode yang sesuai untuk file:

Global_Resources / default.js

var res = {
    Create : "Create",
    Update : "Save Changes",
    Delete : "Delete"
};

Global_Resources / default.fr.js

var res = {
    Create : "créer",
    Update : "Enregistrer les modifications",
    Delete : "effacer"
};

File sumber daya untuk bahasa yang diinginkan harus dimuat di halaman yang dipilih dari Global_Resource - Ini harus menjadi file pertama yang dimuat di semua halaman.

UserManagementSystem / Local_Resources / default.js

res.Name = "Name";
res.UserName = "UserName";
res.Password = "Password";

UserManagementSystem / Local_Resources / default.fr.js

res.Name = "nom";
res.UserName = "Nom d'utilisateur";
res.Password = "Mot de passe";

UserManagementSystem / Local_Resources / createUser.js

// Override res.Create on Global_Resources/default.js
res.Create = "Create User"; 

UserManagementSystem / Local_Resources / createUser.fr.js

// Override Global_Resources/default.fr.js
res.Create = "Créer un utilisateur";

file manager.js ( file ini harus dimuat terakhir)

res.lang = "fr";

var globalResourcePath = "Global_Resources";
var resourceFiles = [];

var currentFile = globalResourcePath + "\\default" + res.lang + ".js" ;

if(!IsFileExist(currentFile))
    currentFile = globalResourcePath + "\\default.js" ;
if(!IsFileExist(currentFile)) throw new Exception("File Not Found");

resourceFiles.push(currentFile);

// Push parent folder on folder into folder
foreach(var folder in parent folder of current page)
{
    currentFile = folder + "\\Local_Resource\\default." + res.lang + ".js";

    if(!IsExist(currentFile))
        currentFile = folder + "\\Local_Resource\\default.js";
    if(!IsExist(currentFile)) throw new Exception("File Not Found");

    resourceFiles.push(currentFile);
}

for(int i = 0; i < resourceFiles.length; i++) { Load.js(resourceFiles[i]); }

// Get current page name
var pageNameWithoutExtension = "SomePage";

currentFile = currentPageFolderPath + pageNameWithoutExtension + res.lang + ".js" ;

if(!IsExist(currentFile))
    currentFile = currentPageFolderPath + pageNameWithoutExtension + ".js" ;
if(!IsExist(currentFile)) throw new Exception("File Not Found");

Semoga membantu :)

Omid Shariati
sumber
7
Satu-satunya hal yang saya tidak suka tentang pendekatan ini adalah bahwa pelokalan dan pengembangan terkait erat ... Jadi ketika string bahasa Inggris (apa pun defaultnya) ditambahkan, bahasa lainnya harus diperbarui melalui kode. Saya lebih suka JSON dibuat dengan alat dari beberapa jenis file terjemahan. Representasinya masih bagus!
Nate-Wilkins
telah melakukan cara yang sama seperti yang Anda lakukan untuk pelokalan, Anda dapat melihatnya dalam kueri ini: stackoverflow.com/q/53864279/4061006 . Satu-satunya hal adalah bagaimana Anda menerjemahkan Global_Resources / default.js ke Global_Resources / default.fr.js? Alat / kit mana yang Anda gunakan untuk mengonversi file tersebut ke bahasa yang diinginkan. Karena saya membutuhkan ini juga
Jayavel
Anda harus menyimpan komentar yang dapat dibaca manusia di samping setiap kunci yang menjelaskan ke mana string itu pergi dan apa artinya, sehingga Anda dapat memberikan lebih banyak konteks kepada penerjemah (atau diri Anda sendiri) saat Anda menambahkan bahasa baru dan Anda lupa apa beberapa arti string. Lakukan sesuatu seperti yang "Create" : {"message": "Create", "description": "text on the button that opens the editor with a blank Foo"}mereka lakukan untuk melokalkan ekstensi Chrome misalnya. Atau buat file terpisah yang menyimpan komentar ini.
Boris
13

jQuery.i18n adalah plugin jQuery ringan untuk mengaktifkan internasionalisasi di halaman web Anda. Ini memungkinkan Anda untuk mengemas string sumber daya khusus dalam file '.properties', seperti di Paket Sumber Daya Java. Ini memuat dan mengurai paket sumber daya (.properties) berdasarkan bahasa atau bahasa yang disediakan yang dilaporkan oleh browser.

untuk mengetahui lebih banyak tentang ini, lihat Bagaimana menginternasionalkan halaman Anda menggunakan JQuery?

BalaKrishnan 웃
sumber
Tautannya hilang
Alexander Farber