[ English | 中文 (简体, 中国) | русский | português (Brasil) | नेपाली | 한국어 (대한민국) | Indonesia | français | español | esperanto | English (United Kingdom) | Deutsch ]
Terjemahan di Horizon¶
Apa gunanya menerjemahkan kode saya?¶
Anda memperkenalkan sepotong kode yang luar biasa dan menikmati pencapaian gemilang Anda. Tiba-tiba dunia Anda runtuh ketika sebuah core memberi Anda -1 karena kode Anda tidak diterjemahkan. Apa yang menyebabkannya?
Jika Anda menulis perangkat lunak untuk audiens global, Anda harus memastikan bahwa itu diterjemahkan sehingga orang lain di seluruh dunia dapat menggunakannya. Menambahkan terjemahan ke kode Anda tidak terlalu sulit dan persyaratan untuk horizon.
Jika Anda tertarik untuk berkontribusi terjemahan, Anda mungkin ingin menyelidiki Zanata dan upstream translations. Anda dapat mengunjungi saluran IRC proyek internasionalisasi #openstack-i18n, jika Anda memerlukan bantuan lebih lanjut.
Tinjauan Umum dan Arsitektur¶
Anda dapat melewati bagian ini jika Anda hanya tertarik mempelajari cara menggunakan terjemahan. Bagian ini menjelaskan dua komponen utama untuk terjemahan: ekstraksi pesan dan substitusi pesan. Kami akan membahas secara singkat apa yang masing-masing lakukan untuk terjemahan secara keseluruhan.
Ekstraksi Pesan¶

Ekstraksi pesan adalah proses mengumpulkan string yang dapat diterjemahkan dari kode. Diagram di atas menunjukkan aliran bagaimana pesan diekstraksi dan kemudian diterjemahkan. Mari kita bagi ini menjadi beberapa langkah yang bisa kita ikuti:
Langkah pertama adalah menandai string yang tidak diterjemahkan sehingga extractor dapat menemukannya. Lihat panduan di bawah ini tentang cara menggunakan terjemahan dan seperti apa bentuk marker ini.
Setelah ditandai, kita dapat menjalankan
tox -e manage -- extract_messages
, yang mencari basis kode untuk marker ini dan mengekstraknya menjadi file Portable Object Template (POT). Di horizon, kami mengekstrak dari folderhorizon
dan folderopenstack_dashboard
. Kami menggunakan AngularJS extractor untuk JavaScript dan file HTML dan Django extractor untuk templat Python dan Django; kedua ekstraktor adalah plugin Babel.Untuk memperbarui file .po, Anda dapat menjalankan
tox -e manage -- update_catalog
untuk memperbarui file .po untuk setiap bahasa, atau Anda dapat menentukan bahasa tertentu untuk diperbarui seperti ini:tox -e manage -- update_catalog de
. Ini berguna jika Anda ingin menambahkan beberapa string translatabale tambahan untuk kustomisasi hilir.
Catatan
Saat mendorong kode ke atas, satu-satunya persyaratan adalah menandai string dengan benar. Semua pembuatan file POT dan PO ditangani oleh pekerjaan hulu harian. Informasi lebih lanjut dapat ditemukan di translation infrastructure documentation.
Substitusi Pesan¶

