C #에서 지역화를 사용하는 방법


268

현지화가 작동하지 않는 것 같습니다.

수업 도서관이 있습니다. 이제 거기에 resx 파일 을 만들고 스레드 문화에 따라 일부 값을 반환 하고 싶습니다 .

어떻게해야합니까?


추신 : Visual Studio 용 무료 Microsoft MAT (Multilingual App Toolkit) 확장 프로그램을 설치했는지 확인하십시오 ;-)
juFo

답변:


571
  • 다음을 수행하여 프로젝트에 자원 파일을 추가하십시오 ( "strings.resx"라고 할 수 있음) . 프로젝트에서 특성
    마우스 오른쪽 단추로 클릭 하고 컨텍스트 메뉴에서 추가-> 새 항목 ... 을 선택한 다음 비주얼 C # 항목은 선택 "자원 파일을" 과 이름 .strings.resx
  • resx 파일에 문자열 저장소를 추가하고 좋은 이름을 지정하십시오 (예 : "Hello"로 이름을 지정하고 "Hello"값을 지정하십시오).
  • 자원 파일을 저장하십시오 ( 참고 : 이 파일은 2 문자 언어 코드가 없으므로 기본 자원 파일입니다).
  • 프로그램에 대한 참조를 추가 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에 들어갈 수 있습니다.


24
대답은 Visual Studio에서 수행하는 "비하인드 스토리"배관을 참조 할 수 있습니다. resx.designer.cs 파일, 지능적인 작업 수행; 클래스 라이브러리로 컴파일 된 위성 어셈블리, 컴파일 된 어셈블리 및이를 사용하는 이후의 프로젝트 등으로 배포해야하는 경우 ... 정답은 간단하지만 간단합니다. Visual Studio를 사용하지 않습니다.
Tao

13
소식 +1 파일을 수동으로 만드는 대신 Zeta Resource Editor ( zeta-resource-editor.com/index.html )를 사용해보십시오 . 무료이며 VS에서보다 이러한 번역을 훨씬 빠르게 수행하는 데 도움이됩니다.
Killnine

4
Access ModifierPublic자원 클래스가 생성 되도록 설정해야합니다 . 클래스는 Properties 네임 스페이스에 반드시 필요한 것은 아니며 .resx 파일을 배치하는 위치입니다.
Andrey Moiseev

3
VS 2017에서는 winform에서 현지화 된 resx가 버그로 인해 작동하지 않습니다 (적어도 버전 15.4까지). 티켓 구매 가능 : developercommunity.visualstudio.com/content/problem/63772/…
muccix

4
.NET 4.5부터 Thread.CurrentThread.CurrentUICulture 대신 System.Globalization.CultureInfo.DefaultThreadCurrentCulture를 사용하여 스레드 대신 스레드 대신 전체 애플리케이션의 로케일을 변경할 수 있습니다.
GrixM

41

실제로는 매우 간단합니다. 예를 들어 새 리소스 파일을 만듭니다 Strings.resx. 설정 Access ModifierPublic. 적절한 파일 템플릿을 사용하면 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클래스도이를 사용합니다.


로케일을 설정하는 방법?
Matheus Simon

1
@MatheusSimon : 필요하지 않습니다. 기본적으로 사용자의 현재 로캘이 사용됩니다. 특정 로캘을 강제로 적용하려면 (예 : 사용자가 수동으로 언어를 변경할 수 있도록) 리소스가 처음로드되기 전에 각 스레드에서 System.Threading.Thread.CurrentCulture 및 CurrentUICulture를 설정 해야합니다. 런타임에 업데이트하는 대신 응용 프로그램을 다시 시작하는 것이 더 쉽습니다.
OregonGhost

15

또한 문자열에 대한 @Fredrik Mörk의 훌륭한 답변 은 양식지역화를 추가 하려면 다음을 수행하십시오.

  • 세트 형태 의 속성을 "Localizable"true
  • 양식의 Language속성을 원하는 언어로 변경하십시오 (모두 멋진 드롭 다운에서)
  • 그 형태로 컨트롤을 번역하고 필요한 경우 이동하십시오 (정말로 긴 프랑스어 문장을 스쿼시하십시오!)

편집 : Windows Forms 현지화에 대한MSDN 기사 는 내가 링크 한 원본이 아니지만 필요한 경우 더 많은 정보를 얻을 수 있습니다. (오래된 것이 제거되었습니다)


msdn 기사는 더 이상 사용할 수 없습니다.
fuomag9 2016 년

