'); fclose($fh); $real_interface_size = sizeof($interface); // Now run through each language and recompile their lookup arrays. // if (is_dir($langdir.$transdir)) { if ($dh = opendir($langdir.$transdir)) { //If dir exists while (($file = readdir($dh)) !== false) { //read contents if ($file==".." or $file=="."){ } else if (substr($file,-3)==".po"){ //only files ending in .po language_log("-------------Compiling $file------------",0); $language = parseLanguage( $langdir.$transdir.$file, $interface ); if (!$fh = fopen($langdir.$compdir.$file.".inc","w")) { language_log( "ERROR: could not access $langdir $compdir - please check permissions",2 ); exit; } fwrite($fh, "'); 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"); } //Do the same again, this time for the project specific language files // and instead of creating new compiled files // just add to whatever existing ones // if (is_dir($langdir.$prjtransdir)) { $interface = parseLanguageInterface($langdir.$prjtransdir.$lang_project_default.".po"); if (!$fh = fopen($langdir.$compdir."language_interface.inc","a")) { language_log("ERROR: could not access $langdir $compdir - please check permissions",2); exit; } fwrite($fh, "'); fclose($fh); if ($dh = opendir($langdir.$prjtransdir)) { //If dir exists while (($file = readdir($dh)) !== false) { //read contents if ($file==".." or $file==".") continue; if (substr($file,-3)==".po"){ //only files ending in .po language_log("----------------Compiling project specific $file---------------",0); $language = parseLanguage($langdir.$prjtransdir.$file, $interface); if (!$fh = fopen($langdir.$compdir.$file.".inc","a")) { language_log("ERROR: could not access $langdir $compdir - please check permissions",2); exit; } fwrite($fh, "'); 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"); } //Lastly we will rename the files to their real names (remove the random prefix): if ($dh = opendir($langdir.$actual_compdir)) { while (($file = readdir($dh)) !== false) { if ($file==".." or $file=="." or (substr($file,0,strlen($randomness))!=$randomness)) continue; if (substr($file,-4)==".inc") { //only files ending in .inc rename ($langdir.$actual_compdir.$file, $langdir.$actual_compdir.substr($file,strlen($randomness))); } } } else { echo "no compile dir?!"; } } /*************************** * Have some of the files changed? **************************/ function languagesNeedsRebuild($langdir,$transdir,$prjtransdir, $compdir){ if (!file_exists($langdir.$compdir)){ //This directory does not exist - try to create one mkdir($langdir.$compdir,0733); return true; //and force an update since we need it } // return false; //Uncomment this to speed up things when you know that you will manually recompile the languages when updated... $last_compile = 0; if (file_exists($langdir."last_compile_timer")) { $last_compile = filemtime($langdir."last_compile_timer"); } //This file gets touched each time a compile finishes if (is_dir($langdir.$transdir)) { if ($dh = opendir($langdir.$transdir)) { while (($file = readdir($dh)) !== false) { if ($file==".." or $file==".") continue; if (substr($file,-3)==".po"){ //only files ending in .po if (filemtime($langdir.$transdir.$file)>$last_compile) { closedir($dh); return true; } } } closedir($dh); } } if (is_dir($langdir.$prjtransdir)) { if ($dh = opendir($langdir.$prjtransdir)) { while (($file = readdir($dh)) !== false) { if ($file==".." or $file==".") continue; if (substr($file,-3)==".po"){ //only files ending in .po if (filemtime($langdir.$prjtransdir.$file)>$last_compile) return true; } } closedir($dh); } } return false; //All checks say that nothing has changed. } /************************** * Parses a gettext .po-file into an indexed PHP array, * checking for inconsistencies if needed. * The $file is parsed and validated against $interface *************************/ function parseLanguage($file, $interface){ if (sizeof($interface)<1){ language_log("No interface defined for 'compileLanguages()'",2); exit; } $translation_file = file($file); $first_entry = true; for ($i = 0;$i=$lang_log_level){ $fh = fopen($lang_log_file,"a"); fwrite($fh, date("Y-m-d H:i:s",time())." ".$msg." ".$message."\n"); fclose($fh); } } if (languagesNeedsRebuild($lang_language_dir, $lang_translations_dir, $lang_prj_translations_dir, $lang_compiled_dir) || get_str("compile_languages",true)){ buildLanguages($lang_language_dir,$lang_translations_dir,$lang_prj_translations_dir, $lang_compiled_dir); } // Define some variables (from constants) that the language files can use in the translation: $PROJECT = PROJECT; if (file_exists($lang_language_dir.$lang_compiled_dir."language_interface.inc")){ require_once($lang_language_dir.$lang_compiled_dir."language_interface.inc"); // 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($HTTP_SERVER_VARS["HTTP_ACCEPT_LANGUAGE"])) { $language_string .= strtolower($HTTP_SERVER_VARS["HTTP_ACCEPT_LANGUAGE"]); } // Find out which language to use by iterating trough list // The list is commaseperated, 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); //Now a language is either defined as primary-secondary or merely primary //it can also have a quality attribute set - which orders the languages in a user //preffered 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 require_once($lang_language_dir.$lang_compiled_dir.$lang_project_default.".po.inc"); //Always include the project default as fallback for ($i=sizeof($client_languages)-1;$i>=0;$i--){ //Now for each language that the client requests if ((strlen($client_languages[$i])>2) && (substr($client_languages[$i],2,1)=="_" || substr($client_languages[$i],2,1)=="-")){ //If this is defined as primary-secondary $language = substr( $client_languages[$i],0,2)."_".strtoupper(substr($client_languages[$i],3,2) ); //represent it as xx_YY } else { $language = substr($client_languages[$i],0,2); //else just use xx } if (file_exists($lang_language_dir.$lang_compiled_dir.$language.".po.inc")) { //If we have the language, include it //echo "[$language]"; require($lang_language_dir.$lang_compiled_dir.$language.".po.inc"); } } } else { language_log("Could not load language interface.",2); echo "ERROR: Could not load language interface. This is a fatal error, exiting."; flush; exit; } ?>