Udostępnij za pośrednictwem


Lokalizacja

Browse sample. Przeglądanie przykładu

Lokalizacja to proces dostosowywania aplikacji w celu spełnienia określonych wymagań językowych lub kulturowych rynku docelowego. Aby zlokalizować aplikację, może być konieczne tłumaczenie tekstu i obrazów na wiele języków. Zlokalizowana aplikacja automatycznie wyświetla przetłumaczony tekst na podstawie ustawień kultury urządzenia.

Platforma .NET zawiera mechanizm lokalizowania aplikacji przy użyciu plików zasobów. Plik zasobu przechowuje tekst i inną zawartość jako pary nazwa/wartość, które umożliwiają aplikacji pobieranie zawartości dla podanego klucza. Pliki zasobów umożliwiają oddzielenie zlokalizowanej zawartości od kodu aplikacji. Oprócz przechowywania tekstu pliki zasobów mogą również przechowywać obrazy i dane binarne. Jednak urządzenia mają szereg rozmiarów i gęstości ekranu, a każda platforma ma funkcje wyświetlania obrazów zależnych od gęstości. W związku z tym funkcje platformy powinny być używane do lokalizowania obrazów zamiast przechowywania ich w plikach zasobów.

Aby zlokalizować aplikację interfejsu użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI), należy:

  1. Utwórz pliki zasobów do przechowywania ciągów. Aby uzyskać więcej informacji, zobacz Tworzenie plików zasobów do przechowywania ciągów.
  2. Określ neutralny język aplikacji. Aby uzyskać więcej informacji, zobacz Określanie neutralnego języka aplikacji.
  3. Wykonaj konfigurację platformy. Aby uzyskać więcej informacji, zobacz Wykonywanie konfiguracji platformy.
  4. Lokalizowanie tekstu. Aby uzyskać więcej informacji, zobacz Lokalizowanie tekstu.
  5. Lokalizowanie obrazów. Aby uzyskać więcej informacji, zobacz Lokalizowanie obrazów.
  6. Lokalizowanie nazwy aplikacji. Aby uzyskać więcej informacji, zobacz Lokalizowanie nazwy aplikacji.
  7. Lokalizacja testowa. Aby uzyskać więcej informacji, zobacz Lokalizacja testowa.

Ponadto można określić kierunek układu aplikacji. Aby uzyskać więcej informacji, zobacz Lokalizacja od prawej do lewej.

Tworzenie plików zasobów do przechowywania ciągów

Pliki zasobów platformy .NET to pliki XML z rozszerzeniem resx , które są kompilowane w plikach zasobów binarnych (.resources) podczas procesu kompilacji. Zlokalizowana aplikacja zwykle zawiera domyślny plik zasobów ze wszystkimi ciągami używanymi w aplikacji i plikami zasobów dla każdego obsługiwanego języka.

Pliki zasobów zawierają następujące informacje dla każdego elementu:

  • Nazwa określa klucz używany do uzyskiwania dostępu do tekstu w kodzie.
  • Wartość określa przetłumaczony tekst.
  • Komentarz jest polem opcjonalnym zawierającym dodatkowe informacje.

Plik zasobu można dodać za pomocą okna dialogowego Dodawanie nowego elementu w programie Visual Studio:

Screenshot of adding a resource file in Visual Studio.

Po dodaniu pliku można dodać wiersze dla każdego zasobu tekstowego:

Screenshot of the default strings for the app.

Lista rozwijana Modyfikator dostępu określa, w jaki sposób program Visual Studio generuje klasę używaną do uzyskiwania dostępu do zasobów. Ustawienie modyfikatora dostępu na publiczny lub wewnętrzny powoduje wygenerowanie klasy z określonym poziomem ułatwień dostępu. Ustawienie modyfikatora dostępu na Wartość Brak generowania kodu nie generuje pliku klasy. Domyślny plik zasobu należy skonfigurować tak, aby wygenerować plik klasy, co powoduje utworzenie pliku z plikiem .Projektant. Rozszerzenie cs dodawane do projektu.

