Ken Ko Ken Ko - 2 months ago 16
iOS Question

Xcode localization - how to create localized strings for development language

Using Xcode 7's localization export workflow, I can export to Xliff, which can be provided to translators, who will give back a translated version, which we import again.

However, how do I generate one for the original development language?

I want to do this so that I don't have to maintain my development language strings files manually by hand.

Here is the scenario:


  1. I start with no strings file in my project, just Swift code which uses the
    NSLocalizedString




static let something = NSLocalizedString("something.hello", tableName: "MyStuff", value: "Hello world!", comment: "some comment")



  1. From the project settings, I choose Editor -> Export for Localization. Because I have no existing strings files, when I export, there are no options. Just a "save as" prompt.

  2. This will perform an Xliff export from the original source code. (Same as when you choose "Include: Development Language only" from the prompt when other localizations already present). The Xliff looks like this, with only
    <source>
    tags, and no
    <target>
    tags.




<trans-unit id="something.hello">
<source>"Hello world!</source>
<note>some comment</note>
</trans-unit>



  1. The Xliff file is modified by translators, and translated to simplified chinese

  2. The translated Xliff file is re-imported into project via Xcode

  3. This creates the
    MyStuff.strings
    file for simplified chinese

  4. Problem - when I run the app, the app will use the chinese strings file, even when language is english, because an english file doesn't exist. It doesn't seem to use the default
    value
    anymore. This means I need an english strings file too.



How can I generate an english (the development language) version of the strings files through the import/export process? Xcode doesn't let me "export" in the original development language. So I can't re-import it to create the strings files.

Note on
genstrings



In the documentation for Separating User-Facing Text from Your Code, it says "Alternatively, you can generate the development language strings files from NSLocalizedString macros directly, as described in Creating Strings Files for User-Facing Text in Your Code." , which tells you to use
genstrings


However that
genstrings
no longer works for Swift when you specify the
tableName
.
It's my understanding from what I've seen on SO that multiple radars have been filed, but it seems Apple is no longer supporting it.

Answer

I've worked out the problem.

It's doesn't seem necessary to generate strings files in the development language. This must be why the capability doesn't exist in Xcode.

My problem was that the app didn't think that my development language (english) was supported, so it did further fallback, and ended up picking a language that my app was localized for (in this case, chinese).

By adding a file localized for english, and ensuring there is an en.lproj folder in the bundle, it infers my app is localized for english, and will correctly use the default values specified in the NSLocalizedString calls.

This means I don't need a seperate copy of the english strings files. Which is great, because I won't need to keep that up to date as the app changes. The source of truth is the Swift source code only.

This link was helpful:

How does iOS determine the language for my app

Comments