Linguan
Linguan greatly simplifies localizing your Mac and iOS apps. It gives you an intelligent editor for all strings files contained in your Xcode project.
You get warned about duplicate tokens or missing translations. Then you can export and e-mail all missing tokens for a specific language to your translator, who can also use Linguan for filling in the translations or use his text editor of choice.
When you get the translators results back Linguan automatically merges the results into your project, even if the tokens originated from multiple different strings files.
Linguan is the most fun way to clean up your translations.
Basic Workflow
- Open an Xcode project file
- Select a strings file in the navigation tree
- Start translating strings in the table
Powerful Tools
Inspector Window
You can also open the inspector window to edit strings. Here you have more space which helps when editing multi-line strings. The inspector window also provides interesting statis- tics about the selected files.
Validating a Project
Linguan checks your project for missing translations and duplicate strings. A validations hap- pens right after you open a project or after invoking the validation manually (e.g. from the tool bar). Warnings are displayed in a special area on the bottom of the main window. Double click warnings to jump directly to the corresponding token.
Scan Sources
Linguan can scan a project’s source files and adds all string tokens used in NSLocalizedString macros which are not already contained within a strings file. All newly added tokens are displayed in the message area at the bottom of the window.
Working With Translators
1) Export Tokens
You can choose to export a source language. E.g. if your translator translates from English to German, you would choose English as source language and German as target language. Select which strings a translator should get. “Missing Tokens” would be a good option.
A strings file containing only strings with missing translation is exported.
2) Let the translator do the work
Send the strings file to the translator. A translator can either edit the file directly using a text editor or import it into Linguan for translating it with style.
3) Import the translated strings file
After the translator has sent you the translated strings file you just import it into your projects and all missing translations will be added in the right place.
App Categories: Drobnik.com Mac


