ฉัน (เหมือนคนอื่น ๆ ทั้งหมด) ใช้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 ง่ายขึ้นหรือไม่? อาจมีกรอบที่ห่อหุ้มหรือไม่