<?php
-/**
- * @package MediaWiki
- * @subpackage Language
- */
-
-/*
- There are two levels of conversion for Serbian: the script level
- (Cyrillics <-> Latin), and the variant level (ekavian
- <->iyekavian). The two are orthogonal. So we really only need two
- dictionaries: one for Cyrillics and Latin, and one for ekavian and
- iyekavian.
-*/
+
require_once( dirname(__FILE__).'/../LanguageConverter.php' );
require_once( dirname(__FILE__).'/LanguageSr_ec.php' );
require_once( dirname(__FILE__).'/LanguageSr_el.php' );
+/**
+ * There are two levels of conversion for Serbian: the script level
+ * (Cyrillics <-> Latin), and the variant level (ekavian
+ * <->iyekavian). The two are orthogonal. So we really only need two
+ * dictionaries: one for Cyrillics and Latin, and one for ekavian and
+ * iyekavian.
+ *
+ * @ingroup Language
+ */
class SrConverter extends LanguageConverter {
var $mToLatin = array(
'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd',
'Nj' => 'Њ', 'n!j' => 'нј', 'N!j'=> 'Нј', 'N!J'=> 'НЈ'
);
- var $mParsingContent=false;
-
function loadDefaultTables() {
$this->mTables = array(
'sr-ec' => new ReplacementArray( $this->mToCyrillics ),
- 'sr-jc' => new ReplacementArray( $this->mToCyrillics),
'sr-el' => new ReplacementArray( $this->mToLatin),
- 'sr-jl' => new ReplacementArray( $this->mToLatin),
'sr' => new ReplacementArray()
);
}
currently, and just produces a couple of bugs
*/
function parseManualRule($rule, $flags=array()) {
- // ignore all formatting
+ if(in_array('T',$flags)){
+ return parent::parseManualRule($rule, $flags);
+ }
+
+ // otherwise ignore all formatting
foreach($this->mVariants as $v) {
- $carray[$v] = $rule;
- }
+ $carray[$v] = $rule;
+ }
return $carray;
}
- // Set a flag when parsing content, this is used to prevent
- // conversion of content within talk pages
- function parserConvert( $text, &$parser ){
- $this->mParsingContent = true;
- $output = parent::parserConvert($text, $parser );
- $this->mParsingContent = false;
- return $output;
-
- }
-
/*
- * Override function from LanguageConvertor
- * Additional checks:
- * - There should be no conversion for Talk pages
+ * A function wrapper:
+ * - if there is no selected variant, leave the link
+ * names as they were
+ * - do not try to find variants for usernames
*/
- function getPreferredVariant( $fromUser=true ){
- global $wgTitle;
- if(is_object($wgTitle) && $wgTitle->isTalkPage() && $this->mParsingContent){
- return $this->mMainLanguageCode;
+ function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
+ // check for user namespace
+ if(is_object($nt)){
+ $ns = $nt->getNamespace();
+ if($ns==NS_USER || $ns==NS_USER_TALK)
+ return;
}
- return parent::getPreferredVariant($fromUser);
- }
-
- /*
- * A function wrapper, if there is no selected variant,
- * leave the link names as they were
- */
- function findVariantLink( &$link, &$nt ) {
$oldlink=$link;
- parent::findVariantLink($link,$nt);
+ parent::findVariantLink( $link, $nt, $ignoreOtherCond );
if($this->getPreferredVariant()==$this->mMainLanguageCode)
$link=$oldlink;
}
*/
function autoConvert($text, $toVariant=false) {
global $wgTitle;
- if(is_object($wgTitle) && $wgTitle->getNameSpace()==NS_IMAGE){
+ if(is_object($wgTitle) && $wgTitle->getNameSpace()==NS_FILE){
$imagename = $wgTitle->getNsText();
if(preg_match("/^$imagename:/",$text)) return $text;
}
return parent::autoConvert($text,$toVariant);
- }
+ }
/**
* It translates text into variant, specials:
$reg = '/^'.$roman.'$|^'.$roman.$breaks.'|'.$breaks.$roman.'$|'.$breaks.$roman.$breaks.'/';
$matches = preg_split($reg, $text, -1, PREG_SPLIT_OFFSET_CAPTURE);
-
+
$m = array_shift($matches);
+ if( !isset( $this->mTables[$toVariant] ) ) {
+ throw new MWException( "Broken variant table: " . implode( ',', array_keys( $this->mTables ) ) );
+ }
$ret = $this->mTables[$toVariant]->replace( $m[0] );
$mstart = $m[1]+strlen($m[0]);
foreach($matches as $m) {
return $ret;
}
-
- function armourMath($text){
- return parent::markNoConversion($text);
- }
-
}
+/**
+ * @ingroup Language
+ */
class LanguageSr extends LanguageSr_ec {
function __construct() {
global $wgHooks;
parent::__construct();
- // these variants are currently UNUSED:
- // 'sr-jc', 'sr-jl'
$variants = array('sr', 'sr-ec', 'sr-el');
$variantfallbacks = array(
'sr' => 'sr-ec',
- 'sr-ec' => 'sr-ec',
- 'sr-el' => 'sr-el',
- );
-
+ 'sr-ec' => 'sr',
+ 'sr-el' => 'sr',
+ );
- $marker = array();//don't mess with these, leave them as they are
$flags = array(
'S' => 'S', 'писмо' => 'S', 'pismo' => 'S',
'W' => 'W', 'реч' => 'W', 'reč' => 'W', 'ријеч' => 'W', 'riječ' => 'W'
);
- $this->mConverter = new SrConverter($this, 'sr', $variants, $variantfallbacks, $marker, $flags);
+ $this->mConverter = new SrConverter($this, 'sr', $variants, $variantfallbacks, $flags);
$wgHooks['ArticleSaveComplete'][] = $this->mConverter;
}
+
+ function convertPlural( $count, $forms ) {
+ if ( !count($forms) ) { return ''; }
+
+ //if no number with word, then use $form[0] for singular and $form[1] for plural or zero
+ if( count($forms) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+
+ // FIXME: CLDR defines 4 plural forms. Form with decimals missing.
+ // See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#ru
+ $forms = $this->preConvertPlural( $forms, 3 );
+
+ if ($count > 10 && floor(($count % 100) / 10) == 1) {
+ return $forms[2];
+ } else {
+ switch ($count % 10) {
+ case 1: return $forms[0];
+ case 2:
+ case 3:
+ case 4: return $forms[1];
+ default: return $forms[2];
+ }
+ }
+ }
}
-?>