简体   繁体   中英

How to set Base Localization & Development Language in Xcode 12(.5)?

I'm writing this question because a lot of information on Stackoverflow (and even Apple's developer website) about this topic is unfortunately partially outdated:

I want to support multiple languages in my Xcode 12.5/Swift 5/iOS 12.3+ app: German as the default language and English as a "fallback".

Currently the "Info" tab lists two "Localization" languages:

在此处输入图像描述

The "Localization" section of the File Inspector for both my Main.storyboard and LaunchScreen.storyboard file look like this (by default):

在此处输入图像描述

"Base" is checked and that's why the first screenshot shows 2 files for it.

The language in Info.plist is set to the following:

在此处输入图像描述

So far I haven't touched the actual localization settings yet and I've been using the same language for every label,... in XIB (which is probably saved in "Base").

According to Apple's old Localization Guide , "Base" is the default language that is used, as long as it's included in the user's language settings (so in my case: German). The "Developer Language" is the "fallback" language that is used if the user's language settings don't include the base language (in my case: English). This Q&A page also says:

If you adopt Base Localization, make sure that the value of CFBundleDevelopmentRegion matches the language used by your content in the Base.lproj folder.

... and in this guide enabling the base localization for "English - Development Language" for both storyboards adds 2 localized files to it, without actually adding another ("Base") localization to the list. As you can see on my first screenshot, "Base" and "Development" are separate list entries, which wasn't the case in earlier Xcode versions.

My first question is: Did I understand all of this correctly? It's a bit confusing that the quote sees "Base" and "Development Language" as the same thing, even though you can of course have a default language that isn't the "fallback" language.

The same Q&A I linked above also goes into detail about regional versions of a specific language:

If my app supports "German" (language code: "de") but the user's language settings only list eg Austrian German ("de_AT"), then the app is still going to set its own language to German. Let's say I want to use Swiss German (de_CH) as the default language but the user only picked Austrian German ("de_AT") in his settings, does this still work the same way? Should you rather set your app's default language to the regular non-regional language (German = "de") instead, even if the labels,... use eg Swiss German words?

How do I change the "Base" language to German (let's say, "de_CH") and also make it appear as that in the list, while using English ("en") as the "fallback"? I did find a similar question but unfortunately the steps described in the answer don't work the same way in Xcode 12.5. anymore.

What I wanted to achieve:

Support English but use German as the default language that is also used if the user's language settings don't include English or German.

How I achieved this in Xcode 12.5:

  1. Add "German (de)" to the "Localizations" list via the little "+" button. In the new Choose files and reference language to create German localization pop-up every storyboard file should already be ticked by default. This adds .strings (German) localization files for all storyboards in the Project Navigator on the left:

在此处输入图像描述

  1. In Main.storyboard 's File Inspector tick the "English" box in the "Localization" section (this might take a while). This adds an additional Main.strings (English) file in the Project Navigator. Repeat this step for each storyboard, including the launch screen.

在此处输入图像描述

  1. To change the "Development Language", which is the language the app uses by default and also if it doesn't support any of the languages the user set in their device's language settings, close Xcode, then open the project's .xcodeproj file with a text editor (I used BBEdit, which is free). There should be a list of files, including project.pbxproj . Open it and set developmentRegion (= development language) to the language code of the language that you added in step 1, so in my case "de". Do not use a different code (eg add "German (de)" but set it to "de_CH") because that's going to create an additional localization.

在此处输入图像描述

  1. There are now two ways to finish this part of localization:
  • A. Leave it as is. Changes in storyboard aren't going to affect any of the .strings files. Advantage: The text can be edited directly (without using storyboard), which is useful if you aren't the person who's working on the translations. Disadvantage: You can't quickly see and test the changes to a translation in storyboard but have to run the app in the simulator or on an actual device.

在此处输入图像描述

  • B. Use the default language as "Base" language: Untick "German" for every storyboard and hit "Remove" in the pop-up, which removes the localizations in the list. This way changes to the storyboard affect the default language, which makes it easier to test changes.

I used version B:

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

Important:

These .strings files are only used for storyboards! If you also want to set localized text at runtime using NSLocalizedString (eg for an error dialog), then you have to add an additional Localizable.strings file (more details here ):

  1. File - New - File - Strings File - Call it Localizable.strings
  2. Click "Localize" in its File Inspector and pick one of the languages you want to use in code.
  3. Afterwards, also in the File Inspector, you can tick the other languages in the "Localization" section (including the development one).

在此处输入图像描述

Bonus infos:

You can change the app language of the simulator through the scheme:

Product - Scheme - Edit Scheme - Run (left side) - Options tab (right side) - App Language

You can also show a preview of the currently selected UIViewController and change its displayed language without starting a simulator:

Editor - Preview - In the new preview window on the right there's a button in the bottom right

Disclaimer: I found this solution by testing different things, as there's currently no tutorial for this (using the latest Xcode version). If this is not the "right" way to do localization, please post your own answer and I'll check it out.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM