Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/stylesheets/beta_common.css |
— | — | @@ -141,9 +141,7 @@ |
142 | 142 | border-right-width: 0px; |
143 | 143 | border-bottom-width: 0px; |
144 | 144 | border-left-width: 0px; |
145 | | - outline-style: none; |
146 | | - outline-width: initial; |
147 | | - outline-color: initial; |
| 145 | + outline: none; |
148 | 146 | padding: 0; |
149 | 147 | font-size: 1.2em; |
150 | 148 | padding-right: 16px; |
— | — | @@ -286,12 +284,6 @@ |
287 | 285 | background-color: #f4f4f4; |
288 | 286 | } |
289 | 287 | |
290 | | -button.show, |
291 | | -button.hide { /* for non-js browsers */ |
292 | | - display: none; |
293 | | - overflow: hidden; |
294 | | -} |
295 | | - |
296 | 288 | .togglingEnabled button.hide, |
297 | 289 | .togglingEnabled .openSection button.show { |
298 | 290 | display: none; |
— | — | @@ -304,6 +296,8 @@ |
305 | 297 | |
306 | 298 | button.show, |
307 | 299 | button.hide { |
| 300 | + display: none; /* for non-js browsers */ |
| 301 | + overflow: hidden; |
308 | 302 | width: 27px; |
309 | 303 | height: 16px; |
310 | 304 | border: none; |
— | — | @@ -342,10 +336,14 @@ |
343 | 337 | max-height: 0; |
344 | 338 | position: relative; |
345 | 339 | overflow: hidden; |
346 | | - -webkit-transition: max-height 0.2s ease-in; |
347 | | - -moz-transition: max-height 0.2s ease-in; |
348 | | - -o-transition: max-height 0.2s ease-in; |
349 | | - transition: max-height 0.2s ease-in; |
| 340 | + -webkit-transition: max-height 0.2s ease-in, |
| 341 | + margin-top 0.2s ease-in; /* for smoother toggling */ |
| 342 | + -moz-transition: max-height 0.2s ease-in, |
| 343 | + margin-top 0.2s ease-in; |
| 344 | + -o-transition: max-height 0.2s ease-in, |
| 345 | + margin-top 0.2s ease-in; |
| 346 | + transition: max-height 0.2s ease-in, |
| 347 | + margin-top 0.2s ease-in; |
350 | 348 | } |
351 | 349 | |
352 | 350 | .togglingEnabled .openSection.section_anchors { |
— | — | @@ -569,7 +567,7 @@ |
570 | 568 | } |
571 | 569 | |
572 | 570 | #content_wrapper p { |
573 | | - margin: 0; |
| 571 | + margin: 0 0 10px 0; |
574 | 572 | } |
575 | 573 | |
576 | 574 | #content_wrapper .section { |
— | — | @@ -750,19 +748,24 @@ |
751 | 749 | -o-transition: all 0.3s ease-in-out; |
752 | 750 | } |
753 | 751 | |
754 | | -#content_wrapper, |
755 | | -.full-screen-search #results { |
756 | | - opacity: 1; |
757 | | - height: auto; |
| 752 | +#results { |
| 753 | + display: none; |
| 754 | + width: 100%; |
758 | 755 | } |
759 | 756 | |
760 | | -#results, |
761 | 757 | .full-screen-search #content_wrapper { |
762 | 758 | height: 0; |
763 | 759 | overflow: hidden; |
764 | 760 | opacity: 0; |
765 | 761 | } |
766 | 762 | |
| 763 | +#content_wrapper, |
| 764 | +.full-screen-search #results { |
| 765 | + opacity: 1; |
| 766 | + height: auto; |
| 767 | + display: block; |
| 768 | +} |
| 769 | + |
767 | 770 | .full-screen-search #footer, |
768 | 771 | .full-screen-search #zero-rated-banner-red, |
769 | 772 | .full-screen-search #zero-rated-banner { |
— | — | @@ -883,12 +886,22 @@ |
884 | 887 | list-style: none; |
885 | 888 | } |
886 | 889 | |
887 | | -#footer img { |
888 | | - height: 23px; |
| 890 | +#footer img.license { |
| 891 | + margin-top: 5px; /* 24px line height - 14px / 2) */ |
| 892 | + height: 14px; |
| 893 | +} |
| 894 | + |
| 895 | +#footer .license { |
889 | 896 | float: left; |
890 | 897 | margin-right: 4px; |
891 | 898 | } |
892 | 899 | |
| 900 | +html[dir="rtl"] #footer img { |
| 901 | + float: right; |
| 902 | + margin-right: 0px; |
| 903 | + margin-left: 4px; |
| 904 | +} |
| 905 | + |
893 | 906 | #footer .toggleCopyright, |
894 | 907 | #footer .license { |
895 | 908 | font-weight: bold; |
— | — | @@ -904,6 +917,13 @@ |
905 | 918 | padding-right: 32px; |
906 | 919 | } |
907 | 920 | |
| 921 | +html[dir="rtl"] #footer .toggleCopyright { |
| 922 | + float: left; |
| 923 | + padding-left: 32px; |
| 924 | + padding-right: 0; |
| 925 | +} |
| 926 | + |
| 927 | + |
908 | 928 | .toggleCopyright .hide, |
909 | 929 | .toggleCopyright .show { |
910 | 930 | position: absolute; |
— | — | @@ -912,6 +932,12 @@ |
913 | 933 | height: 22px; |
914 | 934 | } |
915 | 935 | |
| 936 | +html[dir="rtl"] .toggleCopyright .hide, |
| 937 | +html[dir="rtl"] .toggleCopyright .show { |
| 938 | + right: auto; |
| 939 | + left: 0; |
| 940 | +} |
| 941 | + |
916 | 942 | /* |
917 | 943 | disable animations in footer |
918 | 944 | this is so that toggling can scroll it into view |
— | — | @@ -923,15 +949,16 @@ |
924 | 950 | transition: none; |
925 | 951 | } |
926 | 952 | |
927 | | -.copyrightNotice { |
| 953 | +#footer .notice { |
928 | 954 | padding-top: 8px; |
929 | | - line-height: 1.2em; |
| 955 | + line-height: 1.6em; |
930 | 956 | margin-bottom: 12px; |
931 | 957 | } |
932 | 958 | |
933 | 959 | #content_footer { |
934 | 960 | text-align: center; |
935 | 961 | font-size: 0.9em; |
| 962 | + clear: both; |
936 | 963 | } |
937 | 964 | |
938 | 965 | #footer .links { |
— | — | @@ -978,6 +1005,7 @@ |
979 | 1006 | } |
980 | 1007 | } |
981 | 1008 | |
| 1009 | +/* REFERENCES */ |
982 | 1010 | #mf-references { |
983 | 1011 | -webkit-transition: bottom 0.1s ease-in-out; |
984 | 1012 | -moz-transition: bottom 0.1s ease-in-out; |
— | — | @@ -988,7 +1016,7 @@ |
989 | 1017 | left: 0; |
990 | 1018 | right: 0; |
991 | 1019 | background-color: #E4E4E4; |
992 | | - padding: 22px; |
| 1020 | + padding: 22px 38px 22px 22px; /* 38px is 22px padding + close button icon 16px */ |
993 | 1021 | -webkit-box-shadow: 0px -20px 10px -16px #aaa; |
994 | 1022 | -moz-box-shadow: 0px -20px 10px -16px #aaa; |
995 | 1023 | -o-box-shadow: 0px -20px 10px -16px #aaa; |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/MobileFrontend.php |
— | — | @@ -17,15 +17,7 @@ |
18 | 18 | |
19 | 19 | // Define the extension; allows us make sure the extension is used correctly |
20 | 20 | define( 'MOBILEFRONTEND', 'MobileFrontend' ); |
21 | | -// WURFL installation dir |
22 | | -define( 'WURFL_DIR', dirname( __FILE__ ) . DIRECTORY_SEPARATOR . 'library' . |
23 | | - DIRECTORY_SEPARATOR . 'WURFL' . DIRECTORY_SEPARATOR ); |
24 | | -// WURFL configuration files directory |
25 | | -define( 'RESOURCES_DIR', dirname( __FILE__ ) . DIRECTORY_SEPARATOR . 'library' . |
26 | | - DIRECTORY_SEPARATOR . 'resources' . DIRECTORY_SEPARATOR ); |
27 | 21 | |
28 | | -require_once( WURFL_DIR . 'Application.php' ); |
29 | | - |
30 | 22 | // Extension credits that will show up on Special:Version |
31 | 23 | $wgExtensionCredits['other'][] = array( |
32 | 24 | 'path' => __FILE__, |
— | — | @@ -121,6 +113,16 @@ |
122 | 114 | */ |
123 | 115 | $wgMobileRedirectFormAction = false; |
124 | 116 | |
| 117 | +/** |
| 118 | + * A string to mark the particular version of a Javascript or CSS resource |
| 119 | + * |
| 120 | + * This is useful to update in order to force invalidation of certain caches |
| 121 | + * when new versions of this software gets deployed, as this string gets |
| 122 | + * appended to the query string in the request for resources, which will |
| 123 | + * invalidate caches dependent on URLs. |
| 124 | + * |
| 125 | + * This is entirely optional. |
| 126 | + */ |
125 | 127 | $wgMobileResourceVersion; |
126 | 128 | |
127 | 129 | $wgExtMobileFrontend = null; |
— | — | @@ -160,7 +162,7 @@ |
161 | 163 | * Key for logo. |
162 | 164 | * Example: array('site' => 'mysite', 'logo' => 'mysite_logo.png'); |
163 | 165 | */ |
164 | | -$wgMFCustomLogos = array( array() ); |
| 166 | +$wgMFCustomLogos = array(); |
165 | 167 | |
166 | 168 | // Unit tests |
167 | 169 | $wgHooks['UnitTestsList'][] = 'efExtMobileFrontendUnitTests'; |
— | — | @@ -173,6 +175,7 @@ |
174 | 176 | $dir = dirname( __FILE__ ) . '/tests'; |
175 | 177 | $files[] = "$dir/MobileFrontendTest.php"; |
176 | 178 | $files[] = "$dir/DeviceDetectionTest.php"; |
| 179 | + $files[] = "$dir/HtmlFormatterTest.php"; |
177 | 180 | $files[] = "$dir/MobileFormatterTest.php"; |
178 | 181 | return true; |
179 | 182 | } |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/HtmlFormatter.php |
— | — | @@ -111,9 +111,26 @@ |
112 | 112 | } |
113 | 113 | |
114 | 114 | /** |
| 115 | + * Checks whether specified element should not be removed due to whitelist |
| 116 | + * @param DOMElement $element: Element to check |
| 117 | + * @return bool |
| 118 | + */ |
| 119 | + private function elementNotWhitelisted( DOMElement $element ) { |
| 120 | + $idAttribute = $element->getAttributeNode( 'id' ); |
| 121 | + if ( $idAttribute ) { |
| 122 | + $id = $idAttribute->value; |
| 123 | + if ( isset( $this->idWhitelist[$id] ) ) { |
| 124 | + return false; |
| 125 | + } |
| 126 | + } |
| 127 | + return true; |
| 128 | + } |
| 129 | + |
| 130 | + /** |
115 | 131 | * Removes content inappropriate for mobile devices |
116 | 132 | */ |
117 | 133 | public function filterContent() { |
| 134 | + wfProfileIn( __METHOD__ ); |
118 | 135 | $removals = $this->parseItemsToRemove(); |
119 | 136 | |
120 | 137 | if ( !$removals ) { |
— | — | @@ -134,15 +151,8 @@ |
135 | 152 | foreach ( $removals['TAG'] as $tagToRemove ) { |
136 | 153 | $tagToRemoveNodes = $doc->getElementsByTagName( $tagToRemove ); |
137 | 154 | foreach ( $tagToRemoveNodes as $tagToRemoveNode ) { |
138 | | - $tagToRemoveNodeIdAttributeValue = ''; |
139 | | - if ( $tagToRemoveNode ) { |
140 | | - $tagToRemoveNodeIdAttribute = $tagToRemoveNode->getAttributeNode( 'id' ); |
141 | | - if ( $tagToRemoveNodeIdAttribute ) { |
142 | | - $tagToRemoveNodeIdAttributeValue = $tagToRemoveNodeIdAttribute->value; |
143 | | - } |
144 | | - if ( !isset( $this->idWhitelist[$tagToRemoveNodeIdAttributeValue] ) ) { |
145 | | - $domElemsToRemove[] = $tagToRemoveNode; |
146 | | - } |
| 155 | + if ( $tagToRemoveNode && $this->elementNotWhitelisted( $tagToRemoveNode ) ) { |
| 156 | + $domElemsToRemove[] = $tagToRemoveNode; |
147 | 157 | } |
148 | 158 | } |
149 | 159 | } |
— | — | @@ -165,7 +175,9 @@ |
166 | 176 | $elements = $xpath->query( '//*[@class="' . $classToRemove . '"]' ); |
167 | 177 | |
168 | 178 | foreach ( $elements as $element ) { |
169 | | - $element->parentNode->removeChild( $element ); |
| 179 | + if ( $element->parentNode && $this->elementNotWhitelisted( $element ) ) { |
| 180 | + $element->parentNode->removeChild( $element ); |
| 181 | + } |
170 | 182 | } |
171 | 183 | } |
172 | 184 | |
— | — | @@ -178,7 +190,9 @@ |
179 | 191 | ); |
180 | 192 | |
181 | 193 | foreach ( $elements as $element ) { |
182 | | - $removedElement = $element->parentNode->removeChild( $element ); |
| 194 | + if ( $element->parentNode && $this->elementNotWhitelisted( $element ) ) { |
| 195 | + $element->parentNode->removeChild( $element ); |
| 196 | + } |
183 | 197 | } |
184 | 198 | } |
185 | 199 | |
— | — | @@ -191,7 +205,7 @@ |
192 | 206 | |
193 | 207 | if ( $redLink->hasAttributes() ) { |
194 | 208 | $attributes = $redLink->attributes; |
195 | | - foreach ( $attributes as $i => $attribute ) { |
| 209 | + foreach ( $attributes as $attribute ) { |
196 | 210 | if ( $attribute->name != 'href' ) { |
197 | 211 | $spanNode->setAttribute( $attribute->name, $attribute->value ); |
198 | 212 | } |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/templates/MobileFrontendTemplate.php |
— | — | @@ -48,4 +48,16 @@ |
49 | 49 | * to show the actual HTML output |
50 | 50 | */ |
51 | 51 | abstract public function getHTML(); |
| 52 | + |
| 53 | + /** |
| 54 | + * Intended to override things like $skin->privacyLink() for custom link |
| 55 | + * text of internal MW-generated links |
| 56 | + * @param object Skin object |
| 57 | + * @param string Mediawiki message key denoting the text of the link |
| 58 | + * @param string Mediawiki message key denoting the page the link should point to |
| 59 | + * @return string |
| 60 | + */ |
| 61 | + public function getCustomFooterLink( $skin, $linkText, $page ) { |
| 62 | + return $skin->footerLink( $linkText, $page ); |
| 63 | + } |
52 | 64 | } |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/templates/FooterTemplate.php |
— | — | @@ -9,7 +9,9 @@ |
10 | 10 | public function getHTML() { |
11 | 11 | |
12 | 12 | $regularSite = $this->data['messages']['mobile-frontend-regular-site']; |
13 | | - $copyright = $this->data['messages']['mobile-frontend-copyright']; |
| 13 | + $copyright = $this->data['messages']['mobile-frontend-footer-copyright']; |
| 14 | + $copyrightSymbol = $this->data['copyright-symbol']; |
| 15 | + $license = $this->data['messages']['mobile-frontend-footer-license']; |
14 | 16 | $disableImages = $this->data['messages']['mobile-frontend-disable-images']; |
15 | 17 | $enableImages = $this->data['messages']['mobile-frontend-enable-images']; |
16 | 18 | $leaveFeedback = $this->data['messages']['mobile-frontend-leave-feedback']; |
— | — | @@ -34,8 +36,8 @@ |
35 | 37 | |
36 | 38 | $skin = RequestContext::getMain()->getSkin(); |
37 | 39 | $disclaimerLink = $skin->disclaimerLink(); |
38 | | - $privacyLink = $skin->privacyLink(); |
39 | | - $aboutLink = $skin->aboutLink(); |
| 40 | + $privacyLink = $this->getCustomFooterLink( $skin, 'mobile-frontend-privacy-link-text', 'privacypage' ); |
| 41 | + $aboutLink = $this->getCustomFooterLink( $skin, 'mobile-frontend-about-link-text', 'aboutpage' ); |
40 | 42 | |
41 | 43 | $normalFooter = <<<HTML |
42 | 44 | <div class='nav' id='footmenu'> |
— | — | @@ -45,21 +47,31 @@ |
46 | 48 | </div> |
47 | 49 | <div id='copyright'>{$copyright}</div> |
48 | 50 | HTML; |
| 51 | + if( $this->data['copyright-has-logo'] ) { |
| 52 | + $licenseHTML = <<<HTML |
| 53 | + <img src="{$this->data['wgExtensionAssetsPath']}/MobileFrontend/stylesheets/images/logo-copyright-{$this->data['language-code']}.png" |
| 54 | + class="license" alt="{$this->data['messages']['mobile-frontend-footer-sitename']} {$copyrightSymbol}"> |
| 55 | +HTML; |
| 56 | + } else { |
| 57 | + $licenseHTML = <<<HTML |
| 58 | + <div class="license">{$this->data['messages']['mobile-frontend-footer-sitename']} {$copyrightSymbol}</div> |
| 59 | +HTML; |
| 60 | + } |
| 61 | + |
| 62 | + |
49 | 63 | $betaFooter = <<<HTML |
50 | 64 | <!-- TODO: make license icon and text dynamic --> |
51 | | - <img src="{$this->data['wgExtensionAssetsPath']}/MobileFrontend/stylesheets/images/ccommons.png" alt="creative commons" |
52 | | - class='license' /> |
53 | | - <a href="http://creativecommons.org/licenses/by-sa/3.0/" class="license">by SA 3.0</a> |
| 65 | + {$licenseHTML} |
54 | 66 | <a href="#content_footer" class="toggleCopyright section_heading" id="section_footer"> |
55 | | - <span class="more">more information</span><span class="less">less information</span> |
| 67 | + <span class="more">{$this->data['messages']['mobile-frontend-footer-more']}</span><span class="less">{$this->data['messages']['mobile-frontend-footer-less']}</span> |
56 | 68 | </a> |
57 | 69 | <div class="content_block" id="content_footer"> |
58 | | - <div class="copyrightNotice"> |
59 | | - {$copyright} |
| 70 | + <div class="notice"> |
| 71 | + {$license} |
60 | 72 | </div> |
61 | 73 | <ul class='links'> |
62 | 74 | <li> |
63 | | - <a href="{$this->data['leaveFeedbackURL']}">Contact</a> |
| 75 | + <a href="{$this->data['leaveFeedbackURL']}">{$this->data['messages']['mobile-frontend-footer-contact']}</a> |
64 | 76 | </li><li> |
65 | 77 | {$privacyLink} |
66 | 78 | </li><li> |
— | — | @@ -77,6 +89,6 @@ |
78 | 90 | </div> |
79 | 91 | |
80 | 92 | HTML; |
81 | | - return $footerHtml; |
| 93 | + return $footerHtml; |
| 94 | + } |
82 | 95 | } |
83 | | -} |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/templates/ApplicationTemplate.php |
— | — | @@ -74,7 +74,7 @@ |
75 | 75 | <link href='{$this->data['wgExtensionAssetsPath']}/MobileFrontend/stylesheets/{$betaPrefix}common.css?version={$wgMobileResourceVersion}' media='all' rel='Stylesheet' type='text/css' /> |
76 | 76 | <link href='{$this->data['wgExtensionAssetsPath']}/MobileFrontend/stylesheets/{$cssFileName}.css?version={$wgMobileResourceVersion}' media='all' rel='Stylesheet' type='text/css' /> |
77 | 77 | {$filePageStyle} |
78 | | - <meta name="viewport" content="initial-scale=1.0"> |
| 78 | + <meta name="viewport" content="initial-scale=1.0, user-scalable=yes"> |
79 | 79 | {$appleTouchIconTag} |
80 | 80 | {$jQueryScript} |
81 | 81 | <script type="text/javascript"> |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/MobileFormatter.php |
— | — | @@ -169,7 +169,7 @@ |
170 | 170 | $this->headings++; |
171 | 171 | |
172 | 172 | $base = self::WML_SECTION_SEPARATOR . |
173 | | - "<h2 class='section_heading' id='section_{$this->headings}'>{$this->matches[2]}</h2>"; |
| 173 | + "<h2 class='section_heading' id='section_{$this->headings}'>{$matches[2]}</h2>"; |
174 | 174 | |
175 | 175 | wfProfileOut( __METHOD__ ); |
176 | 176 | return $base; |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/tests/MobileFormatterTest.php |
— | — | @@ -20,9 +20,6 @@ |
21 | 21 | } |
22 | 22 | |
23 | 23 | public function getXhtmlData() { |
24 | | - $disableImages = function( MobileFormatter $mf ) { |
25 | | - $mf->removeImages(); |
26 | | - }; |
27 | 24 | return array( |
28 | 25 | // down with infoboxes |
29 | 26 | array( |
— | — | @@ -37,12 +34,6 @@ |
38 | 35 | Foobar!</div></div></div>', |
39 | 36 | '<div class="thumb tright"><div class="thumbinner" style="width:222px;"><a href="https://www.mediawiki.org/wiki/File:Foo.jpg" class="image"><img alt="" src="/foo.jpg" width="220" height="165" class="thumbimage"></img></a><div class="thumbcaption">Foobar!</div></div></div>', |
40 | 37 | ), |
41 | | - // remove images if asked |
42 | | - array( |
43 | | - '<img src="/foo/bar.jpg">Blah</img>', |
44 | | - 'Blah', |
45 | | - $disableImages, |
46 | | - ), |
47 | 38 | ); |
48 | 39 | } |
49 | 40 | } |
\ No newline at end of file |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/DeviceDetection.php |
— | — | @@ -322,7 +322,7 @@ |
323 | 323 | |
324 | 324 | if ( $formatName === '' ) { |
325 | 325 | if ( strpos( $acceptHeader, 'application/vnd.wap.xhtml+xml' ) !== false ) { |
326 | | - // Should be wap2 or in WURFL xhtmlmp |
| 326 | + // Should be wap2 |
327 | 327 | $formatName = 'html'; |
328 | 328 | } elseif ( strpos( $acceptHeader, 'vnd.wap.wml' ) !== false ) { |
329 | 329 | $formatName = 'wml'; |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/MobileFrontend.body.php |
— | — | @@ -113,6 +113,11 @@ |
114 | 114 | 'mobile-frontend-dismiss-notification', |
115 | 115 | 'mobile-frontend-sopa-notice', |
116 | 116 | 'mobile-frontend-clear-search', |
| 117 | + 'mobile-frontend-footer-more', |
| 118 | + 'mobile-frontend-footer-less', |
| 119 | + 'mobile-frontend-footer-contact', |
| 120 | + 'mobile-frontend-footer-sitename', |
| 121 | + 'mobile-frontend-footer-license', |
117 | 122 | ); |
118 | 123 | |
119 | 124 | public function __construct() { |
— | — | @@ -181,13 +186,13 @@ |
182 | 187 | $output->setSquidMaxage( 1200 ); |
183 | 188 | $output->redirect( $targetUrl, '301' ); |
184 | 189 | } |
185 | | - return false; // Prevent the redirect from occuring |
| 190 | + return false; // Prevent the redirect from occurring |
186 | 191 | } |
187 | 192 | } |
188 | 193 | |
189 | 194 | /** |
190 | 195 | * @param $obj Article |
191 | | - * @param $tpl |
| 196 | + * @param $tpl MobileFrontendTemplate |
192 | 197 | * @return bool |
193 | 198 | */ |
194 | 199 | public function addMobileFooter( &$obj, &$tpl ) { |
— | — | @@ -226,7 +231,7 @@ |
227 | 232 | } |
228 | 233 | |
229 | 234 | public function getMsg() { |
230 | | - global $wgUser, $wgContLang, $wgRequest, $wgServer, $wgMobileRedirectFormAction, $wgOut, $wgLanguageCode; |
| 235 | + global $wgContLang, $wgRequest, $wgServer, $wgMobileRedirectFormAction, $wgOut, $wgLanguageCode; |
231 | 236 | wfProfileIn( __METHOD__ ); |
232 | 237 | |
233 | 238 | self::$disableImagesURL = $wgRequest->escapeAppendQuery( 'disableImages=1' ); |
— | — | @@ -267,7 +272,7 @@ |
268 | 273 | $languageUrls[] = array( |
269 | 274 | 'href' => self::$currentURL, |
270 | 275 | 'text' => self::$htmlTitle, |
271 | | - 'language' => $wgContLang->getLanguageName( $wgLanguageCode ), |
| 276 | + 'language' => Language::fetchLanguageName( $wgLanguageCode ), |
272 | 277 | 'class' => 'interwiki-' . $wgLanguageCode, |
273 | 278 | 'lang' => $wgLanguageCode, |
274 | 279 | ); |
— | — | @@ -282,10 +287,10 @@ |
283 | 288 | $languageUrl = $this->getMobileUrl( $nt->getFullURL() ); |
284 | 289 | $languageUrls[] = array( |
285 | 290 | 'href' => $languageUrl, |
286 | | - 'text' => ( $wgContLang->getLanguageName( $nt->getInterwiki() ) != '' |
287 | | - ? $wgContLang->getLanguageName( $nt->getInterwiki() ) |
| 291 | + 'text' => ( Language::fetchLanguageName( $nt->getInterwiki() ) != '' |
| 292 | + ? Language::fetchLanguageName( $nt->getInterwiki() ) |
288 | 293 | : $l ), |
289 | | - 'language' => $wgContLang->getLanguageName( $lang ), |
| 294 | + 'language' => Language::fetchLanguageName( $lang ), |
290 | 295 | 'class' => $class, |
291 | 296 | 'lang' => $lang, |
292 | 297 | ); |
— | — | @@ -340,7 +345,7 @@ |
341 | 346 | * @return bool |
342 | 347 | */ |
343 | 348 | public function beforePageDisplayHTML( &$out, &$text ) { |
344 | | - global $wgContLang, $wgRequest, $wgMemc, $wgUser; |
| 349 | + global $wgRequest, $wgUser; |
345 | 350 | wfProfileIn( __METHOD__ ); |
346 | 351 | |
347 | 352 | // Note: The WebRequest Class calls are made in this block because |
— | — | @@ -362,32 +367,6 @@ |
363 | 368 | |
364 | 369 | $userAgent = $_SERVER['HTTP_USER_AGENT']; |
365 | 370 | $acceptHeader = isset( $_SERVER["HTTP_ACCEPT"] ) ? $_SERVER["HTTP_ACCEPT"] : ''; |
366 | | - $uAmd5 = md5( $userAgent ); |
367 | | - |
368 | | - $key = wfMemcKey( 'mobile', 'ua', $uAmd5 ); |
369 | | - |
370 | | - $props = null; |
371 | | - try { |
372 | | - $props = $wgMemc->get( $key ); |
373 | | - if ( !$props ) { |
374 | | - $wurflConfigFile = RESOURCES_DIR . 'wurfl-config.xml'; |
375 | | - $wurflConfig = new WURFL_Configuration_XmlConfig( $wurflConfigFile ); |
376 | | - $wurflManagerFactory = new WURFL_WURFLManagerFactory( $wurflConfig ); |
377 | | - $wurflManager = $wurflManagerFactory->create(); |
378 | | - $device = $wurflManager->getDeviceForHttpRequest( $_SERVER ); |
379 | | - |
380 | | - if ( $device->isSpecific() === true ) { |
381 | | - $props = $device->getAllCapabilities(); |
382 | | - $wgMemc->set( $key, $props, 86400 ); |
383 | | - } else { |
384 | | - $wgMemc->set( $key, 'generic', 86400 ); |
385 | | - $props = 'generic'; |
386 | | - } |
387 | | - } |
388 | | - } catch ( Exception $e ) { |
389 | | - // echo $e->getMessage(); |
390 | | - } |
391 | | - |
392 | 371 | self::$title = $out->getTitle(); |
393 | 372 | |
394 | 373 | if ( self::$title->isMainPage() ) { |
— | — | @@ -606,6 +585,7 @@ |
607 | 586 | |
608 | 587 | /** |
609 | 588 | * @param $value string |
| 589 | + * @return bool |
610 | 590 | */ |
611 | 591 | private function setOptInOutCookie( $value ) { |
612 | 592 | global $wgCookieDomain, $wgRequest, $wgCookiePrefix; |
— | — | @@ -669,6 +649,7 @@ |
670 | 650 | |
671 | 651 | /** |
672 | 652 | * Disables caching if the request is coming from a trusted proxy |
| 653 | + * @return bool |
673 | 654 | */ |
674 | 655 | private function disableCaching() { |
675 | 656 | global $wgRequest; |
— | — | @@ -750,7 +731,7 @@ |
751 | 732 | $leaveFeedbackTemplate = new LeaveFeedbackTemplate(); |
752 | 733 | $options = array( |
753 | 734 | 'feedbackPostURL' => str_replace( '&mobileaction=leave_feedback', '', $wgRequest->getFullRequestURL() ) . '&mobileaction=leave_feedback_post', |
754 | | - 'editToken' => $wgUser->editToken(), |
| 735 | + 'editToken' => $wgUser->getEditToken(), |
755 | 736 | 'title' => self::$messages['mobile-frontend-leave-feedback-title'], |
756 | 737 | 'notice' => self::$messages['mobile-frontend-leave-feedback-notice'], |
757 | 738 | 'subject' => self::$messages['mobile-frontend-leave-feedback-subject'], |
— | — | @@ -914,8 +895,9 @@ |
915 | 896 | Html::closeElement( 'table' ) . |
916 | 897 | Html::input( 'wpLoginToken', self::$wsLoginToken, 'hidden' ) . |
917 | 898 | Html::closeElement( 'form' ); |
| 899 | + $result = $this->getDomDocumentNodeByTagName( $form, 'form' ); |
918 | 900 | wfProfileOut( __METHOD__ ); |
919 | | - return $this->getDomDocumentNodeByTagName( $form, 'form' ); |
| 901 | + return $result; |
920 | 902 | } |
921 | 903 | |
922 | 904 | /** |
— | — | @@ -1027,7 +1009,6 @@ |
1028 | 1010 | |
1029 | 1011 | wfProfileIn( __METHOD__ . '-getText' ); |
1030 | 1012 | $formatter->setIsMainPage( self::$isMainPage ); |
1031 | | - $prepend = ''; |
1032 | 1013 | if ( $this->contentFormat == 'XHTML' |
1033 | 1014 | && self::$device['supports_javascript'] === true |
1034 | 1015 | && empty( self::$search ) ) |
— | — | @@ -1037,9 +1018,8 @@ |
1038 | 1019 | $contentHtml = $formatter->getText( 'content' ); |
1039 | 1020 | wfProfileOut( __METHOD__ . '-getText' ); |
1040 | 1021 | |
1041 | | - $htmlTitle = htmlspecialchars( self::$htmlTitle ); |
1042 | | - |
1043 | 1022 | wfProfileIn( __METHOD__ . '-templates' ); |
| 1023 | + $htmlTitle = htmlspecialchars( self::$htmlTitle ); |
1044 | 1024 | if ( $this->contentFormat == 'WML' ) { |
1045 | 1025 | header( 'Content-Type: text/vnd.wap.wml' ); |
1046 | 1026 | |
— | — | @@ -1123,7 +1103,7 @@ |
1124 | 1104 | } |
1125 | 1105 | |
1126 | 1106 | public function getFooterTemplate() { |
1127 | | - global $wgExtensionAssetsPath; |
| 1107 | + global $wgExtensionAssetsPath, $wgLanguageCode; |
1128 | 1108 | wfProfileIn( __METHOD__ ); |
1129 | 1109 | $footerTemplate = new FooterTemplate(); |
1130 | 1110 | $logoutHtml = ( self::$logoutHtml ) ? self::$logoutHtml : ''; |
— | — | @@ -1138,6 +1118,9 @@ |
1139 | 1119 | 'logoutHtml' => $logoutHtml, |
1140 | 1120 | 'loginHtml' => $loginHtml, |
1141 | 1121 | 'code' => self::$code, |
| 1122 | + 'language-code' => 'en', |
| 1123 | + 'copyright-symbol' => $wgLanguageCode === 'en' ? '®': '™', |
| 1124 | + 'copyright-has-logo' => $wgLanguageCode === 'en', |
1142 | 1125 | 'hideFooter' => self::$hideFooter, |
1143 | 1126 | 'wgExtensionAssetsPath' => $wgExtensionAssetsPath, |
1144 | 1127 | 'isBetaGroupMember' => self::$isBetaGroupMember, |
— | — | @@ -1251,7 +1234,7 @@ |
1252 | 1235 | 'remoteExtPath' => 'MobileFrontend', |
1253 | 1236 | ); |
1254 | 1237 | $testModules['qunit']['ext.mobilefrontend.tests.beta'] = array( |
1255 | | - 'scripts' => array( 'tests/js/fixtures.js', 'javascripts/beta_application.js', |
| 1238 | + 'scripts' => array( 'tests/js/fixtures.js', 'javascripts/application.js', |
1256 | 1239 | 'javascripts/beta_opensearch.js', 'tests/js/test_beta_opensearch.js' ), |
1257 | 1240 | 'dependencies' => array( ), |
1258 | 1241 | 'localBasePath' => dirname( __FILE__ ), |
— | — | @@ -1263,6 +1246,7 @@ |
1264 | 1247 | /** |
1265 | 1248 | * Take a URL and return a copy that conforms to the mobile URL template |
1266 | 1249 | * @param $url string |
| 1250 | + * @param $forceHttps bool |
1267 | 1251 | * @return string |
1268 | 1252 | */ |
1269 | 1253 | public function getMobileUrl( $url, $forceHttps = false ) { |
— | — | @@ -1532,10 +1516,10 @@ |
1533 | 1517 | * This cookie can determine whether or not a user should see the mobile |
1534 | 1518 | * version of pages. |
1535 | 1519 | * |
1536 | | - * @param string The format to store in the cookie |
| 1520 | + * @param string $useFormat The format to store in the cookie |
1537 | 1521 | */ |
1538 | 1522 | protected function setUseFormatCookie( $useFormat ) { |
1539 | | - global $wgRequest, $wgCookiePath, $wgCookieSecure, $wgCookieDomain; |
| 1523 | + global $wgCookiePath, $wgCookieSecure, $wgCookieDomain; |
1540 | 1524 | $expiry = $this->getUseFormatCookieExpiry(); |
1541 | 1525 | |
1542 | 1526 | // use regular php setcookie() rather than WebResponse::setCookie |
— | — | @@ -1548,11 +1532,11 @@ |
1549 | 1533 | /** |
1550 | 1534 | * Get the expiration time for the mf_useformat cookie |
1551 | 1535 | * |
1552 | | - * @param int The base time (in seconds since Epoch) from which to calculate |
| 1536 | + * @param int $startTime The base time (in seconds since Epoch) from which to calculate |
1553 | 1537 | * cookie expiration. If null, time() is used. |
1554 | 1538 | * @return int The time (in seconds since Epoch) that the cookie should expire |
1555 | 1539 | */ |
1556 | | - protected function getUseFormatCookieExpiry( $startTime=null ) { |
| 1540 | + protected function getUseFormatCookieExpiry( $startTime = null ) { |
1557 | 1541 | $cookieDuration = $this->getUseFormatCookieDuration(); |
1558 | 1542 | if ( intval( $startTime ) === 0 ) $startTime = time(); |
1559 | 1543 | $expiry = $startTime + $cookieDuration; |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/api/ApiMobileView.php |
— | — | @@ -65,6 +65,7 @@ |
66 | 66 | } |
67 | 67 | $this->getResult()->setIndexedTagName( $result, 'section' ); |
68 | 68 | $this->getResult()->addValue( null, $this->getModuleName(), array( 'sections' => $result ) ); |
| 69 | + wfProfileOut( __METHOD__ ); |
69 | 70 | } |
70 | 71 | |
71 | 72 | private function parseSections( $str ) { |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/api/ApiQueryExtracts.php |
— | — | @@ -80,6 +80,7 @@ |
81 | 81 | 'action' => 'query', |
82 | 82 | 'prop' => 'extracts', |
83 | 83 | 'explaintext' => true, |
| 84 | + 'exintro' => true, |
84 | 85 | 'exlimit' => count( $results ), |
85 | 86 | 'pageids' => implode( '|', $pageIds ), |
86 | 87 | ) ) |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/api/ApiParseExtender.php |
— | — | @@ -9,6 +9,7 @@ |
10 | 10 | * @see https://www.mediawiki.org/wiki/Manual:Hooks/APIGetAllowedParams |
11 | 11 | * @param ApiBase $module |
12 | 12 | * @param array|bool $params |
| 13 | + * @return bool |
13 | 14 | */ |
14 | 15 | public static function onAPIGetAllowedParams( ApiBase &$module, &$params ) { |
15 | 16 | if ( $module->getModuleName() == 'parse' ) { |
— | — | @@ -26,6 +27,7 @@ |
27 | 28 | * @see: https://www.mediawiki.org/wiki/Manual:Hooks/APIGetParamDescription |
28 | 29 | * @param ApiBase $module |
29 | 30 | * @param Array|bool $params |
| 31 | + * @return bool |
30 | 32 | */ |
31 | 33 | public static function onAPIGetParamDescription( ApiBase &$module, &$params ) { |
32 | 34 | if ( $module->getModuleName() == 'parse' ) { |
— | — | @@ -41,6 +43,7 @@ |
42 | 44 | * @see: https://www.mediawiki.org/wiki/Manual:Hooks/APIGetDescription |
43 | 45 | * @param ApiBase $module |
44 | 46 | * @param Array|string $desc |
| 47 | + * @return bool |
45 | 48 | */ |
46 | 49 | public static function onAPIGetDescription( ApiBase &$module, &$desc ) { |
47 | 50 | if ( $module->getModuleName() == 'parse' ) { |
— | — | @@ -54,6 +57,7 @@ |
55 | 58 | * APIAfterExecute hook handler |
56 | 59 | * @see: https://www.mediawiki.org/wiki/Manual:Hooks/ |
57 | 60 | * @param ApiBase $module |
| 61 | + * @return bool |
58 | 62 | */ |
59 | 63 | public static function onAPIAfterExecute( ApiBase &$module ) { |
60 | 64 | if ( $module->getModuleName() == 'parse' ) { |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/javascripts/references.js |
— | — | @@ -1,6 +1,6 @@ |
2 | 2 | if( typeof jQuery !== 'undefined' ) { |
3 | 3 | MobileFrontend.references = (function($) { |
4 | | - var calculatePosition, hashtest, options = {}; |
| 4 | + var calculatePosition = function() {}, hashtest, options = {}, wasVisible; |
5 | 5 | |
6 | 6 | hashtest = window.location.hash.substr(1).match(/refspeed:([0-9]*)/); |
7 | 7 | options.animationSpeed = hashtest ? parseInt( hashtest[1], 10 ) : 500; |
— | — | @@ -11,8 +11,7 @@ |
12 | 12 | var references = {}; |
13 | 13 | $( 'ol.references li' ).each(function(i, el) { |
14 | 14 | references[ $(el).attr( 'id' ) ] = { |
15 | | - html: $(el).html(), |
16 | | - label: i + 1 |
| 15 | + html: $(el).html() |
17 | 16 | }; |
18 | 17 | }); |
19 | 18 | return references; |
— | — | @@ -21,18 +20,39 @@ |
22 | 21 | // TODO: only apply to places that need it |
23 | 22 | // http://www.quirksmode.org/blog/archives/2010/12/the_fifth_posit.html |
24 | 23 | // https://github.com/Modernizr/Modernizr/issues/167 |
25 | | - calculatePosition = function() { |
26 | | - var h = $( '#mf-references' ).outerHeight(); |
27 | | - $( '#mf-references' ).css( { |
28 | | - top: ( window.innerHeight + window.pageYOffset ) - h, |
29 | | - bottom: 'auto', |
30 | | - position: 'absolute' |
31 | | - } ); |
32 | | - }; |
33 | | - $( document ).scroll(calculatePosition); |
| 24 | + function supportsPositionFixed() { |
| 25 | + // TODO: don't use device detection |
| 26 | + var agent = navigator.userAgent; |
| 27 | + // match anything over Webkit 534 |
| 28 | + return agent.match( /AppleWebKit\/(53[4-9]|5[4-9]\d?|[6-9])\d?\d?/ ) ? true : false; |
| 29 | + } |
| 30 | + if( !supportsPositionFixed() ) { |
| 31 | + calculatePosition = function() { |
| 32 | + var h = $( '#mf-references' ).outerHeight(); |
| 33 | + $( '#mf-references' ).css( { |
| 34 | + top: ( window.innerHeight + window.pageYOffset ) - h, |
| 35 | + bottom: 'auto', |
| 36 | + position: 'absolute' |
| 37 | + } ); |
| 38 | + }; |
| 39 | + $( document ).scroll(calculatePosition); |
| 40 | + document.body.ontouchstart = function() { |
| 41 | + wasVisible = $( '#mf-references' ).is( ':visible' ); |
| 42 | + $( '#mf-references' ).hide(); |
| 43 | + }; |
| 44 | + document.body.ontouchend = function() { |
| 45 | + if( wasVisible ) { |
| 46 | + $( '#mf-references' ).show(); |
| 47 | + } |
| 48 | + }; |
| 49 | + } |
34 | 50 | |
35 | 51 | function init() { |
36 | | - $( '<div id="mf-references"><div></div></div>' ).hide().appendTo( document.body ); |
| 52 | + var el = $( '<div id="mf-references"><div></div></div>' ).hide().appendTo( document.body )[0]; |
| 53 | + function cancelBubble( ev ) { |
| 54 | + ev.stopPropagation(); |
| 55 | + } |
| 56 | + el.ontouchstart = cancelBubble; |
37 | 57 | var close = function() { |
38 | 58 | var top; |
39 | 59 | lastLink = null; |
— | — | @@ -44,12 +64,11 @@ |
45 | 65 | } else { |
46 | 66 | $( '#mf-references' ).fadeOut( options.animationSpeed ); |
47 | 67 | } |
48 | | - }, lastLink; |
| 68 | + }, lastLink, data, html, href, references = collect(); |
49 | 69 | $( '<button>close</button>' ).click( close ).appendTo( '#mf-references' ); |
50 | 70 | $( '.mw-cite-backlink a' ).click( close ); |
51 | | - |
52 | | - var data, html, href, references = collect(); |
53 | | - $( 'sup a' ).unbind('click').click( function(ev) { |
| 71 | + |
| 72 | + function clickReference(ev) { |
54 | 73 | var top, oh; |
55 | 74 | href = $(this).attr( 'href' ); |
56 | 75 | data = href && href.charAt(0) === '#' ? |
— | — | @@ -58,12 +77,13 @@ |
59 | 78 | if( !$("#mf-references").is(":visible") || lastLink !== href) { |
60 | 79 | lastLink = href; |
61 | 80 | if( data ) { |
62 | | - html = '<h3>[' + data.label + ']</h3>' + data.html; |
| 81 | + html = '<h3>' + $(this).text() + '</h3>' + data.html; |
63 | 82 | } else { |
64 | 83 | html = $( '<a />' ).text( $(this).text() ). |
65 | 84 | attr( 'href', href ).appendTo('<div />').parent().html(); |
66 | 85 | } |
67 | 86 | $( '#mf-references div' ).html( html ); |
| 87 | + $('#mf-references div sup a').click( clickReference ); |
68 | 88 | calculatePosition(); |
69 | 89 | if( options.animation === 'none' ) { |
70 | 90 | $( '#mf-references' ).show(); |
— | — | @@ -79,8 +99,11 @@ |
80 | 100 | close(); |
81 | 101 | } |
82 | 102 | ev.preventDefault(); |
| 103 | + } |
| 104 | + $( 'sup a' ).unbind('click').click( clickReference ).each(function(i, el) { |
| 105 | + el.ontouchstart = cancelBubble; |
83 | 106 | }); |
84 | 107 | } |
85 | 108 | init(); |
86 | | - })(jQuery); |
87 | | -} |
\ No newline at end of file |
| 109 | + }(jQuery)); |
| 110 | +} |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/javascripts/beta_opensearch.js |
— | — | @@ -14,34 +14,12 @@ |
15 | 15 | |
16 | 16 | apiUrl = MobileFrontend.setting( 'scriptPath' ) + apiUrl; |
17 | 17 | |
18 | | - function hideResults() { |
19 | | - results.style.display = 'none'; |
20 | | - } |
21 | | - |
22 | | - viewportmeta = u( 'meta[name="viewport"]' ) |
23 | | - if ( viewportmeta ) { |
24 | | - viewportmeta = viewportmeta[0]; |
25 | | - originalViewport = viewportmeta.getAttribute( 'content' ); |
26 | | - } |
27 | | - // prevent auto-zoom in on clicking search for certain browsers e.g. palm pre and ipad |
28 | | - function resetViewPort() { |
29 | | - if ( viewportmeta ) { |
30 | | - viewportmeta.setAttribute( 'content', 'minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0'); |
31 | | - u( document.body ).bind( 'gesturestart', function () { |
32 | | - viewportmeta.setAttribute( 'content', originalViewport ); |
33 | | - } ); |
34 | | - } |
35 | | - } |
36 | | - |
37 | | - resetViewPort(); |
38 | | - |
39 | 18 | search.onfocus = function() { |
40 | 19 | var rrd, rrdD; |
41 | 20 | sb = document.getElementById( 'searchbox' ); |
42 | 21 | header = document.getElementById( 'header' ); |
43 | 22 | content = document.getElementById( 'content' ); |
44 | 23 | footer = document.getElementById( 'footer' ); |
45 | | - resetViewPort(); |
46 | 24 | |
47 | 25 | if ( !focused ) { |
48 | 26 | MobileFrontend.utils( document.body ).addClass( 'full-screen-search' ); |
— | — | @@ -69,56 +47,35 @@ |
70 | 48 | } |
71 | 49 | } |
72 | 50 | |
73 | | - function whichElement( e ) { |
74 | | - var targ; |
75 | | - if ( !e ) { |
76 | | - e = window.event; |
77 | | - } |
78 | | - if ( e.target ) { |
79 | | - targ = e.target; |
80 | | - } else if ( e.srcElement ) { |
81 | | - targ = e.srcElement; |
82 | | - } |
83 | | - |
84 | | - if ( targ.nodeType === 3 ) { |
85 | | - targ = targ.parentNode; |
86 | | - } |
87 | | - |
88 | | - e.cancelBubble = true; |
89 | | - e.stopPropagation(); |
90 | | - if ( targ.className === "suggestion-result" || |
91 | | - targ.className === "search-result-item" || |
92 | | - targ.className === "suggestions-result" || |
93 | | - targ.className === "sq-val-update" || |
94 | | - targ.id === 'results' || |
95 | | - targ.id === 'search' || |
96 | | - targ.id === 'searchbox' || |
97 | | - targ.id === 'sq' || |
98 | | - targ.id === 'placeholder' || |
99 | | - targ.id === 'clearsearch' || |
100 | | - targ.tagName === 'BODY' ) { |
101 | | - if ( targ.id === 'clearsearch' && results ) { |
102 | | - results.innerHTML = ''; |
103 | | - } |
104 | | - } else { |
105 | | - hideResults(); |
106 | | - } |
107 | | - } |
108 | | - |
109 | 51 | var performSearch = function(ev) { |
110 | | - ev.preventDefault(); |
| 52 | + if( ev ) { |
| 53 | + ev.preventDefault(); |
| 54 | + } |
111 | 55 | clearTimeout( timer ); |
112 | 56 | term = search.value; |
113 | | - if ( term.length < 1 ) { |
114 | | - results.innerHTML = ''; |
115 | | - } else { |
| 57 | + if ( term.length > 1 ) { |
116 | 58 | term = encodeURIComponent( term ); |
117 | 59 | timer = setTimeout( function () { searchApi( term ); }, typingDelay ); |
118 | 60 | } |
119 | 61 | }; |
120 | | - u( search ).bind( 'keyup', performSearch ); |
| 62 | + var oldValue; |
| 63 | + window.setInterval(function() { |
| 64 | + var value = search.value; |
| 65 | + if( value.length > 1 && value !== oldValue ) { |
| 66 | + oldValue = value; |
| 67 | + performSearch(); |
| 68 | + } |
| 69 | + }, typingDelay); |
| 70 | + |
121 | 71 | u( document.getElementById( 'searchForm' ) ).bind( 'submit', performSearch ); |
122 | | - u( search ).bind( 'blur', performSearch ); // for opera mini etc |
| 72 | + function blurSearch(ev) { |
| 73 | + if( search.value.length === 0) { |
| 74 | + removeResults(); |
| 75 | + } else { |
| 76 | + performSearch(ev); // for opera mini etc |
| 77 | + } |
| 78 | + } |
| 79 | + u( search ).bind( 'blur', blurSearch ); |
123 | 80 | |
124 | 81 | function searchApi( term ) { |
125 | 82 | u( search ).addClass( 'searching' ); |
— | — | @@ -163,7 +120,6 @@ |
164 | 121 | term = htmlEntities( document.getElementById( 'search' ).value ), |
165 | 122 | section, escapedTerm, suggestionsResult, link, label; |
166 | 123 | |
167 | | - results.style.display = 'block'; |
168 | 124 | if ( search ) { |
169 | 125 | search.focus(); |
170 | 126 | } |
— | — | @@ -206,6 +162,7 @@ |
207 | 163 | |
208 | 164 | function clearSearchBox( event ) { |
209 | 165 | search.value = ''; |
| 166 | + results.innerHTML = ''; |
210 | 167 | event.preventDefault(); |
211 | 168 | } |
212 | 169 | |
— | — | @@ -217,11 +174,6 @@ |
218 | 175 | } |
219 | 176 | |
220 | 177 | function init() { |
221 | | - var results = document.getElementById( 'results' ); |
222 | | - results.onmousedown = whichElement; |
223 | | - document.body.onmousedown = whichElement; |
224 | | - document.body.ontouchstart = whichElement; |
225 | | - results.ontouchstart = whichElement; |
226 | 178 | } |
227 | 179 | init(); |
228 | 180 | initClearSearch(); |
Index: branches/wmf/1.19wmf1/extensions/MobileFrontend/MobileFrontend.i18n.php |
— | — | @@ -75,6 +75,13 @@ |
76 | 76 | 'mobile-frontend-dismiss-notification' => 'dismiss this notification', |
77 | 77 | 'mobile-frontend-sopa-notice' => '<h3 id="sopa-notice">Thank you for protecting Wikipedia.</h3><br/><a href="http://en.wikipedia.org/wiki/Wikipedia:SOPA_initiative/Mobile_Learn_more">(We’re not done yet.)</a>', |
78 | 78 | 'mobile-frontend-clear-search' => 'Clear', |
| 79 | + 'mobile-frontend-privacy-link-text' => 'Privacy', |
| 80 | + 'mobile-frontend-about-link-text' => 'About', |
| 81 | + 'mobile-frontend-footer-more' => 'more', |
| 82 | + 'mobile-frontend-footer-less' => 'less', |
| 83 | + 'mobile-frontend-footer-sitename' => 'Wikipedia', |
| 84 | + 'mobile-frontend-footer-license' => 'Content available under <a href="http://wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License?useformat=mobile">CC BY-SA 3.0</a><br><a href="https://www.mediawiki.org//wikimediafoundation.org/wiki/Terms_of_use?useformat=mobile">Terms of Use</a>', |
| 85 | + 'mobile-frontend-footer-contact' => 'Contact', |
79 | 86 | ); |
80 | 87 | |
81 | 88 | /** Message documentation (Message documentation) |
— | — | @@ -113,6 +120,13 @@ |
114 | 121 | 'mobile-frontend-placeholder' => 'Phrase used to prompt user to use search interface for mobile full screen search', |
115 | 122 | 'mobile-frontend-dismiss-notification' => 'Phrase used to dismiss the top banner notification', |
116 | 123 | 'mobile-frontend-clear-search' => 'Tooltip for clear button that appears when you type into search box', |
| 124 | + 'mobile-frontend-privacy-link-text' => 'Custom version of "Privacy policy" link text for mobile footer, intended to be as brief as possible to take up as little screen real estate as possible', |
| 125 | + 'mobile-frontend-about-link-text' => 'Custom version of "About {{Sitename}}" link text for mobile footer, intended to be as brief as possible to take up as little screen real estate as possible', |
| 126 | + 'mobile-frontend-footer-more' => 'Label for more button in footer', |
| 127 | + 'mobile-frontend-footer-less' => 'Label for less button in footer', |
| 128 | + 'mobile-frontend-footer-contact' => 'Label for contact in footer', |
| 129 | + 'mobile-frontend-footer-sitename' => 'Name of site', |
| 130 | + 'mobile-frontend-footer-license' => 'License shown in footer', |
117 | 131 | ); |
118 | 132 | |
119 | 133 | /** Ṫuroyo (Ṫuroyo) |
— | — | @@ -3126,13 +3140,13 @@ |
3127 | 3141 | 'mobile-frontend-wml-back' => 'Indietro ...', |
3128 | 3142 | 'mobile-frontend-view' => 'Versione mobile', |
3129 | 3143 | 'mobile-frontend-opt-in-message' => 'Vuoi provare la versione beta per mobile?', |
3130 | | - 'mobile-frontend-opt-in-yes-button' => 'sì', |
3131 | | - 'mobile-frontend-opt-in-no-button' => 'no', |
| 3144 | + 'mobile-frontend-opt-in-yes-button' => 'Sì', |
| 3145 | + 'mobile-frontend-opt-in-no-button' => 'No', |
3132 | 3146 | 'mobile-frontend-opt-in-title' => 'Partecipazione al collaudo', |
3133 | 3147 | 'mobile-frontend-opt-in-explain' => 'Partecipando alla versione di prova avrai la possibilità di usare funzionalità sperimentali, ma con il rischio di incontrare errori e problemi.', |
3134 | 3148 | 'mobile-frontend-opt-out-message' => 'Abbandonare la versione beta per mobile?', |
3135 | | - 'mobile-frontend-opt-out-yes-button' => 'sì', |
3136 | | - 'mobile-frontend-opt-out-no-button' => 'no', |
| 3149 | + 'mobile-frontend-opt-out-yes-button' => 'Sì', |
| 3150 | + 'mobile-frontend-opt-out-no-button' => 'No', |
3137 | 3151 | 'mobile-frontend-opt-out-title' => 'Abbandono del collaudo', |
3138 | 3152 | 'mobile-frontend-opt-out-explain' => 'Qui puoi abbandonare la prova', |
3139 | 3153 | 'mobile-frontend-disable-images' => 'Disabilita le immagini sul sito per dispositivi mobili', |
— | — | @@ -3355,7 +3369,7 @@ |
3356 | 3370 | 'mobile-frontend-search-results' => 'លទ្ធផលស្វែងរក', |
3357 | 3371 | 'mobile-frontend-no-article-found' => 'រកមិនឃើញអត្ថបទ', |
3358 | 3372 | 'mobile-frontend-featured-article' => 'អត្ថបទពិសេសសំរាប់ថ្ងៃនេះ', |
3359 | | - 'mobile-frontend-in-the-news' => 'នៅក្នុងសារពត៌មាន', |
| 3373 | + 'mobile-frontend-in-the-news' => 'នៅក្នុងសារព័ត៌មាន', |
3360 | 3374 | 'mobile-frontend-home-button' => 'ទំព័រដើម', |
3361 | 3375 | 'mobile-frontend-random-button' => 'ចៃដន្យ', |
3362 | 3376 | 'mobile-frontend-back-to-top-of-section' => 'លោតត្រលប់ទៅផ្នែកខាងលើរបស់ផ្នែកនេះ', |
— | — | @@ -3363,18 +3377,18 @@ |
3364 | 3378 | 'mobile-frontend-hide-button' => 'លាក់', |
3365 | 3379 | 'mobile-frontend-disable-button' => 'ឈប់ប្រើ', |
3366 | 3380 | 'mobile-frontend-back-button' => 'ត្រលប់ក្រោយ', |
3367 | | - 'mobile-frontend-regular-site' => 'បើកមើលទំព័រនេះនៅលើ{{SITENAME}}ធម្មតា', |
| 3381 | + 'mobile-frontend-regular-site' => 'បើកមើលលើផ្ទៃអេក្រង់លើតុ', |
3368 | 3382 | 'mobile-frontend-error-page-title' => 'យើងមានបញ្ហាហើយ!', |
3369 | 3383 | 'mobile-frontend-error-page-text' => '{{SITENAME}} ចល័តកំពុងស្ថិតក្រោមការអភិវឌ្ឍន៍យ៉ាងសកម្ម ហើយយើងខ្ញុំកំពុងប្រឹងប្រែងយ៉ាងខ្លាំងក្លាក្នុងការកែប្រែកំហុសផ្ទៃក្នុងទាំងឡាយ។ យើងខ្ញុំទទួលការប្រាប់ព័ត៌មានអំពីកំហុសទាំងនោះហើយយើងខ្ញុំនឹងធ្វើការកែប្រែវានាពេលឆាប់ៗនេះ។ សូមត្រលប់មកពិនិត្យមើលម្ដងទៀត!', |
3370 | 3384 | 'mobile-frontend-are-you-sure' => 'តើអ្នកប្រាកដហើយ?', |
3371 | | - 'mobile-frontend-explain-disable' => 'តើអ្នកពិតជាចង់ឈប់ប្រើវើសិនសំរាប់ទូរស័ព្ទចល័តរបស់{{SITENAME}}មែនទេ? ប្រើសិនបើអ្នកជ្រើសយក <b>ឈប់ប្រើ</b> នោះចាប់ពីពេលនេះទៅ នៅពេលដែលអ្នកចូលមើល{{SITENAME}} អ្នកនឹងមិនត្រូវបញ្ជូនផ្ទាល់ទៅកាន់ទំរង់សំរាប់ទូរស័ព្ទចល័តរបស់{{SITENAME}}ទេ។', |
| 3385 | + 'mobile-frontend-explain-disable' => 'តើអ្នកពិតជាចង់ឈប់ប្រើវើសិនសំរាប់ទូរស័ព្ទចល័តរបស់{{SITENAME}}មែនទេ? ប្រសិនបើអ្នកជ្រើសយក <b>ឈប់ប្រើ</b> នោះចាប់ពីពេលនេះទៅ នៅពេលដែលអ្នកចូលមើល{{SITENAME}} អ្នកនឹងមិនត្រូវបញ្ជូនផ្ទាល់ទៅកាន់ទំរង់សំរាប់ទូរស័ព្ទចល័តរបស់{{SITENAME}}ទេ។', |
3372 | 3386 | 'mobile-frontend-nav-end' => 'ចប់', |
3373 | 3387 | 'mobile-frontend-nav-top' => 'ផ្នែកខាងលើ', |
3374 | 3388 | 'mobile-frontend-nav-edit' => 'កែប្រែ', |
3375 | 3389 | 'mobile-frontend-nav-history' => 'ប្រវត្តិ', |
3376 | 3390 | 'mobile-frontend-search-text' => 'ស្វែងរក', |
3377 | 3391 | 'mobile-frontend-contact-us' => 'ប្រសិនបើអ្នកមានសំណួរឬមតិយោបល់ សូមផ្ញើអ៊ីមែលមកកាន់យើងខ្ញុំតាមរយៈ mobile@wikipedia.org', |
3378 | | - 'mobile-frontend-author-link' => 'បើកមើលឯកសារមេឌានេះនៅលើ{{SITENAME}}ធម្មតា ដើម្បីមើលព័ត៌មានអំពីម្ចាស់កម្មសិទ្ធ អាជ្ញាប័ណ្ឌ និងការបរិយាយបន្ថែមទៀត។', |
| 3392 | + 'mobile-frontend-author-link' => 'បើកមើលឯកសារមេឌានេះនៅលើ{{SITENAME}}ធម្មតា ដើម្បីមើលព័ត៌មានអំពីម្ចាស់កម្មសិទ្ធ អាជ្ញាប័ណ្ឌ និងការពណ៌នាបន្ថែមទៀត។', |
3379 | 3393 | 'mobile-frontend-download-full-version' => 'ទាញយកវើសិនពេញ', |
3380 | 3394 | 'mobile-frontend-file-namespace' => 'ឯកសារ', |
3381 | 3395 | 'mobile-frontend-wml-continue' => 'បន្ត...', |
— | — | @@ -3384,7 +3398,7 @@ |
3385 | 3399 | 'mobile-frontend-opt-in-yes-button' => 'បាទ/ចាស៎', |
3386 | 3400 | 'mobile-frontend-opt-in-no-button' => 'ទេ', |
3387 | 3401 | 'mobile-frontend-opt-in-title' => 'ការចូលរួមសាកល្បងប្រើកម្មវិធីបេតាសំរាប់ឧបករណ៍ចល័ត', |
3388 | | - 'mobile-frontend-opt-in-explain' => 'ដោយចូលរួមកម្មវិធីបេតេ អ្នកនឹងមានលទ្ធភាពប្រើមុខងាដែលកំពុងស្ថិតនៅក្រោមការពិសោធន៍នៅឡើយ ដែលធ្វើអោយអ្នកប្រឈមមុខនឹងបញ្ហាតូចតាចមួយចំនួន។', |
| 3402 | + 'mobile-frontend-opt-in-explain' => 'ដោយចូលរួមកម្មវិធីបេតា អ្នកនឹងមានលទ្ធភាពប្រើមុខងារដែលកំពុងស្ថិតនៅក្រោមការពិសោធន៍នៅឡើយ ដែលអាចធ្វើអោយអ្នកប្រឈមមុខនឹងបញ្ហាតូចតាចមួយចំនួន។', |
3389 | 3403 | 'mobile-frontend-opt-out-message' => 'ចាកចេញពីកម្មវិធីបេតាសំរាប់ឧបករណ៍ចល័តឬ?', |
3390 | 3404 | 'mobile-frontend-opt-out-yes-button' => 'បាទ/ចាស៎', |
3391 | 3405 | 'mobile-frontend-opt-out-no-button' => 'ទេ', |
— | — | @@ -3392,7 +3406,7 @@ |
3393 | 3407 | 'mobile-frontend-opt-out-explain' => 'ដោយចាកចេញពីកម្មវិធីបេតា អ្នកនឹងបិទមិនប្រើកម្មវិធីដែលស្ថិតនៅក្រោមការពិសោធន៍ទាំងអស់ រួចត្រលប់ទៅប្រើកម្មវិធីសំរាប់ឧបករណ៍ចល័តធម្មតាវិញ។', |
3394 | 3408 | 'mobile-frontend-disable-images' => 'បិទមិនអោយមើលរូបភាពនៅលើវិបសាយសំរាប់ឧបករណ៍ចល័ត', |
3395 | 3409 | 'mobile-frontend-enable-images' => 'បើកអោយមើលរូបភាពនៅលើវិបសាយសំរាប់ឧបករណ៍ចល័ត', |
3396 | | - 'mobile-frontend-news-items' => 'នៅក្នុងសារពត៌មាន', |
| 3410 | + 'mobile-frontend-news-items' => 'នៅក្នុងសារព័ត៌មាន', |
3397 | 3411 | 'mobile-frontend-leave-feedback-title' => 'សូមផ្ដល់មតិយោបល់អំពីវិបសាយសំរាប់ឧបករណ៍ចល័តរបស់យើងខ្ញុំ', |
3398 | 3412 | 'mobile-frontend-leave-feedback-notice' => 'មតិយោបល់របស់អ្នកនឹងជួយយើងខ្ញុំក្នុងការកែលំអវិបសាយសំរាប់ឧបករណ៍ចល័តរបស់យើងអោយកាន់តែប្រសើរឡើង។ មតិរបស់អ្នក (ព្រមជាមួយនឹងអត្តនាម វើសិនរបស់ឧបករណ៍រាវរក និងប្រព័ន្ធប្រតិបត្តិ) នឹងត្រូវបានផ្សព្វផ្សាយជាសាធារណៈនៅលើទំព័រ "$1"។ សូមជ្រើសរើសពាក្យដែលមានព័ត៌មានគ្រប់គ្រាន់សំរាប់ដាក់ជាចំណងជើង។ ឧទាហរណ៍ "បញ្ហាទំរង់របស់តារាងធំៗ"។ មតិយោបល់របស់អ្នកនឹងត្រូវបានប្រើទៅតាមលក្ខខណ្ឌនៃការប្រើប្រាស់របស់យើងខ្ញុំ។', |
3399 | 3413 | 'mobile-frontend-leave-feedback-subject' => 'ប្រធានបទ', |
— | — | @@ -3408,6 +3422,7 @@ |
3409 | 3423 | 'mobile-frontend-login' => 'កត់ឈ្មោះចូល', |
3410 | 3424 | 'mobile-frontend-placeholder' => 'វាយបញ្ជួលពាក្យដែលអ្នកចង់ស្វែងរកនៅទីនេះ...', |
3411 | 3425 | 'mobile-frontend-dismiss-notification' => 'បិទការផ្ដល់ដំណឹងនេះ', |
| 3426 | + 'mobile-frontend-clear-search' => 'ជំរះ', |
3412 | 3427 | ); |
3413 | 3428 | |
3414 | 3429 | /** Kannada (ಕನ್ನಡ) |
— | — | @@ -4114,7 +4129,7 @@ |
4115 | 4130 | * @author Bjankuloski06 |
4116 | 4131 | */ |
4117 | 4132 | $messages['mk'] = array( |
4118 | | - 'mobile-frontend-desc' => 'Кориснички дел за мобилен уред', |
| 4133 | + 'mobile-frontend-desc' => 'Мобилен посредник', |
4119 | 4134 | 'mobile-frontend-search-submit' => 'Оди', |
4120 | 4135 | 'mobile-frontend-search-results' => 'Резултати од пребарувањето', |
4121 | 4136 | 'mobile-frontend-no-article-found' => 'Нема пронајдено статија', |
— | — | @@ -4127,18 +4142,18 @@ |
4128 | 4143 | 'mobile-frontend-hide-button' => 'Скриј', |
4129 | 4144 | 'mobile-frontend-disable-button' => 'Оневозможи', |
4130 | 4145 | 'mobile-frontend-back-button' => 'Назад', |
4131 | | - 'mobile-frontend-regular-site' => 'режим „работна површина“', |
| 4146 | + 'mobile-frontend-regular-site' => 'Обичен изглед', |
4132 | 4147 | 'mobile-frontend-error-page-title' => 'Имаме проблем!', |
4133 | 4148 | 'mobile-frontend-error-page-text' => 'Мобилното издание на {{SITENAME}} е сè уште во активен развој, и работиме напорно за да ги поправиме сите внатрешни грешки. Известени сме за оваа грешка и набргу ќе ја поправиме. Проверете повторно!', |
4134 | 4149 | 'mobile-frontend-are-you-sure' => 'Дали сте сигурни ?', |
4135 | | - 'mobile-frontend-explain-disable' => 'Дали сте сигурни дека сакате да ја оневозможите мобилната верзија на {{SITENAME}}? Ако одберете <b>Оневозможи</b>, тоа ќе значи дека оттогаш па натаму кога ќе ја посетите {{SITENAME}}, страницата нема да ве пренасочува на овој мобилен режим на {{SITENAME}}.', |
| 4150 | + 'mobile-frontend-explain-disable' => 'Дали сте сигурни дека сакате да ја оневозможите мобилната верзија на {{SITENAME}}? Ако одберете <b>Оневозможи</b>, тоа ќе значи дека оттогаш па натаму кога ќе ја посетите {{SITENAME}}, страницата нема да ве пренасочува на овој мобилен изглед на {{SITENAME}}.', |
4136 | 4151 | 'mobile-frontend-nav-end' => 'Најдолу', |
4137 | 4152 | 'mobile-frontend-nav-top' => 'Најгоре', |
4138 | 4153 | 'mobile-frontend-nav-edit' => 'Уреди', |
4139 | 4154 | 'mobile-frontend-nav-history' => 'Историја', |
4140 | 4155 | 'mobile-frontend-search-text' => 'Пребарај', |
4141 | 4156 | 'mobile-frontend-contact-us' => 'Ако имате било какви прашања или примедби, слободно пишете ни на mobile@wikipedia.org', |
4142 | | - 'mobile-frontend-author-link' => 'Погледајте ја снимкава на обичен режим на {{SITENAME}} за да видите повеќе информации за авторот, лиценцата и дополнителен опис.', |
| 4157 | + 'mobile-frontend-author-link' => 'Погледајте ја снимкава на обичен изглед на {{SITENAME}} за да видите повеќе информации за авторот, лиценцата и дополнителен опис.', |
4143 | 4158 | 'mobile-frontend-download-full-version' => 'Преземи полна верзија', |
4144 | 4159 | 'mobile-frontend-file-namespace' => 'Податотека', |
4145 | 4160 | 'mobile-frontend-wml-continue' => 'Продолжи ...', |
— | — | @@ -4154,8 +4169,8 @@ |
4155 | 4170 | 'mobile-frontend-opt-out-no-button' => 'не', |
4156 | 4171 | 'mobile-frontend-opt-out-title' => 'Напуштање на бета-верзијата за мобилни уреди', |
4157 | 4172 | 'mobile-frontend-opt-out-explain' => 'Напуштајќи ја бета-верзијата за мобилни уреди ги оневозможувате сите експериментални функции и се враќате на класичната мобилна верзија.', |
4158 | | - 'mobile-frontend-disable-images' => 'Оневозможи слики на мобилното мреж. место', |
4159 | | - 'mobile-frontend-enable-images' => 'Овозможи слики на мобилното мреж. место', |
| 4173 | + 'mobile-frontend-disable-images' => 'Оневозможи слики во мобилниот изглед', |
| 4174 | + 'mobile-frontend-enable-images' => 'Овозможи слики во мобилниот изглед', |
4160 | 4175 | 'mobile-frontend-news-items' => 'Вести', |
4161 | 4176 | 'mobile-frontend-leave-feedback-title' => 'Дајте ни ваше мислење за мобилната верзија', |
4162 | 4177 | 'mobile-frontend-leave-feedback-notice' => 'Вашето мислење ни помага да ја подобриме мобилната верзија. Мислењето ќе биде објавено јавно (заедно со корисничкото име, верзијата на прелистувачот и оперативниот систем) на страницата „$1“. Одберете информативен наслов, како на пр. „Проблем со форматирање на широките табели“. Искажаното мислење подлежи на условите на употреба.', |
— | — | @@ -4888,7 +4903,7 @@ |
4889 | 4904 | 'mobile-frontend-hide-button' => 'Айсын', |
4890 | 4905 | 'mobile-frontend-disable-button' => 'Ахицæн кæнын', |
4891 | 4906 | 'mobile-frontend-back-button' => 'Фæстæмæ', |
4892 | | - 'mobile-frontend-regular-site' => 'Кæсын ацы фарс нæуи {{grammar:genitive|{{SITENAME}}}}', |
| 4907 | + 'mobile-frontend-regular-site' => 'Æнæхъæнæй', |
4893 | 4908 | 'mobile-frontend-error-page-title' => 'Проблемæ нæм ис!', |
4894 | 4909 | 'mobile-frontend-error-page-text' => 'Мобилон {{SITENAME}} нырмадæр кæронмæ арызт нæу, æмæ мах кусæм нæ мидæггаг рæдыддытæ раст кæныныл. Мах фехъусын кодтой ацы рæдыды тыххæй æмæ йæ тагъд хъуамæ сраст кæнæм. Дæ хорзæхæй, фæстæдæр та бафæлвар!', |
4895 | 4910 | 'mobile-frontend-are-you-sure' => 'Æцæг дæ фæнды?', |
— | — | @@ -4913,6 +4928,13 @@ |
4914 | 4929 | 'mobile-frontend-enable-images' => 'Баиу кæнын нывтæ мобилон сайты', |
4915 | 4930 | 'mobile-frontend-news-items' => 'Нæуæг хабæртты', |
4916 | 4931 | 'mobile-frontend-leave-feedback-message' => 'Фыстæг', |
| 4932 | + 'mobile-frontend-leave-feedback-cancel' => 'Ныууадзын', |
| 4933 | + 'mobile-frontend-language' => 'Æвзаг', |
| 4934 | + 'mobile-frontend-username' => 'Архайæджы ном:', |
| 4935 | + 'mobile-frontend-password' => 'Пароль:', |
| 4936 | + 'mobile-frontend-login' => 'Бахизын', |
| 4937 | + 'mobile-frontend-clear-search' => 'Схафын', |
| 4938 | + 'mobile-frontend-about-link-text' => 'Афыст', |
4917 | 4939 | ); |
4918 | 4940 | |
4919 | 4941 | /** Punjabi (ਪੰਜਾਬੀ) */ |
— | — | @@ -5533,6 +5555,7 @@ |
5534 | 5556 | ); |
5535 | 5557 | |
5536 | 5558 | /** Russian (Русский) |
| 5559 | + * @author Bouron |
5537 | 5560 | * @author Dim Grits |
5538 | 5561 | * @author Express2000 |
5539 | 5562 | * @author Kaganer |
— | — | @@ -5553,7 +5576,7 @@ |
5554 | 5577 | 'mobile-frontend-hide-button' => 'Скрыть', |
5555 | 5578 | 'mobile-frontend-disable-button' => 'Отключить', |
5556 | 5579 | 'mobile-frontend-back-button' => 'Назад', |
5557 | | - 'mobile-frontend-regular-site' => 'Просмотреть страницу в обычной {{grammar:genitive|{{SITENAME}}}}', |
| 5580 | + 'mobile-frontend-regular-site' => 'Обычная версия', |
5558 | 5581 | 'mobile-frontend-error-page-title' => 'У нас проблема!', |
5559 | 5582 | 'mobile-frontend-error-page-text' => 'Мобильная версия {{grammar:genitive|{{SITENAME}}}} ещё находится в стадии активной разработки, и мы прилагаем максимум усилий, чтобы исправить все наши внутренние ошибки. Мы были уведомлены об этой ошибке и планируем её вскоре исправить. Пожалуйста, проверьте через некоторое время!', |
5560 | 5583 | 'mobile-frontend-are-you-sure' => 'Вы уверены?', |