From 0b5da1f400d64a2d3474b96a6c6a52850c512392 Mon Sep 17 00:00:00 2001 From: "Janus B. Kristensen" Date: Mon, 31 Jan 2005 20:32:49 +0000 Subject: [PATCH] Translation functions (currently no support for project specific expansions) svn path=/trunk/boinc/; revision=5254 --- html/inc/translation.inc | 216 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 html/inc/translation.inc diff --git a/html/inc/translation.inc b/html/inc/translation.inc new file mode 100644 index 0000000000..dc3737a446 --- /dev/null +++ b/html/inc/translation.inc @@ -0,0 +1,216 @@ +\n"; + } else { //Else + $interface[] = $token; //Store the token and number in array + } + } + } + return $interface; +} + + +/*************************** + * Builds the lookup arrays from the language interface file + * and the language files found in the $dir directory subtree + ***************************/ +function buildLanguages($langdir,$transdir,$compdir){ + //First build the list of defines for the tokens + //and place it in an include file in the directory + $interface = parseLanguageInterface($langdir."language_interface"); //Get the interface + if (!$fh = fopen($langdir.$compdir."language_interface.inc","w")) { echo "ERROR: could not access $langdir $compdir - please check permissions"; exit;}; + fwrite($fh, "'); + fclose($fh); + + //Now run trough 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 +/////////////////////////////////////////////////////////////////////////////////////////////////// + echo "
----------------
\nCompiling $file
\n---------------
\n"; + $language = parseLanguage($langdir.$transdir.$file, $interface); + if (!$fh = fopen($langdir.$compdir.$file.".inc","w")) { echo "ERROR: could not access $langdir $compdir - please check permissions"; 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"); + } + $fh=fopen($langdir."last_compile_timer","w"); //Toucing compile timer + fwrite($fh, time()); + fclose($fh); + + +} + +/*************************** + * Have some of the files changed? + **************************/ +function languagesNeedsRebuild($langdir,$transdir,$compdir){ + $last_compile = filemtime($langdir."last_compile_timer"); //This file gets touched each time a compile finishes + if (filemtime($langdir."language_interface")>$last_compile) return true; + + 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 + if (filemtime($langdir.$transdir.$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)<2){ echo "
ERROR: No interface defined for 'compileLanguages()'"; exit;} + $translation_file = file($file); + $first_entry = true; + for ($i = 0;$iERROR: above line ".$line.": Language file $file has a token (".$current_token.") that is not defined in the interface."; + return false; + } else { + return $id; + } +} + +/***************** + * This function prints any missing tokens as errors + *****************/ +function checkMissingTokens($language_array, $interface){ + $diff = array_values(array_diff( array_keys($interface),array_keys($language_array))); + for ($i=0; $iERROR: Language file is missing token (".$interface[$diff[$i]].")"; + } +} + +/*********************** + * Returns the contents of a line (ie removes "" from start and end) + *********************/ +function getPOLineContent($line){ + $start = strpos($line, '"')+1; + $stop = strrpos($line, '"'); + return substr($line, $start, $stop-$start); +} + +/************************ + * Translate token + * Use the token name as a constant - like echo tr(MENU_ABOUT); + ************************/ +function tr($tokennumber){ + global $language_lookup_array, $default_language_lookup_array; + if (strval(intval($tokennumber))!=$tokennumber){ + echo "Language token used which is not defined in language interface! DEVELOPER: please check your spelling or add the token to the interface."; + echo "
If you are a user of this system please contact an administrator right away and tell what URL you got this error on"; + } + if (!array_key_exists($tokennumber,$language_lookup_array)){ //If language hasn't got this token + if (!array_key_exists($tokennumber, $default_language_lookup_array)){ //Fallback to a lookup in the project default language + return "[MISSING TEXT]"; //If not found there either, display "MISSING TEXT" + } else { //If found: + return stripslashes($default_language_lookup_array[$tokennumber]); //Return from default language + } + } + return stripslashes($language_lookup_array[$tokennumber]); //If found in client language, return that +} + + +if (languagesNeedsRebuild($lang_language_dir, $lang_translations_dir, $lang_compiled_dir) || $_GET["compile_languages"]){ + buildLanguages($lang_language_dir,$lang_translations_dir,$lang_compiled_dir); +} + +// Define some 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"); + require_once($lang_language_dir.$lang_compiled_dir.$lang_project_default.".po.inc"); + $default_language_lookup_array=$language_lookup_array; + //Find out which language to use (todo: iterate trough list instead of picking first out: + $client_language=strtolower(substr($HTTP_SERVER_VARS["HTTP_ACCEPT_LANGUAGE"],0,2)); + if ($client_language!=$lang_project_default){ + if (file_exists($lang_language_dir.$lang_compiled_dir.$client_language.".po.inc")){ //If we have the language + require_once($lang_language_dir.$lang_compiled_dir.$client_language.".po.inc"); //Include it + } + } +} else { + echo "ERROR: Could not load language interface. This is a fatal error, exitting."; flush; exit; +}; + +?> \ No newline at end of file