Po utworzeniu domyślnego pliku zasobu można utworzyć dodatkowe pliki dla każdego ustawienia regionalnego obsługiwanego przez aplikację. Każdy dodatkowy plik zasobu powinien mieć taką samą nazwę pliku głównego jak domyślny plik zasobu, ale powinien również zawierać język i opcjonalną kulturę w nazwie pliku. Jeśli na przykład dodasz plik zasobów o nazwie AppResources.resx, możesz również utworzyć pliki zasobów o nazwach AppResources.en-US.resx i AppResources.fr-FR.resx do przechowywania zlokalizowanych zasobów odpowiednio dla kultur angielskich (Stany Zjednoczone) i francuskich (Francja). Ponadto należy ustawić modyfikator dostępu dla każdego dodatkowego pliku zasobu na wartość Brak generowania kodu.

W czasie wykonywania aplikacja próbuje rozwiązać żądanie zasobu w kolejności specyficznej. Jeśli na przykład kultura urządzenia to en-US , aplikacja szuka plików zasobów w następującej kolejności:

  1. AppResources.en-US.resx
  2. AppResources.en.resx
  3. AppResources.resx (ustawienie domyślne)

Poniższy zrzut ekranu przedstawia hiszpański plik tłumaczenia o nazwie AppResources.es.resx:

Screenshot of the Spanish strings for the app.

Zlokalizowany plik zasobów używa tych samych wartości Nazwa określonych w pliku domyślnym, ale zawiera ciągi języka hiszpańskiego w kolumnie Wartość . Ponadto modyfikator dostępu ma wartość Brak generowania kodu.

Określanie neutralnego języka aplikacji

Aby pliki zasobów platformy .NET działały poprawnie, aplikacja musi mieć określony neutralny język. Jest to język, którego zasoby są używane, jeśli nie można odnaleźć zasobów dla ustawień regionalnych. Aby określić język neutralny:

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt aplikacji .NET MAUI i wybierz pozycję Właściwości.

  2. Wybierz stronę Właściwości Ogólne pakietu > i wybierz odpowiedni język i kulturę z listy rozwijanej Język neutralny zestawu:

    Screenshot of setting the neutral language for the assembly.

  3. Zapisz zmiany.

Alternatywnie dodaj <NeutralLanguage> element do pierwszego <PropertyGroup> w pliku projektu i określ wybrane ustawienia regionalne jako jego wartość:

<NeutralLanguage>en-US</NeutralLanguage>

Ostrzeżenie

Jeśli nie określisz języka neutralnego, ResourceManager klasa zwraca null wartości dla dowolnych języków bez pliku zasobu. Po określeniu ResourceManager neutralnego języka klasa zwraca wyniki z pliku zasobów neutralnego języka dla nieobsługiwanych języków. Dlatego zaleca się, aby zawsze określać neutralny język, aby tekst był wyświetlany dla nieobsługiwanych języków.

Wykonywanie konfiguracji platformy

Wymagana jest dodatkowa konfiguracja w systemach iOS, Mac Catalyst i Windows, aby wszystkie kontrolki MAUI platformy .NET zostały zlokalizowane.

Katalizator systemów iOS i Mac

W systemach iOS i Mac Catalyst należy zadeklarować wszystkie obsługiwane języki w pliku Info.plist platformy w projekcie aplikacji .NET MAUI. W tym celu otwórz plik Info.plist dla wybranej platformy w edytorze XML i utwórz tablicę CFBundleLocalizations dla klucza. Następnie podaj wartości tablicy, które odpowiadają plikom zasobów. Ponadto upewnij się, że ustawiono oczekiwany język za pomocą CFBundleDevelopmentRegion klucza:

<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>

Alternatywnie w Eksplorator rozwiązań w programie Visual Studio otwórz plik Info.plist dla wybranej platformy w edytorze Generic PList. Następnie utwórz tablicę dla CFBundleLocalizations klucza i podaj wartości tablicy odpowiadające plikom zasobów. Ponadto upewnij się, że ustawiono oczekiwany język za pomocą CFBundleDevelopmentRegion klucza:

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

Aby uzyskać więcej informacji na temat pliku Info.plist , zobacz Lista właściwości informacji.

Windows

