
Apa yang terjadi ketika produk Anda mulai dijual di negara lain dengan bahasa dan karakteristik budayanya sendiri? Kemungkinan besar, lokalisasi menunggunya. Dalam kebanyakan kasus, hanya perlu menerjemahkan file sumber daya sehingga menu dan elemen antarmuka dalam bahasa yang akrab bagi pengguna. Tetapi apa yang harus dilakukan jika dasar dari apa yang Anda jual adalah data, yang jumlahnya banyak, mereka tiba secara konstan, dalam volume besar dan memerlukan terjemahan reguler. Dan bukan hanya satu bahasa, tetapi beberapa bahasa sekaligus.
Di bawah potongan Anda akan menemukan cerita tentang bagaimana masalah ini diselesaikan di 2GIS. Saya akan memberi tahu Anda dengan contoh kasus terakhir dengan Dubai, tetapi praktiknya berlaku untuk bahasa apa pun.
Tentang bahasa Arab
Seluruh cerita ini dimulai dengan fakta bahwa 2GIS diluncurkan di Dubai, di mana dua bahasa digunakan: Arab dan Inggris.
Akurasi data yang tinggi adalah nilai terpenting perusahaan. Ini dicapai dengan kerja manual para kartografer dan spesialis di lapangan. Di Dubai, di mana spesialis lokal dan pengguna akhir tahu bahasa Inggris, awalnya data dimasukkan hanya di dalamnya. Dalam proses pertumbuhan, mereka memutuskan untuk tidak berhenti di situ dan menambahkan bahasa Arab.
Fiji
Untuk pekerjaan kartografer, kami memiliki perangkat lunak kami sendiri. Benda ini disebut Fiji dan berfungsi sebagai sistem master untuk mengumpulkan data peta.
Kami sudah menulis bagaimana Fiji membantu pembuat peta mengedit rumah dan menggambar jalan. Data yang diunggah dari Fiji setelah pemrosesan dan persiapan masuk ke produk akhir untuk menyenangkan pengguna. Dalam artikel itu, saya berbicara tentang apa yang kami terapkan di Fiji untuk mengedit / menyimpan / menampilkan data multibahasa.
Ketentuan
Dalam tim kami menggunakan kosakata tertentu. Di bawah ini adalah empat contoh ↓
Sistem mendukung kerja dengan dua jenis bahasa:
Bahasa
metadata - bahasa di mana semua kontrol pengguna ditampilkan: UI, metadata.
Bahasa
data - bahasa di mana nilai atribut geo-objek, beberapa direktori dan klasifikasi ditampilkan.
Bahasa terkait dengan wilayah. Suatu wilayah dapat memiliki dua jenis bahasa:
Bahasa utama wilayah itu adalah bahasa yang secara resmi diadopsi di wilayah itu.
Bahasa tambahan di wilayah ini adalah bahasa tempat kami ingin merilis produk. Itu datang selain yang utama.
Bahasa dan dialek
Dialek-dialek yang diadopsi di berbagai daerah di negara itu dapat sangat bervariasi. Oleh karena itu, dalam beberapa sistem, inti bahasa (= versi dasar) dan dialek disimpan secara terpisah, dan kemudian ketika membongkar merjat mereka. Bagi kami, pendekatan ini tampak sangat rumit, jadi kami memutuskan untuk menganggap setiap dialek sebagai bahasa independen.
Nuansa terkait dengan bahasa dan dialek Arab. Untuk setiap bahasa, Anda harus memasukkan bendera arah carriage dengan dua nilai: dari kiri ke kanan dan dari kanan ke kiri. Secara default, carriage harus bergerak dari kiri ke kanan. Jika nilainya diatur dari kanan ke kiri, maka Anda perlu mengubah arah carriage untuk semua bidang multibahasa yang dapat diedit. Bagaimana ini dilakukan dalam produk akhir ditulis di
sini . Kami harus melakukan hal yang sama.
Jepret ke Wilayah
Seluruh dunia kita dibagi menjadi wilayah-wilayah tertentu - ini mungkin negara, wilayah, wilayah. Untuk setiap wilayah kami tentukan beberapa bahasa, salah satunya dianggap sebagai bahasa utama, dan sisanya - tambahan. Penerjemahan berlangsung dari bahasa utama ke bahasa lain.
Sebagai contoh, dalam kasus Dubai, kami meninggalkan bahasa Inggris sebagai bahasa utama, karena memiliki banyak data. Bahasa Arab dibuat opsional.
Masukkan dan ubah bahasa
Agar para kartografer dapat bekerja dengan nyaman, kami mendesain ulang antarmuka kami di tempat-tempat di mana input multibahasa dimaksudkan.

