Globalisasi: apa itu, i18n dan multibahasa dalam aplikasi

Penulis: IT Sectr Diterbitkan: 2026-02-26 Waktu membaca: 8 mnt

Globalisasi (globalisasi, juga internasionalisasi, i18n) — proses mempersiapkan aplikasi mobile untuk bekerja dengan beberapa bahasa dan format regional tanpa mengubah kode sumber. Meliputi ekstraksi sumber daya teks dari kode, dukungan untuk format tanggal, angka, dan mata uang yang berbeda, mempertimbangkan arah teks (LTR/RTL) dan adaptasi tata letak untuk berbagai bahasa. Di iOS digunakan NSLocalizedString dan Localizable.strings, di Android — strings.xml di direktori values-{lang}. Selengkapnya di dokumentasi Apple tentang internasionalisasi.

Utama

  • Globalisasi (i18n) — persiapan kode aplikasi untuk beberapa bahasa dan region
  • NSLocalizedString — makro Swift untuk mengambil string yang diterjemahkan dari Localizable.strings
  • strings.xml — file XML Android tempat menyimpan sumber daya string untuk setiap bahasa
  • RTL — dukungan untuk bahasa dengan tulisan kanan ke kiri (Arab, Ibrani, Urdu)
  • Format — tanggal, angka, dan mata uang harus diformat melalui API yang bergantung pada Locale

Apa itu Globalisasi (i18n) dan mengapa diperlukan?

Globalisasi (disingkat i18n — 18 huruf antara «i» dan «n») — persiapan arsitektural aplikasi untuk bekerja dengan bahasa dan region apa pun. Aturan utama i18n: tidak ada string teks yang boleh dikodekan secara tetap (hardcoded) dalam kode sumber. Sebagai gantinya, string diekstraksi ke file sumber daya, dan kode mengaksesnya melalui kunci. Saat menambahkan bahasa baru, cukup menambahkan file terjemahan — kode tetap tidak berubah. Ini membedakan i18n dari lokalisasi (l10n), di mana string itu sendiri yang diterjemahkan.

Argumen bisnis — globalisasi meningkatkan pasar. Menurut Common Sense Advisory (2023), lebih dari 70% pengguna lebih suka membeli di aplikasi dalam bahasa ibu mereka. Lokalisasi ke 10 bahasa meningkatkan audiens potensial sebesar 80%. Tanpa i18n, setiap perluasan ke bahasa baru memerlukan modifikasi kode, yang memperlambat masuk pasar dan meningkatkan biaya 5–10 kali lipat. Arsitektur i18n yang benar memungkinkan mendukung 40+ bahasa dengan biaya minimal.

Komponen i18n meliputi: eksternalisasi string (String externalization), pluralisasi (pluralization untuk 1/2/5+), pemformatan tanggal dan angka (DateFormatter/SimpleDateFormat), dukungan untuk bahasa RTL (Right-to-Left), pengurutan menurut aturan locale (Collator), simbol regional (pemisah ribuan, tanda desimal). Di IT Sectr, kami menerapkan i18n pada tahap arsitektur, bukan menambahkannya setelahnya — ini menghemat hingga 60% waktu saat lokalisasi selanjutnya.

Internasionalisasi di iOS: NSLocalizedString dan XLIFF

NSLocalizedString — makro utama Swift untuk bekerja dengan terjemahan. Format: NSLocalizedString(«key», comment: «deskripsi untuk penerjemah»). Makro secara otomatis mengganti string dari Localizable.strings untuk locale perangkat saat ini (NSLocale.preferredLanguages). Jika terjemahan untuk kunci tidak ditemukan, kunci itu sendiri atau nilai dalam development language (biasanya en) dikembalikan. Apple merekomendasikan penggunaan kunci yang bermakna, bukan string Inggris sebagai kunci.

swift
// Localizable.strings (en)
// "welcome_title" = "Selamat datang!";
// Localizable.strings (ru)
// "welcome_title" = "Selamat datang!";

// Kode Swift — seragam untuk semua bahasa
titleLabel.text = NSLocalizedString(
    "welcome_title",
    comment: "Judul layar selamat datang"
)

// Pluralisasi melalui Localizable.stringsdict
// 
// <dict>
//     <key>items_count</key>
//     <dict>
//         <key>NSStringLocalizedFormatKey</key>
//         <string>%#@items@</string>
//         <key>items</key>
//         <dict>
//             <key>one</key>
//             <string>%d produk</string>
//             <key>few</key>
//             <string>%d produk</string>
//             <key>many</key>
//             <string>%d produk</string>
//         </dict>
//     </dict>
// </dict>

// Penggunaan pluralisasi
let items = 5
let label = String.localizedStringWithFormat(
    NSLocalizedString("items_count", comment: ""), items
)

XLIFF — format pertukaran terjemahan antara pengembang dan penerjemah. Xcode mengekspor file XLIFF (Editor → Export for Localization) yang berisi semua string untuk diterjemahkan. Penerjemah bekerja dengan XLIFF di alat CAT (Trados, memoQ, Smartcat). Setelah diterjemahkan, XLIFF diimpor kembali ke Xcode (Editor → Import Localizations). XLIFF secara otomatis memperbarui semua direktori .lproj. Ini adalah alur kerja standar lokalisasi aplikasi iOS di produksi.

