. $lang_language_dir = "../languages/"; $lang_translations_dir = "translations/"; $lang_prj_translations_dir = "project_specific_translations/"; $lang_compiled_dir = "compiled/"; $lang_log_level = 1; /** * Fetches a list of compiled languages from the directory * set to contain such files. * @returns A list of languages that have been compiled */ function getSupportedLanguages(){ global $lang_language_dir, $lang_compiled_dir; $list = array(); if (is_dir($lang_language_dir.$lang_compiled_dir)) { if ($dh = opendir($lang_language_dir.$lang_compiled_dir)) { while ($file = readdir($dh)) { if (substr($file, -7) != ".po.inc") continue; if (is_numeric(substr($file, 0, 5))) continue; $list[] = substr($file,0,-7); } } } else { echo "\"".$lang_language_dir.$lang_compiled_dir."\" is not a directory. Please consult the documentation for correctly setting up the translation system."; exit; } return $list; } /** * Builds the lookup arrays from the * language files found in the given directory tree. * @param langdir The language base directory * @param transdir The location of the .po files to compile relative to langdir * @param compdir The output location relative to langdir * @param append If true the function will only append to rather than replace the compiled files */ function buildLanguages($langdir,$transdir,$compdir,$append=false){ global $lang_project_default; // Run through each language and compile their lookup arrays. if (is_dir($langdir.$transdir)) { if ($dh = opendir($langdir.$transdir)) { while (($file = readdir($dh)) !== false) { if ($file==".." or $file=="."){ // Skip parent and current dir } else if (substr($file,-3)==".po"){ // and only do files ending in .po language_log( "-------------Compiling $transdir$file------------", 0 ); $language = parseLanguage($langdir.$transdir.$file); if (!$language){ language_log( "WARNING: Could not parse language ".$file ); continue; } $fh = fopen($langdir.$compdir.$file.".inc",$append?"a":"w"); if (!$fh) { language_log( "ERROR: could not access $langdir $compdir - please check permissions", 2 ); exit; } if (!$append) { fwrite($fh, " $value){ if ($value !== "") { //Skip if the msgstr is empty fwrite($fh, "\$language_lookup_array[\"".str_replace("\"", "\\\"", substr($file,0,-3))."\"][\"".$key."\"] = \"".$value."\";\n"); } } // don't write \?\> - may append fclose($fh); } else { //debug("File $file with unknown extension found in $info_dir"); } } closedir($dh); } else { //debug("$info_dir could not be opened - check permissions?"); } } else { //debug("$info_dir not found or is not a directory"); } } /** * Parses a gettext .po-file into an associative PHP array. * @param file The file to parse * checking for inconsistencies if needed. *************************/ function parseLanguage($file){ $translation_file = file($file); $first_entry = true; $current_token_text=""; for ($i = 0;$i= $lang_log_level){ echo date("Y-m-d H:i:s",time())." ".$msg." ".$message."\n"; } } // Determine whether to recompile language files $compile_languages = false; if (isset($_GET['compile_languages'])) $compile_languages = true; if ($compile_languages){ buildLanguages($lang_language_dir,$lang_translations_dir, $lang_compiled_dir); buildLanguages($lang_language_dir,$lang_prj_translations_dir, $lang_compiled_dir, true); } // Make a list of languages which the user prefers // (by looking at cookies and browser settings) // cookies have highest priority. if (isset($_COOKIE['lang'])){ $language_string = $_COOKIE['lang'].","; } else { $language_string = ''; } if (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])) { $language_string .= strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]); } // Find out which language to use by iterating through list // The list is comma-separated, so split it into an array of the following type: // Array ( // [0] => da // [1] => en-us;q=0.7 // [2] => en;q=0.3 // ) $client_languages=explode(",",$language_string); // A language is either defined as primary-secondary or primary. // It can also have a quality attribute set, // which orders the languages in a user preferred ordering. // Since this is usally the same order as the array indices // we just ignore this attribute (TODO: don't ignore this attribute) // A missing quality attribute means q=1 $languages_in_use = array(); // Loop over languages that the client requests for ($i=0; $i2) && (substr($client_languages[$i],2,1)=="_" || substr($client_languages[$i],2,1)=="-")) { // If this is defined as primary-secondary, represent it as xx_YY // $language = substr( $client_languages[$i],0,2)."_".strtoupper(substr($client_languages[$i],3,2) ); // And also check for the primary language // $language2 = substr($client_languages[$i],0,2); } else { // else just use xx // $language = substr($client_languages[$i],0,2); $language2 = null; } // If we have a translation for the language, include it $file_name = $lang_language_dir.$lang_compiled_dir.$language.".po.inc"; if (file_exists($file_name)) { if (!in_array($language, $languages_in_use)){ require_once($file_name); $languages_in_use[] = $language; } } if ($language2) { $file_name = $lang_language_dir.$lang_compiled_dir.$language2.".po.inc"; if (file_exists($file_name)) { if (!in_array($language2, $languages_in_use)){ require_once($file_name); $languages_in_use[] = $language2; } } } } $cvs_version_tracker[]="\$Id$"; //Generated automatically - do not edit ?>