Aby obsługiwać wiele języków w aplikacji .NET MAUI w systemie Windows, należy zadeklarować każdy obsługiwany język w pliku Platformy\Windows\Package.appxmanifest projektu aplikacji .NET MAUI:

  1. Otwórz plik Package.appxmanifest w edytorze tekstów i znajdź następującą sekcję:

    <Resources>
        <Resource Language="x-generate"/>
    </Resources>
    
  2. Zastąp <Resource Language="x-generate"> element elementami <Resource /> dla każdego z obsługiwanych języków:

    <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. Zapisz zmiany.

Lokalizowanie tekstu

Tekst jest zlokalizowany przy użyciu klasy wygenerowanej na podstawie domyślnego pliku zasobów. Klasa jest nazwana na podstawie domyślnej nazwy pliku zasobu. Biorąc pod uwagę domyślną nazwę pliku zasobu AppResources.resx, program Visual Studio generuje zgodną klasę o nazwie AppResources zawierającą właściwości statyczne dla każdego wpisu w pliku zasobu.

W języku XAML można pobrać zlokalizowany tekst przy użyciu x:Static rozszerzenia znaczników w celu uzyskania dostępu do wygenerowanych właściwości statycznych:

<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>

Aby uzyskać więcej informacji na temat x:Static rozszerzenia znaczników, zobacz x:Static markup extension (Rozszerzenie znaczników statycznych x:Static).

Zlokalizowany tekst można również pobrać w kodzie:

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

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

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

Właściwości w AppResources klasie używają CurrentUICulture wartości właściwości, aby określić, z którego pliku zasobu mają być pobierane wartości.

Lokalizowanie obrazów

Oprócz przechowywania tekstu pliki zasobów mogą również przechowywać obrazy i dane binarne. Jednak urządzenia mają szereg rozmiarów i gęstości ekranu, a każda platforma ma funkcje wyświetlania obrazów zależnych od gęstości. W związku z tym funkcje platformy powinny być używane do lokalizowania obrazów zamiast przechowywania ich w plikach zasobów.

Android

W systemie Android zlokalizowane obrazy, znane jako rysowalne, są przechowywane przy użyciu konwencji nazewnictwa opartej na folderze w folderze Platforms\Android\Resources . Foldery powinny mieć nazwę rysowalne z sufiksem języka i kultury. Na przykład folder języka hiszpańskiego nosi nazwę drawable-es. Nazwa folderu do rysowania powinna zawierać obrazy dla domyślnego języka i kultury. Akcja kompilacji każdego obrazu powinna być ustawiona na Wartość AndroidResource.

Uwaga

Zamiast ustawiać poszczególne pliki na akcję kompilacji AndroidResource , zawartość określonego folderu można ustawić na tę akcję kompilacji, dodając następujący kod XML do pliku projektu aplikacji (csproj):

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

W tym przykładzie ustawiono dowolną zawartość w folderze Platforms\Android\Resources , w tym zawartość w podfolderach, do akcji kompilacji AndroidResource . Ustawia również ścieżkę wyjściową dla każdego pliku z tą akcją kompilacji.

W nazwie folderu wymagane są tylko dwa znaki podczas określania języka najwyższego poziomu, takiego jak es. Jednak podczas określania pełnych ustawień regionalnych format nazwy folderu wymaga kreski i małych liter r , aby oddzielić język od kultury. Na przykład folder Ustawienia regionalne Meksyku (es-MX) powinien mieć nazwę drawable-es-rMX. Nazwy plików obrazów w każdym folderze ustawień regionalnych powinny być identyczne:

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

iOS

W systemie iOS zlokalizowane obrazy są przechowywane przy użyciu konwencji nazewnictwa opartej na folderze w folderze Platforms\iOS\Resources . Foldery powinny mieć nazwę z językiem i opcjonalną kulturą, a następnie ciągiem .lproj. Na przykład folder języka hiszpańskiego nosi nazwę es.lproj. Akcja kompilacji każdego obrazu powinna być ustawiona na Wartość BundleResource.

Uwaga

Zamiast ustawiać poszczególne pliki na akcję kompilacji BundleResource , zawartość określonego folderu można ustawić na tę akcję kompilacji, dodając następujący kod XML do pliku projektu aplikacji (csproj):

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

W tym przykładzie ustawiono dowolną zawartość w folderze Platforms\iOS\Resources , w tym zawartość w podfolderach, do akcji kompilacji BundleResource . Ustawia również ścieżkę wyjściową dla każdego pliku z tą akcją kompilacji.

W nazwie folderu wymagane są tylko dwa znaki podczas określania języka najwyższego poziomu, takiego jak es. Jednak podczas określania pełnych ustawień regionalnych format nazwy folderu wymaga kreski oddzielającej język od kultury. Na przykład folder Ustawienia regionalne Meksyku (es-MX) powinien mieć nazwę es-MX.lproj. Nazwy plików obrazów w każdym folderze ustawień regionalnych powinny być identyczne:

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

Ponadto w pliku projektu należy ustawić właściwość kompilacji IPhoneResourcePrefix na folder zawierający zlokalizowane foldery obrazów:

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

Jeśli obraz nie jest obecny dla określonego języka, system iOS powraca do domyślnego folderu języka natywnego i ładuje obraz stamtąd.

Katalizator mac

Na komputerze Mac Catalyst zlokalizowane obrazy są przechowywane przy użyciu konwencji nazewnictwa opartej na folderze w folderze Platforms\MacCatalyst\Resources . Foldery powinny mieć nazwę z językiem i opcjonalną kulturą, a następnie ciągiem .lproj. Na przykład folder języka hiszpańskiego nosi nazwę es.lproj. Akcja kompilacji każdego obrazu powinna być ustawiona na Wartość BundleResource.

Uwaga

Zamiast ustawiać poszczególne pliki na akcję kompilacji BundleResource , zawartość określonego folderu można ustawić na tę akcję kompilacji, dodając następujący kod XML do pliku projektu aplikacji (csproj):

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

W tym przykładzie ustawiono dowolną zawartość w folderze Platforms\MacCatalyst\Resources , w tym zawartość w podfolderach, do akcji kompilacji BundleResource . Ustawia również ścieżkę wyjściową dla każdego pliku z tą akcją kompilacji.

W nazwie folderu wymagane są tylko dwa znaki podczas określania języka najwyższego poziomu, takiego jak es. Jednak podczas określania pełnych ustawień regionalnych format nazwy folderu wymaga kreski oddzielającej język od kultury. Na przykład folder Ustawienia regionalne Meksyku (es-MX) powinien mieć nazwę es-MX.lproj. Nazwy plików obrazów w każdym folderze ustawień regionalnych powinny być identyczne:

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

Ponadto w pliku projektu należy ustawić właściwość kompilacji IPhoneResourcePrefix na folder zawierający zlokalizowane foldery obrazów:

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

Jeśli obraz nie jest obecny dla określonego języka, mac Catalyst powraca do domyślnego folderu języka natywnego i ładuje obraz z tego miejsca.

Windows

W systemie Windows zlokalizowane obrazy są przechowywane przy użyciu konwencji nazewnictwa opartej na folderze w folderze Platforms\Windows\Assets\Images . Foldery powinny mieć nazwę z językiem i opcjonalną kulturą. Na przykład folder języka hiszpańskiego nosi nazwę es , a folder ustawień regionalnych Meksyku powinien mieć nazwę es-MX. Akcja kompilacji każdego obrazu powinna być ustawiona na Zawartość.

Uwaga

Zamiast ustawiać poszczególne pliki na akcję kompilacji Zawartość , zawartość określonego folderu można ustawić na tę akcję kompilacji, dodając następujący kod XML do pliku projektu aplikacji (csproj):

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

Ten przykład ustawia dowolną zawartość w folderze Platformy\Windows\Assets\Images , w tym zawartość w podfolderach, na akcję kompilacji Zawartość . Ustawia również ścieżkę wyjściową dla każdego pliku z tą akcją kompilacji.

W nazwie folderu wymagane są tylko dwa znaki podczas określania języka najwyższego poziomu, takiego jak es. Jednak podczas określania pełnych ustawień regionalnych format nazwy folderu wymaga kreski oddzielającej język od kultury. Na przykład folder Ustawienia regionalne Meksyku (es-MX) powinien mieć nazwę es-MX. Nazwy plików obrazów w każdym folderze ustawień regionalnych powinny być identyczne:

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

