space: other languages are up to 20% longer • Look for ways to shorten space-constrained strings • Custom font? Does it do special characters? What did we learn?
/* No comment provided by engineer. */ "server_down" = "We are working on it and expect to restore service by %s."; Day of the week? am Dienstag Date? am 24.12.2014 Time? um 23:00 Uhr What could %s be?
/* %s will be replaced by local time, e.g. 3:00 AM. */ "server_down" = "We are working on it and expect to restore service by %s."; What could %s be? ✓ /* %s e.g. 3:00 AM. */ "server_down" = "We are working on it and expect to restore service by %s."; or
Solution? "notification" = "%1$@ sent you a %2$@"; "text_message" = "text message"; "video" = "video"; "notification" = "%1$@ sent you %2$@"; "text_message" = "a text message"; "video" = "a video"; Add articles and prepositions to the placeholder content.
- what did we learn? • Use the comment for vital information • Communicate what type of data the placeholder represents • Just because something works in English, this does not necessarily apply to other languages
"BBB will clone <sourceWhole> to <destWhole>."; "desc_local_vol" = "the volume %@"; "desc_network_vol" = "the network volume %@"; "desc_folder_network_vol" = "the folder %1$@ on the network volume %2$@"; "desc_folder_local" = "the folder %1$@ on the volume %2$@"; "desc_local_vol" = "the volume %@";
"BBB will clone <sourceWhole> to <destWhole>."; "desc_network_vol" = "the network volume %@"; "desc_folder_network_vol" = "the folder %1$@ on the network volume %2$@"; "desc_folder_local" = "the folder %1$@ on the volume %2$@"; "desc_local_vol" = "the volume %@"; ✓ "desc_network_vol" = "the network volume %@"; ✓ "desc_folder_local" = "the folder %1$@ on the volume %2$@"; ?
"BBB will clone <sourceWhole> to <destWhole>."; "desc_folder_network_vol" = "the folder %1$@ on the network volume %2$@"; "desc_local_vol" = "the volume %@"; ✓ "desc_network_vol" = "the network volume %@"; ✓ "desc_folder_local" = "the folder %1$@ on the volume %2$@"; ✗ ✗ "desc_folder_network_vol" = "the folder %1$@ on the network volume %2$@";
"BBB will clone <sourceWhole> to <destWhole>."; "desc_backup_everything" = "BBB will clone <sourceWhole> to <destWhole>."; "desc_backup_everything" = "BBB will clone <sourceWhole> to <destWhole>."; Why do we fail here? "desc_local_vol" = "the volume %@"; "desc_network_vol" = "the network volume %@"; "desc_folder_local" = "the folder %1$@ on the volume %2$@"; "desc_folder_network_vol" = "the folder %1$@ on the network volume %2$@";
clone <sourceWhole> to the folder %1$@ on network volume %2$@. CCC clonerà <sourceWhole> sulla cartella %1$@ sul volume di rete %2$@. BBB will clone <sourceWhole> to the network volume %@. CCC clonerà <sourceWhole> sul volume di rete %@.
"BBB will clone <sourceWhole> to <destWhole>."; "desc_folder_local" = "the folder %1$@ on the volume %2$@"; How do we succeed? "desc_backup_everything" = "BBB will clone <sourceWhole> to <destWhole>."; "desc_folder_local" = "the folder %1$@ on the volume %2$@"; <sourceWhole> & <destWhole> use the same pool of strings
Step 1 "desc_backup_everything" = "BBB will clone <sourceWhole> to <destWhole>."; "source_desc_folder_local" = "the folder %1$@ on the volume %2$@"; "source_desc_folder_local" = "the folder %1$@ on the volume %2$@"; "dest_desc_folder_local" = "the folder %1$@ on the volume %2$@"; "desc_backup_everything" = "BBB will clone <sourceWhole> to <destWhole>."; Separate strings pools for <sourceWhole> & <destWhole>
"BBB will clone <sourceWhole> to <destWhole>."; Solution - Step 2 "desc_backup_everything" = "BBB will clone <sourceWhole> <destWhole>."; Move the preposition “to” into the ‘Destination’ string. "source_desc_folder_local" = "the folder %1$@ on the volume %2$@"; "dest_desc_folder_local" = "the folder %1$@ on the volume %2$@"; "source_desc_folder_local" = "the folder %1$@ on the volume %2$@"; "dest_desc_folder_local" = "to the folder %1$@ on the volume %2$@";
"desc_backup_everything" = "BBB kopiert <sourceWhole> <destWhole>."; "source_desc_folder_local" = "den Ordner %1$@ auf dem Volume %2$@"; "dest_desc_folder_local" = "in den Ordner %1$@ auf dem Volume %2$@";
did we learn? • Works in one language ≠ works in other languages • Move mean little fellas such as prepositions or articles into the placeholder strings • Provide for order changes by using %1$@
there are languages that use a different syntax • You do not need to know the syntax of every single language • If in doubt: ask someone who is good at this stuff • Important: You don’t have to be an expert. But expect this to need time during the translation.
resources • Possible specialization in a certain topic • Customization level and complexity of the UI • Your internationalization efforts • Thoroughness of the translators
not the translation, but the Review • Plan for sufficient time – also consider time zone related losses • Inform your translators ahead of time • Ecosystem biorhythm: WWDC, Xmas, OS releases, iTC downtimes, …
formats • xibs, plist, strings, stringsdict, … • json, … • xliff, … • xlsx, docx, … The bigger / complex your project is, the better it is to use native files.
formats • Can be versioned easily • Contain ALL context • Are context themselves • Versioning difficult • Prone to loosing context • Error source Include translators in the decision
web Full services on the web • No file format hassle • Easy and quick • Anonymous translators • Status tracking and statistics • Q&A handling • No file format hassle • Easy and quick • You bring your own translators • Status tracking and statistics • Q&A handling Made for your comfort, typically inefficient for translators
or online platforms - include translators • Most online platforms are very inefficient for translators • Choose wisely and be aware of dependencies and error sources