{name} di salinan terjemahannya hilang, bagaimana cara menghentikannya sebelum online
Jika {name} hilang dalam salinan terjemahan, kesalahan akan terjadi secara online. Penilaian biasa tidak dapat diandalkan. Artikel ini menggunakan pustaka standar Python string.Formatter.parse untuk menyusun placeholder verifikasi, dengan contoh sintesis yang benar dan salah, skrip yang dapat dieksekusi secara langsung, dan batasan tinjauan manual.
Dalam salinan terjemahan, variabel seperti {name} sering diterjemahkan bersama-sama, dan halaman sering kali tidak melaporkan kesalahan hingga nilainya benar-benar terisi. Jika Anda hanya mengandalkan mata manusia atau ekspresi reguler untuk memeriksa kurung kurawal sebelum online, mudah untuk melewatkannya. Artikel ini ditujukan untuk pengembang dan editor yang bertanggung jawab atas pelokalan, templat, dan pemeriksaan pengiriman. Panduan ini memperkenalkan cara menggunakan pustaka standar Python string.Formatter.parse untuk melakukan verifikasi terstruktur pada placeholder, dan menjelaskan situasi mana yang masih memerlukan tinjauan manual.
Setelah membaca, Anda bisa mendapatkan ide verifikasi yang bisa langsung dijalankan: verifikasi identitas bidang, frekuensi kemunculan, dan spesifikasi format saat terjemahan dikirimkan, daripada menunggu hingga masalahnya ditemukan secara online. Contohnya menggunakan sampel sintetis dan kodenya telah diperiksa di lingkungan yang terisolasi, namun hal ini tidak menjamin semua file atau performa produk sebenarnya. Sebelum memproses dokumen penting, harap simpan dokumen asli dan pelajari sesuai dengan batasan dan item penerimaan di bawah ini.
Placeholder hilang setelah terjemahan? Kesimpulan satu kalimat
Pertama, gunakan penguraian terstruktur untuk mengekstrak bidang dalam string format, lalu membandingkannya satu per satu dengan bidang salinan sumber; jika nama kolom, waktu kemunculan, atau spesifikasi format tidak konsisten, maka akan langsung ditolak, dan penyesuaian urutan kata akan diserahkan kepada tinjauan manual.
| situasi Anda | Praktik yang direkomendasikan | alasan |
|---|---|---|
| Nama variabel dalam terjemahan diterjemahkan | Pulihkan nama bidang antarmuka sebelum pengiriman | Nama variabel milik kontrak antarmuka. Setelah perubahan, kesalahan akan dilaporkan saat mengisi nilai pada halaman. |
| Terjemahan tidak memiliki kolom dengan nama yang sama satu kali | Tolak artikel tersebut dan periksa apakah ada terjemahan yang hilang | Jumlah kemunculan di bidang yang sama juga merupakan bagian dari kontrak |
| Hanya posisi lapangan yang disesuaikan | Terimalah, apakah urutan kata bacaannya natural | Perubahan urutan field biasanya tidak mempengaruhi hasil pengisian nilai |
| Spesifikasi format seperti tempat desimal telah berubah | Penandaan tidak konsisten, konfirmasikan sesuai protokol lokalisasi | Spesifikasi format juga dilindungi, dan apakah perubahan diperbolehkan perlu diputuskan melalui kesepakatan. |
Pilih sintaks format terlebih dahulu
Artikel ini hanya membahas placeholder gaya Python str.format dan tidak mencakup string templat JavaScript, ICU MessageFormat, atau sistem placeholder lainnya. Sistem yang berbeda memiliki aturan penyarangan, pelolosan, dan pluralisasi yang sangat berbeda, dan satu ekspresi reguler tidak dapat mengklaim mendukung semuanya. Contoh ini memerlukan penggunaan bidang bernama dan menolak bidang bernomor otomatis (seperti {}).
Penjelasan lengkap tentang sintaks bidang dapat ditemukan di String Python dan dokumentasi Formatter.
Tanda kurung kurawal yang dihilangkan bukan merupakan variabel
{{name}} mewakili teks tampilan {name} dan tidak boleh dihitung sebagai bidang. Mungkin juga ada bidang bersarang dalam spesifikasi format, seperti {value:{width}}. Kode di bawah ini membaca spesifikasi secara rekursif dan menghitung kemunculan berulang pada bidang yang sama.
from string import Formatter
from collections import Counter
def contract(text, depth=0):
if depth > 5:
raise ValueError("nested format budget")
result = Counter()
for literal, field, spec, conversion in Formatter().parse(text):
if field is None:
continue
if not field or field != field.strip():
raise ValueError("named field without surrounding whitespace required")
result[(field, conversion, spec)] += 1
if spec:
result.update(contract(spec, depth + 1))
return result
assert contract("Hi {name}, total {amount:.2f}") == contract("{name}:金额 {amount:.2f}")
assert contract("{{name}}") == Counter()
assert contract("{name} {name}") != contract("{name}")
assert contract("{value:{width}}")[("width", None, "")] == 1
assert contract("{amount:.2f}") != contract("{amount:.0f}")
for bad in ["Hi {name", "{ name}", "{}"]:
try:
contract(bad)
except ValueError:
pass
else:
raise AssertionError("invalid template accepted")
Kontrak ini sengaja dibuat ketat
Spesifikasi format juga dianggap sebagai konten yang dilindungi di sini, sehingga perubahan jumlah desimal akan ditandai. Beberapa tugas pelokalan memang memerlukan perubahan cara angka disajikan, dalam hal ini Anda harus membuat aturan terpisah untuk hal tersebut daripada membatalkan semua pemeriksaan placeholder. Batas kedalaman sarang dalam contoh adalah anggaran demonstrasi dan bukan merupakan persyaratan spesifikasi bahasa.
Tabel berikut mencantumkan beberapa tipe umum perubahan dan metode penanganannya yang terkait:
| mengubah | Hasil dari contoh ini | tindakan peninjauan |
|---|---|---|
| Ubah bidang | menerima | Apakah urutan kata dalam bacaannya natural? |
| Bidang yang sama hilang satu kali | menolak kontrak | Periksa terjemahan yang hilang |
| Nama variabel diterjemahkan | menolak kontrak | Nama bidang antarmuka pemulihan |
| Perubahan spesifikasi desimal | Tag tidak konsisten | Konfirmasikan sesuai perjanjian lokalisasi |
📊 Perbandingan inti
| Ubah jenis | Apakah lolos verifikasi | Tindakan tindak lanjut |
|---|---|---|
| Ubah bidang | lulus | Apakah urutan kata dalam bacaannya natural? |
| Bidang yang sama hilang satu kali | gagal | Periksa terjemahan yang hilang |
| Nama variabel diterjemahkan | gagal | Nama bidang antarmuka pemulihan |
| Perubahan spesifikasi desimal | Tandai sebagai tidak konsisten | Konfirmasikan sesuai perjanjian lokalisasi |
🎯 Metode mana yang cocok untuk Anda?
Jika Anda bertanggung jawab atas pengiriman terjemahan
Jalankan pemeriksaan struktur sebelum pengiriman dan kembalikan entri yang ditolak ke penerjemah dengan nama bidang yang hilang atau diubah.
Jika Anda bertanggung jawab atas templat dan antarmuka
Perjelas nama bidang mana yang termasuk dalam kontrak antarmuka dan cantumkan nama tersebut dalam petunjuk pengiriman untuk memudahkan perbandingan oleh penerjemah dan pengulas.
Jika Anda perlu mengubah cara penyajian angka
Kembangkan protokol pelokalan secara terpisah untuk spesifikasi format dan tambahkan ke aturan verifikasi alih-alih mematikan pemeriksaan keseluruhan.
❓ Pertanyaan yang Sering Diajukan (FAQ)
1. Bisakah metode ini menangani templat JavaScript atau Format Pesan ICU?
tidak bisa. Artikel ini hanya berfokus pada bidang bernama gaya Python str.format. Aturan bersarang, pelolosan, dan pluralisasi sistem lain perlu diproses secara terpisah.
2. Apakah {{name}} akan diperiksa sebagai variabel?
Tidak akan. Ini mewakili teks tampilan {name}, yang tidak dihitung sebagai bidang saat diuraikan.
3. Jika saya hanya mengatur posisi field pada kalimat apakah akan ditolak?
Tidak akan. Perubahan posisi bidang diterima dalam kasus ini, dan kemudian dibaca secara manual untuk melihat apakah urutan kata tersebut natural.
4. Dapatkah saya menghubungi format secara langsung untuk memverifikasi terjemahannya?
Kode pada artikel ini hanya melakukan parsing dan tidak memanggil format untuk mengisi objek. Ini bukan kotak pasir keamanan templat. Render berikutnya juga memerlukan pembatasan pada bidang yang tersedia, akses objek, dan konteks keluaran, terutama pelolosan aturan di halaman HTML.
📝 Ringkasan
Menggunakan penguraian terstruktur untuk memeriksa placeholder selama pengiriman terjemahan dapat mencegah masalah dengan nama bidang, waktu, dan spesifikasi format sebelum online. Kefasihan bahasanya masih perlu dinilai secara terpisah oleh pengulas.


