Localization (การแปลภาษา, l10n) — การปรับเนื้อหาของแอปพลิเคชันมือถือให้เข้ากับภาษา ภูมิภาค และลักษณะเฉพาะทางวัฒนธรรมของกลุ่มเป้าหมาย แตกต่างจากการเตรียมพร้อมสำหรับการแปล (i18n) ที่โค้ดถูกเตรียมไว้สำหรับการแปล การแปลภาษาคือกระบวนการแปลสตริง การจัดรูปแบบวันที่ ตัวเลขและสกุลเงิน การเลือกรูปภาพ และการคำนึงถึงบรรทัดฐานท้องถิ่น ใน iOS ไฟล์แปลจะถูกเก็บใน Localizable.strings (โฟลเดอร์ .lproj สำหรับแต่ละภาษา) ใน Android — ใน values-ru, values-de และไดเรกทอรีทรัพยากรอื่นๆ รายละเอียดเพิ่มเติม — ใน คู่มือการแปลภาษาของ Android
สิ่งสำคัญ
Localization (ย่อว่า l10n — 10 ตัวอักษรระหว่าง “l” และ “n”) — คือกระบวนการปรับแอปพลิเคชันให้เข้ากับภาษาและภูมิภาคที่เฉพาะเจาะจง ถ้า i18n คือรากฐานทางสถาปัตยกรรม l10n คือการเติมเต็มเนื้อหา i18n ทำให้การแปลเป็นไปได้ l10n คือผู้ดำเนินการแปล การแปลภาษาประกอบด้วย: การแปลข้อความทั้งหมดของอินเทอร์เฟซ การปรับรูปแบบวันที่และตัวเลข การเปลี่ยนรูปภาพที่มีเนื้อหาที่อ่อนไหวทางวัฒนธรรม การแก้ไขข้อความทางกฎหมาย (นโยบายความเป็นส่วนตัว, EULA) การตั้งค่าระบบการชำระเงินให้เข้ากับภูมิภาค และการทดสอบบนอุปกรณ์เป้าหมาย
ความคุ้มค่าทางธุรกิจ — การแปลภาษาส่งผลโดยตรงต่ออัตราการแปลง ตามข้อมูลของ CSA Research (2023) 76% ของผู้ใช้ชอบซื้อสินค้าในแอปที่ใช้ภาษาของตนเอง และ 40% ไม่เคยซื้อสินค้าในภาษาต่างประเทศ การแปลภาษาเป็นภาษาญี่ปุ่นสำหรับแอปค้าปลีกช่วยเพิ่มอัตราการแปลงโดยเฉลี่ย 150% (Google, 2022) แอปที่ได้รับการแปลได้รับการติดตั้งแบบออร์แกนิกมากกว่า 2–3 เท่าใน App Store และ Google Play ระดับภูมิภาค เนื่องจากการทำ ASO ระดับภูมิภาค (คำค้นหาในภาษาเป้าหมาย)
i18n vs l10n — สองด้านของกระบวนการเดียวกัน i18n: การแยกสตริงออกเป็นทรัพยากร การรองรับ RTL การจัดรูปแบบตัวเลข ทำครั้งเดียวโดยนักพัฒนา l10n: การแปลสตริง การปรับเนื้อหา การทดสอบในพื้นที่ ทำซ้ำหลายครั้งโดยนักแปลและ QA สำหรับแต่ละภาษา ใน IT Sectr เราจัดสรรเวลา 20–30% ของ Sprint สำหรับการแปลภาษาในแต่ละภาษาใหม่ — ซึ่งรวมถึงการแปล การตรวจสอบ การทดสอบบนอุปกรณ์ และการแก้ไขข้อบกพร่อง
Localizable.strings — ไฟล์หลักสำหรับเก็บคำแปลใน iOS แต่ละภาษามีโฟลเดอร์ .lproj ของตนเอง: en.lproj/Localizable.strings, ru.lproj/Localizable.strings, de.lproj/Localizable.strings รูปแบบ: “key” = “value”; (มีเครื่องหมายอัฒภาค) Apple ใช้ Base Internationalization: Storyboard และ XIB ถูกสร้างขึ้นครั้งเดียว (Base.lproj) และสตริงของอินเทอร์เฟซถูกส่งออกไปยัง Localizable.strings สำหรับแต่ละภาษา วิธีนี้ช่วยลดการสร้างสำเนา XIB สำหรับแต่ละภาษา
// en.lproj/Localizable.strings
// "settings.title" = "การตั้งค่า";
// "profile.greeting" = "สวัสดี, %@!";
// "items.count" = "%d รายการ";
// ru.lproj/Localizable.strings
// "settings.title" = "การตั้งค่า";
// "profile.greeting" = "สวัสดี, %@!";
// "items.count" = "%d รายการ";
// การโหลดสตริงตามคีย์
navigationItem.title = NSLocalizedString(
"settings.title",
comment: "หัวเรื่องหน้าจอการตั้งค่า"
)
// สตริงพร้อมพารามิเตอร์
let name = "อันนา"
greetingLabel.text = String.localizedStringWithFormat(
NSLocalizedString("profile.greeting", comment: ""), name
)
// การนำเข้า XLIFF (Xcode → Editor → Import Localizations)
// อัปเดตไฟล์ .lproj โดยอัตโนมัติหลังจากนักแปลทำงาน
Base Internationalization — แนวทางของ Apple ที่อินเทอร์เฟซ (Storyboard, XIB) ถูกสร้างขึ้นครั้งเดียวใน Base.lproj เมื่อเพิ่มภาษา Xcode จะส่งออกสตริงจาก Base ไปยังไฟล์ XLIFF นักแปลจะแปล XLIFF หลังจากการนำเข้า Xcode จะสร้าง .lproj พร้อมสตริงที่แปลแล้ว ข้อดี: ไม่ต้องทำสำเนา XIB สำหรับแต่ละภาษา ข้อจำกัด: สำหรับภาษา RTL (อาหรับ, ฮีบรู) อาจต้องใช้ XIB แยกต่างหากที่มีเลย์เอาต์แบบกลับด้าน
InfoPlist.strings — ไฟล์สำหรับแปลชื่อแอปพลิเคชัน (CFBundleDisplayName) การอนุญาตกล้อง/ไมโครโฟน (NSCameraUsageDescription) และค่าอื่นๆ จาก Info.plist สร้างใน .lproj: ru.lproj/InfoPlist.strings รูปแบบ: CFBundleDisplayName = “แอปของฉัน”; NSCameraUsageDescription = “แอปต้องการเข้าถึงกล้องเพื่อถ่ายภาพ”; หากไม่มีการแปล InfoPlist.strings กล่องโต้ตอบของระบบจะแสดงเป็นภาษาอังกฤษ
ทรัพยากร Android สำหรับการแปลถูกจัดระเบียบผ่านตัวระบุคุณสมบัติ (qualifiers) ในชื่อไดเรกทอรี สำหรับภาษารัสเซีย — res/values-ru/ สำหรับภาษาเยอรมัน — res/values-de/ สำหรับภาษาโปรตุเกสบราซิล — res/values-pt-rBR/ Android รองรับมากกว่า 160 ภาษา ระบบจะเลือกทรัพยากรโดยอัตโนมัติตามภาษาของอุปกรณ์ (Locale.getDefault()) หากไม่มีภาษาที่ตรงกัน — ระบบจะใช้ทรัพยากรจาก values/ (ภาษาหลัก ปกติคือภาษาอังกฤษ)
// res/values/strings.xml (พื้นฐาน — อังกฤษ)
<string name="settings_title">Settings</string>
<string name="greeting">Hello, %s!</string>
// res/values-ru/strings.xml (รัสเซีย)
<string name="settings_title">การตั้งค่า</string>
<string name="greeting">สวัสดี, %s!</string>
// res/values-de/strings.xml (เยอรมัน)
<string name="settings_title">Einstellungen</string>
<string name="greeting">Hallo, %s!</string>
// Kotlin — โค้ดเดียวสำหรับทุกภาษา
textView.text = getString(R.string.settings_title)
// สตริงพร้อมพารามิเตอร์
val greeting = getString(R.string.greeting, userName)
// รูปภาพที่ถูกแปล
// res/drawable-ru/flag.png — ธงสำหรับเวอร์ชันรัสเซีย
// res/drawable/flag.png — ธงเริ่มต้น
// การแปลเลย์เอาต์ (สำหรับภาษา RTL)
// res/layout-ar/activity_main.xml — เวอร์ชันอาหรับ
การแปลไม่เพียงแค่สตริง — Android รองรับการแปลรูปภาพ (res/drawable-ru/) สี (res/values-ru/colors.xml) ขนาด (res/values-ru/dimens.xml) แอนิเมชัน เมนู และแม้แต่เลย์เอาต์ทั้งหมด สำหรับภาษาที่มีความยาวคำแตกต่างกัน (ภาษาเยอรมันยาวกว่าอังกฤษ 30–40%) ใช้ dimens.xml ที่แปลแล้วซึ่งมีความกว้างปุ่มเพิ่มขึ้น สำหรับภูมิภาคที่มีสัญลักษณ์สีแตกต่างกัน (สีขาวหมายถึงการไว้ทุกข์ในจีน) — ใช้ colors.xml ที่แปลแล้ว
การทดสอบ — เปลี่ยนภาษาของอุปกรณ์เป็นภาษาเป้าหมายผ่าน การตั้งค่า → ระบบ → ภาษา ตรวจสอบว่า: สตริงทั้งหมดถูกแปลแล้ว วันที่ถูกจัดรูปแบบอย่างถูกต้อง ตัวเลขแสดงด้วยตัวคั่นที่ถูกต้อง รูปภาพสอดคล้องกับภูมิภาค เลย์เอาต์ไม่เสียหายเมื่อมีสตริงยาว สำหรับระบบอัตโนมัติ ให้ใช้ Espresso กับ LocaleTestRule (Android Testing Library) — ซึ่งช่วยให้เรียกใช้การทดสอบกับภาษาต่างๆ โดยไม่ต้องเปลี่ยนภาษาด้วยตนเอง
ลักษณะเฉพาะทางวัฒนธรรม — การแปลภาษาไม่ได้จำกัดเพียงแค่การแปลข้อความ สัญลักษณ์สีแตกต่างกัน: สีแดงหมายถึงโชคดีในจีน อันตรายในสหรัฐฯ การไว้ทุกข์ในแอฟริกาใต้ สีขาวหมายถึงความบริสุทธิ์ในยุโรป การไว้ทุกข์ในจีน ไอคอนที่มีท่าทาง: ยกนิ้วโป้งขึ้น — แง่บวกในสหรัฐฯ การดูถูกในตะวันออกกลาง รูปภาพบุคคล: ในประเทศอาหรับไม่อนุญาตให้มีรูปภาพผู้หญิงในชุดว่ายน้ำ สัญลักษณ์ทางศาสนา: ไม้กางเขน เสี้ยววงเดือน ดาราของดาวิด ควรใช้เฉพาะในบริบทที่เหมาะสมเท่านั้น
ข้อกำหนดทางกฎหมาย — แต่ละประเทศมีกฎหมายเกี่ยวกับผลิตภัณฑ์ดิจิทัลของตนเอง GDPR (สหภาพยุโรป) — จำเป็นต้องได้รับความยินยอมเกี่ยวกับคุกกี้และการประมวลผลข้อมูล CCPA (แคลิฟอร์เนีย) — สิทธิ์ในการลบข้อมูล กฎหมายข้อมูลส่วนบุคคล (รัสเซีย 152-FZ) — การจัดเก็บข้อมูลบนเซิร์ฟเวอร์ในรัสเซีย LGPD (บราซิล) — เทียบเท่า GDPR การชำระเงิน: ในจีนต้องใช้ Alipay/WeChat Pay ในอินเดียต้องใช้ UPI ในบราซิลต้องใช้ Boleto และ PIX ตั้งค่าระบบการชำระเงินให้เข้ากับภูมิภาคก่อนเริ่มการแปลภาษา
| ด้าน | สหรัฐฯ | จีน | สหรัฐอาหรับเอมิเรตส์ | เยอรมนี |
|---|---|---|---|---|
| ระบบการชำระเงิน | Apple Pay, บัตร | Alipay, WeChat Pay | บัตร, Apple Pay | PayPal, Giropay |
| สีของแบรนด์ | ใดก็ได้ | แดง — โชคดี | เขียว — อิสลาม | ดำ/เหลือง |
| โซเชียลมีเดีย | Instagram, X | WeChat, Douyin | WhatsApp, X | WhatsApp, X |
| วันที่ | MM/dd/yyyy | yyyy/MM/dd | dd/MM/yyyy | dd.MM.yyyy |
| กฎหมายข้อมูล | CCPA | PIPL | PDPL | GDPR |
ตัวอย่างและเนื้อหา — ปรับตัวอย่างให้เข้ากับภูมิภาค สำหรับการแปลภาษาเยอรมันให้ใช้ระบบเมตริก (กก., กม.) สำหรับอเมริกาให้ใช้ระบบอิมพีเรียล (ปอนด์, ไมล์) หมายเลขโทรศัพท์ รหัสไปรษณีย์ ที่อยู่ — รูปแบบแตกต่างกัน ตัวอย่างสกุลเงิน: ¥1000 ในญี่ปุ่น, $9.99 ในสหรัฐฯ, 999 ₽ ในรัสเซีย รูปภาพอาหาร เสื้อผ้า การตกแต่งภายในต้องสอดคล้องกับมาตรฐานระดับภูมิภาค ใน IT Sectr เราแนะนำให้จ้างที่ปรึกษาท้องถิ่นเพื่อตรวจสอบการปรับเปลี่ยนทางวัฒนธรรม
เครื่องมือการแปล — แพลตฟอร์มระดับมืออาชีพที่ทำให้กระบวนการเป็นอัตโนมัติ: Lokalise, Crowdin, POEditor, Smartling, Phrase เครื่องมือเหล่านี้เชื่อมต่อกับ repository นำเข้าสตริงใหม่โดยอัตโนมัติ ติดตามการเปลี่ยนแปลง (Delta updates — แปลเฉพาะสตริงที่เปลี่ยนแปลง) มี Translation Memory (TM — การบันทึกวลีที่เคยแปลแล้ว) และ Glossary (อภิธานศัพท์) ต้นทุนเฉลี่ยของการแปลมืออาชีพ: $0.08–0.15 ต่อคำ (ขึ้นอยู่กับภาษา)
กระบวนการ — (1) นักพัฒนาเพิ่มคีย์ i18n ในโค้ด push ไปยัง repository (2) CI/CD (GitHub Actions / GitLab CI) ส่งคีย์ใหม่ไปยังแพลตฟอร์มการแปลโดยอัตโนมัติ (3) นักแปลได้รับการแจ้งเตือน แปล และบันทึก (4) ไฟล์ที่แปลแล้วจะสร้าง PR ใน repository โดยอัตโนมัติ (5) QA ตรวจสอบการแปลบนอุปกรณ์ (6) ปล่อยเวอร์ชัน รอบสำหรับหนึ่งภาษา: 2–5 วันทำการ (ขึ้นอยู่กับปริมาณ) สำหรับ 10 ภาษา: 5–15 วันเมื่อนักแปลทำงานพร้อมกัน
การแปลด้วยเครื่อง + การตรวจสอบโดยมนุษย์ — มาตรฐานสมัยใหม่ การแปลด้วยโครงข่ายประสาทเทียม (DeepL, Google Translate, GPT-4) ให้คุณภาพ 80–90% สำหรับคู่ภาษาที่เป็นที่นิยม นักแปลมนุษย์ตรวจสอบ: คำศัพท์เฉพาะทาง บริบท (คำอาจมีความหมายแตกต่างกันในหน้าจอต่างๆ) การปรับเปลี่ยนทางวัฒนธรรม ใน IT Sectr เราใช้แนวทางแบบผสมผสาน: การแปลด้วย ML + การตรวจสอบโดยเจ้าของภาษา สำหรับสตริงที่สำคัญ (กฎหมาย การชำระเงิน) — ใช้เฉพาะนักแปลมืออาชีพ ประหยัดต้นทุนได้ถึง 60% ในขณะที่ยังคงคุณภาพ
คำถามที่พบบ่อย
การเตรียมพร้อมสำหรับการแปล — การเตรียมโค้ดสำหรับการแปล (การแยกสตริง, RTL, การจัดรูปแบบ) การแปลภาษา — การแปลและการปรับเปลี่ยนทางวัฒนธรรม i18n ทำโดยนักพัฒนาครั้งเดียว l10n ทำโดยนักแปลสำหรับแต่ละภาษา i18n โดยไม่มี l10n — แอปพร้อมสำหรับการแปลแต่ยังไม่ได้แปล l10n โดยไม่มี i18n — ต้องเขียนโค้ดใหม่สำหรับแต่ละภาษา
ในไฟล์ Localizable.strings ภายในโฟลเดอร์ .lproj สำหรับแต่ละภาษา: en.lproj (อังกฤษ), ru.lproj (รัสเซีย), de.lproj (เยอรมัน) รูปแบบ: “key” = “value”; สำหรับพหูพจน์ — Localizable.stringsdict การตั้งค่าแอป (CFBundleDisplayName) — ใน InfoPlist.strings Xcode จัดการ .lproj ผ่าน Base Internationalization
values-ru — ไดเรกทอรีทรัพยากร Android สำหรับภาษารัสเซีย ประกอบด้วย strings.xml พร้อมคำแปล เช่นเดียวกับภาษาอื่นๆ: values-de (เยอรมัน), values-fr (ฝรั่งเศส) Android เลือกทรัพยากรตามภาษาของระบบ หากไม่พบ values-ru — ระบบจะใช้ values/ (ภาษาหลัก ปกติคือภาษาอังกฤษ)
ใช้ Locale API เสมอ iOS: DateFormatter.locale = Locale(identifier: locale) Android: DateFormat.getDateInstance(DateFormat.SHORT, locale) รัสเซีย: 31.12.2024 สหรัฐฯ: 12/31/2024 ญี่ปุ่น: 2024/12/31 ห้ามกำหนดรูปแบบตายตัว — แต่ละประเทศมีมาตรฐานของตนเอง สำหรับการป้อนวันที่ให้ใช้ UIDatePicker / DatePicker
สำหรับ การครอบคลุมระดับโลก 10–15 ภาษาก็เพียงพอ: อังกฤษ, สเปน, ฝรั่งเศส, เยอรมัน, ญี่ปุ่น, จีน, เกาหลี, โปรตุเกส, รัสเซีย, อิตาลี, อาหรับ สำหรับระดับภูมิภาค — 1–2 ภาษา แต่ละภาษาเพิ่มเติมช่วยเพิ่มการติดตั้งแบบออร์แกนิก 5–15% ในภูมิภาคนั้นๆ App Store ต้องการอย่างน้อยการแปลภาษาอังกฤษ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