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

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

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

어떻게해야합니까?



답변

  • 다음을 수행하여 프로젝트에 자원 파일을 추가하십시오 ( “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에 들어갈 수 있습니다.


답변

실제로는 매우 간단합니다. 예를 들어 새 리소스 파일을 만듭니다 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클래스도이를 사용합니다.


답변

또한 문자열에 대한 @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 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


답변

나의 경우에는

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

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


답변

@Eric Bole-Feysot 답변 외에도

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

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

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