현지화가 작동하지 않는 것 같습니다.
수업 도서관이 있습니다. 이제 거기에 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 네임 스페이스에 반드시 필요한 것은 아니며 .resx 파일을 배치하는 위치입니다.
실제로는 매우 간단합니다. 예를 들어 새 리소스 파일을 만듭니다 Strings.resx
. 설정 Access Modifier
에 Public
. 적절한 파일 템플릿을 사용하면 Visual Studio에서 자동으로 접근 자 클래스를 생성합니다 ( Strings
이 경우 이름은 ). 이것이 기본 언어입니다.
이제 독일어 현지화를 추가하려면 현지화 된 resx 파일을 추가하십시오. 이 Strings.de.resx
경우 일반적으로 발생합니다. 예를 들어 오스트리아에 대한 현지화를 추가하려면을 추가로 생성합니다 Strings.de-AT.resx
.
이제 문자열을 만들어 봅시다-이름을 가진 문자열을 말해 봅시다 HelloWorld
. 당신에 Strings.resx
, 값으로이 문자열을 추가 "안녕하세요, 세계!". 이어 Strings.de.resx
, "안녕, 채찍 자국을!"를 추가합니다. 그리고 Strings.de-AT.resx
"Servus, Welt!"를 추가하십시오. 그게 다야
이제 생성 된 Strings
클래스가 있고 getter 속성이 HelloWorld
있습니다. 이 속성을 가져 오면 "Servus, Welt!"가로드됩니다. 로케일이 de-AT 인 경우 "Hallo, Welt!는 로케일이 다른 로케일 (de-DE 및 de-CH 포함)이면"Hello, Welt! "이고 로케일이 다른 항목 인 경우"Hello, World! "입니다. 현지화 된 버전에서 누락 된 경우 리소스 관리자는 가장 전문화 된 것에서 고정되지 않은 리소스까지 체인을 자동으로 걸어갑니다.
ResourceManager
클래스를 사용하여 물건을 정확히로드하는 방법에 대한 자세한 제어가 가능합니다. 생성 된 Strings
클래스도이를 사용합니다.
또한 문자열에 대한 @Fredrik Mörk의 훌륭한 답변 은 양식 에 지역화를 추가 하려면 다음을 수행하십시오.
"Localizable"
에true
Language
속성을 원하는 언어로 변경하십시오 (모두 멋진 드롭 다운에서)편집 : Windows Forms 현지화에 대한 이 MSDN 기사 는 내가 링크 한 원본이 아니지만 필요한 경우 더 많은 정보를 얻을 수 있습니다. (오래된 것이 제거되었습니다)
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
원래 네임 스페이스를 파일 이름 (여기서는 "WpfRibbonApplication1")으로 유지하십시오.
@Fredrik Mörk 답변 의 수정 및 정교화 .
strings.resx
프로젝트에 리소스 파일 추가 (또는 다른 파일 이름)Access Modifier
에 Public
(열린에서 strings.resx
파일 탭)Hello
, value Hello
)Visual Studio strings
는 실제로에 배치 된 각 클래스를 자동 생성합니다 strings.Designer.cs
. 클래스는 새로 만든 .cs
파일이 배치 될 것으로 예상되는 것과 동일한 네임 스페이스에 있습니다 .
이 코드 Hello
는 기본 리소스이고 사용 가능한 언어 별 리소스가 없기 때문에 항상 코드를 인쇄 합니다.
Console.WriteLine(strings.Hello);
이제 새로운 언어 별 리소스를 추가하십시오.
strings.fr.resx
(프랑스어)Hello
, value 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
@Eric Bole-Feysot 답변 외에도
위성 어셈블리 덕분에 .dll / .exe 파일을 기반으로 현지화를 만들 수 있습니다 . 이 방법:
.dll / .exe 파일을 기반으로 한 현지화를 만들 수있는 LSACreator (비상업적 사용 또는 구매 옵션 무료) 라는 알려진 도구가 있습니다. 실제로, 언어 프로젝트 디렉토리에서 내부적으로 현지화 된 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 도구 인 Multilingual App Toolkit (MAT)을 설치하십시오. winforms, wpf, asp.net (core), uwp,…와 함께 작동
일반적으로, 예를 들어 WPF 솔루션의 경우 WPF 프로젝트
[assembly: System.Resources.NeutralResourcesLanguage("en")]
....nl.xlf
파일이 포함 된 "MultilingualResources"라는 새 폴더가 생성 됩니다.
이제해야 할 일은 :
.xlf 파일은 "다국어 편집기"로 열어야합니다. 그렇지 않은 경우 .xlf 파일을 마우스 오른쪽 단추로 클릭하고 "다음으로 열기…"를 선택한 다음 "다국어 편집기"를 선택하십시오.
즐기세요! 이제 번역되지 않은 내용, xlf의 번역을 외부 번역 회사로 내보내기, 다시 가져 오기, 다른 프로젝트의 번역 등을 볼 수 있습니다.
더 많은 정보: