다음을 통해 공유


Xamarin.iOS의 지역화

이 문서에서는 iOS SDK의 지역화 기능과 Xamarin을 사용하여 액세스하는 방법을 설명합니다.

유니코드가 아닌 데이터를 처리해야 하는 애플리케이션에 문자 집합/코드 페이지를 포함하는 방법에 대한 지침은 국제화 인코딩 을 참조하세요.

iOS 플랫폼 기능

이 섹션에서는 iOS의 일부 지역화 기능에 대해 설명합니다. 특정 코드 및 예제를 보려면 다음 섹션 으로 건너뜁니다.

언어

사용자는 설정 앱에서 해당 언어를 선택합니다. 이 설정은 운영 체제 및 앱에서 표시하는 언어 문자열 및 이미지에 영향을 줍니다.

앱에서 사용되는 언어를 확인하려면 다음의 NSBundle.MainBundle.PreferredLocalizations첫 번째 요소를 가져옵니다.

var lang = NSBundle.MainBundle.PreferredLocalizations[0];

이 값은 영어, 스페인어ja, es 일본어 등의 en 언어 코드입니다. 반환되는 값은 애플리케이션에서 지원하는 지역화 중 하나로 제한됩니다(대체 규칙을 사용하여 최상의 일치를 결정).

애플리케이션 코드는 항상 이 값에 대해 검사 필요가 없습니다. Xamarin과 iOS는 모두 사용자의 언어에 대한 올바른 문자열 또는 리소스를 자동으로 제공하는 데 도움이 되는 기능을 제공합니다. 이러한 기능은 이 문서의 re기본der에 설명되어 있습니다.

참고 항목

앱에서 지원하는 지역화에 관계없이 사용자의 언어 기본 설정을 결정하는 데 사용합니다 NSLocale.PreferredLanguages . 이 메서드에서 반환된 값은 iOS 9에서 변경되었습니다. 자세한 내용은 기술 참고 TN2418을 참조하세요.

로캘

사용자는 설정 앱에서 로캘을 선택합니다. 이 설정은 날짜, 시간, 숫자 및 통화의 서식을 지정하는 방식에 영향을 줍니다.

이렇게 하면 사용자가 12시간 또는 24시간 시간 형식을 볼지 여부, 소수점 구분 기호가 쉼표인지 또는 포인트인지 여부, 날짜 표시의 일, 월 및 연도 순서를 선택할 수 있습니다.

Xamarin을 사용하면 Apple의 iOS 클래스(NSNumberFormatter)와 System.Globalization의 .NET 클래스 모두에 액세스할 수 있습니다. 개발자는 각각 다양한 기능을 사용할 수 있으므로 요구 사항에 더 적합한 기능을 평가해야 합니다. 특히 StoreKit을 사용하여 앱에서 바로 구매 가격을 검색하고 표시하는 경우 반환된 가격 정보에 Apple의 서식 클래스를 사용해야 합니다.

현재 로캘은 다음 두 가지 방법 중 하나를 통해 쿼리할 수 있습니다.

  • NSLocale.CurrentLocale.LocaleIdentifier
  • NSLocale.AutoUpdatingCurrentLocale.LocaleIdentifier

첫 번째 값은 운영 체제에서 캐시할 수 있으므로 사용자가 현재 선택한 로캘을 항상 반영하지는 않을 수 있습니다. 두 번째 값을 사용하여 현재 선택한 로캘을 가져옵니다.

참고 항목

Mono(Xamarin.iOS의 기반이 되는 .NET 런타임) 및 Apple의 iOS API는 동일한 언어/지역 조합 집합을 지원하지 않습니다. 이 때문에 Mono의 유효한 값에 매핑되지 않는 iOS 설정 앱에서 언어/지역 조합을 선택할 수 있습니다. 예를 들어 i전화 언어를 영어 및 해당 지역을 스페인으로 설정하면 다음 API가 다른 값을 생성합니다.

  • CurrentThead.CurrentCulture: en-US(Mono API)
  • CurrentThread.CurrentUICulture: en-US(Mono API)
  • NSLocale.CurrentLocale.LocaleIdentifier: en_ES(Apple API)