Substitusi pesan bukanlah proses kebalikan dari ekstraksi pesan. Prosesnya sama sekali berbeda. Mari kita berjalan melalui proses ini.
Ingat marker yang kita bicarakan sebelumnya? Kebanyakan dari mereka adalah fungsi seperti gettext atau salah satu variannya. Ini memungkinkan fungsi untuk melayani tujuan ganda - bertindak sebagai penanda (marker) dan juga sebagai pengganti (replacer).
Agar terjemahan berfungsi dengan baik, kita perlu mengetahui lokal pengguna. Di horizon, pengguna dapat menentukan lokal menggunakan panel Setting. Setelah kami tahu lokalnya, kami tahu file Portable Object (PO) mana yang akan digunakan. File PO adalah file yang kami terima dari penerjemah dalam proses ekstraksi pesan. Fungsi gettext dimana kita membungkus kode kita, kemudian fungsi gettext dapat mengganti string yang tidak diterjemahkan dengan penterjemah yang menggunakan string yang tidak diterjemahkan sebagai id pesan.
Untuk terjemahan sisi klien, Django menyematkan katalog pesan Django yang sesuai. Kode Javascript pada klien dapat menggunakan katalog ini untuk melakukan penggantian string yang mirip dengan cara kerja terjemahan sisi server.
Jika Anda membuat proyek dan perlu tahu cara membuatnya diterjemahkan, silakan merujuk this guide.
Membuat string dapat diterjemahkan¶
Untuk membuat string Anda dapat diterjemahkan, Anda harus menandainya sehingga horizon dapat menemukan dan mengekstraknya ke file POT. Ketika pengguna dari lokal lain mengunjungi halaman Anda, string Anda diganti dengan versi terjemahan yang benar.
Dalam Django¶
Untuk menerjemahkan string, cukup bungkus (wrap) salah satu varian gettext di sekitar string. Contoh di bawah ini menunjukkan kepada Anda bagaimana melakukan terjemahan untuk berbagai skenario, seperti interpolasi, penanda kontekstual dan komentar terjemahan.
from django.utils.translation import gettext as _
from django.utils.translation import ngettext
from django.utils.translation import pgettext
class IndexView(request):
# Single example
_("Images")
# Plural example
ngettext(
"there is %(count)d object",
"there are %(count)d objects",
count) % { "count": count }
# Interpolated example
mood = "wonderful"
output = _("Today is %(mood)s.") % mood
# Contextual markers
pgettext("the month name", "May")
# Translators: This message appears as a comment for translators!
gettext("Welcome translators.")
Catatan
In the example above, we imported gettext
as _
. This is a common
alias for gettext or any of its variants.
Dalam template Django¶
Untuk menggunakan terjemahan dalam templat Anda, pastikan Anda memuat modul i18n. Untuk menerjemahkan satu baris teks, gunakan tag templat trans
. Jika Anda perlu menerjemahkan blok teks, gunakan tag template blocktrans
.
Terkadang, sangat membantu untuk menyediakan beberapa konteks melalui tag template comment
. Ada sejumlah tag dan filter lain yang Anda inginkan jika Anda perlu menggunakannya. Untuk informasi lebih lanjut, lihat Django docs
{% extends 'base.html' %}
{% load i18n %}
{% block title %}
{% trans "Images" %}
{% endblock %}
{% block main %}
{% comment %}Translators: Images is an OpenStack resource{% endcomment %}
{% blocktrans with amount=images.length %}
There are {{ amount }} images available for display.
{% endblocktrans %}
{% endblock %}
Dalam JavaScript¶
Katalog pesan Django disuntikkan (injected) ke front-end. Fungsi gettext tersedia sebagai fungsi global sehingga Anda bisa menggunakannya secara langsung. Jika Anda menulis kode AngularJS, kami lebih suka Anda menggunakan layanan gettext, yang pada dasarnya adalah pembungkus di sekitar fungsi gettext.
Angular
.module(myModule)
.controller(myCtrl);
myCtrl.$inject = [
"horizon.framework.util.i18n.gettext"
];
function myCtrl(gettext) {
var translated = gettext("Images");
}
Peringatan
Untuk lokalisasi dalam file AngularJS, gunakan layanan AngularJS horizon.framework.util.i18n.gettext
. Pastikan ketergantungan yang disuntikkan bernama gettext
atau nggettext
. Jika Anda tidak melakukan ini, ekstraksi pesan tidak akan berfungsi dengan baik!
Dalam template AngularJS¶
Untuk menggunakan terjemahan dalam template AngularJS Anda, gunakan tag terjemahan atau filter terjemahan. Perhatikan bahwa kita menggunakan angular-gettext <https://angular-gettext.rocketeer.be/> _ untuk substitusi pesan tetapi tidak untuk ekstraksi pesan.
<translate>Directive example</translate>
<div translate>Attribute example</div>
<div translate>Interpolated {{example}}</div>
<span>{$ 'Filter example'| translate $}</span>
<span translate>
This <em>is</em> a <strong>bad</strong> example
because it contains HTML and makes it harder to translate.
However, it will still translate.
</span>
Catatan
Anotasi dalam contoh di atas dijamin berfungsi. Namun, tidak semua anotasi angular-gettext didukung karena kami menulis ekstraktor babel kustom kami sendiri. Jika Anda memerlukan dukungan untuk anotasi, tanyakan IRC di ruang #openstack-horizon atau laporkan bug. Perhatikan juga bahwa Anda harus menghindari menyisipkan fragmen HTML ke dalam teks Anda karena itu membuat penerjemahan menjadi lebih sulit. Gunakan penilaian terbaik Anda jika Anda benar-benar perlu memasukkan HTML.
Alat terjemahan semu¶
Alat terjemahan semu dapat digunakan untuk memverifikasi bahwa kode siap diterjemahkan. Alat semu ini menggantikan terjemahan bahasa dengan terjemahan palsu yang lengkap. Kemudian Anda dapat memverifikasi bahwa kode Anda menampilkan terjemahan palsu dengan benar untuk memvalidasi bahwa kode Anda siap untuk terjemahan.
Menjalankan alat terjemahan semu¶
Pastikan file .pot Anda terbaru
$ tox -e manage -- extract_messages
Jalankan alat pseudo (semu) untuk membuat terjemahan pseudo (semu). Contoh ini menggantikan terjemahan Jerman dengan terjemahan semu
$ tox -e manage -- update_catalog de --pseudo
Kompilasi katalog
$ tox -e manage -- compilemessages
Jalankan server pengembangan Anda.
$ tox -e runserver
Masuk dan ubah ke bahasa yang Anda pseudo terjemahkan.
Seharusnya terlihat aneh. Lebih khusus lagi, segmen yang diterjemahkan akan mulai dan diakhiri dengan braket dan mereka akan memiliki beberapa karakter tambahan. Misalnya, "Log In" akan menjadi "[~Log In~您好яшçあ]" Ini berguna karena Anda dapat memeriksa hal-hal berikut, dan mempertimbangkan apakah kode Anda berfungsi seperti seharusnya:
Jika Anda melihat string dalam bahasa Inggris, itu tidak dapat diterjemahkan. Haruskah begitu?
Jika Anda melihat tanda kurung di samping satu sama lain yang mungkin merupakan gabungan. Penggabungan dapat membuat terjemahan yang berkualitas menjadi sulit atau tidak mungkin. Lihat Use string formatting variables, never perform string concatenation untuk informasi tambahan.
Jika ada wrapping/truncation yang tidak terduga, mungkin tidak ada cukup ruang untuk terjemahan.
Jika Anda melihat string dalam bahasa terjemahan yang tepat, itu berasal dari sumber eksternal. (Itu tidak buruk, kadang-kadang hanya berguna untuk mengetahui)
Jika Anda mendapatkan crash baru, mungkin ada bug.
Jangan lupa untuk menghapus file pseudo yang diterjemahkan .pot
atau .po
. Itu not harus diserahkan untuk ditinjau.