Localizing Attributed Strings on iOS
Localization can be especially difficult when dealing with attributed strings in an iOS app. Fairly often, designers request something like:
Searching for burgers in SOMA, San Francisco, CA:
The golden rule of localized strings is to treat them as atomic units:
- Never concatenate strings to form sentences. Many languages have different sentence structures or gender rules from English. You cannot just substitute a single word or phrase in for any other.
Often these complexities are cited as reasons to avoid localization. But, unless you have geographic constraints, you will find a substantially larger audience with a localized application.
As the name suggests, ZSWTappableLabel makes the links inside your attributed strings tappable. It's a fast and easy UILabel subclass as it does not do any drawing itself.
ZSWTaggedString is the powerhouse. It transforms an HTML-like syntax into an attributed string. You can read more about the syntax and the advanced usage on its GitHub page, but here's how you might use it for the examples mentioned above:
In my experience, localizers are familiar enough with HTML that they won’thave issues with localizing these strings. By marking the regions you intend to be visually distinct, they can easily understand your intent and produce better localizations.
While on the subject, here are a few best practices for localization in iOS:
- Reload your UI when observing to handle the current locale or dynamic type setting changing:
- To represent dates, durations, distances, lengths, etc., use an appropriate formatter.
- To create your own date formats, use
+dateFormatFromTemplate:options:locale:on NSDateFormatter. Remember that this needs to be recreated if the locale changes.
- To combine a first and last name, use
ABPersonGetCompositeNameFormatForRecordwith a temporary
ABPersonRef, or use the new
- For sending non-user-facing data to a server, use
en_US_POSIXas your locale.
(This is from my blog.)