จะแปลสตริงภายในไฟล์ info.plist ของ iOS ได้อย่างไร


258

ดังที่คุณอาจทราบว่าiOS 8ต้องใช้คีย์NSLocationWhenInUseUsageDescriptionสำหรับการใช้ตำแหน่งของผู้ใช้ ฉันได้เพิ่มคีย์นี้และข้อมูลทั่วไปบางอย่างลงใน Plist ข้อมูลของฉัน ป้อนคำอธิบายรูปภาพที่นี่

ฉันจะใช้สตริงการแปลในไฟล์ plist ได้อย่างไร

- อัปเดต -

ฉันมีสตริง Localizable แล้ว ฉันแค่สงสัยว่าฉันสามารถใช้บางอย่างเช่น NSLocalizedString (MYSTRING, ไม่มี) ภายในสตริง plist ฉันรู้ว่าฉันสามารถสร้างไฟล์หลายไฟล์ของ info.plist สำหรับการโลคัลไลซ์เซชัน แต่ฉันสงสัยว่าอาจมีวิธีที่ง่ายกว่านี้


คุณเคยทำสิ่งนี้มาหรือไม่ฉันพยายามดิ้นรนเพื่อให้ได้ NSLocationWhenInUseUsageDescription แปลเป็นภาษาท้องถิ่นด้วยหรือไม่
Oliver Pearmain

คำตอบ:


489

คุณควรใช้InfoPlist.stringsไฟล์ที่จะ จำกัด Info.plistค่า ในการทำสิ่งนี้ไปที่File->New->FileเลือกStrings Fileภายใต้Resourceแท็บiOSตั้งชื่อInfoPlistและสร้าง เปิดและแทรกInfo.plistค่าที่คุณต้องการให้เป็นภาษาท้องถิ่นเช่น:

NSLocationWhenInUseUsageDescription = "Description of this";

ตอนนี้คุณสามารถแปลInfoPlist.stringsไฟล์ด้วยการแปล โชคดี!

แก้ไข:

เลือกตัวเลือกการแปลหรือเปิดใช้งานการแปลหากจำเป็น

เครื่องมือแก้ไขด้านขวา

คุณควรจะเห็นไฟล์ด้วยตัวแก้ไขด้านซ้าย

เครื่องมือแก้ไขด้านซ้าย

แก้ไข:

นี่คือเอกสารอย่างเป็นทางการสำหรับInfo.plistการแปลคีย์

ให้เครดิตกับMarcoขอบคุณที่รวมรูปในคำตอบนี้ไว้ด้วย!


15
หลังจากสร้างไฟล์ strings คุณจำเป็นต้องรวมคีย์ในไฟล์ Info.plist ด้วยหรือไม่หรือจะลบอย่างปลอดภัยหรือไม่
rounak

11
เคล็ดลับ: ใช้ชื่อ "InfoPlist.strings" อย่างแน่นอนและไม่มีอะไรอื่น เช่นไฟล์ infoplist ดั้งเดิมของฉันมีชื่ออย่างอื่น แต่ฉันต้องใช้ชื่อนี้อย่างถูกต้องเพื่อให้มันใช้งานได้
Sjoerd Perfors

22
เมื่อทดสอบการแปลในเครื่องจำลอง ฉันต้องเปลี่ยนภาษาของตัวจำลองไม่ใช่แค่ภาษาในเป้าหมาย xcode เพียงแค่เตือนให้คนอื่น
John Webb

10
การใช้งานที่ถูกต้องคือ keyname = "your text"; เช่น: NSLocationWhenInUseUsageDescription = "ข้อความของคุณ"
Magurizio

10
ข้อควรระวัง: รหัสในไฟล์นี้ไม่ควรมีเครื่องหมายคำพูดซึ่งแตกต่างจากการแปลปกติ เช่น: NSMic โฟนUsageDescription = "คำอธิบายของคุณ";
Yuchao Zhou

33

ทั้งหมดข้างต้นไม่ได้ผลสำหรับฉัน (XCode 7.3) ดังนั้นฉันจึงอ่านข้อมูลอ้างอิงของ Apple เกี่ยวกับวิธีการทำและมันง่ายกว่าที่อธิบายไว้ข้างต้น ตามที่ Apple:

