bug 28040 Turkish: properly lower case 'I' to 'ı' (dotless i)
authorAntoine Musso <hashar@users.mediawiki.org>
Mon, 14 Mar 2011 22:14:39 +0000 (22:14 +0000)
committerAntoine Musso <hashar@users.mediawiki.org>
Mon, 14 Mar 2011 22:14:39 +0000 (22:14 +0000)
Turkish has two different i, one with a dot and another without a dot. They
are totally different letters in this language, so we have to override the
ucfirst and lcfirst methods.
See http://en.wikipedia.org/wiki/Dotted_and_dotless_I

Credits to #wikipedia-tr users berm, []LuCkY[] and Emperyan

RELEASE-NOTES
languages/classes/LanguageTr.php
tests/phpunit/languages/LanguageTrTest.php [new file with mode: 0644]

index 0a38d43..6540d16 100644 (file)
@@ -275,6 +275,7 @@ changes to languages because of Bugzilla reports.
 * (bug 27681) Set $namespaceGenderAliases for Portuguese (pt and pt-br)
 * (bug 27785) Fallback language for Kabardian (kbd) is English now.
 * (bug 27825) Raw watchlist edit message now uses formatted numbers.
+* (bug 28040) Turkish: properly lower case 'I' to 'ı' (dotless i)
 
 == Compatibility ==
 
index 245b5b0..dec5045 100644 (file)
@@ -3,9 +3,15 @@
 /**
  * Turkish (Türkçe)
  *
+ * Turkish has two different i, one with a dot and another without a dot. They
+ * are totally different letters in this language, so we have to override the
+ * ucfirst and lcfirst methods.
+ * See http://en.wikipedia.org/wiki/Dotted_and_dotless_I
+ * and @bug 28040
  * @ingroup Language
  */
 class LanguageTr extends Language {
+
        function ucfirst ( $string ) {
                if ( !empty( $string ) && $string[0] == 'i' ) {
                        return 'İ' . substr( $string, 1 );
@@ -13,4 +19,13 @@ class LanguageTr extends Language {
                        return parent::ucfirst( $string );
                }
        }
+
+       function lcfirst ( $string ) {
+               if ( !empty( $string ) && $string[0] == 'I' ) {
+                       return 'ı' . substr( $string, 1 );
+               } else {
+                       return parent::lcfirst( $string );
+               }
+       }
+
 }
diff --git a/tests/phpunit/languages/LanguageTrTest.php b/tests/phpunit/languages/LanguageTrTest.php
new file mode 100644 (file)
index 0000000..ddc8ea6
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+/**
+ * @author Ashar Voultoiz
+ * @copyright Copyright © 2011, Ashar Voultoiz
+ * @file
+ */
+
+require_once dirname(dirname(__FILE__)). '/bootstrap.php';
+
+/** Tests for MediaWiki languages/LanguageTr.php */
+class LanguageTrTest extends MediaWikiTestCase {
+       private $lang;
+
+       function setUp() {
+               $this->lang = Language::factory( 'Tr' );
+       }
+       function tearDown() {
+               unset( $this->lang );
+       }
+
+       /**
+        * See @bug 28040
+        * Credits to #wikipedia-tr users berm, []LuCkY[] and Emperyan
+        * @see http://en.wikipedia.org/wiki/Dotted_and_dotless_I
+        * @dataProvider provideDottedAndDotlessI
+        */
+       function testDottedAndDotlessI( $func, $input, $inputCase, $expected ) {
+               if( $func == 'ucfirst' ) {
+                       $res = $this->lang->ucfirst( $input );
+               } elseif( $func == 'lcfirst' ) {
+                       $res = $this->lang->lcfirst( $input );
+               } else {
+                       throw new MWException( __METHOD__ . " given an invalid function name '$func'" );
+               }
+
+               $msg = "Converting $inputCase case '$input' with $func should give '$expected'";
+
+               $this->assertEquals( $expected, $res, $msg );
+       }
+
+       function provideDottedAndDotlessI() {
+               return array(
+                       # function, input, input case, expected
+                       # Case changed:
+                       array( 'ucfirst', 'ı', 'lower', 'I' ),
+                       array( 'ucfirst', 'i', 'lower', 'İ' ),
+                       array( 'lcfirst', 'I', 'upper', 'ı' ),
+                       array( 'lcfirst', 'İ', 'upper', 'i' ),
+
+                       # Already using the correct case
+                       array( 'ucfirst', 'I', 'upper', 'I' ),
+                       array( 'ucfirst', 'İ', 'upper', 'İ' ),
+                       array( 'lcfirst', 'ı', 'lower', 'ı' ),
+                       array( 'lcfirst', 'i', 'lower', 'i' ),
+
+                       # A real example taken from bug 28040 using
+                       # http://tr.wikipedia.org/wiki/%C4%B0Phone
+                       array( 'lcfirst', 'iPhone', 'lower', 'iPhone' ),
+
+                       # next case is valid in Turkish but are different words if we
+                       # consider IPhone is English!
+                       array( 'lcfirst', 'IPhone', 'upper', 'ıPhone' ),
+
+               );
+       }
+
+}