Korzystanie z zlokalizowanych obrazów

W systemach Android, iOS, Mac Catalyst i Windows zlokalizowane obrazy można używać, ustawiając Source właściwość elementu Image na nazwę pliku obrazu:

<Image Source="flag.png" />

Jednak aby działało to w systemie Windows, należy zmodyfikować plik projektu aplikacji, jeśli dodano <Content /> element MSBuild dla każdego zlokalizowanego obrazu. Można to zrobić, modyfikując plik csproj, <Content /> aby usunąć element MSBuild dla każdego obrazu. Następnie dodaj następujący element MSBuild:

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

Dzięki temu wszystkie obrazy w podfolderach folderu Platforms\Windows\Assets\Images zostaną skopiowane do katalogu głównego pakietu aplikacji.

Lokalizowanie nazwy aplikacji

Do lokalizowania nazwy aplikacji wymagana jest funkcja platformy.

Android

W systemie Android zlokalizowana nazwa aplikacji może być przechowywana przy użyciu konwencji nazewnictwa opartej na folderze w folderze Platforms\Android\Resources . Foldery powinny mieć nazwy wartości z sufiksem języka i kultury. Na przykład folder języka hiszpańskiego nosi nazwę values-es. Dodaj plik Strings.xml z akcją kompilacji AndroidResource do każdego folderu, który ustawia ciąg na zlokalizowaną nazwę aplikacji.

Uwaga

Zamiast ustawiać poszczególne pliki na akcję kompilacji AndroidResource , zawartość określonego folderu można ustawić na tę akcję kompilacji, dodając następujący kod XML do pliku projektu aplikacji (csproj):

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

W tym przykładzie ustawiono dowolną zawartość w folderze Platforms\Android\Resources , w tym zawartość w podfolderach, do akcji kompilacji AndroidResource . Ustawia również ścieżkę wyjściową dla każdego pliku z tą akcją kompilacji.

W nazwie folderu wymagane są tylko dwa znaki podczas określania języka najwyższego poziomu, takiego jak es. Jednak podczas określania pełnych ustawień regionalnych format nazwy folderu wymaga kreski i małych liter r , aby oddzielić język od kultury. Na przykład folder ustawienia regionalne Meksyku (es-MX) powinien mieć nazwę values-es-rMX.

Każdy ciąg do tłumaczenia jest elementem XML z identyfikatorem zasobu określonym jako name atrybut i przetłumaczonym ciągiem jako wartością. Musisz uciec od ciągu zgodnie z normalnymi regułami XML i name musi być prawidłowym identyfikatorem zasobu systemu Android (bez spacji ani kreski).

W związku z tym, aby zlokalizować nazwę aplikacji, utwórz plik Strings.xml i dodaj <string> element jako element podrzędny <resources> elementu. Następnie ustaw jego name atrybut na odpowiedni identyfikator z przetłumaczonym ciągiem jako wartością:

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

Następnie, aby użyć zlokalizowanej nazwy aplikacji w aplikacji, dodaj Label właściwość do Activity klasy w klasie aplikacji MainActivity i ustaw jej wartość na @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

W systemie iOS zlokalizowana nazwa aplikacji jest przechowywana przy użyciu konwencji nazewnictwa opartej na folderze w folderze Platforms\iOS\Resources . Foldery powinny mieć nazwę z językiem i opcjonalną kulturą, a następnie ciągiem .lproj. Na przykład folder języka hiszpańskiego nosi nazwę es.lproj. Dodaj plik InfoPlist.strings z akcją kompilacji BundleResource do każdego folderu, który ustawia CFBundleDisplayName klucz i wartość.

Uwaga

Zamiast ustawiać poszczególne pliki na akcję kompilacji BundleResource , zawartość określonego folderu można ustawić na tę akcję kompilacji, dodając następujący kod XML do pliku projektu aplikacji (csproj):

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

W tym przykładzie ustawiono dowolną zawartość w folderze Platforms\iOS\Resources , w tym zawartość w podfolderach, do akcji kompilacji BundleResource . Ustawia również ścieżkę wyjściową dla każdego pliku z tą akcją kompilacji.

