Halo, Habr! Saya mempersembahkan kepada Anda terjemahan materi "Teknologi Pelokalan di Netflix" yang ditulis oleh tim Netflix tentang proses pelokalan internal dan program yang dirancang khusus untuk ini.

Program lokalisasi di Netflix didasarkan pada tiga prinsip: linguistik sempurna, suasana harmonis dalam tim, dan teknologi canggih.
Kami tidak takut untuk bereksperimen dan mencoba proses dan alat baru, untuk menentang norma-norma yang berlaku umum di lokalisasi - terima kasih untuk ini kami telah datang sejauh ini! Bekerja di Netflix berarti menjadi perintis.
Pada artikel ini, kita berbicara tentang dua teknologi yang akan membawa kita ke dominasi DUNIA ... Lebih lanjut lagi.
Netflix Global String Repository
Netflix tidak berhasil karena kami membuat konten berkualitas, tetapi karena kami mengirimkan konten itu. Sebagian besar keberhasilan adalah antarmuka pengguna (UI) yang intuitif, mudah digunakan, dan terlokalisasi. Netflix tersedia di berbagai platform: versi web, Apple iOS, Google Android, Sony PlayStation, Microsoft Xbox, Sony TV, Panasonic dan sebagainya. Masing-masing platform memiliki persyaratan sendiri untuk internalisasi, yang merupakan tantangan serius bagi tim kami.
Berikut adalah beberapa contoh di mana pelokalan UI diperlukan:
- tambahkan bahasa baru
- menambahkan fitur baru
- perubahan pada teks dan data yang ada
Terjemahan teks untuk UI bukan proses otomatis; selama penerjemahan, manajer pelokalan bekerja sama dengan tim pengembangan untuk memahami dengan jelas apa yang menjadi bagian dari baris ini atau itu, bahasa apa yang perlu diterjemahkan, dan pada waktu berapa file yang dilokalkan perlu disediakan. Itu menjadi jauh lebih rumit ketika beberapa fitur dikembangkan secara paralel dan dijalankan di cabang Git yang berbeda.
Setelah terjemahan selesai, aplikasi dirakit, diuji dan ditempatkan pada platform. Beberapa perangkat memerlukan konfirmasi pihak ketiga (misalnya, dari Apple). Semua ini memicu penundaan tenggat waktu yang tidak diinginkan. Terutama yang tidak menyenangkan adalah kasus perubahan darurat.
Tetapi bagaimana jika kita membuat proses lokalisasi terbuka untuk semua pemangku kepentingan - baik untuk tim pengembangan maupun untuk para pelokalisasi? Bagaimana jika kita tidak perlu lagi membangun kembali bangunan setiap kali kita membuat perubahan pada teks?
Untuk mengatasi masalah ini, kami mengembangkan repositori string UI global yang disebut Global String Repository; string lokal disimpan di sini, yang diganti ke lingkungan untuk eksekusi kode. Kami mengintegrasikan Global String Repository ke dalam proses pelokalan, sehingga mereka saling melengkapi.
Global String Repository memisahkan paket lokalisasi dan namespace (placeholder). Paket lokalisasi menyimpan semua data baris demi baris dalam semua bahasa. Placeholder adalah placeholder untuk paket yang sedang dikerjakan tim. Selama pengembangan, placeholder standar digunakan. Alur kerjanya terlihat seperti ini:
- Pengembang membuat perubahan ke versi bahasa Inggris dari string dalam paket (di namespace placeholder)
- Proses penerjemahan dimulai secara otomatis
- Ahli bahasa menyelesaikan terjemahan
- Penerjemah menyediakan kit placeholder
Ketika integrasi dengan Global String Repository terjadi, ada dua jenis perilaku aplikasi:
- Saat runtime: memungkinkan Anda dengan cepat melakukan perubahan pada UI
- Selama perakitan: menggunakan Global String Repository secara terpisah untuk pelokalan, dan paket data dengan perakitan (build)
Global String Repository memungkinkan integrasi selama fase pembangunan dengan menyediakan akses ke data yang dilokalkan melalui REST API.
Kami membuka Global String Repository melalui Netflix API, sehingga penskalaan dan persyaratan yang sama berlaku untuk itu sebagai metadata dari API lain. Untuk aplikasi yang berintegrasi pada saat run time, ini adalah bagian penting. Kami memiliki 60 juta pengguna yang menjalankan Netflix di perangkat yang berbeda, sehingga Global String Repository adalah prioritas.
Seperti Netflix, Global String Repository memiliki arsitektur microservice. Microservice adalah aplikasi web Java (dijalankan di Apache Cassandra dan ElasticSearch) yang dihosting di tiga wilayah AWS. Kami mengumpulkan statistik untuk setiap permintaan API.
Antarmuka Global String Repository dikembangkan di Node.js, Bootstrap, dan Backbone dan di-host di AWS.
Di sisi pengguna, Global String Repository menggunakan REST API untuk mengambil data dan menawarkan klien Java dengan caching bawaan.
Terlepas dari kenyataan bahwa kami telah menempuh perjalanan jauh dan secara aktif mengembangkan Global String Repository, kami memiliki sesuatu untuk diperjuangkan. Inilah yang sedang kami kerjakan sekarang:
- Kami mengembangkan dukungan untuk string dengan variabel numerik dan string dengan pengidentifikasi gender
- Kami mengembangkan kekuatan dari solusi teknis kami
- Meningkatkan proses penskalaan
- Kami mendukung ekspor ke berbagai format (Android XML, Microsoft .Resx, dll.)
Global String Repository tidak terkait dengan domain bisnis Netflix, jadi kami berencana untuk merilisnya sebagai perangkat lunak sumber terbuka.
Hydra
Netflix - layanan global yang mendukung banyak lokal dalam berbagai kombinasi berbeda pada perangkat / UI yang berbeda; pengujian manual tidak sesuai dalam kasus ini. Sebelumnya, tim pelokalan dan pengembang UI menguji semuanya secara manual pada perangkat yang berbeda - dari konsol hingga iOS dan Android; ini adalah bagaimana kami memeriksa semua baris untuk kesesuaian dengan konteks dan UI (misalnya, jika ada "pemangkasan" teks).
Tetapi filosofi Netflix adalah bahwa kami berusaha untuk menjadi yang terbaik. Pendekatan ini memungkinkan kita untuk memikirkan kembali apa yang kita lakukan. Jadi Hydra lahir.
Tugas Hydra adalah membuat katalog semua opsi yang memungkinkan untuk layar unik yang akan menunjukkan dengan tepat layar yang diperlukan (pencarian dilakukan oleh filter, misalnya, Anda dapat memilih perangkat dan lokal). Misalnya, sebagai spesialis dalam pelokalan Jerman, Anda dapat mengonfigurasi pemfilteran sehingga Anda melihat keseluruhan jalur yang dilalui pengguna yang tidak terdaftar di PS3, situs web, dan Android. Layar yang sama dapat dilihat pada kecepatan di mana pengguna akan membukanya di perangkatnya.
Bekerja dengan layar di Hydra
Hydra tidak bekerja dengan layar secara langsung; ini berfungsi untuk katalog dan menampilkannya. Untuk mengambil tampilan layar dari katalog Hydra, kami menggunakan model otomatisasi UI kami. Dengan Jenkins CI, pengujian berbasis data dijalankan secara paralel di semua lokal yang didukung: ini membuat tangkapan layar yang dipublikasikan ke Hydra dengan metadata yang sesuai (nama halaman, area fungsi, platform UI, dan satu bagian penting metadata - definisi unik di layar).
Definisi layar yang unik diperlukan untuk menyusun katalog layar lengkap tanpa kecocokan salah. Ini memungkinkan Anda untuk membandingkan jumlah layar yang lebih besar dalam jangka panjang, karena gambar setiap layar dibandingkan dengan dirinya sendiri. Definisi layar unik berbeda dari UI ke UI; untuk browser, ini adalah kombinasi dari nama halaman, browser, resolusi, lingkungan lokal, dan lingkungan pengembangan.
Teknologi
Hydra adalah aplikasi web penuh-tumpukan AWS. Java back-end memiliki dua fungsi utama: Java memproses screenshot yang masuk dan menyediakan data untuk back-end melalui REST API.