Mono는 리소스를 선택하고 날짜 및 CurrentThread.CurrentCulture 통화의 서식을 지정하는 데 사용 CurrentThread.CurrentUICulture 하므로 Mono 기반 지역화(예: .resx 파일 포함)는 이러한 언어/지역 조합에 대한 예상 결과를 생성하지 못할 수 있습니다. 이러한 상황에서는 Apple의 API를 사용하여 필요에 따라 지역화합니다.

NSCurrentLocaleDidChangeNotification

iOS는 NSCurrentLocaleDidChangeNotification 사용자가 로캘을 업데이트할 때 생성합니다. 애플리케이션은 실행되는 동안 이 알림을 수신 대기할 수 있으며 UI를 적절하게 변경할 수 있습니다.

iOS의 지역화 기본 사항

iOS의 다음 기능은 Xamarin에서 쉽게 활용하여 사용자에게 표시할 지역화된 리소스를 제공합니다. 이러한 아이디어를 구현하는 방법을 보려면 TaskyL10n 샘플을 참조하세요.

Info.plist에서 기본 및 지원되는 언어 지정

기술 Q&A QA1828: iOS에서 앱의 언어를 결정하는 방법에서 Apple은 iOS가 앱에서 사용할 언어를 선택하는 방법을 설명합니다. 다음 요소는 표시되는 언어에 영향을 줍니다.

  • 사용자의 기본 설정 언어(설정 앱에서 찾을 수 있습니다).
  • 앱과 함께 번들로 제공되는 지역화(.lproj 폴더)
  • CFBundleDevelopmentRegion (앱의 기본 언어를 지정하는 Info.plist 값)
  • CFBundleLocalizations (지원되는 모든 지역화를 지정하는 Info.plist 배열)

기술 Q&A CFBundleDevelopmentRegion 에 표시된 대로 앱의 기본 지역 및 언어를 나타냅니다. 앱이 사용자의 기본 설정 언어를 명시적으로 지원하지 않는 경우 이 필드에 지정된 언어를 사용합니다.

Important

iOS 11은 이전 버전의 운영 체제보다 더 엄격하게 이 언어 선택 메커니즘을 적용합니다. 따라서 .lproj 폴더를 포함하거나 값을 CFBundleLocalizations 설정하여 지원되는 지역화를 명시적으로 선언하지 않는 iOS 11 앱은 iOS 10과 다른 언어를 iOS 11로 표시할 수 있습니다.

Info.plist 파일에 지정되지 않은 경우 CFBundleDevelopmentRegion Xamarin.iOS 빌드 도구는 현재 기본값en_US을 사용합니다. 이후 릴리스에서는 변경될 수 있지만 기본 언어는 영어입니다.

앱이 예상 언어를 선택하도록 하려면 다음 단계를 수행합니다.

  • 기본 언어를 지정합니다. Info.plist열고 원본 뷰를 사용하여 키 값을 CFBundleDevelopmentRegion 설정합니다. XML에서는 다음과 유사하게 표시됩니다.
<key>CFBundleDevelopmentRegion</key>
<string>es</string>

이 예제에서는 "es"를 사용하여 사용자의 기본 설정 언어가 지원되지 않는 경우 기본적으로 스페인어로 지정합니다.

  • 지원되는 모든 지역화를 선언합니다. Info.plist에서 원본 뷰를 사용하여 키에 대한 CFBundleLocalizations 배열을 설정합니다. XML에서는 다음과 유사하게 표시됩니다.
<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>es</string>
    ...
</array>

.resx 파일과 같은 .NET 메커니즘을 사용하여 지역화된 Xamarin.iOS 앱은 이러한 Info.plist 값도 제공해야 합니다.

이러한 Info.plist 키에 대한 자세한 내용은 Apple의 정보 속성 목록 키 참조를 참조하세요.

GetLocalizedString 메서드