Dalam gambar ini, Anda dapat melihat bahwa kami telah membagi bahasa menjadi tab, di mana yang paling kiri adalah bahasa utama, dan kemudian ada bahasa tambahan.
Di tab bahasa tambahan, hanya bidang-bidang yang tersedia untuk pengeditan yang memiliki bendera untuk keperluan terjemahan dalam basis data. Ini berfungsi sebagai tindakan perlindungan dan membantu memusatkan perhatian pengguna pada terjemahan data yang diperlukan. Yang lainnya diedit dalam bahasa utama.

Bahkan, mengedit data dalam bahasa tambahan mungkin diperlukan hanya jika pembuat peta sendiri tahu beberapa bahasa dan tidak ingin menggunakan bantuan penerjemah. Untuk semua orang, ada CrowdIn.
Crowdin, atau transfer aliran
Jadi, kami telah memungkinkan kartografer kami untuk mengisi data dalam berbagai bahasa. Tetapi jauh lebih baik untuk menyerahkan tugas terjemahan kepada para profesional.
Hal pertama yang terlintas dalam pikiran ketika menerjemahkan aplikasi adalah memberikan file sumber kepada penerjemah dan setelah mentransfer unduh kembali.
Dalam hal ini, platform CrowdIn banyak membantu kami. Ini memungkinkan Anda untuk mengarahkan file Anda ke penerjemah profesional. Satu-satunya yang tersisa adalah mengintegrasikan data yang diterjemahkan ke dalam sistem kami.
Situasi menjadi rumit oleh kenyataan bahwa data datang kepada kami dalam aliran yang berkelanjutan, oleh karena itu kami ingin menerima terjemahan secara terus menerus.
Kami mengoptimalkan sistem sebagai berikut: jika perubahan dilakukan dalam bahasa utama wilayah, kami mengunggah perubahan untuk terjemahan ke semua bahasa tambahan di wilayah ini. Kami membuat pengecualian untuk kasus-kasus ketika kartografer sendiri yang menerjemahkan. Di sini kami percaya bahwa ia mengerti apa yang ia lakukan, dan tidak perlu menghubungkan seorang juru bahasa.
Untuk setiap direktori atau objek peta, kami memiliki versi ujung ke ujung, yang ditambahkan setiap pembaruan data. Jadi kita dapat dengan cepat mendapatkan semua perubahan dari versi tertentu.
Sistem versi sangat sederhana dan efisien, tetapi memiliki kelemahan signifikan: pada kenyataannya, kami memiliki satu antrian dan kami tidak dapat mengelolanya dengan cara apa pun. Maksimum kami adalah untuk melewati versi. Ada kebutuhan untuk beralih ke antrian normal, misalnya, ke RabitMQ atau Kafka, tetapi tangan belum mencapai.
Untuk memperbarui konten dengan cepat, kami menulis layanan kecil yang berfungsi dalam tiga aliran.
Aliran pertama (Saver) mengeluarkan semua data yang membutuhkan terjemahan, dan menghasilkan file xml dari mereka.
Yang kedua (Ekspor) mengirimkannya ke CrowdIn dan menempatkan mereka ke dalam proyek yang diinginkan, yang menunjukkan bahasa utama dari mana kami menerjemahkan, dan daftar bahasa yang akan diterjemahkan.
Yang ketiga (Impor) melakukan polling API CrowdIn secara berkala untuk file yang terjemahannya telah dibuat dan diinstal 100%, dan mengimpor file yang sudah selesai ke dalam basis data kami.

Tanpa menyapu tidak bisa melakukan. Kami sengaja menemukan sistem versi data kami.
Ketika kami mengunduh terjemahan kata tersebut, versi data diperbarui dan kata tersebut jatuh lagi ke dalam terjemahan.
Untuk menghindari loop terjemahan tanpa akhir, kami mulai merekam data. Setiap kata yang diterjemahkan ditandai, yang menghilangkan pengiriman berulang ke CrowdIn.
Tutorial
Sekarang saya akan memberi tahu Anda bagaimana pekerjaan dengan CrowdIn terjadi. Ada beberapa cara untuk bekerja dengan platform, misalnya, Anda dapat mengunggah file ke repositori Git dan CrowdIn sendiri menghisapnya. Tetapi kami berpikir bahwa bekerja melalui API terlihat lebih nyaman.
CrowdIn memiliki
tutorial yang cukup rinci, tetapi di bawah ini saya akan menulis bagaimana kami melakukannya.
Kami perlu mendapatkan kunci API, yang akan kami lampirkan pada setiap permintaan kami, sehingga sistem memverifikasi kami. Kami pergi ke tab API di pengaturan proyek dan melihat apa yang tertulis di kolom kunci API.