확실하지 않음-내가 볼 수있는 가장 좋은 것을 연결했지만 7 년 전 기사의 내용을 기억할 수 없습니다.)
noelicus

14

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")으로 유지하십시오.


2
네임 스페이스 (y)를 보존하는 것에 대한 의견에 감사드립니다. 누락 된 경우 오류가 발생하지 않고 대체 자원으로 되돌아갑니다.
Mosca Pt

11

@Fredrik Mörk 답변 의 수정 및 정교화 .

  • strings.resx프로젝트에 리소스 파일 추가 (또는 다른 파일 이름)
  • 설정 Access ModifierPublic(열린에서 strings.resx파일 탭)
  • resx 파일에 문자열 저장소를 추가하십시오 (예 : name Hello, value Hello)
  • 자원 파일을 저장하십시오

Visual Studio strings는 실제로에 배치 된 각 클래스를 자동 생성합니다 strings.Designer.cs. 클래스는 새로 만든 .cs파일이 배치 될 것으로 예상되는 것과 동일한 네임 스페이스에 있습니다 .

이 코드 Hello는 기본 리소스이고 사용 가능한 언어 별 리소스가 없기 때문에 항상 코드를 인쇄 합니다.

Console.WriteLine(strings.Hello);

이제 새로운 언어 별 리소스를 추가하십시오.

  • 추가 strings.fr.resx(프랑스어)
  • 이전과 이름은 같지만 값이 다른 문자열을 추가하십시오 : (name 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


1

나의 경우에는

[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]

AssemblyInfo.cs에서 정상적으로 작동하지 못했습니다.


0

@Eric Bole-Feysot 답변 외에도

위성 어셈블리 덕분에 .dll / .exe 파일을 기반으로 현지화를 만들 수 있습니다 . 이 방법:

  • 소스 코드 (VS 프로젝트)는 언어 프로젝트와 분리 될 수 있습니다.
  • 새 언어를 추가해도 프로젝트를 다시 컴파일 할 필요가 없습니다.
  • 최종 사용자조차도 번역 할 수 있습니다.

.dll / .exe 파일을 기반으로 한 현지화를 만들 수있는 LSACreator (비상업적 사용 또는 구매 옵션 무료) 라는 알려진 도구가 있습니다. 실제로, 언어 프로젝트 디렉토리에서 내부적으로 현지화 된 resx 파일 버전을 생성 / 관리하고 @Eric Bole-Feysot가 설명한 것과 유사한 방식으로 어셈블리를 컴파일합니다 .


0

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) );
    }
}

¹ (저는 해당 라이브러리의 관리자입니다)


0

일반적으로 번역을 리소스 파일 (예 : 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 프로젝트

  • Visual Studio 용 Microsoft MAT 확장을 설치하십시오.
  • 솔루션 탐색기에서 프로젝트> 속성> AssemblyInfo.cs로 이동하십시오.
  • AssemblyInfo.cs에 기본 중립 언어 (필자의 경우 영어)를 추가하십시오. [assembly: System.Resources.NeutralResourcesLanguage("en")]
  • 솔루션 탐색기와 Visual Studio에서 프로젝트를 선택하고 상단 메뉴에서 "도구"> "다국어 앱 툴킷"> "선택 항목 사용"을 클릭하여 프로젝트에 MAT를 사용하도록 설정하십시오.
    • 이제 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "다국어 앱 툴킷"> "번역 언어 추가…"를 선택하고 번역을 추가 할 언어를 선택하십시오. 예 : 네덜란드어.

....nl.xlf파일이 포함 된 "MultilingualResources"라는 새 폴더가 생성 됩니다.

이제해야 할 일은 :

  1. 번역을 기본 resources.resx 파일에 추가하십시오 (필자의 경우 영어)
  2. .xlf 파일은 .resx 파일을 생성 / 업데이트하므로 .xlf 파일 (.resx 파일 아님)을 클릭하여 번역하십시오.

.xlf 파일은 "다국어 편집기"로 열어야합니다. 그렇지 않은 경우 .xlf 파일을 마우스 오른쪽 단추로 클릭하고 "다음으로 열기…"를 선택한 다음 "다국어 편집기"를 선택하십시오.

즐기세요! 이제 번역되지 않은 내용, xlf의 번역을 외부 번역 회사로 내보내기, 다시 가져 오기, 다른 프로젝트의 번역 등을 볼 수 있습니다.

더 많은 정보:

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.