เหตุใดทรัพยากรสตริงจึงถูกเก็บภายนอกรหัสและไม่อยู่ในรหัส


18

โดยทั่วไปในหลาย ๆ แพลตฟอร์มฉันกำลังเขียนแหล่งข้อมูลสตริงของฉันไปยังไฟล์. resx หรือ. xml

นั่นคือบน iOS ฉันกำลังทำให้พวกเขาผ่านNSBundle.MainBundleและโดยใช้Context.Resourcesบน Android

อะไรคือข้อดีของวิธีการนี้และทำไมไม่ให้เข้าถึงโดยตรงในรหัสดังนั้นตัวอย่างเช่น:

  1. ในโครงการข้ามแพลตฟอร์มแพลตฟอร์มใด ๆ สามารถเข้าถึงได้โดยตรงโดยไม่มีการรวมเข้าด้วยกัน

  2. ไม่มีความกังวลในระหว่างการสร้างว่าทรัพยากรที่สร้างขึ้นนั้นดีหรือไม่

  3. coder สามารถใช้ฟังก์ชันต่างๆเช่นการจัดการหลายภาษา

เรื่องสั้นสั้น: อะไรคือสาเหตุที่ทำให้โครงสร้างของทรัพยากรสตริงเป็นแบบนั้น?

[แก้ไข]

สมมติว่าไฟล์ของฉันเป็นส่วนหนึ่งของโครงการ "แกน" ที่แชร์ระหว่างโครงการอื่น (คิดเกี่ยวกับ PCL โครงสร้างไฟล์โครงการข้ามแพลตฟอร์ม)

และสมมติว่าไฟล์ของฉันคล้ายกับไฟล์. resx / .xml ทั้งหมดโดยมีลักษณะเช่นนี้ (ฉันไม่ใช่มืออาชีพในรูปแบบ xml ขอโทษด้วย!): พารามิเตอร์พารามิเตอร์

ดังนั้นนี่คือ XML แบบกำหนดเองโดยที่คุณชี้ไปที่คีย์ / ภาษาเพื่อรับสตริงที่เหมาะสม

ไฟล์ดังกล่าวจะเป็นส่วนหนึ่งของแอปพลิเคชันเช่นเดียวกับที่คุณเพิ่มไฟล์ใด ๆ ที่สามารถเข้าถึงได้ภายในแอพและระบบเพื่อเข้าถึงทรัพยากรสตริงโดยใช้ PCL นี่จะเป็นการเพิ่มโอเวอร์เฮดให้กับแอปพลิเคชันหรือไม่


ความเป็นไปได้ที่ซ้ำซ้อนของการทำให้เป็นสากล: มีความคิดอย่างไร
ริ้น

6
ไม่กังวลของฉันไม่ได้เกี่ยวกับความเป็นสากลและค่อนข้างเกี่ยวกับสถาปัตยกรรมและข้ามแพลตฟอร์มขออภัย
Léon Pelletier

1
คำถามนี้สามารถนำไปใช้กับทรัพยากรประเภทใด ๆ ได้แม้ว่าจะมีการแปลเป็นภาษาท้องถิ่น / สากลอย่างง่ายดาย อะไรคือข้อดีของการแยกประเภทของทรัพยากรออกจากรหัส? เหตุใดรูปภาพหรือไฟล์เสียงจึงไม่ได้รับการเข้ารหัสในแหล่งที่มาว่าเป็นสตริงไบนารี (แน่นอนว่า URI ของข้อมูลนั้นมีอยู่จริง แต่โดยทั่วไปแล้วจะใช้ไม่ได้กับไฟล์ขนาดใหญ่) คนอื่น ๆ ได้ให้คำตอบที่ดีงามอยู่แล้ว แต่ฉันแค่อยากจะชี้ให้เห็นว่าสตริงที่ผู้ใช้อ่านได้ไม่ใช่ประเภทของทรัพยากรเพียงอย่างเดียวที่ได้รับประโยชน์จากการถูกทำให้เป็นภายนอก
JAB

คำตอบ:


38

รองรับหลายภาษาและสากล

การรักษาสตริงภายนอกช่วยให้พวกเขาสามารถเปลี่ยนแปลง (อ่าน: แปล) โดยไม่จำเป็นต้องคอมไพล์ใหม่ (เพียงแค่เชื่อมโยงใหม่มากที่สุดและเพิ่งวางในโฟลเดอร์ใหม่ที่ดีที่สุด)


การลิงก์ย้อนกลับซ้ำครั้งนี้เป็นเหตุผลที่ดีขอบคุณ
Léon Pelletier

2
ยังเป็นเพียงคนเดียวที่เข้าใจคำถาม
Léon Pelletier