ค่าที่แปลเป็นภาษาท้องถิ่นจะไม่ถูกเก็บไว้ในไฟล์ Info.plist คุณเก็บค่าสำหรับการแปลเฉพาะในไฟล์สตริงแทนด้วยชื่อ InfoPlist.strings คุณวางไฟล์นี้ในไดเรกทอรีโครงการเฉพาะภาษาเดียวกันกับที่คุณใช้เพื่อจัดเก็บทรัพยากรอื่น ๆ สำหรับการโลคัลไลเซชันเดียวกัน

ดังนั้นฉันสร้างไฟล์สตริงชื่อInfoPlist.stringsและวางไว้ในโฟลเดอร์ xx.lproj ของภาษา "xx" (และเพิ่มลงในโครงการโดยใช้ไฟล์ -> เพิ่มไฟล์ไปที่ ... ) แค่นั้นแหละ. ไม่จำเป็นต้องใช้คีย์ "ทรัพยากรที่แปลเป็นภาษาท้องถิ่น" = YES และไม่จำเป็นต้องใช้ InfoPlist.strings ใน base.lproj หรือ en.lproj

แอปพลิเคชันใช้ Info.plist key-value เป็นค่าเริ่มต้นหากไม่พบคีย์ในไฟล์ภาษาเฉพาะ ดังนั้นฉันจึงใส่ค่าภาษาอังกฤษของฉันลงในไฟล์ Info.plist และค่าที่แปลแล้วในไฟล์เฉพาะภาษาทดสอบและทุกอย่างทำงานได้

โดยเฉพาะอย่างยิ่งไม่จำเป็นต้อง จำกัด InfoPlist.strings (ซึ่งสร้างรุ่นของไฟล์ใน base.lproj, en.lroj และ xx.lproj) และในกรณีของฉันไปในทางที่ไม่ทำงาน


2
เหตุใดจึงไม่มีลิงก์ไปยังเอกสารที่เหมาะสม
Jurasic

3
นี่เชื่อมโยงไปยังหน้าเว็บที่เกี่ยวข้องแอปเปิ้ล doc ในกรณีที่คนมีความสนใจ: developer.apple.com/library/archive/documentation/General/...
โค้ง

และเราตัดสินใจได้อย่างไรว่า xx เช่นภาษาอังกฤษมันสามารถ en, En, Eng, ภาษาอังกฤษเป็นต้น? ขออภัยถ้าเป็นคำถามที่โง่เพราะฉันเป็นมือใหม่
Awais Nasir

คำตอบของคุณใช้ได้กับฉันยกเว้นสถานการณ์ภาษาทางเลือกแอพจะได้รับภาษาทางเลือกเสมอภาษาที่ใช้ก่อนหน้านี้ไม่ใช่ภาษาอังกฤษค่าภาษาอังกฤษของฉันอยู่ในไฟล์ Info.plist แม้ว่าฉันลอง base.lproj ด้วยเช่นกัน
Awais Nasir

19

หากสิ่งที่ใช้งานไม่ได้ตรวจสอบให้แน่ใจว่าคุณได้เพิ่ม:

"ทรัพยากรที่มีการแปลสามารถผสม" = ใช่

ใน info.plist ในกรณีของฉันไฟล์ InfoPlist.strings ก็ถูกละเว้น


15

เคล็ดลับ

  1. จำไว้ว่า iOS Simulator ใช้ประโยชน์จากภาษาระบบของคุณเป็นค่าเริ่มต้น โปรดเปลี่ยนภาษา (และภูมิภาค) ในการตั้งค่าเครื่องมือจำลองของ iOS ด้วยเพื่อทดสอบการแปลของคุณ

  2. สตริงการแปลภาษา (ดูที่เอกสารของ Apple ที่นี่ ) ควรเป็น

    NSLocationWhenInUseUsageDescription = "Description of this";

    และไม่ใช่ (พร้อมอ้างอิง "... ")

    "NSLocationWhenInUseUsageDescription" = "Description of this";

