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:1printf(_"String `%s' has %d characters\n", string, length(string))) A possible Germantranslation for this might be:
"%d Zeichen lang ist die Zeichenkette `%s'\n" The problemshould 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, thepositional 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"
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”. CallThe localization places the format specifiers wherever it makes sense for its locale. Example:
See String Format Specifiers