Johnny Herring:
No, that's not what I meant. This is a custom solution too, as far as I can see, not the built-in solution. However, all solutions, even the built-in solution, will not come cheap if you are already far into your project and currently have all strings hard coded. Because all solutions are similar in one way: You have to pull out all hard coded strings from your code and put them into key/value-structured lookup tables/arrays/whatever, and instead of having the hard coded text in the code, you then have a lookup access in your code, with the matching key for that occasion. This is a bullet you will have to bite if you want localization (which is why it's always a good idea to support localization right from the start. :) )
The built-in system has the advantage, that it handles the language detection automagically:
In the solution explorer, right-click on the project name, then select "Properties". Then from the tabs on the left, select "Resources". If it says "This project does not contain a default resources file. Click here to create one.", then do so, i.e. "click here".
What you get is the default string table, where you can enter resources with "name" and "value" (and a "comment", but I seldomly use this). This is the key/value pair I was talking about (only they call it name, instead of key).
This default string table is for the default language: The framework will always try to read the settings of the user (i.e. either the Windows settings or the XBox settings) to find out which locale the user has currently selected. The framework will then try to use the string table that matches the language for this locale. If there is no matching string table, the framework will then select the default string table. So it is usually best to use English in this default string table (unless you are targeting a local market, but then you probably wouldn't be asking about localization in the first place).
So what you do is, that for any text that is used anywhere in the game, you make an entry here in this string table, with the English text as the "value" and a meaningful name as the "name". Then in your game, at any location where you need this text, instead of writing the text string itself, you write "Properties.name" instead, where you replace "name" with the name of the text that you want to appear. Which is why you should use a "meaningful" name, so that in your code, the "name" will give you a clue of what text will later be used.
For example, if you have a "settings" dialog that is supposed to have the title "Game Settings", then in the string table you would create an entry
Name: Value:
SettingsDialog_Title Game Settings
and in your code, wherever you need this text you would simply write "Resources.SettingsDialog_title". For example:
dialog.SetTitle(Resources.SettingsDialog_Title);
(You may need a "using YOURGAME.Properties" directive for the "Resources" class to become available.)
Transfer all your hard-coded texts into the string table in this fashion. At the end, you will have a game that will always display in the default language (assumably English).
Actually, to edit the string table, you don't have to go via Solution Explorer -> Right Click Project -> Properties -> Resources. There's also a direct access to this table:
In your solution explorer, under the project, there's a folder called "Properties". If you open it you will now find a file called "Resources.resx". Just double click this file to open the default string table.
Then you can start to localize the game for a new language, by adding another string table, which comes in form of another Resources.resx file, only with a slightly different name for each language: The name is Resources.xx.resx, where you need to replace xx with the two-letter language code (lower case) of the desired language. For example, if you wanted to do German, you would need a file called "Resources.de.resx".
In Visual Studio 2005 Express there only seem to be "roundabout" ways for creating such a Resources.xx.resx file (this may be improved in VSE 2008?). The easiest one is probably this one:
In the solution explorer, right click on the project name, then select "Add -> New Item". In the dialog, make sure to select the "Resources File" template and as the name, enter "Resource.xx.resx" (with "xx" replaced according for your target language).
This will create the file in the project root folder. From there you need to move it to the "Properties" folder. Cut&Paste won't work, because the right-click menu on the "Properties" folder doesn't offer "Paste". But you can simply move the file with drag&drop. I.e. inside of the solution explorer, simply drag the file from its location in the project root folder into the "Properties" folder.
Double clicking the file now opens a string table similar to the default string table describe above - only initially empty.
Copy all entries from the default string table to this language specific string table, then translate the texts in the "Value" column to your target language. If you later add more entries to your default table, remember to also add them to all language specific tables (and translate them there). Or if you change a value in the default table, also change it in the language tables. Similarly for deleting values...
That's it, nothing more to do! Especially: You don't need any code changes to support the new language!
If you faithfully used "Resources.name" everywhere in the code (as described above), then each occurrence of a certain "name" will automatically be replaced with the value from the language specific string table that matches the language settings of the user (in Windows or the XBox dashboard), or if there is no specific language table for that language, the text from the default table will be used.
Doc
P.S. You may notice that in the solution explorer the Resources.resx file has a little "+" icon before it, that you can use to unfold a "child" file called Resources.Designer.cs. But the Resources.xx.resx files don't have this. You can safely ignore this. It's part of the framework "magic" that you don't need to care about (and you also don't need to edit the Resources.Designer.cs file, as this file is generated automatically).
P.P.S. The Resources.xx.resx files are XML, so if you have a translater who doesn't work with Visual Studio (for example an external translator) then he can edit the XML directly.