지역화

Browse sample. 샘플 찾아보기

지역화는 대상 시장의 특정 언어 또는 문화권 요구 사항을 충족하도록 앱을 조정하는 프로세스입니다. 앱을 지역화하려면 텍스트와 이미지를 여러 언어로 번역해야 할 수 있습니다. 지역화된 앱은 디바이스의 문화권 설정에 따라 번역된 텍스트를 자동으로 표시합니다.

.NET에는 리소스 파일을 사용하여 앱을 지역화하는 메커니즘이 포함되어 있습니다. 리소스 파일은 앱이 제공된 키에 대한 콘텐츠를 검색할 수 있도록 텍스트 및 기타 콘텐츠를 이름/값 쌍으로 저장합니다. 리소스 파일을 사용하면 지역화된 콘텐츠를 앱 코드와 구분할 수 있습니다. 리소스 파일은 텍스트를 저장하는 것 외에도 이미지와 이진 데이터를 저장할 수 있습니다. 그러나 디바이스에는 다양한 화면 크기 및 밀도가 있으며 각 플랫폼에는 밀도 종속 이미지를 표시하는 기능이 있습니다. 따라서 플랫폼 기능은 리소스 파일에 저장하는 대신 이미지를 지역화하는 데 사용해야 합니다.

.NET 다중 플랫폼 앱 UI(.NET MAUI) 앱을 지역화하려면 다음을 수행해야 합니다.

  1. 문자열을 저장할 리소스 파일을 만듭니다. 자세한 내용은 문자열을 저장할 리소스 파일 만들기를 참조 하세요.
  2. 앱의 중립 언어를 지정합니다. 자세한 내용은 앱의 중립 언어 지정을 참조 하세요.
  3. 플랫폼 설정을 수행합니다. 자세한 내용은 플랫폼 설정 수행을 참조 하세요.
  4. 텍스트를 지역화합니다. 자세한 내용은 텍스트 지역화를 참조 하세요.
  5. 이미지를 지역화합니다. 자세한 내용은 이미지 지역화를 참조 하세요.
  6. 앱 이름을 지역화합니다. 자세한 내용은 앱 이름 지역화를 참조 하세요.
  7. 지역화를 테스트합니다. 자세한 내용은 테스트 지역화를 참조 하세요.

또한 앱의 레이아웃 방향을 지정할 수 있습니다. 자세한 내용은 오른쪽에서 왼쪽으로 지역화를 참조 하세요.

문자열을 저장할 리소스 파일 만들기

.NET 리소스 파일은 빌드 프로세스 중에 이진 리소스(.resources) 파일로 컴파일되는 .resx 확장이 있는 XML 파일입니다. 지역화된 앱에는 일반적으로 앱에서 사용되는 모든 문자열이 포함된 기본 리소스 파일과 지원되는 각 언어에 대한 리소스 파일이 포함됩니다.

리소스 파일은 각 항목의 다음 정보를 포함합니다.

  • 이름은 코드의 텍스트에 액세스하는 데 사용되는 키를 지정합니다.
  • 은 번역된 텍스트를 지정합니다.
  • 주석은 추가 정보를 포함하는 선택적 필드입니다.

Visual Studio에서 새 항목 추가 대화 상자를 사용하여 리소스 파일을 추가할 수 있습니다.

Screenshot of adding a resource file in Visual Studio.

파일이 추가된 후 각 텍스트 리소스의 행을 추가할 수 있습니다.

Screenshot of the default strings for the app.

Access 한정자 드롭다운은 Visual Studio에서 리소스에 액세스하는 데 사용되는 클래스를 생성하는 방법을 결정합니다. 액세스 한정자를 Public 또는 Internal로 설정하면 지정된 접근성 수준으로 클래스가 생성됩니다. Access 한정자를 코드 생성 안 으로 설정해도 클래스 파일이 생성되지 않습니다. 클래스 파일을 생성하도록 기본 리소스 파일을 구성해야 합니다. 그러면 파일이 .와 함께 생성됩니다. 프로젝트에 추가되는 Designer.cs 확장입니다.

기본 리소스 파일이 만들어지면 앱이 지원하는 각 로캘에 대해 추가 파일을 만들 수 있습니다. 각 추가 리소스 파일은 기본 리소스 파일과 동일한 루트 파일 이름을 가져야 하지만 파일 이름에 언어 및 선택적 문화권도 포함해야 합니다. 예를 들어 AppResources.resx라는 리소스 파일을 추가하는 경우 AppResources.en-US.resx 및 AppResources.fr-FR.resx라는 리소스 파일을 만들어 영어(미국) 및 프랑스어(프랑스) 문화권에 대해 지역화된 리소스를 각각 저장할 수도 있습니다. 또한 각 추가 리소스 파일에 대한 Access 한정자를 코드 생성 없음으로 설정해야 합니다.

런타임 시 앱은 특정성 순서로 리소스 요청을 확인하려고 시도합니다. 예를 들어 디바이스 문화권이 en-US인 경우 애플리케이션은 다음 순서로 리소스 파일을 찾습니다.

  1. AppResources.en-US.resx
  2. AppResources.en.resx
  3. AppResources.resx(기본값)

다음 스크린샷은 AppResources.es.resx라는 스페인어 번역 파일을 보여줍니다.

Screenshot of the Spanish strings for the app.

지역화된 리소스 파일은 기본 파일에 지정된 것과 동일한 이름 값을 사용하지만 값 열에 스페인어 문자열을 포함합니다. 또한 액세스 한정자코드 생성 안 됨으로 설정됩니다.

앱의 중립 언어 지정

.NET 리소스 파일이 올바르게 작동하려면 앱에 중립 언어가 지정되어 있어야 합니다. 로캘에 대한 리소스를 찾을 수 없는 경우 리소스가 사용되는 언어입니다. 중립 언어를 지정하려면:

  1. 솔루션 탐색기 .NET MAUI 앱 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.

  2. 패키지 > 일반 속성 페이지를 선택하고 어셈블리 중립 언어 드롭다운에서 적절한 언어 및 문화권을 선택합니다.

    Screenshot of setting the neutral language for the assembly.

  3. 변경 내용을 저장합니다.

또는 프로젝트 파일의 <NeutralLanguage> 첫 번째 <PropertyGroup> 요소에 요소를 추가하고 선택한 로캘을 해당 값으로 지정합니다.

<NeutralLanguage>en-US</NeutralLanguage>

Warning

중립 언어를 지정하지 않으면 클래스는 ResourceManager 리소스 파일이 없는 모든 언어에 대한 값을 반환 null 합니다. 중립 언어를 지정 ResourceManager 하면 클래스는 지원되지 않는 언어에 대한 중립 언어 리소스 파일의 결과를 반환합니다. 따라서 지원되지 않는 언어에 대해 텍스트가 표시되도록 항상 중립 언어를 지정하는 것이 좋습니다.

플랫폼 설정 수행

모든 .NET MAUI 컨트롤이 지역화되도록 iOS, Mac Catalyst 및 Windows에서 추가 설정이 필요합니다.

iOS 및 Mac Catalyst

iOS 및 Mac Catalyst에서는 .NET MAUI 앱 프로젝트에서 플랫폼의 Info.plist 파일에서 지원되는 모든 언어를 선언해야 합니다. 이렇게 하려면 XML 편집기 에서 선택한 플랫폼에 대한 Info.plist 파일을 열고 키에 대한 배열을 CFBundleLocalizations 만듭니다. 그런 다음 리소스 파일에 해당하는 배열 값을 제공합니다. 또한 CFBundleDevelopmentRegion 키를 통해 필요한 언어를 설정했는지 확인합니다.

<key>CFBundleLocalizations</key>
<array>
    <string>de</string>
    <string>es</string>
    <string>fr</string>
    <string>ja</string>
    <string>pt</string> <!-- Brazil -->
    <string>pt-PT</string> <!-- Portugal -->
    <string>ru</string>
    <string>zh-Hans</string>
    <string>zh-Hant</string>
</array>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>

또는 Visual Studio의 솔루션 탐색기 일반 PList 편집기에서 선택한 플랫폼에 대한 Info.plist 파일을 엽니다. 그런 다음 키에 대한 배열을 CFBundleLocalizations 만들고 리소스 파일에 해당하는 배열 값을 제공합니다. 또한 CFBundleDevelopmentRegion 키를 통해 필요한 언어를 설정했는지 확인합니다.

Screenshot of the supported locales for the app in the generic Info.plist editor.

Info.plist 파일에 대한 자세한 내용은 정보 속성 목록을 참조하세요.

Windows

Windows의 .NET MAUI 앱에서 여러 언어를 지원하려면 .NET MAUI 앱 프로젝트의 Platforms\Windows\Package.appxmanifest 파일에서 지원되는 각 언어를 선언해야 합니다.

  1. 텍스트 편집기에서 Package.appxmanifest 파일을 열고 다음 섹션을 찾습니다.

    <Resources>
        <Resource Language="x-generate"/>
    </Resources>
    
  2. 지원되는 각 언어에 대한 요소로 <Resource /> 대체 <Resource Language="x-generate"> 합니다.

    <Resources>
        <Resource Language="en-US"/>
        <Resource Language="de-DE"/>
        <Resource Language="es-ES"/>
        <Resource Language="fr-FR"/>
        <Resource Language="ja-JP"/>
        <Resource Language="pt-BR"/>
        <Resource Language="pt-PT"/>
        <Resource Language="ru-RU"/>
        <Resource Language="zh-CN"/>
        <Resource Language="zh-TW"/>
    </Resources>
    
  3. 변경 내용을 저장합니다.

텍스트 지역화

텍스트는 기본 리소스 파일에서 생성된 클래스를 사용하여 지역화됩니다. 클래스의 이름은 기본 리소스 파일 이름을 기반으로 합니다. AppResources.resx의 기본 리소스 파일 이름을 지정하면 Visual Studio는 리소스 파일의 각 항목에 대한 정적 속성을 포함하는 일치하는 AppResources 클래스를 생성합니다.

