Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Localizing concatenated or dynamic strings

I'm familiar with using NSLocalizedString() to localize strings, but the problem I have today requires a little more finesse. My situation is like this:

NSString *userName; //the users name, entered by the user.  Does not need localized
NSString *favoriteFood; //the users favorite food, also entered by user, and not needing localized

NSString *summary = [NSString stringWithFormat:@"%@'s favorite food is %@", userName, favoriteFood];

This works fine for english, but not every language uses the same word ordering as English, for example, a word-by-word translation of the same sentance from Japanese into English would read:

UserName's favorite food pizza is

Not to mention that 's is doesn't make a possessive in every language.

What techniques are available for localizing this type of concatenated sentence?

UPDATE FOR THE BENEFIT OF OTHERS: @Jon Reed is right, positional specifiers are very important to localization. The document he linked only contains a reference to the fact that they can be used with NSString, NSLog, an others, the link doesn't really tell HOW to use them.

I found this link, that explains it well. It also explains my question better than I did. From the link:

Format strings for printf and sprintf (see Printf) present a special problem for translation. Consider the following:1

 printf(_"String `%s' has %d characters\n",
           string, length(string))) A possible German

translation for this might be:

 "%d Zeichen lang ist die Zeichenkette `%s'\n" The problem

should be obvious: the order of the format specifications is different from the original! Even though gettext can return the translated string at runtime, it cannot change the argument order in the call to printf.

To solve this problem, printf format specifiers may have an additional optional element, which we call a positional specifier. For example:

 "%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" Here, the

positional specifier consists of an integer count, which indicates which argument to use, and a ‘$’. Counts are one-based, and the format string itself is not included. Thus, in the following example, ‘string’ is the first argument and ‘length(string)’ is the second:

 $ gawk 'BEGIN {
 >     string = "Dont Panic"
 >     printf _"%2$d characters live in \"%1$s\"\n",
 >                         string, length(string)
 > }'
 -| 10 characters live in "Dont Panic"
like image 839
SooDesuNe Avatar asked Mar 17 '10 01:03

SooDesuNe


People also ask

What are localization strings?

A localized string can have different values depending on the language in which the project is being build. There are two categories of localized strings: the strings included in the installation package's UI, common to every MSI file.

How do I localize a string in Swift?

Select the project and under “Localizations”, click the “+” icon. Add any language you want (I selected Italian) then click on “Finish”. Now go back to Localizable. string file, select it and on the File Inspector (right menu) select “Localize”.

What is string1 concatenated with string2 when?

Concatenation is the process of appending one string to the end of another string. You concatenate strings by using the + operator. For string literals and string constants, concatenation occurs at compile time; no run-time concatenation occurs. For string variables, concatenation occurs only at run time.

How does localize work?

Localization is the process of adapting a piece of content's full meaning for a new region, including translation, associated imagery, and cultural elements that influence how your content will be perceived. Localization is all about making your website feel like it was written with that audience in mind.


1 Answers

To specify order of substitution, use %1$@ and %2$@ as your format specifiers. The localized format string can use them in any order. For example, say your string key is "FavoriteFood". Call

NSString *summary =
            [NSString stringWithFormat:NSLocalizedString(@"FavoriteFood", nil), 
                                       userName, favoriteFood];

The localization places the format specifiers wherever it makes sense for its locale. Example:

"FavoriteFood" = "%2$@ is the favorite food of %1$@";

See String Format Specifiers

like image 144
Jon Reid Avatar answered Nov 12 '22 19:11

Jon Reid