3
@ ratchetfreak มันเป็นรูปแบบที่ไม่ดีที่จะยอมรับเร็ว ๆ นี้ (ภายในไม่กี่ชั่วโมงนับแน่นอน) ไม่ได้ให้เวลาสำหรับคำตอบอื่น ๆ ที่จะทำให้เกิดฟอง นี่เป็นเรื่องง่ายและตรงประเด็นและถูกต้อง ... แต่ใครบางคนอาจนำคำตอบที่สมบูรณ์ยิ่งขึ้นและมีรายละเอียดมากขึ้นในวันพรุ่งนี้ (หรือในเดือนถัดไปสำหรับเรื่องนั้น)
WernerCD

3
พิเศษ: มันอาจจะโอเคสำหรับนักแปลที่จะแก้ไขไฟล์ XML แต่อย่าปล่อยให้พวกเขา
ทำตัว

ตอนนี้คำถามคือ: "คำตอบนี้ยังใช้กับภาษาที่ตีความหรือไม่" ฉันถามเพราะจะไม่มีการลิงก์ซ้ำหรือคอมไพล์ซ้ำ
โทมัส Eding

10

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


2
ไม่มีความแตกต่างระหว่างไฟล์ที่รวมอยู่ในโครงการและไฟล์ทรัพยากร ปัญหาไม่ได้อยู่ที่นั่น
Léon Pelletier

ฉันกำลังพูดถึงรวมถึงทรัพยากรโดยตรงในรหัสแล้วจัดการทุกอย่างภายในโปรแกรมดังนั้นจึงเป็นมิตรกับ PCL / ข้ามแพลตฟอร์มมากขึ้น
Léon Pelletier

2
หากคุณมีไฟล์ "รหัส" ที่มีทรัพยากรสตริงของคุณ (คำจำกัดความในพจนานุกรมหรืออะไรทำนองนั้น) และไม่มีสิ่งอื่นใดในนั้น .. ดีกว่าโดยทั่วไปคือไฟล์ทรัพยากร (แต่สำหรับไฟล์เดียวสำหรับแพลตฟอร์มเดียวเช่น Android จะไม่ นำโค้ด c ใด ๆ ที่มีวัตถุประสงค์) หากมีรหัสอื่น ๆ อยู่ในนั้นหรือหากมีการแบ่งไฟล์หลาย ๆ ไฟล์มากกว่าการแปลจากภายนอกจะยากกว่า ในมุมมองแบบข้ามแพลตฟอร์มข้อความรูปแบบเช่น XML มีประโยชน์ที่คุณสามารถอ่านและใช้ในภาษาใด ๆ / แพลตฟอร์ม ( แต่คุณอาจจะต้องที่จะนำการทำงานบางอย่างมัน)
Flo

7

นอกเหนือจากการทำให้เป็นสากล / การโลคัลไลซ์ชันการแยกสตริงข้อความออกเช่นนี้ยังช่วยให้ผู้พิสูจน์อักษรสามารถส่งการแก้ไขไปยังการสะกด / ไวยากรณ์ / เครื่องหมายวรรคตอนที่แยกได้messages.${LOCALE}โดยไม่ต้องสัมผัสไฟล์ซอร์สโค้ดที่แท้จริง คุณอาจมีปัญหาในการเปลี่ยนรหัส แต่ยอมรับการแก้ไขข้อความดังกล่าว ถ้าคุณยอมรับการเปลี่ยนแปลงที่เกิดขึ้นพร้อมกันทั้งรหัสและข้อความทำให้พวกเขาแยกออกจากกันทำให้ง่ายต่อการผสานแพทช์ระบุว่าการเปลี่ยนแปลงรหัสไม่ redefine ข้อความใด ๆ messages.en_USที่มีอยู่เมื่อสำอางตรวจสอบออก

นอกจากนี้ยังอาจไม่จำเป็นต้องเชื่อมโยงแอปพลิเคชันอีกครั้งทั้งนี้ขึ้นอยู่กับวิธีการนำไปใช้ รหัสอาจคว้าสาย 138 จากmessages.${LOCALE}ข้อความที่ต้องการโดยมีการกำหนดหมายเลขบรรทัด ณ เวลาใช้งาน


0

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

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

ทางเลือกทั่วไปคือGNU Gettextวิธีการเพียงแค่ทำเครื่องหมายสายอักขระที่แปลได้ในซอร์สโค้ดและแยกสตริงเหล่านี้ไปยังไฟล์ PO มาตรฐานโดยอัตโนมัติซึ่งทำงานข้ามแพลตฟอร์มและข้ามภาษาได้โดยอัตโนมัติ จากมุมมองของนักพัฒนามันจะเป็นการบำรุงรักษาไฟล์ทรัพยากร XML ด้วยตนเองทุกวัน

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