การเพิ่มเติมที่มีค่า แต่ฉันคิดว่านี่ควรเป็นความคิดเห็นภายใต้คำตอบนั้นไม่ใช่คำตอบใหม่ นอกจากนี้โปรดทราบว่า "363" ไม่ได้เป็นตัวระบุโพสต์ แต่จำนวนคะแนนโหวตคำตอบมี (จำนวนมีการเปลี่ยนแปลงนับตั้งแต่)
John J. Camilleri

7
ฉันไม่มีชื่อเสียง 50 คนในการเพิ่มความคิดเห็นที่นั่น
Giuseppe Beccari

ไม่สำคัญว่าคุณจะใช้เครื่องหมายคำพูด "... " รอบ ๆ คีย์เช่น: ( "NSLocationWhenInUseUsageDescription"="description"ถูกต้อง) มันสามารถมีหรือไม่มี
mluisbrown

12

ฉันขอแนะนำให้อ่านคำแนะนำของ Apple และดูแหล่งข้อมูล WWDC ที่นี่: หัวข้อการทำให้เป็นสากลและการแปลเป็นภาษาท้องถิ่น

เพื่อตอบคำถามของคุณโดยเฉพาะเมื่อคุณเพิ่มภาษาใหม่ให้กับโครงการของป้อนคำอธิบายรูปภาพที่นี่คุณคุณจะมีโอกาสเลือกไฟล์ InfoPlist ที่จะรวม (ถ้าคุณมีเป้าหมายหลายเป้าหมายคุณจะมีไฟล์ Plist หลายไฟล์) สิ่งที่คุณต้องทำเพื่อให้ได้หน้าจอต่อไปนี้คือกดเครื่องหมาย + ใต้การโลคัลไลเซชันแล้วเลือกภาษาใหม่เพื่อเพิ่มการสนับสนุน ป้อนคำอธิบายรูปภาพที่นี่

เมื่อคุณเพิ่มมันจะสร้างไฟล์สตริงที่จำเป็นในไดเรกทอรี lproj ที่เหมาะสมสำหรับภาษาที่กำหนด

--EDIT--

เพื่อให้ชัดเจน iOS จะแลกเปลี่ยนสตริงสำหรับไฟล์ Plist ของคุณตามภาษาที่ผู้ใช้เลือกในปัจจุบันโดยใช้คีย์ของรายการ plist เป็นคีย์ในไฟล์สตริงที่แปลแล้ว


3
การแปลโปรแกรมทั้งหมดด้วยคีย์เดียวคือการเขียนเกินจริง ค้นหาข้อมูลเพิ่มเติมได้ที่นี่: bit.ly/1yBUTru
RGML

2
มันไม่เป็นความจริงสำหรับ XCode 9 มัน nevers ขอให้แปลเป็นภาษาท้องถิ่นเมื่อมีการเพิ่มภาษาใหม่
Tom

ฉันจะต้องดูว่าสำหรับ Xcode 9 - ยังไม่มีโอกาสทดสอบใน Xcode ใหม่
Matt S.

11

Info.plist จำกัด ขั้นตอน

  1. ค้นหาใน Xcode ที่โฟลเดอร์ทรัพยากร (อยู่ในรูท)
  2. เลือกโฟลเดอร์ทรัพยากร
  3. จากนั้นกดเมนูหลักไฟล์ -> ใหม่ -> ไฟล์ ...
  4. เลือกในส่วนไฟล์ "ทรัพยากร" Strings และกดถัดไป
  5. จากนั้นในSave Asฟิลด์เขียน InfoPlist เท่านั้น ("ฉัน" ใหญ่และ "P" ใหญ่)
  6. จากนั้นกดสร้าง
  7. จากนั้นเลือกไฟล์ InfoPlist.strings ที่สร้างในโฟลเดอร์ Resources แล้วกดปุ่ม "Localize" ในเมนูด้านขวา
  8. จากนั้นคุณเลือกโครงการจากตัวนำทางโครงการและเลือกรายการโครงการจากโครงการ
  9. ในแท็บข้อมูลที่ด้านล่างคุณสามารถเลือกภาษาได้มากเท่าที่คุณต้องการ (มีอยู่ในส่วน Localization)
  10. ภาษาที่คุณเห็นในโฟลเดอร์ทรัพยากร
  11. ในการแปลค่า ("คีย์") จากไฟล์ info.plist คุณสามารถเปิดด้วยโปรแกรมแก้ไขข้อความและรับคีย์ทั้งหมดที่คุณต้องการแปล
  12. คุณเขียนคีย์ใด ๆ เป็นตัวอย่างใน InfoPlist.strings เช่นตัวอย่างข้างต้น

