Under .Net you can build resources into what are known as satelite assembles that can be dynamically loaded by the application.
A simple design time containing something like error messages would be called
Errors.resx
If you needed to support French clients you would create a version called
Errors.fr.resx
which would contain the French culture neutral version of the strings, for each culture you would then create another version:
Errors.fr-FR.resx
Errors.fr-CA.resx
etc.
Each of these contain values for the specific culture. At runtime it will check the most specific resource (e.g. fr-CA if you are in Canada) for the resource item, if it isn't there it falls back to the next level (fr) and finally the resources compiled into the executable if needed.
As well as simple strings there is also a tool called WinRes.exe that can be used to modify form layouts as well as just the text - the translators would require the Framework SDK but nothing else to make UI changes.
This MSDN Link has a brief overview of the tools required and this article covers the issues in a lot more depth.