<?xml version="1.0" encoding="UTF-8"?>
<language name="en">
<page name="errors">
<phase name="empty">Please fill in all the fields</phase>
<phase name="email_not_found">E-mail not found in database</phase>
<phase name="login_error">Login error</phase>
<phase name="email_not_valid">E-mail not valid</phase>
<phase name="password6">Password must be at least 6 characters</phase>
<phase name="pass_no_match">Passwords do not match</phase>
<phase name="template_not_found">Template not found</phase>
</page>
</language>
<?php
public function load_phrases($lang_id) {
$xml = new DomDocument('1.0');
//path to language directory
$lang_path=(LANG_PATH.$lang_id.'.xml');
$xml->load($lang_path);
//phrases are inside page tags, first we must get these
$page = $xml->getElementsByTagName('page');
$page_num=$page->length;
for($i = 0; $i < $page_num; $i++) {
$page=$xml->getElementsByTagName('page')->item($i);
//get phase tags and store them into array
foreach($page->getElementsByTagName('phase') as $phase) {
$phase_name = $phase->getAttribute('name');
$phrases[$phase_name] = $phase->firstChild->nodeValue;
$phrases[$phase_name] = str_replace('n','<br/>',$phrases[$phase_name]);
}
}
$this->phrases=$phrases;
}
?>
<?php
public function lang_id() {
//determine page language
$lang_id= isset($_COOKIE['lang']) ? $_COOKIE['lang'] : 'en';
//set the language cookie and update cookie expiration date
if(!isset($_COOKIE['lang'])) {
$expiration_date=time()+3600*24*365;
setcookie('lang',$lang_id,$expiration_date,'/');
}
return $lang_id;
}
public function change_lang($lang_id) {
setcookie('lang',$lang_id,$expiration_date,'/');
}
?>
<?php
public function __construct() {
$this->load_phrases($this->lang_id());
}
?>
Let's start with the database:
CREATE TABLE IF NOT EXISTS `lang` (
`lang_id` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
`lang_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`lang_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE IF NOT EXISTS `phrases` (
`phrase_id` int(10) NOT NULL AUTO_INCREMENT,
`lang_id` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
`phrase_type` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`phrase_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`phrase_text` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`phrase_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Lang_id is the language code (I used ISO-639-1, a two-letter international language code standard). Phrase type is used for minimizing the number of phrases that need to be loaded. Assign the value Global to phrase_type if you are going to use that phrase in more than one page. If a phrase appears on one page only, assign the PHP file name (without the .php) as a phrase type.
<?php
public function load_phrases($lang_id,$page_name) {
$this->db->q("SELECT * FROM phrases WHERE lang_id='$lang_id' AND (phrase_type='global' OR phrase_type='$page_name')");
while($f=$this->db->f_row()) {
$phrases[$f['phrase_name'] = $f['phrase_text'];
}
return $phrases;
}
?>
<?php
echo $lang->phrases[' email_not_valid ']; // prints out E-mail not valid; email_not_valid is the value of phrase_name database field
?>
Here is the construct function:
<?php
public function __construct($lang_id,$page_name) {
$this->db = new db; // load database class
$this->phrases = $this->load_phrases($lang_id,$page_name);
}
?>
public function get_current_filename() {
$current_file = $_SERVER["SCRIPT_NAME"];
$parts = Explode('/', $current_file);
$current_file = $parts[count($parts) - 1];
$current_file = substr($current_file,0,strlen($current_file)-4);
return $current_file;
}
RewriteRule ^([a-zA-Z]{2})/(.*)$ /$2?lang_id=$1 [L,QSA]
lang_id is set and valid in your init file. Also, set the default language here (in this example, it is English):
<?php
//fetch lang ID
$lang_id = !input::check_varchar($_GET['lang_id'],2,false) ? 'en' : $_GET['lang_id'];
DEFINE('LANG_ID',$lang_id);
//fetch phrases, global and for this page
$page_name = !input::check_varchar($_GET['page_name'],20,false) ? globals::get_current_filename() : $_GET['page_name'];
$lang = new lang($lang_id,$page_name);
?>