Changeset 1402 for trunk/contrib


Ignore:
Timestamp:
02/19/18 07:35:49 (2 years ago)
Author:
gogo
Message:

Rebuild the translation system and language files.

Includes a few kludges to help lc_parse_strings.php detect translation strings.

See README_TRANSLATORS.TXT for description of the translation system.

Location:
trunk/contrib
Files:
2 added
1 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/contrib/lc_parse_strings.php

    r901 r1402  
    11<?php 
    2 die("this script is disabled for security"); 
     2//die("this script is disabled for security"); 
    33 
    44/** 
    55  * LC-Parse-Strings-Script 
    66  * 
    7   * This script parses all xinhas source-files and creates base lang-files 
    8   * in the lang-folders (one for base and one every plugin) 
     7  * This script parses all xinhas source-files and creates base language files... 
     8  * 
     9  *   /lang/lc_base.js 
     10  *   /modules/.../lang/lc_base.js 
     11  *   /plugins/.../lang/lc_base.js 
     12  *   /unsupported_plugins/.../lang/lc_base.js 
     13  * 
     14  * This script should be used from the command line, not from a web browser 
     15  *  (well it should work, but anyway). 
    916  * 
    1017  * How To use it: - remove the die() in line 2 (security) 
    11   *                - make sure all lang-folders are writeable for your webserver 
    12   *                - open the contrib/lc_parse_strings.php in your browser 
    13   *                - lang/base.js will be written 
    14   *                - open base.js, translate all strings into your language and save it 
     18  *                - cd contrib && php ./lc_parse_strings.php 
     19  *                - lang/lc_base.js will be written 
     20  *                - open lc_base.js, translate all strings into your language and save it 
    1521  *                  as yourlangauge.js 
    1622  *                - send the translated file to the xinha-team 
     
    1824 
    1925 
    20  
    2126error_reporting(E_ALL); 
    2227 
     28$XinhaRoot = realpath(dirname(__FILE__).'/..'); 
     29 
    2330$ret = array(); 
    24 $files = getFiles("../", "js$"); 
     31$files = getFiles($XinhaRoot, "/js$/"); 
    2532foreach($files as $file) { 
    2633    $fp = fopen($file, "r"); 
     
    3037    } 
    3138 
    32     preg_match_all('#_lc\("([^"]+)"\)|_lc\(\'([^\']+)\'\)#', $data, $m); 
     39    preg_match_all("#_lc\(\s*\"((?:[^\"]|\\\\\")+)\"\s*[,)]#", $data, $m);             
    3340    foreach($m[1] as $i) { 
    34         if(trim($i)=="") continue; 
    35         $ret[] = $i; 
    36     } 
    37     foreach($m[2] as $i) { 
    38         if(trim($i)=="") continue; 
    39         $ret[] = $i; 
    40     } 
    41  
    42     if(eregi('htmlarea\\.js$', $file)) { 
     41        if(trim(strip_tags($i))=="") continue; 
     42        $ret[] = preg_replace('/\\\\"/', '"', $i); 
     43    } 
     44     
     45    preg_match_all('#_lc\(\s*\'((?:[^\']|\\\\\')+)\'\s*[,)]#', $data, $m); 
     46    foreach($m[1] as $i) { 
     47        if(trim(strip_tags($i))=="") continue; 
     48        $ret[] = preg_replace("/\\\\'/", "'", $i); 
     49    } 
     50 
     51    if(preg_match('/(XinhaCore|XinhaLoader|htmlarea)\.js$/', $file)) { 
    4352        //toolbar-buttons 
    4453        //bold:          [ "Bold" 
     
    5059 
    5160        //HTMLArea._lc({key: 'button_bold', string 
    52         preg_match_all('#HTMLArea\\._lc\\({key: \'([^\']*)\'#', $data, $m); 
     61        preg_match_all('#(Xinha|HTMLArea)\\._lc\\({key: \'(([^\']|\\\\\')+)\'\s*[,)]#', $data, $m); 
    5362        foreach($m[1] as $i) { 
    5463            if(trim($i)=="") continue; 
     
    6675} 
    6776 
    68 $files = getFiles("../popups/", "html$"); 
     77$files = getFiles("{$XinhaRoot}/popups", "/html$/"); 
    6978foreach($files as $file) 
    7079{ 
     
    7786 
    7887 
    79  
    80 $plugins = getFiles("../plugins/"); 
     88foreach(array('plugins', 'modules', 'unsupported_plugins') as $pDir) 
     89{ 
     90$plugins = getFiles("{$XinhaRoot}/{$pDir}"); 
    8191foreach($plugins as $pluginDir) { 
    82     $plugin = substr($pluginDir, 12); 
    83     if($plugin=="ibrowser") continue; 
     92    $plugin = basename($pluginDir);//preg_replace('/\.\.\/[^/]+\//', '', $pluginDir); 
     93     
    8494    $ret = array(); 
    8595 
    86     $files = getFiles("$pluginDir/", "js$"); 
    87     $files = array_merge($files, getFiles("$pluginDir/popups/", "html$")); 
    88     $files = array_merge($files, getFiles("$pluginDir/", "php$")); 
     96    $files = getFiles("$pluginDir", "/js$/"); 
     97    $files = array_merge($files, getFiles("$pluginDir/popups", "/html$/")); 
     98    $files = array_merge($files, getFiles("$pluginDir", "/php$/")); 
    8999    foreach($files as $file) 
    90100    { 
     
    92102        $data = ""; 
    93103        if($fp) { 
    94             echo "$file open...<br>"; 
     104            echo "$file open\n"; 
    95105            while(!feof($fp)) { 
    96106              $data .= fread($fp, 1024); 
    97107            } 
    98             preg_match_all('#_lc\("([^"]+)"|_lc\(\'([^\']+)\'#', $data, $m); 
     108             
     109            preg_match_all("#_lc\(\s*\"((?:[^\"]|\\\\\")+)\"\s*[,)]#", $data, $m);             
    99110            foreach($m[1] as $i) { 
    100111                if(trim(strip_tags($i))=="") continue; 
    101                 $ret[] = $i; 
     112                $ret[] = preg_replace('/\\\\"/', '"', $i); 
    102113            } 
    103             foreach($m[2] as $i) { 
    104                 if(trim(strip_tags($i))=="") continue; 
    105                 $ret[] = $i; 
    106             } 
    107         } 
    108     } 
    109  
    110     if($plugin=="TableOperations") 
    111     { 
    112         preg_match_all('#options = \\[([^\\]]+)\\];#', $data, $m); 
    113         foreach($m[1] as $i) { 
    114             preg_match_all('#"([^"]+)"#', $i, $m1); 
    115             foreach($m1[1] as $i) { 
    116                 $ret[] = $i; 
    117             } 
    118         } 
    119          
    120         //["cell-delete",        "td", "Delete cell"], 
    121         preg_match_all('#\\["[^"]+",[ \t]*"[^"]+",[ \t]*"([^"]+)"\\]#', $data, $m); 
    122         foreach($m[1] as $i) { 
    123             $ret[] = $i; 
    124         } 
    125     } 
    126  
    127  
    128     $files = getFiles("$pluginDir/", "html$"); 
    129     $files = array_merge($files, getFiles("$pluginDir/", "php$")); 
    130     foreach($files as $file) 
    131     { 
    132         $ret = array_merge($ret, parseHtmlFile($file, $plugin)); 
    133     } 
    134      
    135     $files = getFiles("$pluginDir/popups/", "html$"); 
    136     foreach($files as $file) 
    137     { 
    138         $ret = array_merge($ret, parseHtmlFile($file, $plugin)); 
    139     } 
    140     $ret = array_unique($ret); 
    141  
    142     $langData[$plugin] = $ret; 
    143 } 
    144  
    145 $plugins = getFiles("../modules/"); 
    146 foreach($plugins as $pluginDir) { 
    147     $plugin = substr($pluginDir, 12); 
    148     $ret = array(); 
    149     $files = getFiles("$pluginDir/", "js$"); 
    150     foreach($files as $file) 
    151     { 
    152         $fp = fopen($file, "r"); 
    153         $data = ""; 
    154         if($fp) { 
    155             echo "$file open...<br>"; 
    156             while(!feof($fp)) { 
    157               $data .= fread($fp, 1024); 
    158             } 
    159             preg_match_all('#_lc\("([^"]+)"|_lc\(\'([^\']+)\'#', $data, $m); 
     114             
     115            preg_match_all('#_lc\(\s*\'((?:[^\']|\\\\\')+)\'\s*[,)]#', $data, $m); 
    160116            foreach($m[1] as $i) { 
    161117                if(trim(strip_tags($i))=="") continue; 
    162                 $ret[] = $i; 
     118                $ret[] = preg_replace("/\\\\'/", "'", $i); 
    163119            } 
    164             foreach($m[2] as $i) { 
    165                 if(trim(strip_tags($i))=="") continue; 
    166                 $ret[] = $i; 
    167             } 
    168         } 
    169     } 
    170     $ret = array_unique($ret); 
    171     $langData[$plugin] = $ret; 
    172 } 
     120             
     121             
     122        } 
     123    } 
     124 
     125    $files = array_merge($files, getFiles("$pluginDir", "/\.(html|php)$/")); 
     126    $files = array_merge($files, getFiles("$pluginDir/popups", "/\.(html|php)$/")); 
     127    $files = array_merge($files, getFiles("$pluginDir/dialogs", "/\.(html|php)$/")); 
     128    foreach($files as $file) 
     129    { 
     130        $ret = array_merge($ret, parseHtmlFile($file, $plugin)); 
     131    } 
     132     
     133    $langData[$plugin] = array_unique($ret);     
     134} 
     135} 
     136 
    173137 
    174138 
    175139foreach($langData as $plugin=>$strings) { 
    176     if(sizeof($strings)==0) continue; 
    177140     
    178141 
    179142    $data = "// I18N constants\n"; 
    180143    $data .= "//\n"; 
    181     $data .= "// LANG: \"base\", ENCODING: UTF-8\n"; 
     144    $data .= "// LANG: \"en\", ENCODING: UTF-8\n"; 
    182145    $data .= "// Author: Translator-Name, <email@example.com>\n"; 
    183146    $data .= "//\n";    
    184     $data .= "// Last revision: 06 september 2007\n"; 
     147    $data .= "// Last revision: ".date('Y-m-d')."\n"; 
    185148    $data .= "// Please don´t remove this information\n"; 
    186149    $data .= "// If you modify any source, please insert a comment with your name and e-mail\n"; 
     
    199162    $data .= "//       that states what encoding is necessary.)\n"; 
    200163    $data .= "\n"; 
     164    /* 
    201165    $data .= "{\n"; 
     166     
    202167    sort($strings); 
    203168    foreach($strings as $string) { 
     
    208173    $data .= "\n"; 
    209174    $data .= "}\n"; 
    210  
    211     if($plugin=="HTMLArea") { 
    212        $file = "../lang/base.js"; 
    213                         $fp = fopen($file, "w"); 
    214                   if(!$fp) continue; 
    215                         fwrite($fp, $data); 
    216                         fclose($fp); 
    217                         echo "$file written...<br>"; 
    218                 }       elseif (($plugin=="InternetExplorer")||($plugin=="InsertTable")||($plugin=="InsertImage")||($plugin=="GetHtml")||($plugin=="Gecko")||($plugin=="Dialogs")||($plugin=="CreateLink")||($plugin=="ColorPicker")) { 
    219         $file = "../modules/$plugin/lang/base.js";       
    220                         $fp = fopen($file, "w"); 
    221                   if(!$fp) continue; 
    222                         fwrite($fp, $data); 
    223                         fclose($fp); 
    224                         echo "$file written...<br>"; 
    225                 } elseif ($plugin=="FullScreen") { 
    226         $file = "../modules/$plugin/lang/base.js"; 
    227                         $fp = fopen($file, "w"); 
    228                   if(!$fp) continue; 
    229                         fwrite($fp, $data); 
    230                         fclose($fp); 
    231                         echo "$file written...<br>"; 
    232                                 $file = "../plugins/$plugin/lang/base.js";               
    233                         $fp = fopen($file, "w"); 
    234                   if(!$fp) continue; 
    235                         fwrite($fp, $data); 
    236                         fclose($fp); 
    237                         echo "$file written...<br>"; 
    238                 } else { 
    239         $file = "../plugins/$plugin/lang/base.js";               
    240                         $fp = fopen($file, "w"); 
    241                   if(!$fp) continue; 
    242                         fwrite($fp, $data); 
    243                         fclose($fp); 
    244                         echo "$file written...<br>"; 
    245                 }        
     175    */ 
     176    sort($strings); 
     177    $js_data = array(); 
     178    foreach($strings as $string) 
     179    { 
     180      $js_data[$string] = ''; 
     181    }     
     182    $data .= json_encode($js_data,  JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE); 
     183     
     184    $langfile = false; 
     185    if(preg_match('/HTMLArea|Xinha/', $plugin)) 
     186    { 
     187      $langfile = dirname(__FILE__).'/../lang/lc_base.js'; 
     188    } 
     189    elseif (is_dir(dirname(__FILE__).'/../modules/'.$plugin))  
     190    { 
     191      $langfile = dirname(__FILE__).'/../modules/'.$plugin.'/lang/lc_base.js'; 
     192    } 
     193    elseif (is_dir(dirname(__FILE__).'/../plugins/'.$plugin))  
     194    { 
     195      $langfile = dirname(__FILE__).'/../plugins/'.$plugin.'/lang/lc_base.js'; 
     196    } 
     197    elseif (is_dir(dirname(__FILE__).'/../unsupported_plugins/'.$plugin))  
     198    { 
     199      $langfile = dirname(__FILE__).'/../unsupported_plugins/'.$plugin.'/lang/lc_base.js'; 
     200    } 
     201    else 
     202    { 
     203      echo "Unknown {$plugin}\n"; 
     204      continue; 
     205      throw new Exception("What sort of plugin is {$plugin}?"); 
     206    } 
     207     
     208    // If we don't have any data, remove any existing lc_base.js 
     209    if(!count($js_data)) 
     210    { 
     211      if(file_exists($langfile)) unlink($langfile); 
     212      continue; 
     213    } 
     214     
     215     if(!file_exists(dirname($langfile))) 
     216     { 
     217       mkdir(dirname($langfile)); 
     218     } 
     219    file_put_contents($langfile, $data); 
     220    echo "$langfile written\n"; 
    246221} 
    247222 
     
    251226function parseHtmlFile($file, $plugin="") 
    252227{ 
     228echo "Parsing $file\n"; 
    253229    $ret = array(); 
    254230     
    255     $fp = fopen($file, "r"); 
    256     if(!$fp) { 
    257         die("invalid fp"); 
    258     } 
    259     $data = ""; 
    260     while(!feof($fp)) { 
    261         $data .= fread($fp, 1024); 
    262     } 
    263      
    264     if($plugin=="FormOperations" || $plugin=="SuperClean" || $plugin=="Linker") { 
    265         //<l10n>-tags for inline-dialog or panel-dialog based dialogs 
    266         $elems = array("l10n"); 
    267     } else { 
    268         $elems = array("title", "input", "select", "legend", "span", "option", "td", "button", "div", "label"); 
    269     } 
     231    $data = file_get_contents($file); 
     232     
     233    if(preg_match('/<l10n>/i', $data) || preg_match('/"_\([^"]*\)"/', $data)) 
     234    { 
     235      // Newer plugin dialogs use our <l10n>english</l10n> tag to indicate a translation text. 
     236      // also a attribute="_([english])" 
     237      $elems = array('l10n'); 
     238    } 
     239    else 
     240    { 
     241      $elems = array("title", "input", "select", "legend", "span", "option", "td", "button", "div", "label"); 
     242    } 
     243 
    270244    foreach($elems as $elem) { 
    271245        preg_match_all("#<{$elem}[^>]*>([^<^\"]+)</$elem>#i", $data, $m); 
     
    280254    } 
    281255     
    282     if($plugin=="FormOperations" || $plugin=="SuperClean" || $plugin=="Linker") 
    283     { 
    284         //_( for inline-dialog or panel-dialog based dialogs 
    285         preg_match_all('#"_\(([^"]+)\)"#i', $data, $m); 
    286         foreach($m[1] as $i) { 
    287             if(trim($i)=="") continue; 
    288             $ret[] = $i; 
    289         } 
    290     } 
    291     else 
     256    // "_( ... )" is only valide for an attribute value 
     257    preg_match_all('#"_\(([^"]+)\)"#i', $data, $m); 
     258    foreach($m[1] as $i) { 
     259        if(trim($i)=="") continue; 
     260        $ret[] = $i; 
     261    } 
     262       
     263    // Older plugins translate the title attribute 
     264    if(count($elems) > 1) 
    292265    { 
    293266        preg_match_all('#title="([^"]+)"#i', $data, $m); 
     
    298271        } 
    299272    } 
     273     
    300274    return($ret); 
    301275} 
    302276 
    303277 
    304 function getFiles($rootdirpath, $eregi_match='') { 
     278function getFiles($rootdirpath, $preg_match='') { 
    305279 $array = array(); 
    306280 if ($dir = @opendir($rootdirpath)) { 
    307281   $array = array(); 
    308282   while (($file = readdir($dir)) !== false) { 
    309      if($file=="." || $file==".." || $file==".svn") continue; 
    310       if($eregi_match=="") 
     283     if($file=="." || $file==".." || $file==".svn" || $file == ".htaccess") continue; 
     284      if($preg_match=="") 
    311285        $array[] = $rootdirpath."/".$file; 
    312       else if(eregi($eregi_match,$file)) 
     286      else if(preg_match($preg_match,$file)) 
    313287        $array[] = $rootdirpath."/".$file; 
    314288       
     
    320294 
    321295 
    322  
    323  
    324  
    325296?> 
  • trunk/contrib/make-release.sh

    r1265 r1402  
    55VER=0.96.1 
    66 
    7 # 
     7if ! [ -f XinhaCore.js ] 
     8then  
     9  echo "Run this script from inside your Xinha Root directory." 
     10  exit 1 
     11fi 
     12 
     13if ! [ -f .svn ] 
     14then  
     15  echo "This script must be run inside a subversion working copy." 
     16  exit 1 
     17fi 
     18 
     19# Create merged language files for translators 
     20php contrib/lc_parse_strings.php 
     21for lang in $(find . -wholename "*/lang/*.js" | sed -r 's/.*\///' | sort | uniq | grep -v base | sed -r 's/.js//') 
     22do 
     23  php contrib/lc_create_merged_file.php $lang lang/merged/$lang.js 
     24done 
     25php contrib/lc_create_merged_file.php NEW lang/merged/__new__.js 
     26 
     27 
    828# 
    929svn export $(pwd) /tmp/Xinha-$VER 
Note: See TracChangeset for help on using the changeset viewer.