SwiftUI dan i18n

SwiftUI bekerja dengan NSLocalizedString melalui inisialisator Text. Teks di SwiftUI secara otomatis diinternasionalisasi: Text(«welcome_title») mencari terjemahan di Localizable.strings seperti NSLocalizedString. Untuk pluralisasi gunakan Text(«%d items», count: items). SwiftUI mendukung pemformatan tanggal melalui Text(date, style: .date) — secara otomatis menggunakan Locale.current. Apple merekomendasikan SwiftUI untuk proyek baru, karena internasionalisasi di dalamnya lebih transparan.

Internasionalisasi di Android: strings.xml dan RTL

Android i18n dibangun di atas sistem sumber daya. String diekstraksi ke res/values/strings.xml untuk bahasa default (biasanya Inggris). Untuk setiap bahasa dibuat direktori terpisah: res/values-ru/strings.xml (Rusia), res/values-de/strings.xml (Jerman), res/values-fr/strings.xml (Prancis). Android secara otomatis memilih string berdasarkan bahasa sistem perangkat (Locale.getDefault()). Jika locale yang tepat tidak ada, versi dasar (values/strings.xml) digunakan.

kotlin
// res/values/strings.xml (Inggris, default)
<resources>
    <string name="welcome_title">Welcome!</string>
    <string name="items_count">%d item(s)</string>
</resources>

// res/values-ru/strings.xml (Rusia)
<resources>
    <string name="welcome_title">Selamat datang!</string>
    <plurals name="items_count">
        <item quantity="one">%d produk</item>
        <item quantity="few">%d produk</item>
        <item quantity="many">%d produk</item>
    </plurals>
</resources>

// Kode Kotlin
textView.text = getString(R.string.welcome_title)

// Pluralisasi
val items = 5
textView.text = resources.getQuantityString(
    R.plurals.items_count, items, items
)

// Dukungan RTL dalam kode
textView.textDirection = View.TEXT_DIRECTION_LOCALE
// Manifest: supportsRtl="true"

RTL (Right-to-Left) — dukungan untuk bahasa di mana teks dibaca dari kanan ke kiri (Arab, Ibrani, Urdu, Persia). Android mendukung RTL melalui atribut android:layoutDirection dan android:textDirection. Di manifest, atur android:supportsRtl="true" — dan Android secara otomatis mencerminkan tata letak. NavDrawer, ikon kembali/maju, perataan teks harus berfungsi di kedua arah. Dalam kode, gunakan View.LAYOUT_DIRECTION_LOCALE dan Gravity.START/END, bukan LEFT/RIGHT.

Sumber daya yang dilokalisasi

Android Resource Qualifiers memungkinkan lokalisasi tidak hanya string, tetapi juga gambar (res/drawable-ru/), tata letak (res/layout-ru/), animasi, warna. Untuk Arab dan Ibrani diperlukan tata letak terpisah dengan pencerminan elemen — gunakan res/layout-ar/ (Arab). Android juga mendukung varian regional: values-rUS, values-rGB, values-de-DE. Qualifiers dapat digabungkan: values-ldrtl-ru — Rusia untuk layar RTL.

Format regional: tanggal, angka, mata uang di iOS dan Android

Tanggal dan waktu — salah satu aspek kunci i18n. Berbagai region menggunakan format berbeda: Rusia — DD.BB.TTTT, AS — BB/DD/TTTT, Jepang — TTTT.BB.DD. Menggunakan format tetap (yyyy-MM-dd) untuk ditampilkan kepada pengguna adalah kesalahan. Di iOS gunakan DateFormatter dengan Locale(identifier: locale), di Android — DateFormat.getDateInstance(DateFormat.SHORT, locale). Untuk asisten suara dan pencarian AI, tanggal harus dalam ISO 8601 dalam representasi internal.

Angka dan mata uang — di berbagai region pemisah yang berbeda: 1,234.56 (AS) vs 1.234,56 (Rusia), 1 234,56 (Prancis). iOS: NumberFormatter dengan .locale = locale. Android: DecimalFormat dengan DecimalFormatSymbols(locale). Untuk mata uang: format ¥1,234 (Jepang) vs $1,234.56 (AS) vs 1 234,56 ₽ (Rusia). Jangan pernah menggabungkan mata uang dan angka secara manual — gunakan NumberFormatter.currencyCode dan .currencySymbol.

RegionTanggalAngkaMata Uang
Rusia31.12.20241 234,561 234,56 ₽
AS12/31/20241,234.56$1,234.56
Jerman31.12.20241.234,561.234,56 €
Jepang2024/12/311,234¥1,234
Arab Saudi31/12/20241,234.561,234.56 SAR

