현지화가 작동하지 않는 것 같습니다.
수업 도서관이 있습니다. 이제 거기에 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 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
파일 탭) - resx 파일에 문자열 저장소를 추가하십시오 (예 : name
Hello
, valueHello
) - 자원 파일을 저장하십시오
Visual Studio strings
는 실제로에 배치 된 각 클래스를 자동 생성합니다 strings.Designer.cs
. 클래스는 새로 만든 .cs
파일이 배치 될 것으로 예상되는 것과 동일한 네임 스페이스에 있습니다 .
이 코드 Hello
는 기본 리소스이고 사용 가능한 언어 별 리소스가 없기 때문에 항상 코드를 인쇄 합니다.
Console.WriteLine(strings.Hello);
이제 새로운 언어 별 리소스를 추가하십시오.
- 추가
strings.fr.resx
(프랑스어) - 이전과 이름은 같지만 값이 다른 문자열을 추가하십시오 : (name
Hello
, valueSalut
)
다음 코드가 인쇄됩니다 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가 설명한 것과 유사한 방식으로 어셈블리를 컴파일합니다 .