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 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
@Eric Bole-Feysot 답변 외에도
위성 어셈블리 덕분에 .dll / .exe 파일을 기반으로 현지화를 만들 수 있습니다 . 이 방법:
- 소스 코드 (VS 프로젝트)는 언어 프로젝트와 분리 될 수 있습니다.
- 새 언어를 추가해도 프로젝트를 다시 컴파일 할 필요가 없습니다.
- 최종 사용자도 번역 할 수 있습니다.
.dll / .exe 파일을 기반으로 지역화를 만들 수있는 LSACreator (비상업적 사용 또는 구매 옵션 무료) 라는 알려진 도구가 있습니다. 실제로, 언어 프로젝트 디렉토리에서 내부적으로 현지화 된 resx 파일 버전을 생성 / 관리하고 @Eric Bole-Feysot가 설명한 것과 유사한 방식으로 어셈블리를 컴파일합니다 .
나의 경우에는
[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]
AssemblyInfo.cs에서 정상적으로 작동하지 못했습니다.
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) );
}
}
¹ (저는 해당 라이브러리의 관리자입니다)
참고 URL : https://stackoverflow.com/questions/1142802/how-to-use-localization-in-c-sharp
'IT' 카테고리의 다른 글
Android에서 ScrollView를 사용하는 방법은 무엇입니까? (0) | 2020.04.25 |
---|---|
AJAX 응답이 쿠키를 설정할 수 있습니까? (0) | 2020.04.02 |
Laravel Eloquent를 사용하여 마지막으로 삽입 한 ID 가져 오기 (0) | 2020.04.02 |
동일한 속성에서 배경 이미지와 불투명도를 설정할 수 있습니까? (0) | 2020.04.02 |
Xcode : 프로세스 작업을 가져 오지 못했습니다. (0) | 2020.04.02 |