Implementing internationalization in SharePoint is pretty straight forward – until you notice it fails for the site’s default language. Peeking into Microsoft’s code with ILSpy you see something like this:

So if the current UI culture equals the site’s default culture m_strTitle is returned with no respect to internationalization.

Unfortunately, the documentation for the title parameter of SPNavigationNode’s constructor states that ‘The string value can be a resource expression such as “$Resources:core,announceList”‘. The code shows this won’t work for the site’s default culture: you’ll see something like ‘$Resources:core,announceList’ in your UI and not ‘Announce list’ as you wanted.

For SharePoint 2010 you’ll have to loop through your supported cultures, setting your thread’s UI culture to each of them and the node’s title to the respective localized title. There are various posts on the Net showing how to do this.

SharePoint 2013 didn’t fix the bug but makes it easier to get around it. It added an SPNavigationNode constructor with three parameters: title, resxTitleResource, and url. Call this constructor with the title set for the site’s default culture, pass your resource expression as the second parameter, and internationalization will work as expected.