"NSLocationAlwaysAndWhenInUseUsageDescription" = "blabla";

"NSLocationAlwaysUsageDescription" = "blabla2";

นั่นคือทั้งหมดที่ทำงานและคุณมีการแปลไฟล์ info.plist ของคุณ!


4

สำหรับทุกคนที่ประสบปัญหาของ info.plist ไม่รวมอยู่ในขณะที่พยายามเพิ่มการแปลเป็นภาษาท้องถิ่นเช่นใน Xcode 9

คุณต้องสร้าง info.plist localiazble โดยเข้าไปที่ปุ่มนั้นและคลิกที่ปุ่ม localize ในตัวตรวจสอบไฟล์ดังที่แสดงด้านล่าง

จากนั้น info.plist จะรวมอยู่ในแหล่งข้อมูลไฟล์เมื่อคุณไปเพิ่มการแปลใหม่

ป้อนคำอธิบายรูปภาพที่นี่


3
คุณพบปัญหาหรือไม่? ฉันไม่สามารถสร้างโครงการได้เมื่อฉันเพิ่มสองภาษาใน Localization เนื่องจาก xcode กำลังพูดว่า "ไฟล์ info.plist ไม่สามารถเปิดได้เนื่องจากไม่มีไฟล์ดังกล่าว
mkkrolik

2
@mkkrolik ฉันมีปัญหาเดียวกันตอนนี้ คุณพบวิธีแก้ปัญหาหรือไม่?
Todanley

@Todanley ข้ามวิธีนี้ไม่ได้ผลสำหรับฉัน ใช้ InfoPlist.strings แทน
mkkrolik

@mkkrolik ขอบคุณที่ได้ผล และเมื่อทำการทดสอบด้วยเครื่องจำลองผมต้องเปลี่ยนการตั้งค่าภาษาของเครื่องจำลองมากกว่าเป้าหมายเพื่อให้มันทำงานได้
Todanley

3

ดังที่ RGML บอกไว้ว่าคุณสามารถสร้าง InfoPlist.strings ให้แปลเป็นภาษาท้องถิ่นแล้วเพิ่มคีย์ของคุณและค่าเช่นนี้: "NSLocationWhenInUseUsageDescription" = "ช่วยค้นหาฉัน!";

มันจะเพิ่มกุญแจไปที่ info.plist ของคุณสำหรับภาษาที่ระบุ


0

ในกรณีของฉันทุกอย่างถูกตั้งค่าอย่างถูกต้อง แต่ก็ยังไม่พบไฟล์ InfoPlist.strings

สิ่งเดียวที่ใช้งานได้จริงคือการลบและเพิ่มไฟล์ InfoPlist.strings อีกครั้งในโครงการ


0

ในกรณีของฉันการแปลไม่ทำงานทำให้เกิดสัญลักษณ์ '-' ในชื่อ ตัวอย่าง: "aero-Info.plist" และไฟล์ที่แปลแล้ว: "aero-InfoPlist.strings" และ "aeroInfoPlist.strings" ไม่ทำงาน


0

เมื่อใช้InfoPlist.stringsไฟล์ (ใน XCode ควรวางไว้ถัดจากInfo.plistไฟล์ - ตำแหน่งไฟล์จริงอาจอยู่ที่ใดก็ได้ภายในโครงการ

ดูใน XCode

) ระมัดระวังการใช้ชื่อย่อของคีย์สำหรับการแปล

ฉันพยายามจะใช้Privacy - Camera Usage Descriptionแต่ปุ่มทำงานคือNSCameraUsageDescription

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.