XAML에서 태그 확장을 사용하여 x:Static 생성된 정적 속성에 액세스하여 지역화된 텍스트를 검색할 수 있습니다.

<ContentPage ...
             xmlns:strings="clr-namespace:LocalizationDemo.Resources.Strings">
    <VerticalStackLayout>
        <Label Text="{x:Static strings:AppResources.NotesLabel}" />
        <Entry Placeholder="{x:Static strings:AppResources.NotesPlaceholder}" />
        <Button Text="{x:Static strings:AppResources.AddButton}" />
    </VerticalStackLayout>
</ContentPage>

태그 확장에 x:Static 대한 자세한 내용은 x:Static 태그 확장을 참조 하세요.

코드에서 지역화된 텍스트를 검색할 수도 있습니다.

Label notesLabel = new Label();
notesLabel.Text = AppResources.NotesLabel,

Entry notesEntry = new Entry();
notesEntry.Placeholder = AppResources.NotesPlaceholder,

Button addButton = new Button();
addButton.Text = AppResources.AddButton,

클래스의 AppResources 속성은 속성 값을 사용하여 CurrentUICulture 값을 검색할 리소스 파일을 결정합니다.

이미지 지역화

리소스 파일은 텍스트를 저장하는 것 외에도 이미지와 이진 데이터를 저장할 수 있습니다. 그러나 디바이스에는 다양한 화면 크기 및 밀도가 있으며 각 플랫폼에는 밀도 종속 이미지를 표시하는 기능이 있습니다. 따라서 플랫폼 기능은 리소스 파일에 저장하는 대신 이미지를 지역화하는 데 사용해야 합니다.

Android

Android에서는 drawables라고 하는 지역화된 이미지가 Platforms\Android\Resources 폴더의 폴더 기반 명명 규칙을 사용하여 저장됩니다 . 폴더 이름은 언어 및 문화권에 대한 접미사가 있는 그리기 가능으로 지정해야 합니다. 예를 들어 스페인어 폴더의 이름은 drawable-es로 지정됩니다. 그리기 가능한 폴더 이름에는 기본 언어 및 문화권에 대한 이미지가 포함되어야 합니다. 각 이미지의 빌드 작업은 AndroidResource설정해야 합니다.

참고 항목

개별 파일을 AndroidResource 빌드 작업으로 설정하는 대신 앱의 프로젝트(.csproj) 파일에 다음 XML을 추가하여 특정 폴더의 내용을 이 빌드 작업으로 설정할 수 있습니다.

<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
  <AndroidResource Include="Platforms\Android\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

다음은 하위 폴더의 콘텐츠를 포함하여 Platforms\Android\Resources 폴더의 모든 콘텐츠를 AndroidResource 빌드 작업으로 설정하는 예제입니다. 또한 이 빌드 작업을 사용하여 각 파일에 대한 출력 경로를 설정합니다.

es와 같은 최상위 언어를 지정할 때 폴더 이름에는 두 문자만 필요합니다. 그러나 전체 로캘을 지정할 때 폴더 이름 형식에는 언어를 문화권과 구분하기 위해 대시 및 소문자 r 이 필요합니다. 예를 들어 멕시코 로캘(es-mx) 폴더의 이름은 drawable-es-rMX로 지정되어야 합니다. 각 로캘 폴더의 이미지 파일 이름은 같아야 합니다.

Screenshot of the localized folder structure in Visual Studio for images on Android.

iOS

iOS에서 지역화된 이미지는 Platforms\iOS\Resources 폴더의 폴더 기반 명명 규칙을 사용하여 저장됩니다 . 폴더의 이름은 언어 및 선택적 문화권과 .lproj지정해야 합니다. 예를 들어 스페인어 폴더의 이름은 es.lproj로 지정됩니다. 각 이미지의 빌드 작업은 BundleResource설정해야 합니다.

참고 항목

개별 파일을 BundleResource 빌드 작업으로 설정하는 대신 앱의 프로젝트(.csproj) 파일에 다음 XML을 추가하여 특정 폴더의 내용을 이 빌드 작업으로 설정할 수 있습니다.

<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
  <BundleResource Include="Platforms\iOS\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

다음은 하위 폴더의 콘텐츠를 포함하여 Platforms\iOS\Resources 폴더의 모든 콘텐츠를 BundleResource 빌드 작업으로 설정하는 예제입니다. 또한 이 빌드 작업을 사용하여 각 파일에 대한 출력 경로를 설정합니다.

es와 같은 최상위 언어를 지정할 때 폴더 이름에는 두 문자만 필요합니다. 그러나 전체 로캘을 지정할 때 폴더 이름 형식은 언어를 문화권과 구분하기 위해 대시가 필요합니다. 예를 들어 멕시코 로캘(es-MX) 폴더의 이름은 es-MX.lproj로 지정되어야 합니다. 각 로캘 폴더의 이미지 파일 이름은 같아야 합니다.

Screenshot of the localized folder structure in Visual Studio for images on iOS.

또한 프로젝트 파일에서 빌드 속성을 지역화된 이미지 폴더가 포함된 폴더로 설정 IPhoneResourcePrefix 해야 합니다.

<PropertyGroup Condition="$(TargetFramework.Contains('-ios'))">
  <IPhoneResourcePrefix>Platforms/iOS/Resources</IPhoneResourcePrefix>
</PropertyGroup>

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

Mac Catalyst

Mac Catalyst에서 지역화된 이미지는 Platforms\MacCatalyst\Resources 폴더의 폴더 기반 명명 규칙을 사용하여 저장됩니다 . 폴더의 이름은 언어 및 선택적 문화권과 .lproj지정해야 합니다. 예를 들어 스페인어 폴더의 이름은 es.lproj로 지정됩니다. 각 이미지의 빌드 작업은 BundleResource설정해야 합니다.

참고 항목

개별 파일을 BundleResource 빌드 작업으로 설정하는 대신 앱의 프로젝트(.csproj) 파일에 다음 XML을 추가하여 특정 폴더의 내용을 이 빌드 작업으로 설정할 수 있습니다.

<ItemGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <BundleResource Include="Platforms\MacCatalyst\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

다음은 하위 폴더의 콘텐츠를 포함하여 Platforms\MacCatalyst\Resources 폴더의 모든 콘텐츠를 BundleResource 빌드 작업으로 설정하는 예제입니다. 또한 이 빌드 작업을 사용하여 각 파일에 대한 출력 경로를 설정합니다.

es와 같은 최상위 언어를 지정할 때 폴더 이름에는 두 문자만 필요합니다. 그러나 전체 로캘을 지정할 때 폴더 이름 형식은 언어를 문화권과 구분하기 위해 대시가 필요합니다. 예를 들어 멕시코 로캘(es-MX) 폴더의 이름은 es-MX.lproj로 지정되어야 합니다. 각 로캘 폴더의 이미지 파일 이름은 같아야 합니다.

Screenshot of the localized folder structure in Visual Studio for images on MacCatalyst.

또한 프로젝트 파일에서 빌드 속성을 지역화된 이미지 폴더가 포함된 폴더로 설정 IPhoneResourcePrefix 해야 합니다.

<PropertyGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <IPhoneResourcePrefix>Platforms/MacCatalyst/Resources</IPhoneResourcePrefix>
</PropertyGroup>

특정 언어에 대한 이미지가 없는 경우 Mac Catalyst는 기본 모국어 폴더로 돌아가서 해당 위치에서 이미지를 로드합니다.

Windows

Windows에서 지역화된 이미지는 Platforms\Windows\Assets\Images 폴더의 폴더 기반 명명 규칙을 사용하여 저장됩니다. 폴더의 이름은 언어 및 선택적 문화권으로 지정해야 합니다. 예를 들어 스페인어 폴더의 이름은 es로 지정되며 멕시코 로캘 폴더의 이름은 es-MX로 지정되어야 합니다. 각 이미지의 빌드 동작을 Content설정해야 합니다.

참고 항목

개별 파일을 콘텐츠 빌드 작업으로 설정하는 대신 앱의 프로젝트(.csproj) 파일에 다음 XML을 추가하여 특정 폴더의 콘텐츠를 이 빌드 작업으로 설정할 수 있습니다.

<ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
  <Content Include="Platforms\Windows\Assets\Images\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

다음은 하위 폴더의 콘텐츠를 포함하여 Platforms\Windows\Assets\Images 폴더의 모든 콘텐츠를 콘텐츠 빌드 작업으로 설정하는 예제입니다. 또한 이 빌드 작업을 사용하여 각 파일에 대한 출력 경로를 설정합니다.

es와 같은 최상위 언어를 지정할 때 폴더 이름에는 두 문자만 필요합니다. 그러나 전체 로캘을 지정할 때 폴더 이름 형식은 언어를 문화권과 구분하기 위해 대시가 필요합니다. 예를 들어 멕시코 로캘(es-MX) 폴더의 이름은 es-MX여야 합니다. 각 로캘 폴더의 이미지 파일 이름은 같아야 합니다.

Screenshot of the localized folder structure in Visual Studio for images on Windows.

지역화된 이미지 사용

Android, iOS, Mac Catalyst 및 Windows에서는 이미지 파일 이름으로 속성을 Image 설정 Source 하여 지역화된 이미지를 사용할 수 있습니다.

<Image Source="flag.png" />

그러나 Windows에서 작동하려면 지역화된 각 이미지에 대해 MSBuild 항목을 추가 <Content /> 한 경우 앱의 프로젝트 파일을 수정해야 합니다. 이 작업은 .csproj 파일을 수정하여 각 이미지에 <Content /> 대한 MSBuild 항목을 제거하여 수행할 수 있습니다. 그런 다음, 다음 MSBuild 항목을 추가합니다.

<ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
  <Content Include="Platforms\Windows\Assets\Images\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

이렇게 하면 Platforms\Windows\Assets\Images 폴더의 하위 폴더에 있는 모든 이미지가 앱 패키지의 루트에 복사됩니다.

앱 이름 지역화

앱의 이름을 지역화하려면 플랫폼 기능이 필요합니다.

Android

Android에서는 Platforms\Android\Resources 폴더의 폴더 기반 명명 규칙을 사용하여 지역화된 앱 이름을 저장할 수 있습니다 . 폴더의 이름은 언어 및 문화권에 대한 접미사가 있는 값 이어야 합니다. 예를 들어 스페인어 폴더의 이름은 values-es입니다. 문자열을 지역화된 앱 이름으로 설정하는 각 폴더에 AndroidResource빌드 작업이 포함된 Strings.xml 파일을 추가합니다.

참고 항목

개별 파일을 AndroidResource 빌드 작업으로 설정하는 대신 앱의 프로젝트(.csproj) 파일에 다음 XML을 추가하여 특정 폴더의 내용을 이 빌드 작업으로 설정할 수 있습니다.

<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
  <AndroidResource Include="Platforms\Android\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

다음은 하위 폴더의 콘텐츠를 포함하여 Platforms\Android\Resources 폴더의 모든 콘텐츠를 AndroidResource 빌드 작업으로 설정하는 예제입니다. 또한 이 빌드 작업을 사용하여 각 파일에 대한 출력 경로를 설정합니다.

es와 같은 최상위 언어를 지정할 때 폴더 이름에는 두 문자만 필요합니다. 그러나 전체 로캘을 지정할 때 폴더 이름 형식에는 언어를 문화권과 구분하기 위해 대시 및 소문자 r 이 필요합니다. 예를 들어 멕시코 로캘(es-MX) 폴더의 이름은 values-es-rMX여야 합니다.

번역 가능한 각 문자열은 리소스 ID가 특성으로 지정되고 변환된 문자열이 값으로 name 지정된 XML 요소입니다. 일반 XML 규칙에 따라 문자열을 이 name 스케이프해야 하며 유효한 Android 리소스 ID(공백 또는 대시 없음)여야 합니다.

따라서 앱 이름을 지역화하려면 Strings.xml 파일을 만들고 요소를 요소의 <resources> 자식으로 추가 <string> 합니다. 그런 다음 변환된 문자열을 값으로 사용하여 해당 name 특성을 적절한 ID로 설정합니다.

<resources>
    <!-- French -->
    <string name="app_name">Maison</string>
</resources>

그런 다음 앱에서 지역화된 앱 이름을 사용하려면 앱 클래스의 MainActivity 속성에 속성을 Activity 추가하고 Label 해당 값을 다음으로 @string/id설정합니다.

[Activity(Label = "@string/app_name", Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
    }
}

iOS

iOS에서 지역화된 앱 이름은 Platforms\iOS\Resources 폴더의 폴더 기반 명명 규칙을 사용하여 저장됩니다 . 폴더의 이름은 언어 및 선택적 문화권과 .lproj지정해야 합니다. 예를 들어 스페인어 폴더의 이름은 es.lproj로 지정됩니다. 키와 값을 설정하는 CFBundleDisplayName 각 폴더에 BundleResource빌드 작업이 포함된 InfoPlist.strings 파일을 추가합니다.

참고 항목

개별 파일을 BundleResource 빌드 작업으로 설정하는 대신 앱의 프로젝트(.csproj) 파일에 다음 XML을 추가하여 특정 폴더의 내용을 이 빌드 작업으로 설정할 수 있습니다.

<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
  <BundleResource Include="Platforms\iOS\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

다음은 하위 폴더의 콘텐츠를 포함하여 Platforms\iOS\Resources 폴더의 모든 콘텐츠를 BundleResource 빌드 작업으로 설정하는 예제입니다. 또한 이 빌드 작업을 사용하여 각 파일에 대한 출력 경로를 설정합니다.

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

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

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

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

따라서 앱 이름을 지역화하려면 InfoPlist.strings 파일을 만들고 키 값을 CFBundleDisplayName 파일에 추가합니다.

/* French */
CFBundleDisplayName="Maisons";

앱별 문자열을 지역화하는 데 사용할 수 있는 다른 키는 다음과 같습니다.

  • CFBundleName - 앱 번들의 짧은 이름을 지정합니다. 이 이름은 값 CFBundleDisplayName이 없는 경우 사용자에게 표시될 수 있습니다.
  • CFBundleShortVersionString - 앱 번들의 릴리스 버전 번호를 지정합니다.
  • NSHumanReadableCopyright - 앱 번들에 대한 저작권 고지입니다.

또한 프로젝트 파일에서 빌드 속성을 지역화된 폴더가 포함된 폴더로 설정 IPhoneResourcePrefix 해야 합니다.

