แนวทางปฏิบัติที่ดีที่สุดในการสร้างแอปพลิเคชันหลายภาษาใน C # / WinForms? [ปิด]


94

ฉันกำลังมองหาการสร้างแอปพลิเคชันที่เหมาะสมกับหลายภาษาใน C # เนื่องจากฉันต้องทำงานในโครงการขนาดเล็กซึ่งเป็นกรณีนี้ ฉันพบโดยทั่วไปสองวิธีในการทำสิ่งนี้:

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

สร้างไฟล์ทรัพยากรตัวอย่างเช่น 'Lang.en-us.resx' และอีกไฟล์หนึ่งสำหรับทุกภาษาเช่น 'Lang.nl-nl.resx' และเติมด้วย Strings ดูเหมือนว่า IDE จะสร้างคลาสให้ฉันโดยอัตโนมัติดังนั้นในโค้ดฉันสามารถใช้ Lang.SomeText ได้ ข้อเสียเปรียบที่ใหญ่ที่สุดที่ฉันเห็นในสิ่งนี้คือสำหรับทุกรูปแบบฉันต้องตั้งค่าป้ายกำกับและคำอธิบายภาพอื่น ๆ ทั้งหมดด้วยตัวเองในโค้ด (และดูเหมือนว่าการผูกข้อมูลจะใช้กับทรัพยากรเหล่านี้ไม่ได้)

อย่างไรก็ตามฉันแน่ใจว่ามีวิธีอื่นในการทำเช่นนี้เช่นกัน

แนวทางปฏิบัติที่ดีที่สุดคืออะไร? อะไรที่ง่ายที่สุดสำหรับแอปพลิเคชันขนาดเล็ก (ไม่กี่รูปแบบการเชื่อมต่อฐานข้อมูล ฯลฯ ) และแบบใดที่เหมาะกับแอปพลิเคชันขนาดใหญ่ที่สุด


3
ฉันสังเกตเห็นว่าคำถามที่ไม่สร้างสรรค์ (หรือคำถามประเภท "ไม่ถูกต้องสำหรับ SO" อื่น ๆ ) เป็นหนึ่งในคำถามที่มีค่าที่สุด :) คำถามนี้เป็นคำถามที่ดีเช่นกัน (ฉันคิดว่าการโหวตพิสูจน์ได้ว่า) นี่คือการสาธิตที่ดีเกี่ยวกับวิธี เพื่อใช้ Add-in หลายภาษาสำหรับการสนับสนุนหลายภาษาyoutube.com/watch?v=SNIyP1QQdVs
Prokurors

1
บางครั้งมันยากมากที่จะปะติดปะต่อความรู้ทั้งหมดในอินเทอร์เน็ตและฉันพบว่าคำถามนี้มีค่าในตอนนี้ แน่นอนว่ามีหลายครั้งที่การปิดคำถามแบบนิ่มนวลนั้นสร้างสรรค์น้อยกว่าการเปิดทิ้งไว้และฉันคิดว่านี่เป็นหนึ่งในครั้งนั้น :)

คำตอบ:


20

ฉันใช้ไฟล์ทรัพยากรสำหรับแอปพลิเคชันหลายภาษามาโดยตลอด
มีบทความมากมายบนเว็บที่อธิบายวิธีการใช้งาน

ฉันใช้สองวิธีที่แตกต่างกัน:

  • ไฟล์ทรัพยากรต่อฟอร์ม
  • ไฟล์ทรัพยากรส่วนกลาง

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

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

คำถามเรื่องรสชาติ ...

ประเด็นสุดท้ายคือฉันเขียนโปรแกรมเป็นภาษาอังกฤษและฝรั่งเศสฉันใช้ "en" และ "fr" ไม่ใช่ "en-US" และ "fr-FR" อย่าซับซ้อนสิ่งที่แตกต่างกันของภาษาอังกฤษ (อเมริกันอังกฤษออสเตรเลีย ฯลฯ ) มีความแตกต่างเพียงเล็กน้อยพอที่จะใช้เพียงอันเดียว (เช่นเดียวกับภาษาฝรั่งเศส)


2
คุณต้องกังวลเกี่ยวกับภาษาถิ่นในบางครั้ง ตัวอย่างเช่นตัวอักษรจีนมีความแตกต่างกันอย่างสิ้นเชิงในภาษาจีนดั้งเดิม (ไต้หวัน) กับภาษาจีนตัวย่อ (จีนแผ่นดินใหญ่)
MarkJ

