ฉัน (เหมือนคนอื่น ๆ ทั้งหมด) ใช้NSLocalizedString
เพื่อแปลแอปของฉัน
น่าเสียดายที่มี "ข้อเสีย" หลายประการ (ไม่จำเป็นต้องเป็นความผิดของ NSLocalizedString เอง) รวมถึง
- ไม่มีการเติมข้อความอัตโนมัติสำหรับสตริงใน Xcode สิ่งนี้ทำให้การทำงานไม่เพียง แต่เกิดข้อผิดพลาดได้ง่าย แต่ยังน่าเบื่อ
- คุณอาจสิ้นสุดการกำหนดสตริงใหม่เนื่องจากคุณไม่รู้ว่ามีสตริงเทียบเท่าอยู่แล้ว (เช่น "โปรดป้อนรหัสผ่าน" และ "ป้อนรหัสผ่านก่อน")
- เช่นเดียวกับปัญหาการเติมข้อความอัตโนมัติคุณต้อง "จดจำ" / คัดลอกสตริงความคิดเห็นไม่เช่น
genstring
นั้นจะมีหลายความคิดเห็นสำหรับหนึ่งสตริง - หากคุณต้องการใช้
genstring
หลังจากที่คุณแปลสตริงบางส่วนแล้วคุณต้องระวังไม่ให้สูญเสียการแปลท้องถิ่นของคุณ - สายเดียวกันกระจัดกระจายตลอดโครงการของคุณทั้งหมด ตัวอย่างเช่นคุณใช้
NSLocalizedString(@"Abort", @"Cancel action")
ทุกที่จากนั้นตรวจสอบรหัสขอให้คุณเปลี่ยนชื่อสตริงNSLocalizedString(@"Cancel", @"Cancel action")
เพื่อให้รหัสสอดคล้องกันมากขึ้น
สิ่งที่ฉันทำ (และหลังจากการค้นหาบางอย่างดังนั้นฉันคิดว่าหลายคนทำสิ่งนี้) คือการมีstrings.h
ไฟล์แยกต่างหากที่ฉัน#define
ทุกรหัสภาษา ตัวอย่างเช่น
// In strings.h
#define NSLS_COMMON_CANCEL NSLocalizedString(@"Cancel", nil)
// Somewhere else
NSLog(@"%@", NSLS_COMMON_CANCEL);
สิ่งนี้จะช่วยให้การสร้างโค้ดเสร็จสมบูรณ์เป็นที่เดียวในการเปลี่ยนชื่อตัวแปร (ดังนั้นจึงไม่จำเป็นต้องมีจีสตริงอีกต่อไป) และคำสำคัญที่ไม่ซ้ำใครในการ refactor อัตโนมัติ อย่างไรก็ตามสิ่งนี้มาพร้อมกับค่าใช้จ่ายในการปิดท้ายด้วย#define
งบจำนวนมากที่ไม่ได้มีการจัดโครงสร้างอย่างแท้จริง (เช่น LocString.Common.Cancel หรืออะไรทำนองนั้น)
ดังนั้นในขณะที่วิธีนี้ใช้งานได้ดี แต่ฉันก็สงสัยว่าพวกคุณทำได้อย่างไรในโครงการของคุณ มีวิธีอื่นที่จะทำให้การใช้ NSLocalizedString ง่ายขึ้นหรือไม่? อาจมีกรอบที่ห่อหุ้มหรือไม่