Pengurutan (Collation) — pengurutan alfabet berbeda di berbagai bahasa. Dalam bahasa Spanyol «ch» muncul setelah «c». Dalam bahasa Swedia «ä» berada di akhir alfabet. Dalam bahasa Jerman «ß» diurutkan seperti «ss». iOS: LocalizedComparison (String.localizedCompare). Android: Collator.getInstance(locale). Jangan pernah menggunakan compareTo() untuk string yang ditampilkan kepada pengguna — ia menggunakan Unicode Code Point order yang tidak mempertimbangkan aturan regional.

Praktik terbaik internasionalisasi aplikasi mobile

Prinsip arsitektur — mulailah i18n dari commit pertama. Setiap string dalam kode harus melewati fungsi pembungkus (tr("key")), yang tidak ada sebelum i18n dikonfigurasi — ini memaksa pengembang untuk mengekstraksi string segera. Jangan gunakan string Inggris sebagai kunci — saat formulasi dalam bahasa Inggris berubah, semua terjemahan harus diperbarui. Gunakan kunci yang bermakna: «profile.title», «settings.language.label».

Pseudolokalisasi — teknik pengujian i18n sebelum terjemahan sebenarnya. Ganti setiap huruf Latin dengan simbol diakritik (á, é, ñ, ü) untuk memeriksa pengkodean, tambahkan prefiks [XXX] untuk memeriksa pemotongan string. Xcode: skema peluncuran — pseudobahasa «Double-Length Pseudolanguage». Android: Developer Options — Force RTL layout direction, System font scale hingga 200%. Pseudolokalisasi menemukan 80% masalah i18n tanpa keterlibatan penerjemah.

Daftar periksa IT Sectr i18n — sebelum rilis kami memeriksa: (1) tidak ada string hardcoded dalam kode (pengecualian: log), (2) pluralisasi berfungsi dengan benar untuk semua bahasa, (3) tanggal/angka diformat melalui Locale API, (4) tata letak ditampilkan dengan benar dalam bahasa RTL, (5) string tidak terpotong pada penskalaan maksimum, (6) pseudolokalisasi tidak menemukan kesalahan, (7) semua bahasa yang dideklarasikan di toko memiliki set terjemahan lengkap.

Pertanyaan yang Sering Diajukan

Apa perbedaan i18n dengan l10n?

i18n (internasionalisasi) — persiapan kode: ekstraksi string, dukungan RTL, pemformatan. Dilakukan oleh pengembang sekali. l10n (lokalisasi) — penerjemahan string ke bahasa tertentu. Dilakukan oleh penerjemah berkali-kali untuk setiap lokalisasi. i18n — arsitektur, l10n — konten. Tanpa i18n, lokalisasi pada prinsipnya tidak mungkin.

Bagaimana cara kerja NSLocalizedString di Swift?

NSLocalizedString — makro yang mencari nilai berdasarkan kunci di Localizable.strings untuk locale perangkat saat ini. Jika terjemahan ditemukan — mengembalikannya. Jika tidak — mengembalikan kunci. Format: NSLocalizedString(«key», comment: «deskripsi»). Untuk pemformatan dengan parameter gunakan String.localizedStringWithFormat().

Bagaimana struktur strings.xml di Android?

strings.xml — file dengan terjemahan di direktori res/values/{lang}/. Versi dasar di values/strings.xml, terjemahan — di values-ru/strings.xml. Kode mengakses melalui getString(R.string.key). Android sendiri memilih file yang diperlukan berdasarkan bahasa sistem. Untuk pluralisasi digunakan sumber daya <plurals> dengan spesifikasi zero/one/few/many/other.

Apa itu RTL dalam konteks i18n?

RTL (Right-to-Left) — arah penulisan untuk Arab, Ibrani, Urdu, Persia. Android: supportsRtl="true" di manifest, android:layoutDirection, Gravity.START/END. iOS: UISemanticContentAttribute.forceLeftToRight untuk RTL paksa. Tata letak harus dicerminkan: menu di kanan, teks — dari kanan ke kiri, ikon navigasi — terbalik.

Bahasa apa yang wajib untuk publikasi?

Untuk publikasi global set minimal: Inggris, Spanyol, Prancis, Jerman, Jepang, Mandarin, Korea, Portugis, Rusia, Italia. App Store memerlukan setidaknya lokalisasi Inggris. Setiap lokalisasi tambahan meningkatkan audiens potensial. Untuk pasar lokal, 1–2 bahasa sudah cukup.

Kesimpulan

  • Globalisasi (i18n) — persiapan arsitektural aplikasi untuk banyak bahasa dan region
  • NSLocalizedString — makro Swift untuk menerjemahkan string melalui Localizable.strings + ekspor XLIFF
  • strings.xml — sumber daya Android dengan terjemahan di direktori values-{lang}
  • RTL — dukungan wajib untuk Arab, Ibrani, Urdu dan Persia
  • Format — tanggal dan angka diformat secara ketat melalui Locale API, tidak manual
  • Pluralisasi — iOS: stringsdict, Android: <plurals> dengan enam bentuk kuantitas
  • Pseudolokalisasi — teknik pengujian i18n sebelum terjemahan (mendeteksi 80% masalah)

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga