A Good Way to Handle Multi Language Resource Files
09 Jun 2012 3 Comments
If you are working with SharePoint you should also be using ressource (resx) files in your projects.
The problem is that SharePoint is quite annoying in the way it handles fallback to the default language resx when there is no culture specific version.
For instance in a Danish site it will look for MySolution.da-DK.resx and fallback to MySolution.resx if it isn’t o found.
However SharePoint will spam your ULS log with messages like:
04/20/2012 13:56:37.25 w3wp.exe (0x3758) 0x344C SharePoint Foundation General b9y9 High Failed to read resource file "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\Resources\MySolution.da-DK.resx" from feature id "(null)". 5b6991c9-5b39-4c95-b895-ed282bc00034 04/20/2012 13:56:37.25 w3wp.exe (0x3758) 0x344C SharePoint Foundation General 8e26 Medium Failed to open the language resource keyfile MySolution. 5b6991c9-5b39-4c95-b895-ed282bc00034 04/20/2012 13:56:37.25 w3wp.exe (0x3758) 0x2C94 SharePoint Foundation General b9y3 High Failed to open the file 'C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\Resources\MySolution.da-DK.resx'. 492a45e8-e416-4321-a83a-12f56c0341c1 04/20/2012 13:56:37.25 w3wp.exe (0x3758) 0x2C94 SharePoint Foundation General b9y4 High #20015: "" kan ikke åbnes: Filen eller mappen findes ikke. 492a45e8-e416-4321-a83a-12f56c0341c1 04/20/2012 13:56:37.25 w3wp.exe (0x3758) 0x2C94 SharePoint Foundation General b9y4 High (#2: "" kan ikke åbnes: Filen eller mappen findes ikke.) 492a45e8-e416-4321-a83a-12f56c0341c1
And to make matters worse they are actually marked with “high” importance. In my mind this is a very normal way to code (for non-SharePoint projects) and should certainly not be marked with high importance. For now I am forced to look for the “unexpected” importance instead when troubleshooting.
The Simple Fix
There are a number of ways to correct this, I chose:
- Delete the duplicate localized version (MySolution.da-DK.resx) from source control
Add a prebuild event to copy MySolution.resx to MySolution.da-DK.resx
- Write something like ‘copy /Y “$(ProjectDir)Resources\$(TargetName).resx” “$(ProjectDir)Resources\$(TargetName).da-DK.resx” ‘ (change to suit your needs and ensure quotes are not html mangled)
- Make sure to include MySolution.da-DK.resx in the project and mark it with “Build Action: Content”, “Copy to Output Directory: Do not copy”.
Choose to exclude MySolution.da-DK.resx from Source Control in Visual Studio (File / Source Control / Exclude …)
(otherwise Visual Studio will likely face write protected files)
All in all it should look somewhat like this:
Other possible solutions would be to symbolic soft/hard link to the file (mklink.exe), however care should be taken as TFS really don’t like symbolic links.
The trick with exclusion from source control would likely work too, however a file copy just seemed like a simpler solution…
Another creative way would be to mess around with the packaging options it’s likely possible.