Składnia zlokalizowanych wartości ciągów jest następująca:

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

W ciągach należy stosować znaki ucieczki:

  • Oferta dla klienta \"
  • \\ Ukośnik odwrotny
  • \n Newline

W związku z tym, aby zlokalizować nazwę aplikacji, utwórz plik InfoPlist.strings i dodaj wartość CFBundleDisplayName klucza do pliku:

/* French */
CFBundleDisplayName="Maisons";

Inne klucze, których można użyć do lokalizowania ciągów specyficznych dla aplikacji, to:

  • CFBundleName - określa krótką nazwę pakietu aplikacji, który może być wyświetlany użytkownikom w sytuacjach, takich jak brak wartości dla CFBundleDisplayName.
  • CFBundleShortVersionString — określa numer wersji pakietu aplikacji.
  • NSHumanReadableCopyright - powiadomienie o prawach autorskich dla pakietu aplikacji.

Ponadto w pliku projektu należy ustawić właściwość kompilacji IPhoneResourcePrefix na folder zawierający zlokalizowane foldery:

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

Katalizator mac

Na komputerze Mac Catalyst zlokalizowana nazwa aplikacji jest przechowywana przy użyciu konwencji nazewnictwa opartej na folderze w folderze Platforms\MacCatalyst\Resources . Foldery powinny mieć nazwę z językiem i opcjonalną kulturą, a następnie ciągiem .lproj. Na przykład folder języka hiszpańskiego nosi nazwę es.lproj. Dodaj plik InfoPlist.strings z akcją kompilacji BundleResource do każdego folderu, który ustawia CFBundleDisplayName klucz i wartość.

Uwaga

Zamiast ustawiać poszczególne pliki na akcję kompilacji BundleResource , zawartość określonego folderu można ustawić na tę akcję kompilacji, dodając następujący kod XML do pliku projektu aplikacji (csproj):

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

W tym przykładzie ustawiono dowolną zawartość w folderze Platforms\MacCatalyst\Resources , w tym zawartość w podfolderach, do akcji kompilacji BundleResource . Ustawia również ścieżkę wyjściową dla każdego pliku z tą akcją kompilacji.

Składnia zlokalizowanych wartości ciągów jest następująca:

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

W ciągach należy stosować znaki ucieczki:

  • Oferta dla klienta \"
  • \\ Ukośnik odwrotny
  • \n Newline

W związku z tym, aby zlokalizować nazwę aplikacji, utwórz plik InfoPlist.strings i dodaj wartość CFBundleDisplayName klucza do pliku:

/* French */
CFBundleDisplayName="Maisons";

Inne klucze, których można użyć do lokalizowania ciągów specyficznych dla aplikacji, to:

  • CFBundleName — określa krótką nazwę pakietu aplikacji, która może być wyświetlana użytkownikom w sytuacjach, takich jak brak wartości dla CFBundleDisplayNameelementu .
  • CFBundleShortVersionString — określa numer wersji pakietu aplikacji.
  • NSHumanReadableCopyright - powiadomienie o prawach autorskich dla pakietu aplikacji.

Ponadto w pliku projektu należy ustawić właściwość kompilacji IPhoneResourcePrefix na folder zawierający zlokalizowane foldery:

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

Windows

W systemie Windows nazwa aplikacji jest zdefiniowana w manifeście pakietu aplikacji. Lokalizowanie nazwy aplikacji wymaga najpierw określenia domyślnego języka aplikacji, a następnie utworzenia pliku zasobu ciągu dla każdego ustawień regionalnych, które mają być obsługiwane. Zasób ciągu reprezentujący zlokalizowaną nazwę aplikacji można następnie użyć w manifeście pakietu aplikacji przy użyciu schematu identyfikatora ms-resource URI.

Aby uzyskać więcej informacji na temat lokalizowania ciągów w manifeście pakietu aplikacji, zobacz Localize strings in your UI and app package manifest (Lokalizowanie ciągów w interfejsie użytkownika i manifeście pakietu aplikacji).

Określanie języka domyślnego