Kunci ini harus ditambahkan di akhir setiap permintaan platform Anda. Misalnya, seperti ini:
DAPATKAN:
https://api.crowdin.com/api/project/{myLitleProject}/download/all.zip?key={project-key}
2. Buat folder tempat kami akan mengunggah file di dalam proyek.
var uri = $"project/{_projectName}/add-directory?key={apiKey}"; var content = new MultipartFormDataContent { { new StringContent(crowdInDirectoryPath), "name" } }; return PostAsync(uri, content);
Ada sedikit momen canggung. Kami menulis layanan, alangkah baiknya jika pada awalnya memeriksa untuk melihat apakah folder yang kami butuhkan ada sebelum mencoba membuatnya. CrowdIn tidak memiliki cara normal untuk memeriksa folder, jadi kami mengirim permintaan untuk membuat. Jika tidak ada, CrowdIn akan membuatnya dan mengembalikan kode 200. Jika ada folder, itu tidak akan membuat apa pun dan akan mengembalikan kode 500.
3. Ekspor file. Fungsi add-file memiliki banyak opsi dan parameter, cara membaca dan di mana. Di bawah ini adalah contoh bagaimana kami memuat data dengan file xml.
ContohKami memasukkan semua data yang akan kami terjemahkan ke file xml dengan struktur berikut.
<LocalizableDocument> <LocalizableValues> <LocalizableValue> … <Attributes> <LocalizableAttributeValue> <AttributeName/> <Value/> </LocalizableAttributeValue> </Attributes> </LocalizableValue> </LocalizableValues> </LocalizableDocument>
Agar CrowdIn mem-parsing data mana dari file yang perlu diterjemahkan, itu harus ditentukan. Untuk melakukan ini, Anda perlu menulis array dari parameter yang dapat diterjemahkan dengan lintasan ke elemen-elemen dokumen yang diperlukan ke dalam konten. Dalam kasus kami, terlihat seperti ini:
var uri = $"project/{_projectName}/add-file?key={apiKey}"; var content = new MultipartFormDataContent { { new StringContent("/LocalizableDocument/LocalizableValues/LocalizableValue/Attributes/LocalizableAttributeValue/Value"), "translatable_elements[0]" } }; foreach (var filePath in filePaths) { var fileName = Path.GetFileName(filePath); var fileStream = File.OpenRead(filePath); var fileContent = new StreamContent(fileStream); content.Add(fileContent, $"files[{_crowdInDirectoryPath}/{fileName}]", fileName); } return PostAsync(uri, content);
Harap dicatat: dokumentasi menyatakan bahwa CrowdIn dapat mengunyah maksimal 20 file sekaligus, sedangkan ukuran satu file tidak boleh melebihi 100 MB.
4. Kami mencari tahu file mana yang telah kami terjemahkan sepenuhnya. Kami melakukan ini menggunakan perintah untuk bahasa tertentu.
var uri = $"project/{_projectName}/language-status?key={apiKey}"; var content = new MultipartFormDataContent {{ new StringContent(langCode), "language" } }; return PostAsync(uri, content);
Platform akan mengembalikan kita sesuatu seperti ini:
<item> <node_type>directory</node_type> <id>29812</id> <name>Version 1.0</name> <files> <item> <node_type>file</node_type> <id>29827</id> <name>strings.xml</name> <node_type>file</node_type> <phrases>7</phrases> <translated>0</translated> <approved>0</approved> <words>32</words> <words_translated>0</words_translated> <words_approved>0</words_approved> </item> </files> </item>
Di sini kita tertarik pada nilai-nilai <diterjemahkan /> dan <disetujui />. Yang pertama menunjukkan persentase baris yang diterjemahkan dalam file ini, yang kedua menunjukkan persentase nilai yang disetujui jika, selain penerjemah, pengulas juga berpartisipasi dalam alur kerja. Bergantung pada alur kerja kami, misalnya, pada 100 kami mempertimbangkan dokumen tersebut diterjemahkan dan disetujui. Sekarang file ini dapat diimpor kembali kepada kami.
5. Impor file kembali ke sistem kami.
Ini dilakukan dengan permintaan GET sederhana.
https://api.crowdin.com/api/project/{_projectName}/export-file?file={_crowdInDirectoryPath}/{fileName}&language={langCode}&key={project-key}
File yang dihasilkan adalah deserialized dan data diimpor ke sistem kami.
Alih-alih sebuah kesimpulan
Secara umum, itu saja. Tentu saja, kami masih perlu memperbaiki tampilan tanda tangan di peta Fiji sehingga ditampilkan dalam bahasa yang tepat, tergantung pada wilayah apa yang sekarang diatur oleh kartografer. Penting untuk menyetujui dengan sistem lain bagaimana kami akan menyediakan mereka dengan data multibahasa, tetapi ini adalah cerita lain.
Sebagai hasilnya, kami menerima layanan dalam semangat "dihidupkan dan dilupakan". Kartografer memasukkan data, menerjemahkan penterjemah, syekh puas, layanan mengunggah data jika diperlukan, dan kami memecahkan masalah yang lebih mendesak tanpa memikirkan bagaimana sistem kami bekerja dalam beberapa bahasa.