* @ingroup Language
*
* @author Zhengzhu Feng <zhengzhu@gmail.com>
- * @maintainers fdcn <fdcn64@gmail.com>, shinjiman <shinjiman@gmail.com>, PhiLiP <philip.npc@gmail.com>
+ * @maintainers fdcn <fdcn64@gmail.com>, shinjiman <shinjiman@gmail.com>
*/
class LanguageConverter {
var $mPreferredVariant='';
var $mVariants, $mVariantFallbacks, $mVariantNames;
var $mTablesLoaded = false;
var $mTables;
- var $mManualAddTables;
- var $mManualRemoveTables;
var $mTitleDisplay='';
var $mDoTitleConvert=true, $mDoContentConvert=true;
var $mManualLevel; // 'bidirectional' 'unidirectional' 'disable' for each variants
'N'=>'N' // current variant name
);
$this->mFlags = array_merge($f, $flags);
- foreach( $this->mVariants as $v) {
+ foreach( $this->mVariants as $v)
$this->mManualLevel[$v]=array_key_exists($v,$manualLevel)
?$manualLevel[$v]
:'bidirectional';
- $this->mManualAddTables[$v] = array();
- $this->mManualRemoveTables[$v] = array();
- }
}
/**
return $ret;
}
-
+
+
/**
- * prepare manual conversion table
+ * apply manual conversion
* @private
*/
- function prepareManualConv($convRule){
+ function applyManualConv($convRule){
// use syntax -{T|zh:TitleZh;zh-tw:TitleTw}- for custom conversion in title
$title = $convRule->getTitle();
if($title){
$action = $convRule->getRulesAction();
foreach($convTable as $v=>$t) {
if( !in_array($v,$this->mVariants) )continue;
- if( $action=="add" ) {
- foreach($t as $from=>$to) {
- // more efficient than array_merge(), about 2.5 times.
- $this->mManualAddTables[$v][$from] = $to;
- }
- }
+ if( $action=="add" )
+ $this->mTables[$v]->mergeArray($t);
elseif ( $action=="remove" )
- $this->mManualRemoveTables[$v] = array_merge($this->mManualRemoveTables[$v], $t);
- }
- }
-
- /**
- * apply manual conversion from $this->mManualAddTables and $this->mManualRemoveTables
- * @private
- */
- function applyManualConv(){
- //apply manual conversion table to global table
- foreach($this->mVariants as $v) {
- if (count($this->mManualAddTables[$v]) > 0) {
- $this->mTables[$v]->mergeArray($this->mManualAddTables[$v]);
- }
- if (count($this->mManualRemoveTables[$v]) > 0)
- $this->mTables[$v]->removeArray($this->mManualRemoveTables[$v]);
+ $this->mTables[$v]->removeArray($t);
}
}
$plang = $this->getPreferredVariant();
$tarray = StringUtils::explode($this->mMarkup['end'], $text);
$text = '';
-
- $marks = array();
+ $lastDelim = false;
foreach($tarray as $txt) {
$marked = explode($this->mMarkup['begin'], $txt, 2);
- if (array_key_exists(1, $marked)) {
- $crule = new ConverterRule($marked[1], $this);
- $crule->parse($plang);
- $marked[1] = $crule->getDisplay();
- $this->prepareManualConv($crule);
- }
- array_push($marks, $marked);
- }
- $this->applyManualConv();
- foreach ($marks as $marked) {
+
if( $this->mDoContentConvert )
$text .= $this->autoConvert($marked[0],$plang);
else
$text .= $marked[0];
- if( array_key_exists(1, $marked) )
- $text .= $marked[1];
+
+ if(array_key_exists(1, $marked)){
+ // strip the flags from syntax like -{T| ... }-
+ $crule = new ConverterRule($marked[1], $this);
+ $crule->parse($plang);
+
+ $text .= $crule->getDisplay();
+ $this->applyManualConv($crule);
+ $lastDelim = false;
+ } else {
+ // Reinsert the }- which wasn't part of anything
+ $text .= $this->mMarkup['end'];
+ $lastDelim = true;
+ }
+ }
+ if ( $lastDelim ) {
+ // Remove the last delimiter (wasn't real)
+ $text = substr( $text, 0, -strlen( $this->mMarkup['end'] ) );
}
return $text;
* @ingroup Language
* @author fdcn <fdcn64@gmail.com>
*/
-
class ConverterRule {
var $mText; // original text in -{text}-
var $mConverter; // LanguageConverter object
'Preferences' => array( '参数设置' ),
'Watchlist' => array( '监视列表' ),
'Recentchanges' => array( '最近更改' ),
- 'Recentchangeslinked' => array( '链出更改' ),
'Upload' => array( '上传文件' ),
'Listfiles' => array( '文件列表' ),
'Newimages' => array( '新建文件' ),
'Uncategorizedcategories' => array( '未归类分类' ),
'Uncategorizedimages' => array( '未归类文件' ),
'Uncategorizedtemplates' => array( '未归类模版' ),
- 'Unusedcategories' => array( '未使用分类' ),
+ 'Unusedcategories' => array( '未使用的模板' ),
'Unusedimages' => array( '未使用文件' ),
'Wantedpages' => array( '待撰页面' ),
'Wantedcategories' => array( '待撰分类' ),