Verify that your Resource Labels Exists
19 Jul 2012 2 Comments
This is part 2 of 4 in a series on how to improve the way we usually work with resource (resx) files. At least the way my team and I work with them.
I generally like to – and do – use resource files for all string constants that are shown to end-users, however I do feel that it is needlessly cumbersome, therefore these posts:
- A Good Way to Handle Multi Language Resource Files
- Verify that your Resource Labels Exists (this one)
- Find Obsolete Resource Labels
- Supercharge your Resource Efficiency with Macros
Generally these issues are generic to .NET and not specific to SharePoint, though that is where I’m spending my time writing this.
So, are you sure that your Resource Labels Exists?
The issue at hand is that you have hundreds of source files of various flavors and they are springled with references to a number of resource files. Usually only one for each project/wsp though.
So how can you be sure that you don’t use one in your code that isn’t defined in your resource file?
As missing resource labels are just output verbose to the end user/application this can be a major issue.
The answer is that you run the PowerShell script below, that’ll check it
I made a small script to check for resource labels after a major code rewrite that had me change literally hundreds of labels.
The script will, given a starting location (i.e. the root folder for your solution)
- Search recursively for resx files and store their locations
- Go through every code file (.xml, .cs, .vb, .as*x, .webpart, .dwp, .feature) and look for resource labels of the form “$Resources:filename,label_key“
- For every one of those resource keys it’ll open the corresponding resx file and check that the key is present and write a warning to the console if not
Obviously this takes a minute or two – in my current project with 8500 files (including everything) it takes about 1 minute to complete (a VM on a power laptop) which is completely acceptable as you don’t really need to run it that often.
Enterprising people may want to add it to the buildserver’s list of tests. I haven’t found the need or the time yet
PS> & VerifyResourceLabelsExists.ps1 “path to solution dir“
(Tip: Download the script to somewhere, write an ampersand (&) and then drag the ps1 file into the PowerShell window and then drag the solution folder to the window.)
Searching for resx files Searching for labels Parsing resx files Checking labels Warning: Could not find $Resources:Delegate.XXX.XXX,ContentType_XXX_Description in file C:\Dev\TFS\xxxx\Elements.xml Warning: Could not find $Resources:Delegate.XXX.XXX,ListDefinition_XXX_Heading in file C:\Dev\TFS\xxxx\Schema.xml ...
You’ll likely want to pipe the results to a file and then run through your source files to add the missing labels (see part 4, when I finish it).
What it does not do
There are obviously some limitations. It will not
- Add the missing labels for you
- It simply looks at files. If you have some files that are excluded from your project files they will be counted in regardless
- It simply does pattern matching – code commented out is still included by the script
- It always works of the default non-language specific resx file – the task of ensuring that all labels are defined in all languages is a fairly simple xml comparison for which tools exists
- Handle default resource files, i.e. the case where you define a default resource file in your feature.xml files and then use the “$Resources:label_key” shorthand with no file name