이 메서드는 NSBundle.MainBundle.GetLocalizedString 프로젝트의 .strings 파일에 저장된 지역화된 텍스트를 찾습니다 . 이러한 파일은 .lproj 접미사가 있는 특별히 명명된 디렉터리에서 언어별로 구성됩니다(확장의 첫 글자는 소문자 "L"입니다).

.strings 파일 위치

  • Base.lproj 는 기본 언어에 대한 리소스를 포함하는 디렉터리입니다. 프로젝트 루트에 있는 경우가 많습니다(리소스 폴더에도 배치할 수 있음).
  • <language.lproj> 디렉터리들은 지원되는 각 언어(일반적으로 Resources 폴더)에 대해 만들어집니다.

각 언어 디렉터리에 다양한 .strings 파일이 있을 수 있습니다.

  • Localizable.strings – 지역화된 텍스트의 기본 목록입니다.
  • InfoPlist.strings – 애플리케이션 이름과 같은 항목을 번역하기 위해 이 파일에서 특정 키를 사용할 수 있습니다.
  • <storyboard-name.strings> – 스토리보드의 사용자 인터페이스 요소에 대한 번역을 포함하는 선택적 파일입니다.

이러한 파일에 대한 빌드 작업은 번들 리소스여야 합니다.

.strings 파일 형식

지역화된 문자열 값의 구문은 다음과 같습니다.

/* comment */
"key"="localized-value";

문자열에서 다음 문자를 이스케이프해야 합니다.

  • \" 의견
  • \\ 백슬래시
  • \n 줄 바꿈

예제 es/Localizable.strings (예: 샘플의 스페인어) 파일:

"<new task>" = "<new task>";
"Task Details" = "Detalles de la tarea";
"Name" = "Nombre";
"task name" = "nombre de la tarea";
"Notes" = "Notas";
"other task info"= "otra información de tarea";
"Done" = "Completo";
"Save" = "Guardar";
"Delete" = "Eliminar";

이미지

iOS에서 이미지를 지역화하려면 다음을 수행합니다.

  1. 코드의 이미지를 참조하세요. 예를 들면 다음과 같습니다.

    UIImage.FromBundle("flag");
    
  2. 기본 이미지 파일 flag.png Base.lproj (네이티브 개발 언어 디렉터리)에 배치합니다.

  3. 필요에 따라 각 언어에 대한 .lproj 폴더에 지역화된 버전의 이미지를 배치합니다(예: es.lproj, ja.lproj). 각 언어 디렉터리에서 동일한 파일 이름 flag.png 사용합니다.

특정 언어에 대한 이미지가 없는 경우 iOS는 기본 네이티브 언어 폴더로 대체되고 해당 위치에서 이미지를 로드합니다.

이미지 시작

각 언어의 .lproj 디렉터리에 배치할 때 시작 이미지(및 i전화6 모델의 경우 XIB 또는 Storyboard)에 대한 표준 명명 규칙을 사용합니다.

Default.png
Default@2x.png
Default-568h@2x.png
LaunchScreen.xib

앱 이름

.lproj 디렉터리에 InfoPlist.strings 파일을 배치하면 애플리케이션 이름을 포함하여 앱의 Info.plist에서 일부 값을 재정의할 수 있습니다.

"CFBundleDisplayName" = "LeónTodo";

애플리케이션별 문자열을 지역화하는 데 사용할 수 있는 다른 키는 다음과 같습니다.

  • CFBundleName
  • CFBundleShortVersionString
  • NSHumanReadableCopyright

날짜 및 시간

기본 제공 .NET 날짜 및 시간 함수(현재 CultureInfo와 함께)를 사용하여 로캘의 날짜 및 시간 형식을 지정할 수 있지만 로캘별 사용자 설정(언어와 별도로 설정할 수 있습니다)은 무시됩니다.

iOS NSDateFormatter 를 사용하여 사용자의 로캘 기본 설정과 일치하는 출력을 생성합니다. 다음 샘플 코드에서는 기본 날짜 및 시간 서식 옵션을 보여 줍니다.