Aby zlokalizować nazwę aplikacji, aplikacja systemu Windows musi najpierw mieć określony język domyślny. Jest to język, którego zasoby są używane, jeśli nie można odnaleźć zlokalizowanych zasobów dla określonego języka. Aby określić język domyślny:

  1. W Eksplorator rozwiązań otwórz plik Packageappxmanifest w edytorze manifestu pakietu.

  2. W edytorze manifestu pakietu na karcie Aplikacja ustaw pole Język domyślny na wybrany język domyślny:

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

  3. Zapisz zmiany.

Co najmniej musisz podać zasób ciągu dla nazwy aplikacji dla języka domyślnego. Jest to zasób ładowany, jeśli nie można znaleźć lepszego dopasowania dla preferowanego języka użytkownika lub ustawień języka wyświetlania.

Tworzenie plików zasobów systemu Windows

W systemie Windows zlokalizowana nazwa aplikacji powinna być przechowywana w pliku zasobów systemu Windows dla każdego ustawienia regionalnego. Plik zasobów systemu Windows to plik XML z rozszerzeniem resw skompilowanym w formacie binarnym i przechowywanym w pliku pri . Plik resw dla każdego ustawienia regionalnego powinien mieć nazwę Resources.resw i przechowywany przy użyciu konwencji nazewnictwa opartej na folderze w folderze Platforms\Windows\Strings . Foldery powinny mieć nazwę z językiem i opcjonalną kulturą. Na przykład folder języka hiszpańskiego nosi nazwę es , a folder ustawień regionalnych Meksyku powinien mieć nazwę es-MX.

Obecnie nie ma szablonu elementu programu Visual Studio do tworzenia pliku zasobów systemu Windows w aplikacji .NET MAUI. W związku z tym, aby utworzyć plik zasobów systemu Windows dla każdego ustawienia regionalnego:

  1. W folderze Platforms\Windows projektu aplikacji .NET MAUI utwórz folder Strings .

  2. W folderze Ciągi utwórz folder dla każdego ustawienia regionalnego.

  3. W folderze dla każdego ustawienia regionalnego utwórz plik o nazwie Resources.resw zawierający następujący kod XML:

    <?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>
    

    Uwaga

    Pliki zasobów systemu Windows używają akcji kompilacji .PRIResource Ta akcja kompilacji nie wymaga ustawienia dla każdego pliku resw w aplikacji .NET MAUI, ponieważ jest ona niejawnie stosowana.

  4. Otwórz każdy plik Resources.resw i dodaj zasób ciągu reprezentujący nazwę aplikacji:

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

    Uwaga

    Identyfikatory zasobów są bez uwzględniania wielkości liter i muszą być unikatowe dla pliku zasobu.

  5. Zapisz każdy plik zasobów systemu Windows.

Przykład wymaganego folderu i struktury plików przedstawiono na poniższym zrzucie ekranu:

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

Używanie zlokalizowanej nazwy aplikacji

Zasób ciągu reprezentujący zlokalizowaną nazwę aplikacji może być używany przy użyciu schematu identyfikatora ms-resource URI:

  1. W Eksplorator rozwiązań otwórz plik Packageappxmanifest w edytorze manifestu pakietu.

  2. W edytorze manifestu pakietu na karcie Aplikacja ustaw pole Nazwa wyświetlana, a ms-resource: następnie nazwę zasobu ciągu, który identyfikuje nazwę aplikacji:

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

  3. Zapisz zmiany.

Ważne

Jeśli pliki resw są przechowywane w innym zestawie w projekcie aplikacji .NET MAUI, musisz określić w pełni kwalifikowaną ścieżkę do nazwy zasobu. Używa to formatu ms-resource:Assembly/ResourceFilename/Resource.

Lokalizacja od prawej do lewej

Kierunek przepływu lub kierunek układu to kierunek, w którym elementy interfejsu użytkownika na stronie są skanowane przez oko. Niektóre języki, takie jak arabski i hebrajski, wymagają, aby elementy interfejsu użytkownika zostały określone w kierunku przepływu od prawej do lewej. Aplikacje MAUI platformy .NET automatycznie przestrzegają kierunku przepływu urządzenia na podstawie wybranego języka i regionu. Aby uzyskać informacje o sposobie pobierania kierunku przepływu urządzenia na podstawie jego ustawień regionalnych, zobacz Pobieranie kierunku układu.

