ฉันดูเหมือนจะไม่สามารถแปลภาษาท้องถิ่นให้ทำงานได้
ฉันมีห้องสมุดเรียน ตอนนี้ฉันต้องการสร้างresxไฟล์ในนั้นและคืนค่าบางอย่างตามวัฒนธรรมเธรด
ฉันจะทำสิ่งนั้นได้อย่างไร
ฉันดูเหมือนจะไม่สามารถแปลภาษาท้องถิ่นให้ทำงานได้
ฉันมีห้องสมุดเรียน ตอนนี้ฉันต้องการสร้างresxไฟล์ในนั้นและคืนค่าบางอย่างตามวัฒนธรรมเธรด
ฉันจะทำสิ่งนั้นได้อย่างไร
คำตอบ:
strings.resx
และชื่อSystem.Threading
และSystem.Globalization
เรียกใช้รหัสนี้:
Console.WriteLine(Properties.strings.Hello);
ควรพิมพ์ "Hello"
ตอนนี้เพิ่มไฟล์ทรัพยากรใหม่ชื่อ "strings.fr.resx" (หมายเหตุส่วน "fr" หนึ่งไฟล์นี้จะมีทรัพยากรเป็นภาษาฝรั่งเศส) เพิ่มทรัพยากรสตริงที่มีชื่อเดียวกับใน strings.resx แต่มีค่าเป็นภาษาฝรั่งเศส (Name = "Hello", Value = "Salut") ตอนนี้ถ้าคุณเรียกใช้รหัสต่อไปนี้ก็ควรพิมพ์ Salut:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.Hello);
สิ่งที่เกิดขึ้นคือระบบจะค้นหาทรัพยากรสำหรับ "FR-FR" จะไม่พบหนึ่ง (เนื่องจากเราระบุ "fr" ในไฟล์ของคุณ ") จากนั้นจะกลับไปตรวจสอบ" fr "ซึ่งพบ (และใช้)
รหัสต่อไปนี้จะพิมพ์ "Hello":
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.Hello);
นั่นเป็นเพราะไม่พบทรัพยากร "en-US" ใด ๆ และยังไม่มีทรัพยากร "en" ดังนั้นมันจะถอยกลับไปเป็นค่าเริ่มต้นซึ่งเป็นสิ่งที่เราเพิ่มจากจุดเริ่มต้น
คุณสามารถสร้างไฟล์ที่มีทรัพยากรเฉพาะเจาะจงมากขึ้นหากต้องการ (เช่น strings.fr-FR.resx และ strings.fr-CA.resx สำหรับภาษาฝรั่งเศสในฝรั่งเศสและแคนาดาตามลำดับ) ในแต่ละไฟล์ดังกล่าวคุณจะต้องเพิ่มทรัพยากรสำหรับสตริงเหล่านั้นที่แตกต่างจากทรัพยากรที่มันจะถอยกลับไป ดังนั้นหากข้อความเหมือนกันในฝรั่งเศสและแคนาดาคุณสามารถใส่ไว้ใน strings.fr.resx ในขณะที่สตริงที่แตกต่างกันในภาษาฝรั่งเศสแคนาดาสามารถเข้าไปใน strings.fr-CA.resx
Access Modifier
ควรตั้งค่าPublic
สำหรับคลาสทรัพยากรที่จะสร้าง คลาสไม่จำเป็นใน Properties namespace เป็นตำแหน่งที่คุณวางไฟล์. resx
มันค่อนข้างง่ายจริงๆ Strings.resx
สร้างแฟ้มทรัพยากรใหม่ตัวอย่างเช่น ตั้งค่าการAccess Modifier
Public
ใช้เทมเพลตไฟล์ apprioriate ดังนั้น Visual Studio จะสร้างคลาส accessor โดยอัตโนมัติ (ชื่อจะเป็นStrings
ในกรณีนี้) นี่คือภาษาเริ่มต้นของคุณ
ตอนนี้เมื่อคุณต้องการเพิ่มพูดการแปลภาษาเยอรมันให้เพิ่มไฟล์ resx ที่แปลแล้ว โดยทั่วไปจะเป็นStrings.de.resx
ในกรณีนี้ Strings.de-AT.resx
หากคุณต้องการที่จะเพิ่มการแปลเพิ่มเติมสำหรับพูดออสเตรียนอกจากนี้คุณยังจะต้องสร้าง
ตอนนี้ไปสร้างสตริง - HelloWorld
สมมติว่าสตริงที่มีชื่อ ในของคุณStrings.resx
เพิ่มสตริงนี้ด้วยค่า "Hello, world!" ในStrings.de.resx
เพิ่ม "Hallo, Welt!" และในStrings.de-AT.resx
เพิ่ม "Servus, Welt!" แค่นี้แหละ
ตอนนี้คุณมีStrings
คลาสที่สร้างขึ้นและมันมีคุณสมบัติที่มีทะเยอทะยานHelloWorld
ระดับและมีคุณสมบัติที่มีความทะเยอทะยานการรับคุณสมบัตินี้จะโหลด "Servus, Welt!" เมื่อสถานที่ของคุณเป็น de-AT, "Hallo, Welt! เมื่อสถานที่ของคุณเป็นสถานที่อื่น ๆ (รวมถึง de-DE และ de-CH) และ" Hello, World! "เมื่อสถานที่ของคุณเป็นอย่างอื่นถ้าสตริงเป็น หายไปในเวอร์ชันที่แปลแล้วตัวจัดการทรัพยากรจะเดินขึ้นโซ่โดยอัตโนมัติจากผู้เชี่ยวชาญที่มากที่สุดไปจนถึงทรัพยากรที่ไม่เปลี่ยนแปลง
คุณสามารถใช้ResourceManager
คลาสเพื่อควบคุมเพิ่มเติมเกี่ยวกับวิธีการโหลดสิ่งต่างๆ Strings
คลาสที่สร้างขึ้นใช้เช่นกัน
นอกจากนี้ @Fredrik Mörkคำตอบที่ยอดเยี่ยมเกี่ยวกับสตริงเพื่อเพิ่มการแปลเป็นภาษาท้องถิ่นให้ทำดังนี้
"Localizable"
การtrue
Language
คุณสมบัติของฟอร์มเป็นภาษาที่คุณต้องการ (จากรายการแบบหล่นลงพร้อมกับพวกเขาทั้งหมดใน)แก้ไข: บทความ MSDN นี้เกี่ยวกับ Localizing Windows Formsไม่ใช่ต้นฉบับที่ฉันเชื่อมโยง ... แต่อาจทำให้มีแสงสว่างมากขึ้นถ้าจำเป็น (อันเก่าถูกพรากไป)
คำตอบที่ยอดเยี่ยมโดยF.Mörk แต่ถ้าคุณต้องการอัปเดตการแปลหรือเพิ่มภาษาใหม่เมื่อมีการเปิดตัวแอปพลิเคชันคุณจะต้องติดขัดเพราะคุณจะต้องคอมไพล์ใหม่เพื่อสร้าง resources.dll
นี่เป็นวิธีการรวบรวม dll ทรัพยากรด้วยตนเอง มันใช้เครื่องมือ resgen.exe และ al.exe (ติดตั้งกับ sdk)
สมมติว่าคุณมีไฟล์ทรัพยากร Strings.fr.resx คุณสามารถรวบรวม dll ทรัพยากรด้วยชุดข้อมูลต่อไปนี้:
resgen.exe /compile Strings.fr.resx,WpfRibbonApplication1.Strings.fr.resources
Al.exe /t:lib /embed:WpfRibbonApplication1.Strings.fr.resources /culture:"fr" /out:"WpfRibbonApplication1.resources.dll"
del WpfRibbonApplication1.Strings.fr.resources
pause
อย่าลืมรักษา namespace ดั้งเดิมไว้ในชื่อไฟล์ (ที่นี่ "WpfRibbonApplication1")
การแก้ไขและคำตอบของ@Fredrik Mörkอย่างละเอียด
strings.resx
ไฟล์ทรัพยากรให้กับโครงการของคุณ (หรือชื่อไฟล์อื่น)Access Modifier
เป็นPublic
(ในstrings.resx
แท็บไฟล์ที่เปิด)Hello
, ค่าHello
)Visual Studio อัตโนมัติสร้างแต่ละชั้นซึ่งวางอยู่ในstrings
strings.Designer.cs
คลาสอยู่ในเนมสเปซเดียวกันกับที่คุณคาดว่า.cs
จะวางไฟล์ที่สร้างขึ้นใหม่
รหัสนี้จะพิมพ์เสมอHello
เพราะนี่เป็นทรัพยากรเริ่มต้นและไม่มีทรัพยากรเฉพาะภาษา:
Console.WriteLine(strings.Hello);
ตอนนี้เพิ่มทรัพยากรเฉพาะภาษาใหม่:
strings.fr.resx
(สำหรับภาษาฝรั่งเศส)Hello
ค่าSalut
)พิมพ์รหัสต่อไปนี้Salut
:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(strings.Hello);
Thread.CurrentThread.CurrentUICulture
สิ่งที่ทรัพยากรถูกใช้ขึ้นอยู่กับ มันถูกตั้งค่าขึ้นอยู่กับการตั้งค่าภาษาของ Windows UI หรือสามารถตั้งค่าด้วยตนเองเหมือนในตัวอย่างนี้ เรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่
คุณสามารถเพิ่มทรัพยากรเฉพาะประเทศเหมือนหรือstrings.fr-FR.resx
strings.fr-CA.resx
สตริงที่จะใช้ถูกกำหนดตามลำดับความสำคัญนี้:
strings.fr-CA.resx
strings.fr.resx
strings.resx
หมายเหตุว่าทรัพยากรเฉพาะภาษาสร้างประกอบดาวเทียม
ยังได้เรียนรู้วิธีการที่CurrentCulture
แตกต่างจากที่นี่CurrentUICulture
ในกรณีของฉัน
[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]
ใน AssemblyInfo.cs ทำให้สิ่งต่าง ๆ ทำงานตามปกติ
นอกจากคำตอบ@Eric Bole-Feysot :
ด้วยแอสเซมบลีของดาวเทียมคุณสามารถสร้างการแปลตามไฟล์. dll / .exe ทางนี้:
มีเครื่องมือที่รู้จักกันเล็กน้อยที่เรียกว่า LSACreator (ฟรีสำหรับการใช้ที่ไม่ใช่เชิงพาณิชย์หรือตัวเลือกซื้อ) ซึ่งช่วยให้คุณสร้างการแปลตามไฟล์. dll / .exe ในความเป็นจริงภายใน (โครงการภาษา directory) มันจะสร้าง / จัดการภาษาท้องถิ่นรุ่นของแฟ้ม resx และรวบรวมการชุมนุมในลักษณะที่คล้ายกันเป็น@ Eric Bole Feysot-อธิบาย
ResourceManager และ. resx ค่อนข้างยุ่ง
คุณสามารถใช้Lexical.Localization ¹ซึ่งอนุญาตให้ฝังค่าเริ่มต้นและค่าเฉพาะของวัฒนธรรมลงในรหัสและสามารถขยายในไฟล์การแปลภายนอกสำหรับวัฒนธรรมที่ละเอียดยิ่งขึ้น (เช่น. json หรือ. resx)
public class MyClass
{
/// <summary>
/// Localization root for this class.
/// </summary>
static ILine localization = LineRoot.Global.Type<MyClass>();
/// <summary>
/// Localization key "Ok" with a default string, and couple of inlined strings for two cultures.
/// </summary>
static ILine ok = localization.Key("Success")
.Text("Success")
.fi("Onnistui")
.sv("Det funkar");
/// <summary>
/// Localization key "Error" with a default string, and couple of inlined ones for two cultures.
/// </summary>
static ILine error = localization.Key("Error")
.Format("Error (Code=0x{0:X8})")
.fi("Virhe (Koodi=0x{0:X8})")
.sv("Sönder (Kod=0x{0:X8})");
public void DoOk()
{
Console.WriteLine( ok );
}
public void DoError()
{
Console.WriteLine( error.Value(0x100) );
}
}
¹ (ฉันเป็นผู้ดูแลห้องสมุดนั้น)
โดยทั่วไปคุณใส่การแปลของคุณลงในไฟล์ทรัพยากรเช่น resources.resx
แต่ละวัฒนธรรมที่เฉพาะเจาะจงมีชื่อแตกต่างกันเช่น resources.nl.resx, resources.fr.resx, resources.de.resx, ...
ตอนนี้ส่วนที่สำคัญที่สุดของโซลูชันคือการรักษาการแปลของคุณ ใน Visual Studio ติดตั้งเครื่องมือ Microsoft MAT: Multkit App Toolkit (MAT) ทำงานร่วมกับ winforms, wpf, asp.net (core), uwp, ...
โดยทั่วไปเช่นสำหรับโซลูชัน WPF ในโครงการ WPF
[assembly: System.Resources.NeutralResourcesLanguage("en")]
สิ่งที่คุณจะเห็นคือโฟลเดอร์ใหม่จะถูกสร้างขึ้นเรียกว่า "MultilingualResources" ที่มี....nl.xlf
ไฟล์
สิ่งเดียวที่คุณต้องทำตอนนี้คือ:
(ไฟล์. xlf ควรเปิดด้วย "ตัวแก้ไขหลายภาษา" หากไม่ใช่กรณีนี้ให้คลิกเมาส์ขวาที่ไฟล์. xlf เลือก "เปิดด้วย ... " และเลือก "ตัวแก้ไขหลายภาษา"
มีความสุข! ตอนนี้คุณสามารถดูสิ่งที่ยังไม่ได้แปลส่งออกการแปลใน xlf ไปยัง บริษัท แปลภายนอกนำเข้าอีกครั้งรีไซเคิลการแปลจากโครงการอื่น ๆ ฯลฯ ...
ข้อมูลเพิ่มเติม: