Merge "Update special pages aliases for Westerm Baluchi (bgn) from translatewiki"
[lhc/web/wiklou.git] / includes / specials / SpecialMyLanguage.php
1 <?php
2 /**
3 * Implements Special:MyLanguage
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * http://www.gnu.org/copyleft/gpl.html
19 *
20 * @file
21 * @author Niklas Laxström
22 * @author Siebrand Mazeland
23 * @copyright Copyright © 2010-2013 Niklas Laxström, Siebrand Mazeland
24 */
25
26 /**
27 * Unlisted special page just to redirect the user to the translated version of
28 * a page, if it exists.
29 *
30 * Usage: [[Special:MyLanguage/Page name|link text]]
31 *
32 * @since 1.24
33 * @ingroup SpecialPage
34 */
35 class SpecialMyLanguage extends RedirectSpecialArticle {
36 public function __construct() {
37 parent::__construct( 'MyLanguage' );
38 }
39
40 /**
41 * If the special page is a redirect, then get the Title object it redirects to.
42 * False otherwise.
43 *
44 * @param string $par Subpage string
45 * @return Title|bool
46 */
47 public function getRedirect( $par ) {
48 $title = $this->findTitle( $par );
49 // Go to the main page if given invalid title.
50 if ( !$title ) {
51 $title = Title::newMainPage();
52 }
53 return $title;
54 }
55
56 /**
57 * Assuming the user's interface language is fi. Given input Page, it
58 * returns Page/fi if it exists, otherwise Page. Given input Page/de,
59 * it returns Page/fi if it exists, otherwise Page/de if it exists,
60 * otherwise Page.
61 *
62 * @param string $par
63 * @return Title|null
64 */
65 public function findTitle( $par ) {
66 $par = (string)$par;
67 // base = title without language code suffix
68 // provided = the title as it was given
69 $base = $provided = Title::newFromText( $par );
70
71 if ( $base && strpos( $par, '/' ) !== false ) {
72 $pos = strrpos( $par, '/' );
73 $basepage = substr( $par, 0, $pos );
74 $code = substr( $par, $pos + 1 );
75 if ( strlen( $code ) && Language::isKnownLanguageTag( $code ) ) {
76 $base = Title::newFromText( $basepage );
77 }
78 }
79
80 if ( !$base ) {
81 return null;
82 }
83
84 if ( $base->isRedirect() ) {
85 $page = new WikiPage( $base );
86 $base = $page->getRedirectTarget();
87 }
88
89 $uiCode = $this->getLanguage()->getCode();
90 $proposed = $base->getSubpage( $uiCode );
91 if ( $uiCode !== $this->getConfig()->get( 'LanguageCode' ) && $proposed && $proposed->exists() ) {
92 return $proposed;
93 } elseif ( $provided && $provided->exists() ) {
94 return $provided;
95 } else {
96 return $base;
97 }
98 }
99 }