var date = NSDate.Now;
var df = new NSDateFormatter ();
df.DateStyle = NSDateFormatterStyle.Full;
df.TimeStyle = NSDateFormatterStyle.Long;
Debug.WriteLine ("Full,Long: " + df.StringFor(date));
df.DateStyle = NSDateFormatterStyle.Short;
df.TimeStyle = NSDateFormatterStyle.Short;
Debug.WriteLine ("Short,Short: " + df.StringFor(date));
df.DateStyle = NSDateFormatterStyle.Medium;
df.TimeStyle = NSDateFormatterStyle.None;
Debug.WriteLine ("Medium,None: " + df.StringFor(date));

미국 영어 결과:

Full,Long: Friday, August 7, 2015 at 10:29:32 AM PDT
Short,Short: 8/7/15, 10:29 AM
Medium,None: Aug 7, 2015

스페인의 스페인어 결과:

Full,Long: viernes, 7 de agosto de 2015, 10:26:58 GMT-7
Short,Short: 7/8/15 10:26
Medium,None: 7/8/2015

자세한 내용은 Apple Date Formatters 설명서를 참조하세요. 로캘에 민감한 날짜 및 시간 서식을 테스트할 때 i전화 언어지역 설정을 모두 검사.

RTL(오른쪽에서 왼쪽) 레이아웃

iOS는 RTL 인식 앱을 빌드하는 데 도움이 되는 다양한 기능을 제공합니다.

  • 자동 레이아웃 leadingtrailing 특성을 컨트롤 맞춤에 사용합니다(영어의 경우 왼쪽과 오른쪽에 해당하지만 RTL 언어에서는 역방향). 컨트롤은 UIStackView RTL을 인식하도록 컨트롤을 배치하는 데 특히 유용합니다.
  • 텍스트 맞춤(대부분의 언어에는 남아 있지만 RTL의 경우 오른쪽)에 사용합니다 TextAlignment = UITextAlignment.Natural .
  • UINavigationController 는 뒤로 단추를 자동으로 대칭 이동하고 살짝 밀기 방향을 반대로 바뀝니다.

다음 스크린샷은 아랍어 및 히브리어로 지역화된 Tasky 샘플을 보여 줍니다(필드에 영어가 입력되었지만).

Localization in Arabic

Localization in Hebrew

iOS는 자동으로 반전 UINavigationController하고 다른 컨트롤은 자동 레이아웃 내부에 UIStackView 배치되거나 자동 레이아웃에 맞춰집니다. RTL 텍스트는 LTR 텍스트와 동일한 방식으로 .strings 파일을 사용하여 지역화됩니다.

코드에서 UI 지역화

Tasky(코드에서 지역화된) 샘플은 사용자 인터페이스가 코드에서 빌드되는 애플리케이션을 지역화하는 방법을 보여 줍니다(XIB 또는 스토리보드가 아닌).

프로젝트 구조

Screenshot shows the resources tree for a sample including the location of localizable strings.

Localizable.strings 파일

위에서 설명한 대로 Localizable.strings 파일 형식은 키-값 쌍으로 구성됩니다. 키는 문자열의 의도를 설명하고 값은 앱에서 사용할 번역된 텍스트입니다.

샘플에 대한 스페인어 지역화는 다음과 같습니다.

"<new task>" = "<new task>";
"Task Details" = "Detalles de la tarea";
"Name" = "Nombre";
"task name" = "nombre de la tarea";
"Notes" = "Notas";
"other task info"= "otra información de tarea";
"Done" = "Completo";
"Save" = "Guardar";
"Delete" = "Eliminar";

지역화 수행

애플리케이션 코드에서 사용자 인터페이스의 표시 텍스트가 설정되는 위치(레이블의 텍스트 또는 입력의 자리 표시자 등)에서 코드는 iOS GetLocalizedString 함수를 사용하여 표시할 올바른 번역을 검색합니다.

var localizedString = NSBundle.MainBundle.GetLocalizedString ("key", "optional");
someControl.Text = localizedString;