Ketika otomatisasi UI mengirimkan layar ke Hydra, file gambar itu sendiri ditulis ke S3, yang memastikan penyimpanannya tak terbatas (plus atau minus), dan metadata yang jauh lebih kecil ditulis ke database RDS, sehingga nantinya dapat diminta melalui REST API. REST endpoints (REST endpoints) menampilkan parameter string kueri untuk kueri MySQL.
Sebagai contoh:
REST/v1/lists/distinctList?item=feature&selectors=uigroup,TVUI;area,signupwizard;locale,da-DK
Permintaan ini berisi parameter untuk memilih data yang diperlukan dari Database:
select distinct feature where uigroup = 'TVUI' AND area = 'signupwizard' AND locale = 'da-DK'
Front-end JavaScript, yang menggunakan knockout.js, memungkinkan pengguna untuk memilih filter dan melihat layar yang cocok dengan filter tersebut. Konten filter, serta layar yang sesuai dengan filter yang dipilih, disediakan oleh panggilan ke titik akhir REST yang disebutkan di atas.
Penskalaan aplikasi
Setelah menginstal Hydra dan memulai otomatisasi, menambahkan lokal baru semudah menambahkan satu baris ke file properti yang ada, yang dikirim ke Penyedia Data kerangka testNG. Layar dengan lokal baru akan ditampilkan dengan bangunan Jenkins yang berfungsi sebagai berikut.
Apa selanjutnya
Kita perlu mengimplementasikan fungsi yang akan memberi tahu bahwa layar telah berubah. Saat ini, jika garis berubah, tidak ada yang secara otomatis memberitahukan hal ini. Hydra dapat berubah menjadi antrian yang kurang lebih berfungsi, dan kemudian para ahli pelokalan akan dapat masuk ke sistem dan hanya melihat satu set layar spesifik yang telah berubah.
Fitur lain adalah kemampuan untuk memetakan setiap baris kunci yang ingin ditampilkan layar. Ini akan memungkinkan penerjemah untuk mengubah baris, dan kemudian melakukan pencarian kunci dan melihat layar yang terpengaruh oleh perubahan ini; jadi penerjemah akan melihat bagaimana baris ini berubah sesuai konteks sebelumnya.
Kami tidak takut untuk memecahkan masalah yang kompleks. Netflix akan menjadi layanan global, dan tim lokalisasi kami akan berkembang. Tantangan seperti itu memungkinkan kami untuk menarik orang-orang paling berbakat, dan kami membuat tim yang bisa melakukan apa yang dianggap mustahil.