When did the Price jump to $9.99. I had the impression the $4.99 would be available for a short time to come.
The price increase came with 1.0.1. Other developers kept telling us that it is too cheap and makes them wonder where the problem is. There is one competitor that charges $30, so Linguan is still very affordable compared to the hours of time it will save you.
$9.99 is the perfect price point for this app and better reflects the app’s quality than $4.99.
Hi,
unfortunately the tool doesn’t work for me at all. When I import a project it only shows the original language and no translation column. Even though, it tells me, that there are more translations set up in the project.
It looks like the project tree is broken. It shows me the complete path on my hard drive instead of a relative path, like it is on the screencast.
I don’t get any errors or warnings whatsoever, it just doesn’t work. :-/ So it’s the opposite of “painless localization” :-/
I have no idea how I can reach your support but this page is referenced as support site on the Mac App Store. Would be nice to have at least an e-mail address where one could send screenshots and stuff and where support questions are not public!
Regards,
Thomas
There is an e-mail button at the top of every page of this blog here. You can also directly file a bug report at https://bugs.cocoanetics.com for the “Linguan” project.
Sorry, for my harsh comment. Thanks for the link!
Greets,
Thomas
Excellent product!
Just 1 suggestion: import and export in excel compatible format. I gave to my translator guy the file string… but he destroy it… so I fix it and import it.
In stead, if I can send an xls or csv, is easier to “non developer” people to manage.
Any way… It is a nice product that makes me save a lot of time!
Thanks!
Facundo
Hi,
nice Tool, helps saving a lot of time.
In our project we have an issue with Linguan, so this is a suggestion for a later version.
Sometimes we use “Format specifiers” like “Mailcount: %i” in our translations or
Complete sentences like “Hello!\r\nThis is a greetings mail.”
But Linguan is malforming “\r\n” to “\\r\\n” and sometimes “%i” to “%1 $i”.
Search/Replace helps out here. But it would be nice to use format specifiers in translations, too.
Another suggestions is, replacing the NSLocalizedStrings inside the project on demand, if the “Key” changed.
The developer can ‘inline’ create strings like “Internal Server error: SSH must be turned on”.
And if Linguan were able to change this later to a key like “mail_ssh” would be fine.
Greetings
Jack Pearse
Where do you see this “malforming”? Please provide me with a stripped down xcodeproj that demonstrates the issue.
Hi,
Linguan is a very handy tool – thanks for putting it together!
I’d like to second Jack’s suggestion for being able to modify the NSLocalizedString in the project if the key is changed. I have run into several cases where this would be desirable.
A couple of other things I’ve noticed that would be nice to have:
- The search filter box only seems to work when on the “All” filter. It would be good if it could filter also on missing or warnings.
- It would be nice to be able to delete a translation that no longer exists
- It would be nice if it could scan and determine if a particular localized string is no longer present in the source. i.e.: code has changed and some strings are no longer required.
Thanks!
Sean.
Hi!
Another suggestion:
Last friday I spent 4 hours creating all the string.xml for android eclipse… just coping and pasting from Localized.string….
If you create some export to android should be great!
Regards
It happens while scanning the code for strings. How can I provide you the examplecode. Should I use your e-mail?
Greetings
Jack
Yes, just email me.
Hi,
I sent you a mail to the account which was was linked at the top of your site. I hope this can help.
Thanks in advance.
Jack
Hi!
Actually I was trying to translate a project using Linguan for the first time!
Thank you so much for this tool! It’s like a compiler upon the compiler. The warnings helped me getting rid of doubled tokens. And much better, if you append functionality to your apps, new string will appear. Extracting the new ones so that the translators don’t have to deal with double translations is so easy now.
Linguan knows different kind of localized strings, i.e. NSLocalizedString() or NSLocalizedStringWithDefaultValue(). Now I can easily extract Strings into class relevant string files (i.e. localized error messages, which must not be translated all the time, because they are bundled with a class or library)
I am actually beginning translating and Linguan just saved me so much time.
This App is a must have if you are xcode developer and trying translating stuff.
And support is fast and friendly. Thank you so much!
Regards
Jack
P.S.
I like the Application Icon
So I’m not sure if I’m missing something, but when I modify a string name, it doesn’t modify the underlying call to NSLocalizedString. This is basically the main reason I bought the product – any chance that is an option or could be?
Linguan does not modify your project file or source code. It is meant as an editor for the strings files.
To change all tokens in your code you can simply use the search/replace function in Xcode.
I like Linguan very much!
Have you ever thought about integrating ibtool in a way, so that Linguan would create .string files for selected XIB files (and create the translated XIB files vice versa)?
Having that in Linguan (like scanning for NSLocalizedString macros) would make life even easier
Max,
I am trying to elaborate Drops’ answer a bit more:
if you have NSString *xHello = NSLocalizedString(@”Hello World!”);
in one of your source files, then Linguan will find that and add an entry to localized.strings (which you need to create in your project and assign languages to it).
In Linguan you can then easily translate all these entries. At runtime your app will then look into “localized.strings” for the current language. In turn xHello will hold a translated version of “Hello World”.
Linguan only writes those .strings files back to your project. It does not modify .m or .h files!
Xib support is coming soon
Oh I get that, I just don’t like it.
The flow I want (and I realize it’s not everybody who wants this) is that it scans the source, creates the localized strings file(s). Then I edit the generated files (mostly key names), and choose to write them back to the .m. A plugin system of some sort or an option would be pretty awesome. I can write the regexp scanner stuff myself, but ugh.
If it writes back to the .m files, how should the different languages be distinguished then?
Ah, I realize I didn’t describe it well. I want NSLocalizedString(@”I was a lazy developer”, “My hint”) to become NSLocalizedStringWithDefault(@”My.Smart.Key”,@”My hint”,@”My Default”) (I think that order is right).
Point being I want to use the Linguan interface to manipulate all the keys names at once rather than trying to do that in code. (Might also be nice to be able to edit the string file name at the same time)
Personally I found it to be difficult to separate keys and default values. We have done that in one larger iOS app, but it either ended up that key==default or that you could hardly determine what meaning a specific key was meant to have (without looking at the place in source).
But as always, preferences are personal, so maybe Drops puts this on his list as an option for a future version …
Thanks for saving me loads of time! A request however.
It would be great if any edits of comments would also update the original comments in the .h or .m file.
So in the .strings file I add “WITH EDIT” using Linguan:
/* Settings View: choose a color setting WITH EDIT */
“Color” = “Color”;
And it also updates my original definition:
#define COLOR_LOCAL NSLocalizedString(@”Color”, @”Settings View: choose a color setting WITH EDIT”)
Thank you for your feedback. We’ll take it under advisement. Though it is rather unlikely that we are going to touch your source code, that’s simply too dangerous and much effort.
Feature Request/Bug Fix: save the changes I make to the toolbar (I always add the Save All button, but it disappears when I restart the app).
+100
Good to hear!
I’ve bought Linguan to help me managing a number of App projects and it took care of the .string files in a wonderful way.
And just like Olof, I’d like to get similar support for the .nib files.
Hi Oliver,
Question: How can I use Linguan to work with a sub bundle? Like the Settings bundle or other sub bundle to the main bundle?
Thank you for your help.
Regards,
Enrique
Linguan does not go into bundles yet. Generally you should build bundles with a bundle target, because then the resources get properly preprocessed and Linguan can see them.
Ah, I was just about to ask this myself, as adding settings would certainly help.
OK I’ll see if I can do that.
Other than that, Linguan is working great for me- well done
A guide to how best to do this for the Settings bundle would be much appreciated, as it is something most users of Linguan will need to do.
Integrating this within Linguan would obviously be the optimum user experience.
Erst mal ein Lob für das coole Tool.
Dann aber paar Anmerkungen.
Wenn ich den Source Scanne, dann werden auch auskommentierte Strings importiert.
Wenn in dem xcode Project string und xib Files zwar drin sind, aber in keinem Target definiert, dann werden diese auch mit gescannt.
Beim Export währe es besser wenn nicht alle Files angehakt sind, sondern evtl. nur die strings.
Dann währe es schön wenn man die xib Files ausschliessen könnte.
Wenn der Export fertig ist, dann geht der Dialog immer gleich zu.
Besser währe wenn der Dialog offen bleibt.
Währe schön wenn die Anmerkungen evtl. umgesetzt werden könnten.
Danke
Hello,
Firstly a big congratulations: this application is really a great idea!
Secondly, do you integrate the google translate api or other automatic translation service in future versions?
We have many ideas for Linguan’s future. If more people would buy it then we would have the budget to also implement them.
Hey there. I just bought Linguan, exported a strings file from Linguan and sent it to my translator (who recommended Linguan). They said that my file was malformed and that I should contact you. I didn’t see a Contact Support link anywhere, so here I am. Any ideas? Thanks…
How is it malformed in their opinion?
Linguan exports strings files with some extra comments that contain meta information like feom which original file a token originated from.
My email is at the top right of every page of cocoanetics.com. Please send me this file and exact info what is supposedly wrong with it.
I am using version 1.1.1.
After adding new language (Portuguese) on xcode and reopen the project on Linguan, the application stops functioning. The wizard is not working, the export is not working etc’.
I tried to reopen the application and even restart the machine. Nothing helps.
I got 10 languages currently on my project.
Any advice?
Please send me a cutdown version of the project that is able to demo the problem.
When I remove one localization (Korean), and left the 9 others it works fine.
Either way, I still need to have a test project that shows the issue so that the developers can fix it. Please supply one.
Hallo Support,
kann man Linguan auch nutzen, ohne dass ein gesamtes XCode Projekt existiert, also indem man nur mit Localisable.strings nutzt?
Wenn ja, wir haben es hinbekommen, dass wir die Localisable.strings angezeigt bekommen, allerdings alphabetisch geordnet, nicht in der Sortierung, wie sie in der strings an sich auftaucht. Wir haben in Einstellungen die Sortierung umgestellt, es ändert aber nichts.
Darüber hinaus würden wir gerne direkt eine neue Sprache anlegen und dann die Übersetzung in die entsprechenden Zeilen für die neue Sprache neben der Mastersprache anlegen. Geht das oder muss man eine neue Localisable.strings außerhalb Linguan anlegen und dann erst importieren?
Könnt Ihr da helfen?
Linguan benötigt die Struktur eines Xcode Projektes um seine Stärken wirklich ausspielen zu können. Ausserdem kann man einzelne strings files öffnen, z.B. wenn man der Übersetzer ist. Die Sortierung der Files spielt keine Rolle für Xcode/iOS.
Für eine neue Sprache muss die entsprechende Lokalisierung in Xcode eingetragen werden. Dann das Projekt neue öffnen und dann sieht man diese Sprach auch als Spalte.
Hello,
Are there any command line or automation tools available? For example, it would be very nice to automatically export new strings right after building the project.
Thanks,
Jon
Hi,
Interest translate the Linguan Software to Brazilian Portuguese language? In exchange the One Family Pack License (5 Users) and more a generously donation via PayPal? My translations is lifetime. Let me know, please.
Btw, a little bit for me. I am translator since 1999. Some my recent translations: EazyDraw, ProPresenter, Presentation Prompter, WhiteSize, Flux, Totals, Sandvox, FontLab Studio, MacFamilyTree Pro and all Synium Softwares, GraphicConverter, Lyn, Nisus Writer Pro and Express, Accordance Bible, MacGourmet Deluxe, Path Finder, AppDelete, DropDMG and 150 more Mac and Windows platform.
BTW, please send me reply for e-mail only.
Sincerely,
Paulo
Exporting crashes if more than 4 languages. Tried work around by deleting one and adding another, export, restore old (the one with 5 languages) and importing the previous export. Import fails–doesn’t even do anything.
Could you please e-mail me your Xcode project, or share it with me on Dropbox oliver@drobnik.com, so that I can see what is going on there? That should not happen.
Update on previous issue, new app with 5 languages works. Previous app where it crashes consistently with 5 languages has about 1600 lines of text per language across 60 externalized string files. I’d send you a crash log but I can’t seem to find one.
I just purchased Linguan and opened my project and it did not recognize my translation into German. In fact, it lists al German files in the far left column along with the English files so there are two of each. What is odd about my my project (or it seems odd), is that the de.prj directory is a sub-directory (inside) the en.prj directory. XCode created it that what way for some reason.
Also, is there a way for Linguan to find tokens in the translation files that are no longer needed in the code or the UI files? I have removed from View Controllers and their class files.
The structure you describe is messed up, the folders need to be next to each others. You will have to fix that manually.
Checking for unused tokens is something we plan in the future, user-base permitting.
The embedded de.prj inside the en.prj was done by xcode, do you any insight into what suggests to xcode to do this?
The tool have a way to merge duplicates and append their comments together?
If I want to remove a translation (remove a line), because I know I just deleted some code with the string in it, do I have to do this manually in the two files in xcode?
In Linguan 1.1.2 – awesome tool – I cannot close the Settings page. I’m on Mac OS X 10.7.5. Known problem?
No, this is the first I hear about it.
Hi guys, just downloaded – thanks for a great (but expensive) product. For this price, we should be able to export to CSV/XLS! Are there any plans to implement at all?
We have CSV as an import/export format on my road map, yes.
Just added a new language (da), got it back from translator, imported into Linguan and all looks well, saved it and figured I was all set. For some other reason I needed to look at the localized file in XCode and found that the Danish is actually ALL english. So, I deleted all of the text, opened Linguan, re-imported: text looks fine there. Saved. Go to XCode, it’s english. Any ideas?
Please save and check on the file system if the files have been updated correctly or whether there is a bug. It could be that Xcode had the file open and did not recognize that it was updated.
A new day (a new Xcode) and additional da.strings and this time it worked fine. Thanks.
Would be nice if there were different view modes:
1. Show the whole text for all languages in the selected row.
2. Show the text, the comment, and all translations each on it’s own row, with double-lines or something between each.
Frustrating: I start editing a translation. Then I want to go to the next translation and start editing it. I double-click in the next row and the wrong translation is selected on the first click (because the row shrinks), and then I’m editing the wrong thing.
Even more frustrating: I want to just move to the next language, and the same thing happens!
After ‘scan sources’ and adding a new item to “Localizable.strings” (which doesn’t have any translations), the Warnings and Missing lists are empty. Shouldn’t be?
Looking forward to an update with some simple usability updates.
Cheers,
John.
I am just looking for a latin dictionary German – Latin
Where can I find this
> In Linguan 1.1.2 – awesome tool – I cannot close the Settings page.
Here too, I’m on Mac OS 10.8.2
Nice tool. Please show/highlight the corresponding source code file to the selected string.
Nice and very useful tool.
Here are few suggestions to improve it.
[Activation/ Deactivation]
It’s the ability to activate/deactivate a string. I use ‘fake’ string in storyboard only to have visual presence:these strings are not to be translated. So each time I send file to translators I have to parse the document to remove them.
[Project preferences]
Adding preferences by projects. For example each project keep it’s own export settings, directory settings and so on.Then when strings are updated a simple clic leads to generate exported files on the right directory for each language.
Each language defined could have it’s own directory. An in each directory several files : all strings, news strings only, previous version…
Regards
Dominique Vial