<PropertyGroup Condition="$(TargetFramework.Contains('-ios'))">
  <IPhoneResourcePrefix>Platforms/iOS/Resources</IPhoneResourcePrefix>
</PropertyGroup>

Mac Catalyst

Mac Catalyst에서 지역화된 앱 이름은 Platforms\MacCatalyst\Resources 폴더의 폴더 기반 명명 규칙을 사용하여 저장됩니다 . 폴더의 이름은 언어 및 선택적 문화권과 .lproj지정해야 합니다. 예를 들어 스페인어 폴더의 이름은 es.lproj로 지정됩니다. 키와 값을 설정하는 CFBundleDisplayName 각 폴더에 BundleResource빌드 작업이 포함된 InfoPlist.strings 파일을 추가합니다.

참고 항목

개별 파일을 BundleResource 빌드 작업으로 설정하는 대신 앱의 프로젝트(.csproj) 파일에 다음 XML을 추가하여 특정 폴더의 내용을 이 빌드 작업으로 설정할 수 있습니다.

<ItemGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <BundleResource Include="Platforms\MacCatalyst\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

다음은 하위 폴더의 콘텐츠를 포함하여 Platforms\MacCatalyst\Resources 폴더의 모든 콘텐츠를 BundleResource 빌드 작업으로 설정하는 예제입니다. 또한 이 빌드 작업을 사용하여 각 파일에 대한 출력 경로를 설정합니다.

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

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

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

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

따라서 앱 이름을 지역화하려면 InfoPlist.strings 파일을 만들고 키 값을 CFBundleDisplayName 파일에 추가합니다.

/* French */
CFBundleDisplayName="Maisons";

앱별 문자열을 지역화하는 데 사용할 수 있는 다른 키는 다음과 같습니다.

  • CFBundleName - 앱 번들의 짧은 이름을 지정합니다. 이 이름은 값 CFBundleDisplayName이 없는 경우 사용자에게 표시될 수 있습니다.
  • CFBundleShortVersionString - 앱 번들의 릴리스 버전 번호를 지정합니다.
  • NSHumanReadableCopyright - 앱 번들에 대한 저작권 고지입니다.

또한 프로젝트 파일에서 빌드 속성을 지역화된 폴더가 포함된 폴더로 설정 IPhoneResourcePrefix 해야 합니다.

<PropertyGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <IPhoneResourcePrefix>Platforms/MacCatalyst/Resources</IPhoneResourcePrefix>
</PropertyGroup>

Windows

Windows에서 앱 이름은 앱 패키지 매니페스트에 정의됩니다. 앱 이름을 지역화하려면 먼저 앱의 기본 언어를 지정한 다음 지원하려는 각 로캘에 대한 문자열 리소스 파일을 만들어야 합니다. 지역화된 앱 이름을 나타내는 문자열 리소스는 URI 체계를 사용하여 ms-resource 앱 패키지 매니페스트에서 사용할 수 있습니다.

앱 패키지 매니페스트에서 문자열을 지역화하는 방법에 대한 자세한 내용은 UI 및 앱 패키지 매니페스트에서 문자열 지역화를 참조하세요.

기본 언어 지정

앱 이름을 지역화하려면 먼저 Windows 앱에 기본 언어가 지정되어 있어야 합니다. 특정 언어에 대한 지역화된 리소스를 찾을 수 없는 경우 리소스가 사용되는 언어입니다. 기본 언어를 지정하려면:

  1. 솔루션 탐색기 패키지 매니페스트 편집기에서 Packageappxmanifest 파일을 엽니다.

  2. 패키지 매니페스트 편집기에서 애플리케이션 탭에서 기본 언어 필드를 선택한 기본 언어로 설정합니다.

    Screenshot of setting the default language of a Windows app in the package manifest.

  3. 변경 내용을 저장합니다.

최소한 기본 언어의 앱 이름에 대한 문자열 리소스를 제공해야 합니다. 사용자의 기본 설정 언어 또는 표시 언어 설정에 대해 더 나은 일치 항목을 찾을 수 없는 경우 로드되는 리소스입니다.

Windows 리소스 파일 만들기

Windows에서 지역화된 앱 이름은 각 로캘에 대한 Windows 리소스 파일에 저장되어야 합니다. Windows 리소스 파일은 .resw 확장이 있는 XML 파일로, 이진 형식으로 컴파일되고 .pri 파일에 저장됩니다. 각 로캘에 대한 .resw 파일의 이름은 Resources.resw이고 Platforms\Windows\Strings 폴더의 폴더 기반 명명 규칙을 사용하여 저장해야 합니다. 폴더의 이름은 언어 및 선택적 문화권으로 지정해야 합니다. 예를 들어 스페인어 폴더의 이름은 es로 지정되며 멕시코 로캘 폴더의 이름은 es-MX로 지정되어야 합니다.