스토리보드 UI 지역화

샘플 Tasky(지역화된 스토리보드) 는 스토리보드의 컨트롤에서 텍스트를 지역화하는 방법을 보여 줍니다.

프로젝트 구조

Base.lproj 디렉터리에는 스토리보드가 포함되어 있으며 애플리케이션에 사용되는 이미지도 포함되어야 합니다.

다른 언어 디렉터리에 는 코드에서 참조되는 문자열 리소스에 대한 Localizable.strings 파일과 스토리보드의 텍스트 번역이 포함된 MainStoryboard.strings 파일이 포함되어 있습니다.

Screenshot shows the resources tree for a sample including the location of MainStoryboard strings.

언어 디렉터리에는 Base.lproj에 있는 이미지를 재정의하기 위해 지역화된 이미지의 복사본이 포함되어야 합니다.

개체 ID/지역화 ID

스토리보드에서 컨트롤을 만들고 편집할 때 각 컨트롤을 선택하고 지역화에 사용할 ID를 검사.

  • Mac용 Visual Studio 속성 패드에 있으며 지역화 ID라고 합니다.
  • Xcode에서는 개체 ID라고 합니다.

이 문자열 값에는 다음 스크린샷과 같이 "NF3-h8-xmR"과 같은 형식이 있는 경우가 많습니다.

Xcode view of Storyboard localization

이 값은 .strings 파일에서 번역된 텍스트를 각 컨트롤에 자동으로 할당하는 데 사용됩니다.

MainStoryboard.strings

스토리보드 번역 파일의 형식은 Localizable.strings 파일과 비슷합니다. 단, 키(왼쪽의 값)는 사용자 정의일 수 없지만 대신 매우 구체적인 형식ObjectID.property이 있어야 합니다.

아래의 Mainstoryboard.strings 예제에서는 지역화 UILabel 할 수 있는 placeholder 텍스트 속성이 있는 것을 볼 UITextField 있습니다.s에는 속성이 text 있으며 UIButton기본 텍스트는 다음을 사용하여 normalTitle설정됩니다.

"SXg-TT-IwM.placeholder" = "nombre de la tarea";
"Pqa-aa-ury.placeholder"= "otra información de tarea";
"zwR-D9-hM1.text" = "Detalles de la tarea";
"bAM-2j-Rzw.text" = "Notas";           /* Notes */
"NF3-h8-xmR.text" = "Completo";        /* Done */
"MWt-Ya-pMf.normalTitle" = "Guardar";  /* Save */
"IGr-pR-05L.normalTitle" = "Eliminar"; /* Delete */

Important

크기 클래스가 있는 스토리보드를 사용하면 애플리케이션에 표시되지 않는 번역이 발생할 수 있습니다. Apple의 Xcode 릴리스 정보는 세 가지가 true이면 스토리보드 또는 XIB가 올바르게 지역화되지 않음을 나타냅니다. 즉, 크기 클래스를 사용하고, 기본 지역화 및 빌드 대상이 유니버설로 설정되며, 빌드 대상은 iOS 7.0을 대상으로 합니다. 다음 스크린샷과 같이 Storyboard 문자열 파일을 MainStoryboard~iphone.stringsMainStoryboard~ipad.strings라는 두 개의 동일한 파일로 복제하는 것이 해결되었습니다.

Strings files

App Store 목록

앱 스토어 지역화에 대한 Apple의 FAQ에 따라 앱이 판매 중인 각 국가에 대한 번역을 입력합니다. 앱에 언어에 대한 지역화된 .lproj 디렉터리도 포함된 경우에만 번역이 표시됩니다.

요약

이 문서에서는 기본 제공 리소스 처리 및 스토리보드 기능을 사용하여 iOS 애플리케이션을 지역화하는 기본 사항을 설명합니다.

이 플랫폼 간 가이드에서는 iOS, Android 및 플랫폼 간 앱(Xamarin.Forms 포함)용 i18n 및 L10n에 대해 자세히 알아볼 수 있습니다.