1
เอกสารของ @MarkJ MSDNระบุว่าภาษาจีนตัวเต็มและภาษาจีนตัวย่อไม่ใช่ภาษาถิ่น (ประเทศ / ภูมิภาค) แต่เป็นวัฒนธรรมที่เป็นกลาง Msdn: "วัฒนธรรมที่เป็นกลางคือวัฒนธรรมที่เกี่ยวข้องกับภาษา แต่ไม่ใช่กับประเทศ / ภูมิภาควัฒนธรรมเฉพาะคือวัฒนธรรมที่เกี่ยวข้องกับภาษาและประเทศ / ภูมิภาคตัวอย่างเช่น" fr "คือความเป็นกลาง วัฒนธรรมและ "fr-FR" เป็นวัฒนธรรมเฉพาะโปรดทราบว่า "zh-CHS" (จีนตัวย่อ) และ "zh-CHT" (จีนดั้งเดิม) เป็นวัฒนธรรมที่เป็นกลาง "
บรอดแบนด์

ฉันเพิ่งทำสิ่งนี้ด้วยความช่วยเหลือของลิงก์ 2 ขั้นตอนที่ไม่ได้กล่าวถึงที่นั่น: 1. คลิกไฟล์. แหล่งที่มาทั้งหมดและตั้งค่าคุณสมบัติ "Build Action" เป็น "เนื้อหา" 2. คลิกไฟล์. ทรัพยากรทั้งหมดและตั้งค่าคุณสมบัติ "Copy to Output Directory" เป็น "Copy Always"
Sourav

1
@Kiquenet สำหรับคำตอบที่สมบูรณ์ (พร้อมรหัส) รวมถึงการรองรับแบบกว้าง. NET โปรดดู: stackoverflow.com/a/35813707/2901207
CularBytes

9

ฉันเพิ่งเขียนโปรแกรมที่รองรับทั้งภาษาเยอรมันและภาษาอังกฤษ ฉันรู้สึกประหลาดใจที่พบว่าถ้าฉันตั้งชื่อแหล่งข้อมูลภาษาอังกฤษของฉันว่า LanguageResources.resx และทรัพยากรภาษาเยอรมันของฉัน LanguageResources.de.resx มันจะเลือกภาษาที่ถูกต้องโดยอัตโนมัติ ResXFileCodeGenerator ดูแลทั้งหมดให้ฉัน

โปรดทราบว่าฟิลด์ในสองไฟล์เหมือนกันและฟิลด์ใด ๆ ที่ยังไม่ได้ป้อนภาษาเยอรมันจะแสดงในแอปพลิเคชันเป็นภาษาอังกฤษเนื่องจากภาษาไฟล์ที่ไม่เฉพาะเจาะจงที่สุดคือไฟล์เริ่มต้น เมื่อต้องการค้นหาสตริงให้เปลี่ยนจากเฉพาะส่วนใหญ่ (เช่น. de-DE.resx) ไปหาค่าที่เจาะจงน้อยที่สุด (เช่น .resx)

หากต้องการรับสตริงของคุณให้ใช้การเรียก ResourceManager.GetString หรือ ResourceManager.GetObject แอปพลิเคชันควรให้ ResourceManager แก่คุณฟรี


6

เพื่อประโยชน์ของผู้อื่นที่อาจเจอสิ่งนี้ (1 ปีขึ้นไปหลังจากโพสต์ล่าสุด) ฉันเป็นผู้เขียนผลิตภัณฑ์แปลภาษาแบบมืออาชีพที่ทำให้กระบวนการแปลทั้งหมดง่ายมาก เป็น Add-in ของ Visual Studio ที่จะดึงสตริง ".resx" ทั้งหมดออกจากโซลูชันที่กำหนดเองและโหลดลงในไฟล์เดียวที่สามารถแปลโดยใช้แอปพลิเคชันแบบสแตนด์อโลนฟรี (นักแปลสามารถดาวน์โหลดได้จากไซต์ของฉัน) Add-in เดียวกันจะนำเข้าสตริงที่แปลแล้วกลับเข้าไปในโซลูชันของคุณ ใช้งานง่ายมากด้วยระบบป้องกันในตัวจำนวนมากระฆังและนกหวีดจำนวนมากและความช่วยเหลือออนไลน์ (คุณไม่ต้องการมันมากนัก) ดูhttp://www.hexadigm.com


1
สิ่งนี้ควรเพิ่มเป็นฟังก์ชันเนทีฟให้กับ visualstudio! ซอฟต์แวร์ยอดเยี่ยม!
Caverna

ขอบคุณมาก (ชื่นชม) ฉันจะตกลงกับคุณก่อนที่จะเริ่มผลิตภัณฑ์ (ประมาณ 10 ปีที่แล้ว) แต่ถ้า MSFT นำมาใช้ในวันนี้มันจะทำให้ฉันออกจากธุรกิจ :)
Larry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.