iTuner Translation - Help Wanted!

Are you fluent in English even though it's not your primary native language? Do you know what a .NET resource file is and how to modify one? Then you may be the perfect person to help translate and localize this project. I'm looking for a few great translators for this project. You'll need access to Visual Studio 2010 and should have experience translating from English to your preferred language. This is a free hobby project so I can't offer great fortunes but I can offer immeasurable fame and recognition by placing your name on the acknowledgements page. Thank you!

Please note all copyrights belong to the project owner.

Languages requested:

  • Chinese (zh-Hans)
  • French (fr-FR)
  • German (de-DE) - 95% complete
  • Hebrew (he-IL)
  • Italian (it-IT)
  • Japanese (ja-JP)
  • Portuguese (pt-BR)
  • Russian (ru-RU)
  • Spanish (es-ES)

How to…

All iTuner resources are specified in a single file.  The iTuner\Properties\Resources.resx file contains the master en-US strings for the application.  These resources are referenced by both C# and XAML.

Invariant Resources

 There is one convention that you must abide by.  Any resource identifier prefixed with the string “I_” (that’s a capital “i” followed by an underscore) is considered an invariant resource and must not be localized or translated.

XAML Localization

Referencing resource strings from XAML is quite easy.  This is just informational so everyone knows how I did it.  There are a ton of solutions on the Net including custom MarkupExtension implementations that work nicely.  But I found the simplest solution to be the best.  In place of explicit text, use a static reference such as:

<TextBlock Text="{x:Static resx:Resources.AboutBox_Reserved}" />

Submit your work

So grab the latest source code, find the Resources.resx file, copy it and rename it to include your ISO language-Culture code such as or, and translate each of the non-invariant strings.  Finally, just submit it as a patch and I’ll incorporate it in to the next release.

en-029 and Pseduo-English

What is the Resources.en-029.resx file and how is it generated?

Unless there is a special need, I intend on maintaining only the most common or generic variant of each language, for example, de-DE for German, fr-FR for French, es-ES for Spanish, etc.  For English, I decided to support en-US as the default language since this is what I speak!

Then I needed a way of validating that all of the text within iTuner is properly implemented as “translatable” meaning every bit of text is specified as a resource string and is properly fetched from the resource assemblies.  But I’m a typical American programmer and my idea of multi-lingual is C# and C++!  So I created this mechanism to replace English text with pseudo-English text.  To do that, you need a valid ISO culture to apply to  CurrentCulture and CurrentUICulture.  “en-029” is technically Caribbean English but it provides a bucket where I can declare “pseudo-English” translations.

This is how it works:

  1. The iTuner\Properties\Resources.resx file specifies the en-US strings.
  2. When iTuner is compiled, the pre-build event command iTunerPseudolator is executed.  Pseudolator generates “pseudo-English” which is merely a copy of the English text strings in which every third character in each word is replaced with a Unicode equivalent maintaining the primary letter for readability.  For example, the string “Starting iTunes” becomes "Ŝtařtiňg ïTuňes”.  (By only peudo-translating every third character, we prove that the string is translated while maintaining reasonable readability.)
  3. The App.config used during development includes the setting UICulture set to en-029.
  4. When iTuner starts, it reads this UICulture configuration key and applies this setting instead of the default workstation culture.
  5. Now I can see iTuner pseudo-translated! 

  6. And to switch to real en-US English, I simply need to delete the UICulture configuration setting.


Copyright (c) 2010-2012 Steven M. Cohn. All rights reserved.

Last edited May 19, 2012 at 12:06 PM by stevenmcohn, version 20


No comments yet.