คุณกำลังพัฒนาแอพพลิเคชั่น ASP.Net MVC ใช่ไหม คำตอบอื่น ๆ ดูเหมือนจะเฉพาะเจาะจงสำหรับแอปพลิเคชันเดสก์ท็อป ให้ฉันจับสิ่งทั่วไป:
การตรวจจับตำแหน่ง
มันค่อนข้างสำคัญที่แอปพลิเคชันของคุณจะตรวจจับตำแหน่งของผู้ใช้อย่างถูกต้อง ในแอปพลิเคชันเดสก์ท็อป CultureInfo.CurrentCulture มีโลแคลการจัดรูปแบบที่ต้องการ (อันที่ควรใช้เพื่อจัดรูปแบบตัวเลขวันที่สกุลเงิน ฯลฯ ) ในขณะที่ CultureInfo.CurrentUICulture มีโลแคลอินเทอร์เฟซผู้ใช้ที่ต้องการ . สำหรับเว็บแอปพลิเคชันคุณควรตั้งค่าทั้งสองวัฒนธรรมเป็นอัตโนมัติ (เพื่อตรวจหาสถานที่โดยอัตโนมัติจากส่วนหัวของ AcceptLanguage) เว้นแต่ว่าคุณต้องการที่จะใช้เวิร์กโฟลว์การตรวจจับสถานที่แฟนซีบางอย่าง (เช่นต้องการสนับสนุนภาษาที่เปลี่ยนแปลงตามต้องการ)
ส่งออกสตริง
สตริงทั้งหมดควรมาจากแหล่งข้อมูลนั่นคือไฟล์ Resx ในแอป Winforms สามารถทำได้อย่างง่ายดายโดยการตั้งค่าคุณสมบัติ Localizable ให้เป็นจริง นอกจากนี้คุณยังจะต้อง (ภายนอก) สตริงที่มาจากรุ่นของคุณด้วยตนเอง มันค่อนข้างง่าย ใน Asp.Net คุณจะต้องส่งออกทุกอย่างด้วยตนเอง ...
เลย์เอาต์
คุณต้องอนุญาตให้มีการขยายสตริง ในโลก Winforms สามารถทำได้ผ่าน TableLayoutPanel ซึ่งควรใช้เพื่อให้แน่ใจว่าเค้าโครงจะปรับโดยอัตโนมัติเพื่อรองรับข้อความที่ยาวขึ้น ในโลกเว็บคุณโชคไม่ดีเลยสักนิด คุณอาจจำเป็นต้องใช้ CSS Localization Mechanism - วิธีในการแก้ไข (แทนที่) คำจำกัดความของ CSS สิ่งนี้จะช่วยให้ผู้ใช้รองรับหลายภาษาสามารถแก้ไขปัญหาเกี่ยวกับรูปแบบได้ตามต้องการ ตรวจสอบให้แน่ใจว่าองค์ประกอบ HTML แต่ละหน้าในการแสดงผลมีรหัสที่ไม่ซ้ำกันซึ่งจะช่วยให้สามารถกำหนดเป้าหมายได้อย่างแม่นยำ
ปัญหาเฉพาะทางวัฒนธรรม
หลีกเลี่ยงการใช้กราฟิกสีและเสียงที่อาจเฉพาะสำหรับวัฒนธรรมตะวันตก หากคุณต้องการมันจริงๆโปรดระบุวิธีการแปล หลีกเลี่ยงกราฟิกที่ไวต่อทิศทาง (เช่นนี้จะเป็นปัญหาเมื่อคุณพยายามแปลเป็นภาษาอาหรับหรือฮิบรู) นอกจากนี้อย่าคิดว่าโลกทั้งโลกใช้หมายเลขเดียวกัน (เช่นไม่จริงสำหรับภาษาอาหรับ)
ToString () และ Parse ()
ตรวจสอบให้แน่ใจว่าได้ผ่าน CultureInfo ทุกครั้งเมื่อเรียก ToString () เว้นแต่ว่าไม่ได้รับการสนับสนุน ด้วยวิธีนี้คุณแสดงความคิดเห็นเจตนาของคุณ ตัวอย่างเช่น: หากคุณใช้หมายเลขภายในและด้วยเหตุผลบางอย่างจำเป็นต้องแปลงเป็นสตริงใช้:
int i = 42;
var s = i.ToString(CultureInfo.InvariantCulture);
สำหรับตัวเลขที่จะแสดงต่อผู้ใช้ให้ใช้:
var s = i.ToString(CultureInfo.CurrentCulture); // formatting culture used
เช่นเดียวกับ Parse (), TryParse () และแม้แต่ ParseExact () - ข้อผิดพลาดที่น่ารังเกียจบางอย่างอาจถูกนำมาใช้โดยไม่ต้องใช้ CultureInfo นั่นเป็นเพราะจิตวิญญาณที่ไม่ดีใน Microsoft เต็มไปด้วยความตั้งใจดีตัดสินใจว่าควรรักษา CultureInfo.CurrentCulture เป็นค่าเริ่มต้น (มันจะถูกใช้ถ้าคุณไม่ผ่านอะไรเลย) - หลังจากที่ทุกคนใช้ ToString ( ) เขา / เธอต้องการแสดงมันต่อผู้ใช้ใช่ไหม? เปิดใช้งานไม่ได้ทุกกรณี - ตัวอย่างเช่นพยายามเก็บหมายเลขเวอร์ชันแอปพลิเคชันของคุณในฐานข้อมูลแล้วแปลงเป็นอินสแตนซ์ของคลาสเวอร์ชัน โชคดี.
วันที่และเขตเวลา
ให้แน่ใจว่าได้เสมอเก็บและยกตัวอย่าง DateTime ใน UTC (ใช้แทน DateTime.UtcNow DateTime.Now) แปลงเป็นเวลาท้องถิ่นในรูปแบบท้องถิ่นเมื่อแสดง:
DateTime now = DateTime.UtcNow;
var s = now.ToLocalTime().ToString(CultureInfo.CurrentCulture);
หากคุณต้องการส่งอีเมลที่มีการอ้างอิงเวลาในเนื้อหาต้องแน่ใจว่าได้รวมข้อมูลเขตเวลา - รวมทั้ง UTC offset และรายชื่อเมือง:
DateTime someDate; // i.e. from database
var formattedDate = String.Format("{0} {1}",
someDate.ToLocaleTime().ToString(CultureInfo.CurrentCulture),
TimeZoneInfo.Local.DisplayName);
ข้อความผสม
คุณได้รับคำเตือนแล้วว่าจะไม่ต่อสตริงเข้าด้วยกัน แต่คุณอาจจะใช้ String.Format () ดังที่แสดงไว้ด้านบน อย่างไรก็ตามฉันต้องระบุว่าคุณควรลดการใช้ข้อความผสม นั่นเป็นเพราะกฎไวยากรณ์เป้าหมายแตกต่างกันมากดังนั้นนักแปลอาจไม่จำเป็นต้องเรียงประโยคอีกครั้งเท่านั้น (ซึ่งจะแก้ไขได้โดยใช้ตัวยึดและสตริงรูปแบบ ()) แต่แปลประโยคทั้งหมดด้วยวิธีที่แตกต่างกันตาม สิ่งที่จะถูกแทนที่ ฉันขอยกตัวอย่างบางอย่างให้คุณ:
// Multiple plural forms
English: 4 viruses found.
Polish: Znaleziono 4 wirusy. **OR** Znaleziono 5 wirusów.
// Conjugation
English: Program encountered incorrect character | Application encountered incorrect character.
Polish: Program napotkał nieznaną literę | Aplikacja napotkała nieznaną literę.
ปัญหาการต่อข้อมูลอื่น ๆ
การต่อข้อมูลไม่ จำกัด เฉพาะสตริง หลีกเลี่ยงการวางการควบคุมร่วมกันพูด:
เตือนฉันอีกครั้งใน [กล่องข้อความพร้อมหมายเลข] วัน
สิ่งนี้ควรได้รับการออกแบบใหม่เพื่อ: เตือนฉันอีกครั้งในจำนวนวันนี้: [กล่องข้อความ]
การเข้ารหัสอักขระและแบบอักษร
บันทึกถ่ายโอนข้อความใน Unicode ทุกครั้ง (เช่นใน UTF-8) ห้ามใช้ฟอนต์แบบฮาร์โค้ด - การแปลเป็นภาษาท้องถิ่นอาจต้องแก้ไขและจะปิดกลไกฟอนต์ถอยแบบอักษรเริ่มต้น (ในกรณีของ Winforms) อย่าลืมอนุญาตให้ใช้อักขระ "แปลก" ในฟิลด์ส่วนใหญ่ (เช่นชื่อผู้ใช้)
ทดสอบ
คุณอาจจะต้องใช้สิ่งที่เรียกว่าการแปลแบบหลอกซึ่งเป็นการสร้างทรัพยากรสำหรับพูดวัฒนธรรมเยอรมันและคัดลอกสตริงภาษาอังกฤษของคุณโดยเพิ่มคำนำหน้าและคำต่อท้าย นอกจากนี้คุณยังสามารถใส่ตัวยึดตำแหน่งเพื่อตรวจจับสตริงผสมได้อย่างง่ายดาย วัตถุประสงค์ของการแปลแบบหลอกคือการตรวจสอบปัญหา Localizability เช่นสตริงที่มีการเข้ารหัสยากปัญหาเกี่ยวกับเลย์เอาต์และการใช้ข้อความผสมมากเกินไป