현재 .NET MAUI 앱에서 Windows 리소스 파일을 만들기 위한 Visual Studio 항목 템플릿이 없습니다. 따라서 각 로캘에 대한 Windows 리소스 파일을 만들려면 다음을 수행합니다.

  1. .NET MAUI 앱 프로젝트의 Platforms\Windows 폴더에서 Strings 폴더를 만듭니다.

  2. Strings 폴더에서 각 로캘에 대한 폴더를 만듭니다.

  3. 각 로캘의 폴더에서 다음 XML을 포함하는 Resources.resw라는 파일을 만듭니다.

    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <!--
        Microsoft ResX Schema
    
        Version 2.0
    
        The primary goals of this format is to allow a simple XML format
        that is mostly human readable. The generation and parsing of the
        various data types are done through the TypeConverter classes
        associated with the data types.
    
        Example:
    
        ... ado.net/XML headers & schema ...
        <resheader name="resmimetype">text/microsoft-resx</resheader>
        <resheader name="version">2.0</resheader>
        <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
        <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
        <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
        <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
        <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
            <value>[base64 mime encoded serialized .NET Framework object]</value>
        </data>
        <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
            <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
            <comment>This is a comment</comment>
        </data>
    
        There are any number of "resheader" rows that contain simple
        name/value pairs.
    
        Each data row contains a name, and value. The row also contains a
        type or mimetype. Type corresponds to a .NET class that support
        text/value conversion through the TypeConverter architecture.
        Classes that don't support this are serialized and stored with the
        mimetype set.
    
        The mimetype is used for serialized objects, and tells the
        ResXResourceReader how to depersist the object. This is currently not
        extensible. For a given mimetype the value must be set accordingly:
    
        Note - application/x-microsoft.net.object.binary.base64 is the format
        that the ResXResourceWriter will generate, however the reader can
        read any of the formats listed below.
    
        mimetype: application/x-microsoft.net.object.binary.base64
        value   : The object must be serialized with
                : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                : and then encoded with base64 encoding.
    
        mimetype: application/x-microsoft.net.object.soap.base64
        value   : The object must be serialized with
                : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
                : and then encoded with base64 encoding.
    
        mimetype: application/x-microsoft.net.object.bytearray.base64
        value   : The object must be serialized into a byte array
                : using a System.ComponentModel.TypeConverter
                : and then encoded with base64 encoding.
        -->
      <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
        <xsd:element name="root" msdata:IsDataSet="true">
          <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
              <xsd:element name="metadata">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" />
                  </xsd:sequence>
                  <xsd:attribute name="name" use="required" type="xsd:string" />
                  <xsd:attribute name="type" type="xsd:string" />
                  <xsd:attribute name="mimetype" type="xsd:string" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="assembly">
                <xsd:complexType>
                  <xsd:attribute name="alias" type="xsd:string" />
                  <xsd:attribute name="name" type="xsd:string" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="data">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                    <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
                  <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
                  <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="resheader">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" />
                </xsd:complexType>
              </xsd:element>
            </xsd:choice>
          </xsd:complexType>
        </xsd:element>
      </xsd:schema>
      <resheader name="resmimetype">
        <value>text/microsoft-resx</value>
      </resheader>
      <resheader name="version">
        <value>2.0</value>
      </resheader>
      <resheader name="reader">
        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
      <resheader name="writer">
        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
    </root>
    

    참고 항목

    Windows 리소스 파일은 빌드 작업을 PRIResource사용합니다. 이 빌드 작업은 암시적으로 적용되므로 .NET MAUI 앱의 각 .resw 파일에 대해 설정할 필요가 없습니다.

  4. Resources.resw 파일을 열고 앱의 이름을 나타내는 문자열 리소스를 추가합니다.

    Screenshot of the resw file editor in Visual Studio on Windows.

    참고 항목

    리소스 식별자는 대/소문자를 구분하지 않으며 리소스 파일별로 고유해야 합니다.

  5. 각 Windows 리소스 파일을 저장합니다.

다음 스크린샷에는 필수 폴더 및 파일 구조의 예가 나와 있습니다.

Screenshot of the localized folder structure in Visual Studio for strings on Windows.

지역화된 앱 이름 사용

지역화된 앱 이름을 나타내는 문자열 리소스는 URI 체계를 ms-resource 사용하여 사용할 수 있습니다.

  1. 솔루션 탐색기 패키지 매니페스트 편집기에서 Packageappxmanifest 파일을 엽니다.

  2. 패키지 매니페스트 편집기의 애플리케이션 탭에서 표시 이름 필드 ms-resource: 뒤에 앱 이름을 식별하는 문자열 리소스의 이름을 설정합니다.

    Screenshot of setting the localized app name in the package manifest on Windows.

  3. 변경 내용을 저장합니다.

Important

.resw 파일이 .NET MAUI 앱 프로젝트와 다른 어셈블리에 저장된 경우 리소스 이름에 대한 정규화된 경로를 지정해야 합니다. 형식을 ms-resource:Assembly/ResourceFilename/Resource사용합니다.

오른쪽에서 왼쪽으로 쓰는 언어 지역화

