As above. A single base language file, and additional language files on top of that.
The base file contains an array of language strings, and their relevant text:
Code:
// Base
$lang['welcome_message'] = 'Welcome to foobar.com';
$lang['error'] = 'We are having technical problems';
Alternative languages override these where necessary - if you don't have a translation for the message, then it falls back to the base English string.
Code:
// French
$lang['welcome_message'] = 'Bienvenue à foobar.com';
I then use Smarty templating and assign the $lang array to the template (switching via a user preferences system), and insert the message where needed e.g.:
Code:
<h2>{$lang.welcome_message}</h2>
<p>{$lang.error}</p>
(You could do it without a templating engne, but it makes life so much easier for this sort of thing)
This may not be the most appropriate method when you need alternative versions of large articles, and you might be best storing the translations in a DB and pulling out the relevant one when necessary.
Switching character set should be as simple as changing the header('Content-type:...'); sent, and optionally the <meta> content-type tag. I've not used Japanese characters on a site before, only a little bit of Chinese, but are the characters you need not within the UTF-8 character set? I believe Kanji is supported, and certainly the common Chinese characters. If so, you can use UTF-8 for all languages and not worry about switching the content-type header.
There may be better overall methods, this is the one that seems most efficient for my needs at the moment - only 1 template file for all translations of a page. I'm currently working on a framework for multi-language sites, and it's the first time I've done it properly, so I'll be interested in other viewpoints.