Strongly typed localized strings in universal apps

Back in the old days when the need for localized string arose, I would add a new string and use AppResources to access the correct string in code.
In Windows Phone application (known today as Windows Phone Silverlight 8.0/8.1) I would do something like this:

public void SomeMethod()
{
var localizedString1 = AppResources.MyFirstSring;
var localizedString2 = AppResources.AnotherString;
}

In the new universal apps the story is a bit different:

  • Only strings are allowed in the resource files (which are .resw instead of .resx)
  • Using a directory for each supported language (i.e. Strings\en-US\)
  • Access to localized strings is string based

I can live with the first two (I actually prefer it that way) but I have huge problems with Stringly Typed API calls – it’s easy to get it wrong, and even worse a trivial rename can cause problems that would only show during application run.

Luckily a co-worker of mine has put together a T4 template that fixes this problem (thanks Noam):











<# string str = this.Host.ResolvePath("strings\\en-us\\Resources.resw");
System.Xml.Linq.XElement resXml = System.Xml.Linq.XElement.Load(str); // Read a data file here. "%aaa%/string/en-us/Resources.resw"
IEnumerable appElement = (from dataElements in resXml.Descendants("data") select dataElements); #>

using Windows.ApplicationModel.Resources;

namespace UniversalApp
{
public class StringsResourceManager
{
private static readonly ResourceLoader _resourceLoader = new ResourceLoader();
public StringsResourceManager()
{
}


public static string
{
get
{
return _resourceLoader.GetString("");
}
}

}
}

Using the class created from this template I can get from this:

public void SomeMethod()
{
var resourceLoader = new ResourceLoader();

var string1 = resourceLoader.GetString("MyFirstSring");
var string2 = resourceLoader.GetString("AnotherString");
}

To this:

public void SomeMethod() 
{
var string1 = StringsResourceManager.MyFirstSring;
var string2 = StringsResourceManager.AnotherString;
}

Happy coding…

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.