흐름 방향 또는 레이아웃 방향은 페이지의 UI 요소가 눈으로 스캔되는 방향입니다. 아랍어 및 히브리어와 같은 일부 언어는 UI 요소가 오른쪽에서 왼쪽 흐름 방향으로 배치되어야 합니다. .NET MAUI 앱은 선택한 언어 및 지역에 따라 디바이스의 흐름 방향을 자동으로 준수합니다. 로캘에 따라 디바이스의 흐름 방향을 검색하는 방법에 대한 자세한 내용은 레이아웃 방향 가져오기를 참조하세요.

앱의 흐름 방향을 재정의하려면 속성을 설정합니다 Window.FlowDirection . 또는 요소별로 속성을 설정합니다 VisualElement.FlowDirection . 이러한 속성은 레이아웃을 제어하는 부모 요소 내에서 UI 요소가 흐르는 방향을 얻거나 설정하며 열거형 값 중 FlowDirection 하나로 설정해야 합니다.

  • LeftToRight
  • RightToLeft
  • MatchParent

FlowDirection 속성을 RightToLeft 요소에 설정하면 맞춤이 오른쪽, 읽기 순서가 오른쪽에서 왼쪽으로, 컨트롤의 레이아웃이 오른쪽에서 왼쪽으로 이동합니다.

Warning

런타임에 FlowDirection 속성을 변경하면 성능에 영향을 주는 비용이 많이 드는 레이아웃 프로세스가 발생합니다.

요소의 기본 FlowDirection 속성 값은 .입니다 MatchParent. 따라서 요소는 시각적 트리에 있는 부모로부터 FlowDirection 속성 값을 상속받으며 모든 요소는 부모로부터 얻은 값을 재정의할 수 있습니다.

흐름 방향을 변경해야 하는 경우 창, 페이지 또는 루트 레이아웃에서 속성을 설정합니다 FlowDirection . 이렇게 하면 앱, 페이지 또는 루트 레이아웃에 포함된 모든 요소가 흐름 방향에 적절하게 응답합니다.

플랫폼 설정

오른쪽에서 왼쪽 방향 로캘을 사용하려면 특정 플랫폼 설정이 필요합니다.

Android

.NET MAUI 앱 프로젝트 템플릿을 사용하여 만든 앱에는 오른쪽에서 왼쪽 로캘에 대한 지원이 자동으로 포함됩니다. 이 지원은 앱의 android:supportsRtl AndroidManifest.xml 파일의 노드에서 <application> 설정 true 되는 특성에 의해 활성화됩니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application ... android:supportsRtl="true" />
    ...
</manifest>

그런 다음 오른쪽에서 왼쪽으로 쓰는 언어를 사용하도록 디바이스 또는 에뮬레이터를 변경하여 오른쪽에서 왼쪽으로 지역화를 테스트할 수 있습니다. 또는 설정 앱에서 개발자 옵션을 활성화한 경우 설정 개발자 옵션에서 > RTL 강제 레이아웃 방향을 사용하도록 설정할 수 있습니다. 개발자 옵션을 구성하는 방법에 대한 자세한 내용은 developer.android.com 디바이스 내 개발자 옵션 구성을 참조하세요.

iOS 및 Mac Catalyst

필요한 오른쪽에서 왼쪽 방향 로캘이 Info.plistCFBundleLocalizations 키에 대한 배열 항목에 지원되는 언어로 추가되어야 합니다. 다음 예제는 CFBundleLocalizations 키에 대한 배열에 아랍어가 추가된 것을 보여줍니다.

<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>ar</string>
</array>

그런 다음 디바이스 또는 시뮬레이터의 언어 및 지역을 Info.plist에 지정된 오른쪽에서 왼쪽 로캘로 변경하여 오른쪽에서 왼쪽으로 지역화를 테스트할 수 있습니다.

Windows

필요한 언어 리소스는 Package.appxmanifest 파일의 <Resources> 노드에 지정해야 합니다. 지원되는 각 언어에 대한 요소로 <Resource /> 대체 <Resource Language="x-generate"> 합니다. 예를 들어 다음 태그는 "en" 및 "ar" 지역화된 리소스를 사용할 수 있도록 지정합니다.

<Resources>
    <Resource Language="en" />
    <Resource Language="ar" />
</Resources>

그런 다음, 디바이스의 언어 및 지역을 적절한 오른쪽에서 왼쪽으로 쓰는 로캘로 변경하여 오른쪽에서 왼쪽으로 쓰는 지역화를 테스트할 수 있습니다.

지역화 테스트

런타임 시 앱은 속성에 지정된 문화권에 따라 스레드별로 적절한 지역화된 리소스를 CurrentUICulture 로드합니다.

각 디바이스의 설정 앱에서 디바이스 언어를 변경하여 지역화를 테스트하는 것이 가장 좋습니다.

Warning

코드에서 값을 CurrentUICulture 설정할 수 있지만 결과 동작은 플랫폼 간에 일관성이 없으므로 테스트에 권장되지 않습니다.