Aby zastąpić kierunek przepływu aplikacji, ustaw Window.FlowDirection właściwość . Alternatywnie ustaw VisualElement.FlowDirection właściwość na podstawie elementu. Te właściwości pobierają lub ustawiają kierunek przepływu elementów interfejsu użytkownika w dowolnym elemercie nadrzędnym, który kontroluje ich układ, i powinny być ustawione na jedną z FlowDirection wartości wyliczenia:

  • LeftToRight
  • RightToLeft
  • MatchParent

FlowDirection Ustawienie właściwości na RightToLeft wartość w elemecie powoduje ustawienie wyrównania do prawej, kolejności odczytu do prawej do lewej oraz układu kontrolki do przepływu od prawej do lewej.

Ostrzeżenie

FlowDirection Zmiana właściwości w czasie wykonywania powoduje kosztowny proces układu, który wpłynie na wydajność.

Domyślną FlowDirection wartością właściwości elementu jest MatchParent. W związku z tym element dziedziczy FlowDirection wartość właściwości z elementu nadrzędnego w drzewie wizualizacji, a dowolny element może zastąpić wartość pobieraną z elementu nadrzędnego.

Napiwek

Jeśli musisz zmienić kierunek przepływu, ustaw FlowDirection właściwość w oknie, stronie lub układzie głównym. Powoduje to, że wszystkie elementy zawarte w aplikacji, stronie lub układzie głównym odpowiadają odpowiednio na kierunek przepływu.

Konfiguracja platformy

Aby włączyć ustawienia regionalne od prawej do lewej, wymagana jest określona konfiguracja platformy.

Android

Aplikacje utworzone przy użyciu szablonu projektu aplikacji .NET MAUI automatycznie uwzględniają obsługę ustawień regionalnych od prawej do lewej. Ta obsługa jest włączona przez android:supportsRtl atrybut ustawiany na true węźle <application> w pliku AndroidManifest.xml aplikacji:

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

Następnie można przetestować lokalizację od prawej do lewej, zmieniając urządzenie lub emulator tak, aby używał języka od prawej do lewej. Alternatywnie, jeśli opcje dewelopera zostały aktywowane w aplikacji Ustawienia, możesz włączyć opcję Wymuś kierunek układu biblioteki RTL w obszarze Ustawienia > Opcje dewelopera. Aby uzyskać informacje na temat konfigurowania opcji dewelopera, zobacz Konfigurowanie opcji dewelopera na urządzeniu w developer.android.com.

Katalizator systemów iOS i Mac

Wymagane ustawienia regionalne od prawej do lewej należy dodać jako obsługiwany język do elementów tablicy dla CFBundleLocalizations klucza w pliku Info.plist. W poniższym przykładzie pokazano, że język arabski został dodany do tablicy CFBundleLocalizations klucza:

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

Następnie można przetestować lokalizację od prawej do lewej przez zmianę języka i regionu na urządzeniu lub symulatorze na ustawienia regionalne od prawej do lewej określone w pliku Info.plist.

Windows

Wymagane zasoby językowe należy określić w węźle <Resources>pliku Package.appxmanifest . Zastąp <Resource Language="x-generate"> element elementami <Resource /> dla każdego z obsługiwanych języków. Na przykład następujące znaczniki określają, że dostępne są zasoby zlokalizowane "en" i "ar":

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

Następnie można przetestować lokalizację od prawej do lewej, zmieniając język i region na urządzeniu na odpowiednie ustawienia regionalne od prawej do lewej.

Lokalizacja testowa

W czasie wykonywania aplikacja ładuje odpowiednie zlokalizowane zasoby na podstawie poszczególnych wątków na podstawie kultury określonej przez CurrentUICulture właściwość .

Najlepiej przeprowadzić testowanie lokalizacji przez zmianę języka urządzenia w aplikacji Ustawienia na każdym urządzeniu.

Ostrzeżenie

Chociaż można ustawić wartość CurrentUICulture w kodzie, wynikowe zachowanie jest niespójne na różnych platformach, więc nie jest to zalecane do testowania.