r24502 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r24501‎ | r24502 | r24503 >
Date:22:31, 31 July 2007
Author:david
Status:old
Tags:
Comment:
Merged revisions 24415-24479 via svnmerge from
svn+ssh://david@svn.wikimedia.org/svnroot/mediawiki/trunk/phase3

........
r24418 | robchurch | 2007-07-28 15:21:23 -0700 (Sat, 28 Jul 2007) | 4 lines

* Allow overwriting existing files with conflicting names using the --override option
* More useful output (no. of files added, overwritten, skipped)
* Trim some whitespace and kill a dud global \o/
........
r24419 | robchurch | 2007-07-28 16:09:16 -0700 (Sat, 28 Jul 2007) | 2 lines

* (bug 10732) Protection chaining checkbox broken - this appears to have regressed in r24272/r24274; we might do worse than to fix things up so checkboxes without a certain class can't be shift-clicked or whatever
* Rewrite a couple bits in allowCascade() - isCascadeableLevel() was inefficient, and the function was throwing up errors and whatnot due to bad checking of selection indexes and so on
........
r24420 | robchurch | 2007-07-28 16:10:58 -0700 (Sat, 28 Jul 2007) | 1 line

Bump $wgStyleVersion
........
r24421 | robchurch | 2007-07-28 16:13:48 -0700 (Sat, 28 Jul 2007) | 1 line

Whee, turns out the error-puking JavaScript made it into 1.10, so this needs a RELEASE NOTE!
........
r24422 | rotem | 2007-07-28 18:57:45 -0700 (Sat, 28 Jul 2007) | 1 line

Fix.
........
r24423 | rotem | 2007-07-28 19:04:43 -0700 (Sat, 28 Jul 2007) | 1 line

Use native newlines when rebuilding a messages file.
........
r24424 | rotem | 2007-07-28 19:18:16 -0700 (Sat, 28 Jul 2007) | 1 line

A message (fileexists) with the same name of another one was introduced in r24313; renaming it to fileexistserror. Other messages files that updated since this revision may also have to rename the message.
........
r24425 | rotem | 2007-07-28 19:22:18 -0700 (Sat, 28 Jul 2007) | 1 line

Use the same order as in the English messages file.
........
r24426 | rotem | 2007-07-28 19:25:15 -0700 (Sat, 28 Jul 2007) | 1 line

Rebuild.
........
r24427 | robchurch | 2007-07-29 07:32:26 -0700 (Sun, 29 Jul 2007) | 1 line

(bug 10732 and others) Further fixes to protect chaining JavaScript; introduce addClickHandler() to work around missing addEventListener() in IE and other browsers that suck
........
r24428 | robchurch | 2007-07-29 07:32:44 -0700 (Sun, 29 Jul 2007) | 1 line

Tweak comment
........
r24429 | robchurch | 2007-07-29 08:21:01 -0700 (Sun, 29 Jul 2007) | 1 line

Document this file all over
........
r24430 | robchurch | 2007-07-29 09:50:40 -0700 (Sun, 29 Jul 2007) | 1 line

strpos() !== false is faster than strstr()
........
r24432 | robchurch | 2007-07-29 11:41:49 -0700 (Sun, 29 Jul 2007) | 2 lines

* Use a table to present file histories
* (bug 10741) Don't show deletion links for non-sysops [in file histories]
........
r24433 | robchurch | 2007-07-29 11:48:20 -0700 (Sun, 29 Jul 2007) | 2 lines

* More precise comment
* Trim whitespace
........
r24434 | robchurch | 2007-07-29 11:51:36 -0700 (Sun, 29 Jul 2007) | 1 line

Whoops, missed this one...
........
r24435 | robchurch | 2007-07-29 11:53:40 -0700 (Sun, 29 Jul 2007) | 1 line

Note
........
r24436 | robchurch | 2007-07-29 12:53:50 -0700 (Sun, 29 Jul 2007) | 1 line

Refactor addClickHandler() and introduce addHandler()
........
r24437 | robchurch | 2007-07-29 13:12:28 -0700 (Sun, 29 Jul 2007) | 1 line

Lucky bug
........
r24438 | robchurch | 2007-07-29 13:45:07 -0700 (Sun, 29 Jul 2007) | 1 line

What is this, Blankety Blank?
........
r24439 | robchurch | 2007-07-29 15:00:46 -0700 (Sun, 29 Jul 2007) | 2 lines

* (bug 10739) Users can now enter comments when reverting files
* You'll see some commented-out bits left in indicating I had bigger plans for the interface - some notes there, in case it's possible in the future
........
r24440 | robchurch | 2007-07-29 15:03:22 -0700 (Sun, 29 Jul 2007) | 1 line

Left in a comment
........
r24441 | robchurch | 2007-07-29 15:05:10 -0700 (Sun, 29 Jul 2007) | 1 line

Longer comment box
........
r24442 | brion | 2007-07-29 16:37:14 -0700 (Sun, 29 Jul 2007) | 2 lines

fix an immediate php error, but result is still wrong -- we get 'exif-exif-make' etc, since the tag already has 'exif' in the name. Something's broken, but not sure where
........
r24443 | brion | 2007-07-29 16:39:54 -0700 (Sun, 29 Jul 2007) | 3 lines

Hopefully fix the problem with EXIF field names being listed as <exif-exif-make> etc in the image table.
Since the type is already added to the sub-name, presumably the type ('exif') should not be added in again here.
........
r24444 | robchurch | 2007-07-29 16:53:45 -0700 (Sun, 29 Jul 2007) | 1 line

Introduce OutputPage::addReturnTo(), with a view to replacing OutputPage::returnToMain() [cleaner calling convention], and document the latter
........
r24445 | rotem | 2007-07-29 17:40:22 -0700 (Sun, 29 Jul 2007) | 1 line

Update.
........
r24446 | rotem | 2007-07-29 17:42:02 -0700 (Sun, 29 Jul 2007) | 1 line

Fix.
........
r24447 | robchurch | 2007-07-29 17:46:09 -0700 (Sun, 29 Jul 2007) | 1 line

Some style tweaks, per Brion
........
r24448 | river | 2007-07-29 18:56:37 -0700 (Sun, 29 Jul 2007) | 3 lines

- new field: page_key, stores page_title in uppercase.
schema change, maintenance script included
........
r24449 | brion | 2007-07-29 20:06:20 -0700 (Sun, 29 Jul 2007) | 2 lines

Undo r24394; not really comfortable with this change. Probably not ideal for installations without thumbs enabled
........
r24453 | yurik | 2007-07-30 01:09:15 -0700 (Mon, 30 Jul 2007) | 5 lines

API:
* Added full text search in titles and content (list=search)
* (bug 10684) Expanded list=allusers functionality
* Possible breaking change: prop=revisions no longer includes pageid for rvprop=ids
* Bug fix: proper search escaping for SQL LIKE queries.
........
r24454 | raymond | 2007-07-30 01:38:09 -0700 (Mon, 30 Jul 2007) | 1 line

Fix regression: message 'imghistory' was deleted in r24432 but still used in SpecialUndelete.php. Now replaced with the new message 'filehist'.
........
r24455 | river | 2007-07-30 03:07:12 -0700 (Mon, 30 Jul 2007) | 2 lines

add missing file
........
r24456 | river | 2007-07-30 03:11:43 -0700 (Mon, 30 Jul 2007) | 2 lines

need name_key index in tables.sql too
........
r24457 | raymond | 2007-07-30 03:39:45 -0700 (Mon, 30 Jul 2007) | 2 lines

* (bug 10724) Update Chinese translations
Patch by Shinjiman
........
r24458 | raymond | 2007-07-30 05:16:23 -0700 (Mon, 30 Jul 2007) | 1 line

* (bug 10713) Message file for Lao language (lo)
........
r24460 | greg | 2007-07-30 07:10:42 -0700 (Mon, 30 Jul 2007) | 2 lines

Add function to check if function-based indexes are supported by the backend DB.
........
r24467 | raymond | 2007-07-30 09:16:27 -0700 (Mon, 30 Jul 2007) | 1 line

Updates German
........
r24469 | raymond | 2007-07-30 09:23:58 -0700 (Mon, 30 Jul 2007) | 1 line

Update for r24423 by Rotem
........
r24473 | raymond | 2007-07-30 12:08:11 -0700 (Mon, 30 Jul 2007) | 2 lines

Separate date and time in new 'filerevert-intro', 'filerevert-defaultcomment' and 'filerevert-success' messages to allow a better localization.
It's always a mess to localize with timestamps, at least in German :-(
........
r24474 | rotem | 2007-07-30 12:12:11 -0700 (Mon, 30 Jul 2007) | 1 line

Update.
........
r24475 | raymond | 2007-07-30 13:12:53 -0700 (Mon, 30 Jul 2007) | 2 lines

* (bug 10724) Update Chinese translations
Patch by Shinjiman
........
r24476 | raymond | 2007-07-30 14:09:31 -0700 (Mon, 30 Jul 2007) | 1 line

* Prettifying file history table a bit. Especially for histories with long comments/descriptions it look clearer now.
........
r24477 | daniel | 2007-07-30 15:52:37 -0700 (Mon, 30 Jul 2007) | 1 line

adding generic hook points to SpecialPreferences
........
Modified paths:
  • /branches/liquidthreads (modified) (history)
  • /branches/liquidthreads/RELEASE-NOTES (modified) (history)
  • /branches/liquidthreads/api.php (modified) (history)
  • /branches/liquidthreads/docs/hooks.txt (modified) (history)
  • /branches/liquidthreads/includes/Article.php (modified) (history)
  • /branches/liquidthreads/includes/AutoLoader.php (modified) (history)
  • /branches/liquidthreads/includes/Database.php (modified) (history)
  • /branches/liquidthreads/includes/DatabasePostgres.php (modified) (history)
  • /branches/liquidthreads/includes/DefaultSettings.php (modified) (history)
  • /branches/liquidthreads/includes/EditPage.php (modified) (history)
  • /branches/liquidthreads/includes/FileRevertForm.php (added) (history)
  • /branches/liquidthreads/includes/FileRevertForm.php (added) (history)
  • /branches/liquidthreads/includes/ImagePage.php (modified) (history)
  • /branches/liquidthreads/includes/OutputPage.php (modified) (history)
  • /branches/liquidthreads/includes/SpecialPreferences.php (modified) (history)
  • /branches/liquidthreads/includes/SpecialUndelete.php (modified) (history)
  • /branches/liquidthreads/includes/Title.php (modified) (history)
  • /branches/liquidthreads/includes/api/ApiQuery.php (modified) (history)
  • /branches/liquidthreads/includes/api/ApiQueryAllLinks.php (modified) (history)
  • /branches/liquidthreads/includes/api/ApiQueryAllUsers.php (modified) (history)
  • /branches/liquidthreads/includes/api/ApiQueryAllpages.php (modified) (history)
  • /branches/liquidthreads/includes/api/ApiQueryBase.php (modified) (history)
  • /branches/liquidthreads/includes/api/ApiQueryImageInfo.php (modified) (history)
  • /branches/liquidthreads/includes/api/ApiQueryRevisions.php (modified) (history)
  • /branches/liquidthreads/includes/api/ApiQuerySearch.php (added) (history)
  • /branches/liquidthreads/includes/api/ApiQuerySearch.php (added) (history)
  • /branches/liquidthreads/includes/filerepo/FSRepo.php (modified) (history)
  • /branches/liquidthreads/includes/filerepo/File.php (modified) (history)
  • /branches/liquidthreads/includes/media/BMP.php (modified) (history)
  • /branches/liquidthreads/includes/media/Bitmap.php (modified) (history)
  • /branches/liquidthreads/languages/messages/MessagesDe.php (modified) (history)
  • /branches/liquidthreads/languages/messages/MessagesEn.php (modified) (history)
  • /branches/liquidthreads/languages/messages/MessagesHe.php (modified) (history)
  • /branches/liquidthreads/languages/messages/MessagesLo.php (modified) (history)
  • /branches/liquidthreads/languages/messages/MessagesZh_classical.php (modified) (history)
  • /branches/liquidthreads/languages/messages/MessagesZh_cn.php (modified) (history)
  • /branches/liquidthreads/languages/messages/MessagesZh_tw.php (modified) (history)
  • /branches/liquidthreads/languages/messages/MessagesZh_yue.php (modified) (history)
  • /branches/liquidthreads/maintenance/archives/patch-page_key.sql (added) (history)
  • /branches/liquidthreads/maintenance/archives/patch-page_key.sql (added) (history)
  • /branches/liquidthreads/maintenance/importImages.inc.php (modified) (history)
  • /branches/liquidthreads/maintenance/importImages.php (modified) (history)
  • /branches/liquidthreads/maintenance/language/messages.inc (modified) (history)
  • /branches/liquidthreads/maintenance/language/writeMessagesArray.inc (modified) (history)
  • /branches/liquidthreads/maintenance/tables.sql (modified) (history)
  • /branches/liquidthreads/maintenance/updaters.inc (modified) (history)
  • /branches/liquidthreads/skins/common/protect.js (modified) (history)
  • /branches/liquidthreads/skins/common/shared.css (modified) (history)
  • /branches/liquidthreads/skins/common/wikibits.js (modified) (history)
  • /branches/liquidthreads/skins/monobook/main.css (modified) (history)

Diff [purge]

Index: branches/liquidthreads/docs/hooks.txt
@@ -482,6 +482,10 @@
483483 $imagePage: ImagePage object ($this)
484484 $output: $wgOut
485485
 486+'InitPreferencesForm': called at the end of PreferencesForm's constructor
 487+$form: the PreferencesForm
 488+$request: the web request to initialized from
 489+
486490 'InternalParseBeforeLinks': during Parser's internalParse method before links but
487491 after noinclude/includeonly/onlyinclude and other processing.
488492 &$this: Parser object
@@ -574,6 +578,20 @@
575579 &$obj: RawPage object
576580 &$text: The text that's going to be the output
577581
 582+'RenderPreferencesForm': called at the end of PreferencesForm::mainPrefsForm
 583+$form: the PreferencesForm
 584+$out: output page to render to, probably $wgOut
 585+
 586+'ResetPreferences': called at the end of PreferencesForm::resetPrefs
 587+$form: the PreferencesForm
 588+$user: the User object to load preferences from
 589+
 590+'SavePreferences': called at the end of PreferencesForm::savePreferences;
 591+ returning false prevents the preferences from being saved.
 592+$form: the PreferencesForm
 593+$user: the User object to save preferences to
 594+$message: change this to set an error message (ignored if the hook does notreturn fals)
 595+
578596 'SearchUpdate': Prior to search update completion
579597 $id : Page id
580598 $namespace : Page namespace
Index: branches/liquidthreads/api.php
@@ -50,7 +50,7 @@
5151 */
5252 $processor = new ApiMain($wgRequest, $wgEnableWriteAPI);
5353
54 -// Generate the output.
 54+// Process data & print results
5555 $processor->execute();
5656
5757 // Log what the user did, for book-keeping purposes.
Index: branches/liquidthreads/languages/messages/MessagesZh_cn.php
@@ -374,7 +374,7 @@
375375 'filedeleteerror' => '无法删除文件 "$1"。',
376376 'directorycreateerror' => '无法创建目录"$1"。',
377377 'filenotfound' => '找不到文件 "$1"。',
378 -'fileexists' => '无法写入文件"$1": 文件已存在',
 378+'fileexistserror' => '无法写入文件"$1": 文件已存在',
379379 'unexpected' => '非正常值: "$1"="$2"。',
380380 'formerror' => '错误: 无法提交表单',
381381 'badarticleerror' => '无法在此页进行此项操作。',
@@ -978,14 +978,17 @@
979979 'imgdelete' => '删除',
980980 'imgdesc' => '描述',
981981 'imgfile' => '文件',
982 -'imglegend' => '说明: (描述) = 显示/编辑文件描述。',
983 -'imghistory' => '文件历史',
984 -'revertimg' => '恢复',
985 -'deleteimg' => '删除',
986 -'deleteimgcompletely' => '删除此文件的所有修订版本',
987 -'imghistlegend' => '说明: (当前) = 这是当前文件,(删除) = 删除此旧版本,
988 -(恢复 = 恢复到此旧版本。
989 -<br /><i>点击日期查看当天上载的文件</i>。',
 982+'filehist' => '文件历史',
 983+'filehist-help' => '点击日期/时间以查看当时出现过的文件。',
 984+'filehist-deleteall' => '删除全部',
 985+'filehist-deleteone' => '删除这个',
 986+'filehist-revert' => '恢复',
 987+'filehist-current' => '当前',
 988+'filehist-datetime' => '日期/时间',
 989+'filehist-user' => '用户',
 990+'filehist-dimensions' => '维度',
 991+'filehist-filesize' => '文件大小',
 992+'filehist-comment' => '注解',
990993 'imagelinks' => '鏈接',
991994 'linkstoimage' => '以下页面鏈接到本文件:',
992995 'nolinkstoimage' => '没有页面鏈接到本文件。',
@@ -1002,6 +1005,16 @@
10031006 'imagelist_description' => '描述',
10041007 'imagelist_search_for' => '按图像名称搜索:',
10051008
 1009+# File reversion
 1010+'filerevert' => '恢复$1',
 1011+'filerevert-legend' => '恢复文件',
 1012+'filerevert-intro' => "<span class=\"plainlinks\">您现正在恢复'''[[Media:$1|$1]]'''到[于$2 $3的$4版本]。</span>",
 1013+'filerevert-comment' => '注解:',
 1014+'filerevert-defaultcomment' => '已经恢复到于$1 $2的版本',
 1015+'filerevert-submit' => '恢复',
 1016+'filerevert-success' => "<span class=\"plainlinks\">'''[[Media:$1|$1]]'''已经恢复到[于$2 $3的$4版本]。</span>",
 1017+'filerevert-badversion' => '这个文件所提供的时间截记并无先前的本地版本。',
 1018+
10061019 # MIME search
10071020 'mimesearch' => 'MIME 搜索',
10081021 'mimesearch-summary' => '本页面启用文件MIME类型过滤器。输入:内容类型/子类型,如 <tt>image/jpeg</tt>。',
@@ -1037,7 +1050,7 @@
10381051 即每页平均编辑'''\$5'''次,各次编辑后页面的每个版本平均浏览'''\$6'''次。
10391052
10401053 [http://meta.wikimedia.org/wiki/Help:Job_queue 工作排队]的长度是'''\$7'''。",
1041 -'userstatstext' => "网站有'''$1'''位注册用户,其中
 1054+'userstatstext' => "网站有'''$1'''位注册[[Special:Listusers|用户]],其中
10421055 '''$2''' (或 '''$4%''') 有$5权限。",
10431056 'statistics-mostpopular' => '浏览最多的页面',
10441057
@@ -1276,7 +1289,6 @@
12771290 'deletionlog' => '删除日志',
12781291 'reverted' => '恢复到早期版本',
12791292 'deletecomment' => '删除原因',
1280 -'imagereverted' => '恢复到早期版本操作完成。',
12811293 'rollback' => '恢复编辑',
12821294 'rollback_short' => '恢复',
12831295 'rollbacklink' => '恢复',
Index: branches/liquidthreads/languages/messages/MessagesHe.php
@@ -505,7 +505,7 @@
506506 'filedeleteerror' => 'מחיקת "$1" נכשלה.',
507507 'directorycreateerror' => 'יצירת התיקייה "$1" נכשלה.',
508508 'filenotfound' => 'הקובץ "$1" לא נמצא.',
509 -'fileexists' => 'הכתיבה לקובץ "$1" נכשלה: הקובץ קיים',
 509+'fileexistserror' => 'הכתיבה לקובץ "$1" נכשלה: הקובץ קיים',
510510 'unexpected' => 'ערך לא צפוי: "$1"="$2"',
511511 'formerror' => 'שגיאה: לא יכול לשלוח טופס.',
512512 'badarticleerror' => 'לא ניתן לבצע פעולה זו בדף זה.',
@@ -593,7 +593,7 @@
594594 'throttled-mailpassword' => 'כבר נעשה שימוש באפשרות שחזור הסיסמה ב־$1 השעות האחרונות. כדי למנוע ניצול לרעה, רק דואר אחד כזה יכול להישלח כל $1 שעות.',
595595 'mailerror' => 'שגיאה בשליחת דואר: $1',
596596 'acct_creation_throttle_hit' => 'מצטערים, יצרת כבר $1 חשבונות. אינך יכול ליצור חשבונות נוספים.',
597 -'emailauthenticated' => 'כתובת הדוא"ל שלך אושרה על־ידי $1.',
 597+'emailauthenticated' => 'כתובת הדוא"ל שלך אושרה ב־$1.',
598598 'emailnotauthenticated' => 'כתובת הדוא"ל שלך עדיין לא אושרה. אף דוא"ל לא יישלח מאף אחת מהתכונות הבאות.',
599599 'noemailprefs' => 'אנא ציינו כתובת דוא"ל כדי שתכונות אלה יעבדו.',
600600 'emailconfirmlink' => 'אשר את כתובת הדוא"ל שלך',
@@ -1104,13 +1104,17 @@
11051105 'imgdelete' => 'מחק',
11061106 'imgdesc' => 'תיאור',
11071107 'imgfile' => 'קובץ',
1108 -'imglegend' => 'מקרא: (תיאור) הצג/ערוך תיאור התמונה.',
1109 -'imghistory' => 'היסטורית קובץ תמונה',
1110 -'revertimg' => 'חזור',
1111 -'deleteimg' => 'מחק',
1112 -'deleteimgcompletely' => 'מחק את כל גרסאות התמונה',
1113 -'imghistlegend' => 'מקרא (נוכ) = זו התמונה הנוכחית, (מחק) = מחק גרסה ישנה זו, (חזור) חזור לגרסה ישנה זו.<br />
1114 -<b>לחצו על תאריך לראות את התמונה שהועלתה בתאריך זה.</b>',
 1108+'filehist' => 'היסטוריית קובץ התמונה',
 1109+'filehist-help' => 'לחצו על תאריך/שעה כדי לראות את התמונה כפי שהופיעה בעת זו.',
 1110+'filehist-deleteall' => 'מחיקת כל הגרסאות',
 1111+'filehist-deleteone' => 'מחיקת הגרסה הנוכחית',
 1112+'filehist-revert' => 'שחזור',
 1113+'filehist-current' => 'נוכחית',
 1114+'filehist-datetime' => 'תאריך/שעה',
 1115+'filehist-user' => 'משתמש',
 1116+'filehist-dimensions' => 'ממדים',
 1117+'filehist-filesize' => 'גודל הקובץ',
 1118+'filehist-comment' => 'הערה',
11151119 'imagelinks' => 'קישורי תמונות',
11161120 'linkstoimage' => 'הדפים הבאים משתמשים בתמונה זו:',
11171121 'nolinkstoimage' => 'אין דפים המשתמשים בתמונה זו.',
@@ -1127,6 +1131,16 @@
11281132 'imagelist_description' => 'תיאור',
11291133 'imagelist_search_for' => 'חיפוש תמונה בשם:',
11301134
 1135+# File reversion
 1136+'filerevert' => 'שחזור $1',
 1137+'filerevert-legend' => 'שחזור קובץ',
 1138+'filerevert-intro' => '<span class="plainlinks">משחזר את \'\'\'[[Media:$1|$1]]\'\'\' ל[גרסה $4 מ־$2, $3].</span>',
 1139+'filerevert-comment' => 'הערה:',
 1140+'filerevert-defaultcomment' => 'שוחזר לגרסה מ־$1, $2',
 1141+'filerevert-submit' => 'שחזור',
 1142+'filerevert-success' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\' שוחזרה ל[גרסה $4 מ־$2, $3].</span>',
 1143+'filerevert-badversion' => 'אין גרסה מקומית קודמת של הקובץ שהועלתה בתאריך המצוין.',
 1144+
11311145 # MIME search
11321146 'mimesearch' => 'חיפוש MIME',
11331147 'mimesearch-summary' => 'דף זה מאפשר את סינון הקבצים לפי סוג ה־MIME שלהם. סוג ה־MIME בנוי בצורה "סוג תוכן/סוג משני", לדוגמה <tt>image/jpeg</tt>.',
@@ -1393,7 +1407,6 @@
13941408 'deletionlog' => 'יומן מחיקות',
13951409 'reverted' => 'שוחזר לגרסה קודמת',
13961410 'deletecomment' => 'סיבת המחיקה',
1397 -'imagereverted' => 'השחזור לגרסה הקודמת הושלם בהצלחה.',
13981411 'rollback' => 'שחזור עריכות',
13991412 'rollback_short' => 'שחזור',
14001413 'rollbacklink' => 'שחזור',
@@ -1485,7 +1498,6 @@
14861499
14871500 $1
14881501 ',
1489 -
14901502
14911503 # Namespace form on various pages
14921504 'namespace' => 'מרחב שם:',
@@ -1658,7 +1670,7 @@
16591671 'move-watch' => 'מעקב אחרי דף זה',
16601672 'movepagebtn' => 'העבר דף',
16611673 'pagemovedsub' => 'ההעברה הושלמה בהצלחה',
1662 -'movepage-moved' => '<big>הדף "$1" הועבר לשם "$2".</big>',
 1674+'movepage-moved' => '<big>הדף "$1" הועבר לשם "$2".</big>', # The two titles are passed in plain text as $3 and $4 to allow additional goodies in the message.
16631675 'articleexists' => 'קיים כבר דף עם אותו שם, או שהשם שבחרתם אינו חוקי.
16641676 אנא בחרו שם אחר.',
16651677 'talkexists' => 'הדף עצמו הועבר בהצלחה, אבל דף השיחה לא הועבר כיוון שקיים כבר דף שיחה במיקום החדש. אנא מזגו אותם ידנית.',
@@ -2279,7 +2291,7 @@
22802292 # Auto-summaries
22812293 'autosumm-blank' => 'מסיר את כל התוכן מדף זה',
22822294 'autosumm-replace' => "מחליף את הדף עם '$1'",
2283 -'autoredircomment' => 'הפניה לדף [[$1]]', # This should be changed to the new naming convention, but existed beforehand
 2295+'autoredircomment' => 'הפניה לדף [[$1]]',
22842296 'autosumm-new' => 'דף חדש: $1',
22852297
22862298 # Size units
Index: branches/liquidthreads/languages/messages/MessagesZh_yue.php
@@ -432,7 +432,7 @@
433433 'filedeleteerror' => '唔可以刪除檔案 "$1"。',
434434 'directorycreateerror' => '開唔到目錄 "$1"。',
435435 'filenotfound' => '搵唔到檔案 "$1"。',
436 -'fileexists' => '寫唔到檔案 "$1": 檔案已經存在',
 436+'fileexistserror' => '寫唔到檔案 "$1": 檔案已經存在',
437437 'unexpected' => '意外數值。 "$1"="$2"。',
438438 'formerror' => '錯誤:表格交唔到',
439439 'badarticleerror' => '呢個動作唔可以喺頁面度進行。',
@@ -1051,14 +1051,17 @@
10521052 'imgdelete' => '刪除',
10531053 'imgdesc' => '描述',
10541054 'imgfile' => '檔案',
1055 -'imglegend' => '說明:(描述)顯示/編輯檔案描述。',
1056 -'imghistory' => '檔案歷史',
1057 -'revertimg' => '回復',
1058 -'deleteimg' => '刪除',
1059 -'deleteimgcompletely' => '刪除呢個檔案嘅所有修改',
1060 -'imghistlegend' => '說明:(現) = 呢個係目前嘅檔案,(刪除) = 刪除呢個舊版本,
1061 -(回復) = 恢復到呢個舊版本。
1062 -<br /><i>撳日期嚟睇喺嗰個日期上載嘅檔案。</i>',
 1055+'filehist' => '檔案歷史',
 1056+'filehist-help' => '撳個日期/時間去睇響嗰個時間出現過嘅檔案。',
 1057+'filehist-deleteall' => '刪除全部',
 1058+'filehist-deleteone' => '刪除呢個',
 1059+'filehist-revert' => '回復',
 1060+'filehist-current' => '現時',
 1061+'filehist-datetime' => '日期/時間',
 1062+'filehist-user' => '用戶',
 1063+'filehist-dimensions' => '尺寸',
 1064+'filehist-filesize' => '檔案大細',
 1065+'filehist-comment' => '註解',
10631066 'imagelinks' => '連結',
10641067 'linkstoimage' => '以下嘅頁面連結到呢個檔案:',
10651068 'nolinkstoimage' => '冇個頁面連結到呢個檔案。',
@@ -1075,6 +1078,16 @@
10761079 'imagelist_description' => '描述',
10771080 'imagelist_search_for' => '搵圖像名:',
10781081
 1082+# File reversion
 1083+'filerevert' => '回復$1',
 1084+'filerevert-legend' => '回復檔案',
 1085+'filerevert-intro' => "<span class=\"plainlinks\">你而家回復緊'''[[Media:$1|$1]]'''到[響$2 $3嘅$4版本]。</span>",
 1086+'filerevert-comment' => '註解:',
 1087+'filerevert-defaultcomment' => '已經回復到響$1 $2嘅版本',
 1088+'filerevert-submit' => '回復',
 1089+'filerevert-success' => "<span class=\"plainlinks\">'''[[Media:$1|$1]]'''已經回復到[響$2 $3嘅$4版本]。</span>",
 1090+'filerevert-badversion' => '呢個檔案所提供嘅時間截記並無之前嘅本地版本。',
 1091+
10791092 # MIME search
10801093 'mimesearch' => 'MIME 搜尋',
10811094 'mimesearch-summary' => '呢一版可以過濾有關檔案嘅MIME類型。輸入方法:contenttype/subtype,例如 <tt>image/jpeg</tt>。',
@@ -1111,7 +1124,7 @@
11121125 平均每個頁面有'''$5'''次瀏覽,同埋'''$6'''次編輯。
11131126
11141127 [http://meta.wikimedia.org/wiki/Help:Job_queue job queue]嘅長度係'''$7'''。",
1115 -'userstatstext' => "目前有'''$1'''個註冊用戶,其中有'''$2'''人(即'''$4%''')係$5。",
 1128+'userstatstext' => "目前有'''$1'''個註冊[[Special:Listusers|用戶]],其中有'''$2'''人(即'''$4%''')有$5權限。",
11161129 'statistics-mostpopular' => '最多人睇嘅頁',
11171130
11181131 'disambiguations' => '搞清楚頁',
@@ -1350,7 +1363,6 @@
13511364 'deletionlog' => '刪除日誌',
13521365 'reverted' => '恢復到先前嘅修訂',
13531366 'deletecomment' => '刪除原因',
1354 -'imagereverted' => '恢復到先前版本嘅操作已經成功。',
13551367 'rollback' => '還原修改',
13561368 'rollback_short' => '還原',
13571369 'rollbacklink' => '還原',
Index: branches/liquidthreads/languages/messages/MessagesZh_tw.php
@@ -357,7 +357,7 @@
358358 'filedeleteerror' => '無法刪除檔案"$1"。',
359359 'directorycreateerror' => '無法建立目錄"$1"。',
360360 'filenotfound' => '找不到檔案"$1"。',
361 -'fileexists' => '無法寫入檔案"$1": 檔案已存在',
 361+'fileexistserror' => '無法寫入檔案"$1": 檔案已存在',
362362 'unexpected' => '不正常值:"$1"="$2"。',
363363 'formerror' => '錯誤:無法提交表單',
364364 'badarticleerror' => '無法在本頁上進行此項操作。',
@@ -952,14 +952,17 @@
953953 'imgdelete' => '刪除',
954954 'imgdesc' => '描述',
955955 'imgfile' => '檔案',
956 -'imglegend' => '說明: (描述) = 顯示/編輯檔案描述。',
957 -'imghistory' => '檔案歷史',
958 -'revertimg' => '恢復',
959 -'deleteimg' => '刪除',
960 -'deleteimgcompletely' => '刪除此檔案的所有修訂版本',
961 -'imghistlegend' => '說明: (當前) = 這是當前檔案,(刪除) = 刪除此舊版本,
962 -(恢復 = 恢復到此舊版本。
963 -<br /><i>點擊日期檢視當天上載的檔案</i>。',
 956+'filehist' => '檔案歷史',
 957+'filehist-help' => '點擊日期/時間以檢視當時出現過的檔案。',
 958+'filehist-deleteall' => '刪除全部',
 959+'filehist-deleteone' => '刪除這個',
 960+'filehist-revert' => '恢復',
 961+'filehist-current' => '當前',
 962+'filehist-datetime' => '日期/時間',
 963+'filehist-user' => '用戶',
 964+'filehist-dimensions' => '維度',
 965+'filehist-filesize' => '檔案大小',
 966+'filehist-comment' => '註解',
964967 'imagelinks' => '連結',
965968 'linkstoimage' => '以下頁面連接到本檔案:',
966969 'nolinkstoimage' => '沒有頁面連接到本檔案。',
@@ -976,6 +979,16 @@
977980 'imagelist_description' => '描述',
978981 'imagelist_search_for' => '按圖像名稱搜索:',
979982
 983+# File reversion
 984+'filerevert' => '恢復$1',
 985+'filerevert-legend' => '恢復檔案',
 986+'filerevert-intro' => "<span class=\"plainlinks\">您現正在恢復'''[[Media:$1|$1]]'''到[於$2 $3的$4版本]。</span>",
 987+'filerevert-comment' => '註解:',
 988+'filerevert-defaultcomment' => '已經恢復到於$1 $2的版本',
 989+'filerevert-submit' => '恢復',
 990+'filerevert-success' => "<span class=\"plainlinks\">'''[[Media:$1|$1]]'''已經恢復到[於$2 $3的$4版本]。</span>",
 991+'filerevert-badversion' => '這個檔案所提供的時間截記並無先前的本地版本。',
 992+
980993 # MIME search
981994 'mimesearch' => 'MIME 搜索',
982995 'mimesearch-summary' => '本頁面啟用檔案MIME類型過濾器。輸入︰內容類型/子類型,如 <tt>image/jpeg</tt>。',
@@ -1011,7 +1024,7 @@
10121025 即每頁平均編輯'''\$5'''次,各次編輯後頁面的每個版本平均瀏覽'''\$6'''次。
10131026
10141027 [http://meta.wikimedia.org/wiki/Help:Job_queue 工作隊列]的長度是'''\$7'''。",
1015 -'userstatstext' => "網站有'''$1'''位註冊用戶,其中
 1028+'userstatstext' => "網站有'''$1'''位註冊[[Special:Listusers|用戶]],其中
10161029 '''$2''' (或 '''$4%''') 有$5許可權。",
10171030 'statistics-mostpopular' => '被查閱次數最多的頁面',
10181031
@@ -1251,7 +1264,6 @@
12521265 'deletionlog' => '刪除紀錄',
12531266 'reverted' => '恢復到早期版本',
12541267 'deletecomment' => '刪除理由',
1255 -'imagereverted' => '恢復到早期版本操作完成。',
12561268 'rollback' => '恢復',
12571269 'rollback_short' => '恢復',
12581270 'rollbacklink' => '恢復',
Index: branches/liquidthreads/languages/messages/MessagesZh_classical.php
@@ -201,7 +201,7 @@
202202 'navigation' => '導',
203203
204204 # Metadata in edit box
205 -'metadata_help' => '衍意,見[[{{ns:project}}:Metadata]]',
 205+'metadata_help' => '衍意:',
206206
207207 'errorpagetitle' => '誤',
208208 'returnto' => '返$1。',
@@ -257,28 +257,29 @@
258258
259259 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
260260 'aboutsite' => '關於 {{SITENAME}}',
261 -'aboutpage' => '{{ns:project}}:相關',
 261+'aboutpage' => 'Project:相關',
262262 'bugreports' => '稟明錯漏',
263 -'bugreportspage' => '{{ns:project}}:錯漏集',
 263+'bugreportspage' => 'Project:錯漏集',
264264 'copyright' => '文悉釋以$1。',
265265 'copyrightpagename' => '{{SITENAME}}版權',
266 -'copyrightpage' => '{{ns:project}}:版權',
 266+'copyrightpage' => 'Project:版權',
267267 'currentevents' => '世事',
268268 'currentevents-url' => '天下大事',
269269 'disclaimers' => '免責告示',
270 -'disclaimerpage' => '{{ns:project}}:免責告示',
 270+'disclaimerpage' => 'Project:免責告示',
271271 'edithelp' => '助',
272272 'edithelppage' => '{{ns:help}}:修',
273273 'faq' => '頻答問',
274 -'faqpage' => '{{ns:project}}:頻答問集',
 274+'faqpage' => 'Project:頻答問集',
275275 'helppage' => 'Help:目錄',
276276 'mainpage' => '卷首',
 277+'policy-url' => 'Project:策',
277278 'portal' => '市集',
278 -'portal-url' => '{{ns:project}}:市集',
 279+'portal-url' => 'Project:市集',
279280 'privacy' => '隱私通例',
280 -'privacypage' => '{{ns:project}}:隱私通例',
 281+'privacypage' => 'Project:隱私通例',
281282 'sitesupport' => '捐助',
282 -'sitesupport-url' => '{{ns:project}}:捐助集',
 283+'sitesupport-url' => 'Project:捐助集',
283284
284285 'badaccess' => '子未逮',
285286 'badaccess-group0' => '子未逮,歉限之。',
@@ -349,7 +350,7 @@
350351 'filedeleteerror' => '"$1"未可刪。',
351352 'directorycreateerror' => '"$1"之目莫能立也。',
352353 'filenotfound' => '未見"$1"。',
353 -'fileexists' => '"$1"檔莫之能書︰蓋因其檔已在',
 354+'fileexistserror' => '"$1"檔莫之能書︰蓋因其檔已在',
354355 'unexpected' => '異數,"$1"="$2"。',
355356 'formerror' => '有誤:表未可呈',
356357 'badarticleerror' => '此頁莫為之',
@@ -475,7 +476,7 @@
476477 終止之時為:$6<br />
477478 見禁之人:$7
478479
479 -存惑可詢$1,或[[{{ns:project}}:Administrators|有秩]],[[Special:Preferences|簿註]]無驛則信不遣。
 480+存惑可詢$1,或[[{{MediaWiki:grouppage-sysop}}|有秩]],[[Special:Preferences|簿註]]無驛則信不遣。
480481 另,子IP為$3,其簿名為#$5。詢時切附之。",
481482 'blockedoriginalsource' => "'''$1'''本源如下:",
482483 'blockededitsource' => "子'''$1纂文'''如下:",
@@ -611,7 +612,7 @@
612613
613614 # Search results
614615 'searchresults' => '得尋',
615 -'searchresulttext' => '何索{{SITENAME}},詳見[[{{ns:project}}:Searching|索{{SITENAME}}]]。',
 616+'searchresulttext' => '何索{{SITENAME}},詳見[[{{MediaWiki:helppage}}|{{int:help}}]]。',
616617 'searchsubtitle' => "'''[[:$1]]'''尋焉",
617618 'searchsubtitleinvalid' => "'''$1'''索焉",
618619 'badquery' => '問尋有誤',
@@ -775,8 +776,19 @@
776777 'bydate' => '以日',
777778 'bysize' => '以量',
778779 'imgdelete' => '刪',
779 -'imghistory' => '圖像沿革',
780 -'deleteimg' => '刪',
 780+'imgdesc' => '述',
 781+'imgfile' => '檔',
 782+'filehist' => '檔案沿革',
 783+'filehist-help' => '擊日時,察時現檔。',
 784+'filehist-deleteall' => '刪全',
 785+'filehist-deleteone' => '刪此',
 786+'filehist-revert' => '還',
 787+'filehist-current' => '現',
 788+'filehist-datetime' => '日時',
 789+'filehist-user' => '薄',
 790+'filehist-dimensions' => '度',
 791+'filehist-filesize' => '檔量',
 792+'filehist-comment' => '注',
781793 'imagelinks' => '通',
782794 'shareduploadwiki' => '欲知更多,請詳閱$1。',
783795 'shareduploadwiki-linktext' => '文件描述頁',
@@ -787,6 +799,16 @@
788800 'imagelist_description' => '述',
789801 'imagelist_search_for' => '以圖名尋:',
790802
 803+# File reversion
 804+'filerevert' => '還$1',
 805+'filerevert-legend' => '還檔',
 806+'filerevert-intro' => "<span class=\"plainlinks\">汝還'''[[Media:$1|$1]]'''至[在$2$3之$4版本]。</span>",
 807+'filerevert-comment' => '注:',
 808+'filerevert-defaultcomment' => '已還至在$1$2之版矣',
 809+'filerevert-submit' => '還',
 810+'filerevert-success' => "<span class=\"plainlinks\">'''[[Media:$1|$1]]'''已還[在$2$3之$4版本]矣。</span>",
 811+'filerevert-badversion' => '此檔之時印無本地之前版也。',
 812+
791813 # Unwatched pages
792814 'unwatchedpages' => '無哨',
793815
@@ -797,7 +819,7 @@
798820 'sitestatstext' => "庫藏共'''$1'''頁,除議、釋、芻文、轉與不濟者,有足文$2、獻品'''$8'''。
799821 自大典始焉,閱頁'''$3''',纂文'''$4'''。均之則每頁'''$5'''覽,每文'''$6'''纂。
800822 [http://meta.wikimedia.org/wiki/Help:Job_queue job queue]長'''$7'''",
801 -'userstatstext' => "有簿者'''$1''',中有'''$2'''人為$5,計有百分之'''$4'''。",
 823+'userstatstext' => "有[[Special:Listusers|簿]]者'''$1''',中有'''$2'''人有$5之權,計有百分之'''$4'''。",
802824 'statistics-mostpopular' => '首博之頁',
803825
804826 'disambiguations' => '釋義',
@@ -944,12 +966,12 @@
945967 'deletepage' => '刪頁',
946968 'confirm' => '准',
947969 'excontent' => "文乃:'$1'",
948 -'excontentauthor' => "文乃:'$1' (而[[Special:Contributions/$2|$2]]'者,為僅有之與者也)",
 970+'excontentauthor' => "文乃:'$1' (而[[Special:Contributions/$2|$2]]者,為僅有之與者也)",
949971 'exblank' => '缺頁',
950972 'confirmdelete' => '准刪',
951973 'deletesub' => '("$1",正刪之)',
952974 'historywarning' => '警:欲刪之頁有誌:',
953 -'confirmdeletetext' => '子若欲久刪此物與其誌,知後果、合[[{{ns:project}}:Policy]]後再為之。',
 975+'confirmdeletetext' => '子若欲久刪此物與其誌,知後果、合[[{{MediaWiki:policy-url}}]]後再為之。',
954976 'actioncomplete' => '已矣',
955977 'deletedtext' => '"$1"刪矣,見誌於$2。',
956978 'deletedarticle' => '"[[$1]]"刪矣',
@@ -958,7 +980,6 @@
959981 'deletionlog' => '誌刪',
960982 'reverted' => '還',
961983 'deletecomment' => '註刪',
962 -'imagereverted' => '還矣',
963984 'rollback' => '退修',
964985 'rollback_short' => '退',
965986 'rollbacklink' => '退',
@@ -1358,7 +1379,7 @@
13591380 'watchlistedit-normal-done' => '$1題之哨已撤:',
13601381 'watchlistedit-raw-title' => '治源哨',
13611382 'watchlistedit-raw-legend' => '治源哨',
1362 -'watchlistedit-raw-explain' => '此列有哨之題,治此表以加減題;一行一題之。善,擊更哨。亦[[[Special:Watchlist/edit|標準治哨]]也。',
 1383+'watchlistedit-raw-explain' => '此列有哨之題,治此表以加減題;一行一題之。善,擊更哨。亦[[Special:Watchlist/edit|標準治哨]]也。',
13631384 'watchlistedit-raw-titles' => '題:',
13641385 'watchlistedit-raw-submit' => '更哨',
13651386 'watchlistedit-raw-done' => '爾哨已更也。',
@@ -1372,3 +1393,5 @@
13731394 'watchlisttools-clear' => '清哨',
13741395
13751396 );
 1397+
 1398+
Index: branches/liquidthreads/languages/messages/MessagesDe.php
@@ -439,7 +439,7 @@
440440 'filedeleteerror' => 'Die Datei „$1“ konnte nicht gelöscht werden.',
441441 'directorycreateerror' => 'Das Verzeichnis „$1“ konnte nicht angelegt werden.',
442442 'filenotfound' => 'Die Datei „$1“ wurde nicht gefunden.',
443 -'fileexists' => 'In die Datei „$1“ konnte nicht geschrieben werden, da die Datei bereits vorhanden ist.',
 443+'fileexistserror' => 'In die Datei „$1“ konnte nicht geschrieben werden, da die Datei bereits vorhanden ist.',
444444 'unexpected' => 'Unerwarteter Wert: „$1“=„$2“.',
445445 'formerror' => 'Fehler: Die Eingaben konnten nicht verarbeitet werden.',
446446 'badarticleerror' => 'Diese Aktion kann auf diese Seite nicht angewendet werden.',
@@ -615,7 +615,7 @@
616616 *Sperre betrifft: $7
617617 *Sperr-ID: #$5
618618 </div>',
619 -'autoblockedtext' => 'Ihre IP-Adresse wurde automatisch gesperrt, da sie von einem anderen Benutzer genutzt wurde, der durch $1 gesperrt wurde.
 619+'autoblockedtext' => 'Ihre IP-Adresse wurde automatisch gesperrt, da sie von einem anderen Benutzer genutzt wurde, der durch $1 gesperrt wurde.
620620 Als Grund wurde angegeben:
621621
622622 :\'\'$2\'\'
@@ -735,32 +735,32 @@
736736 Dies geschah vermutlich auf Grund von wiederholtem Vandalismus von Besuchern der Bildungseinrichtung oder anderen Benutzern des Internet-Service-Providers.',
737737
738738 # History pages
739 -'revhistory' => 'Frühere Versionen',
740 -'viewpagelogs' => 'Logbücher für diese Seite anzeigen',
741 -'nohistory' => 'Es gibt keine früheren Versionen dieser Seite.',
742 -'revnotfound' => 'Diese Version wurde nicht gefunden.',
743 -'revnotfoundtext' => 'Die Version dieser Seite, nach der Sie suchen, konnte nicht gefunden werden. Bitte überprüfen Sie die URL dieser Seite.',
744 -'loadhist' => 'Lade Liste mit früheren Versionen',
745 -'currentrev' => 'Aktuelle Version',
746 -'revisionasof' => 'Version vom $1',
747 -'revision-info' => 'Version vom $1 von $2',
748 -'previousrevision' => '← Nächstältere Version',
749 -'nextrevision' => 'Nächstjüngere Version →',
750 -'currentrevisionlink' => 'Aktuelle Version',
751 -'cur' => 'Aktuell',
752 -'next' => 'Nächste',
753 -'last' => 'Vorherige',
754 -'orig' => 'Original',
755 -'page_first' => 'Anfang',
756 -'page_last' => 'Ende',
757 -'histlegend' => 'Zur Anzeige der Änderungen einfach die zu vergleichenden Versionen auswählen und die Schaltfläche „{{int:compareselectedversions}}“ klicken.<br />
 739+'revhistory' => 'Frühere Versionen',
 740+'viewpagelogs' => 'Logbücher für diese Seite anzeigen',
 741+'nohistory' => 'Es gibt keine früheren Versionen dieser Seite.',
 742+'revnotfound' => 'Diese Version wurde nicht gefunden.',
 743+'revnotfoundtext' => 'Die Version dieser Seite, nach der Sie suchen, konnte nicht gefunden werden. Bitte überprüfen Sie die URL dieser Seite.',
 744+'loadhist' => 'Lade Liste mit früheren Versionen',
 745+'currentrev' => 'Aktuelle Version',
 746+'revisionasof' => 'Version vom $1',
 747+'revision-info' => 'Version vom $1 von $2',
 748+'previousrevision' => '← Nächstältere Version',
 749+'nextrevision' => 'Nächstjüngere Version →',
 750+'currentrevisionlink' => 'Aktuelle Version',
 751+'cur' => 'Aktuell',
 752+'next' => 'Nächste',
 753+'last' => 'Vorherige',
 754+'orig' => 'Original',
 755+'page_first' => 'Anfang',
 756+'page_last' => 'Ende',
 757+'histlegend' => 'Zur Anzeige der Änderungen einfach die zu vergleichenden Versionen auswählen und die Schaltfläche „{{int:compareselectedversions}}“ klicken.<br />
758758 * (Aktuell) = Unterschied zur aktuellen Version, (Vorherige) = Unterschied zur vorherigen Version
759759 * Uhrzeit/Datum = Version zu dieser Zeit, Benutzername/IP-Adresse des Bearbeiters, K = Kleine Änderung',
760 -'deletedrev' => '[gelöscht]',
761 -'histfirst' => 'Älteste',
762 -'histlast' => 'Neueste',
763 -'historysize' => '($1 Bytes)',
764 -'historyempty' => '(leer)',
 760+'deletedrev' => '[gelöscht]',
 761+'histfirst' => 'Älteste',
 762+'histlast' => 'Neueste',
 763+'historysize' => '($1 Bytes)',
 764+'historyempty' => '(leer)',
765765
766766 # Revision feed
767767 'history-feed-title' => 'Versionsgeschichte',
@@ -769,7 +769,6 @@
770770 'history-feed-empty' => 'Die angeforderte Seite existiert nicht. Vielleicht wurde sie gelöscht oder verschoben. [[Special:Search|Durchsuchen]] Sie {{SITENAME}} für passende neue Seiten.',
771771
772772 # Revision deletion
773 -'revisiondelete' => 'Versionen löschen/wiederherstellen',
774773 'rev-deleted-comment' => '(Bearbeitungskommentar entfernt)',
775774 'rev-deleted-user' => '(Benutzername entfernt)',
776775 'rev-deleted-event' => '(Aktion entfernt)',
@@ -779,6 +778,7 @@
780779 Als Administrator können Sie sie weiterhin einsehen.
781780 Nähere Angaben zum Löschvorgang sowie eine Begründung finden sich im [{{fullurl:Special:Log/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch].</div>',
782781 'rev-delundel' => 'zeige/verstecke',
 782+'revisiondelete' => 'Versionen löschen/wiederherstellen',
783783 'revdelete-nooldid-title' => 'Keine Version angegeben',
784784 'revdelete-nooldid-text' => 'Sie haben keine Version angegeben, auf die diese Aktion ausgeführt werden soll.',
785785 'revdelete-selected' => "{{PLURAL:$2|Ausgewählte Version|Ausgewählte Versionen}} von '''$1:'''",
@@ -1029,21 +1029,21 @@
10301030 'largefileserver' => 'Die Datei ist größer als die vom Server eingestellte Maximalgröße.',
10311031 'emptyfile' => 'Die hochgeladene Datei ist leer. Der Grund kann ein Tippfehler im Dateinamen sein. Bitte kontrollieren Sie, ob Sie die Datei wirklich hochladen wollen.',
10321032 'fileexists' => 'Eine Datei mit diesem Namen existiert bereits. Wenn Sie auf „Datei speichern“ klicken, wird die Datei überschrieben. Bitte prüfen Sie <strong><tt>$1</tt></strong>, wenn Sie sich nicht sicher sind.',
1033 -'fileexists-extension' => "Eine Datei mit ähnlichem Namen existiert bereits:<br />
 1033+'fileexists-extension' => 'Eine Datei mit ähnlichem Namen existiert bereits:<br />
10341034 Name der hochzuladenden Datei: <strong><tt>$1</tt></strong><br />
10351035 Name der vorhandenen Datei: <strong><tt>$2</tt></strong><br />
1036 -Nur die Dateiendung unterscheidet sich in Groß-/Kleinschreibung. Bitte prüfen Sie, ob die Dateien inhaltlich identisch sind.",
 1036+Nur die Dateiendung unterscheidet sich in Groß-/Kleinschreibung. Bitte prüfen Sie, ob die Dateien inhaltlich identisch sind.',
10371037 'fileexists-thumb' => "'''<center>Vorhandenes Bild</center>'''",
1038 -'fileexists-thumbnail-yes' => "Bei der Datei scheint es sich um ein Bild verringerter Größe <i>(thumbnail)</i> zu handeln. Bitte prüfen Sie die Datei <strong><tt>$1</tt></strong>.<br />
1039 -Wenn es sich um das Bild in Originalgröße handelt, so braucht kein separates Vorschaubild hochgeladen zu werden.",
1040 -'file-thumbnail-no' => "Der Dateiname beginnt mit <strong><tt>$1</tt></strong>. Dies deutet auf ein Bild verringerter Größe <i>(thumbnail)</i> hin.
1041 -Bitte prüfen Sie, ob Sie das Bild in voller Auflösung vorliegen haben und laden Sie dieses unter dem Originalnamen hoch.",
 1038+'fileexists-thumbnail-yes' => 'Bei der Datei scheint es sich um ein Bild verringerter Größe <i>(thumbnail)</i> zu handeln. Bitte prüfen Sie die Datei <strong><tt>$1</tt></strong>.<br />
 1039+Wenn es sich um das Bild in Originalgröße handelt, so braucht kein separates Vorschaubild hochgeladen zu werden.',
 1040+'file-thumbnail-no' => 'Der Dateiname beginnt mit <strong><tt>$1</tt></strong>. Dies deutet auf ein Bild verringerter Größe <i>(thumbnail)</i> hin.
 1041+Bitte prüfen Sie, ob Sie das Bild in voller Auflösung vorliegen haben und laden Sie dieses unter dem Originalnamen hoch.',
10421042 'fileexists-forbidden' => 'Mit diesem Namen existiert bereits eine Datei. Bitte gehen Sie zurück und laden Ihre Datei unter einem anderen Namen hoch. [[Image:$1|thumb|center|$1]]',
10431043 'fileexists-shared-forbidden' => 'Mit diesem Namen existiert bereits eine Datei. Bitte gehen Sie zurück und laden Sie diese Datei unter einem anderen Namen hoch. [[Image:$1|thumb|center|$1]]',
10441044 'successfulupload' => 'Erfolgreich hochgeladen',
10451045 'uploadwarning' => 'Warnung',
10461046 'savefile' => 'Datei speichern',
1047 -'uploadedimage' => 'hat [[$1]] hochgeladen',
 1047+'uploadedimage' => 'hat „[[$1]]“ hochgeladen',
10481048 'uploaddisabled' => 'Entschuldigung, das Hochladen ist deaktiviert.',
10491049 'uploaddisabledtext' => 'Das Hochladen von Dateien ist in {{SITENAME}} deaktiviert.',
10501050 'uploadscripted' => 'Diese Datei enthält HTML- oder Scriptcode, der irrtümlich von einem Webbrowser ausgeführt werden könnte.',
@@ -1087,12 +1087,17 @@
10881088 'imgdelete' => 'Löschen',
10891089 'imgdesc' => 'Beschreibung',
10901090 'imgfile' => 'Datei',
1091 -'imglegend' => 'Legende: (Beschreibung) = Zeige/Bearbeite Dateibeschreibung.',
1092 -'imghistory' => 'Dateiversionen',
1093 -'revertimg' => 'Zurücksetzen',
1094 -'deleteimg' => 'Löschen',
1095 -'deleteimgcompletely' => 'Alle Versionen dieser Datei löschen',
1096 -'imghistlegend' => 'Legende: (Aktuell) = Dies ist die aktuelle Datei, (Löschen) = lösche diese alte Version, (Zurücksetzen) = verwende wieder diese alte Version.',
 1091+'filehist' => 'Dateiversionen',
 1092+'filehist-help' => 'Klicke auf einen Zeitpunkt, um die Dateiversion zu diesem Zeitpunkt darzustellen.',
 1093+'filehist-deleteall' => 'Alle Versionen löschen',
 1094+'filehist-deleteone' => 'Diese Version löschen',
 1095+'filehist-revert' => 'zurücksetzen',
 1096+'filehist-current' => 'aktuell',
 1097+'filehist-datetime' => 'Zeitpunkt',
 1098+'filehist-user' => 'Benutzer',
 1099+'filehist-dimensions' => 'Maße',
 1100+'filehist-filesize' => 'Dateigröße',
 1101+'filehist-comment' => 'Kommentar',
10971102 'imagelinks' => 'Verwendung',
10981103 'linkstoimage' => 'Die folgenden Seiten benutzen diese Datei:',
10991104 'nolinkstoimage' => 'Keine Seite benutzt diese Datei.',
@@ -1109,6 +1114,16 @@
11101115 'imagelist_description' => 'Beschreibung',
11111116 'imagelist_search_for' => 'Suche nach Datei:',
11121117
 1118+# File reversion
 1119+'filerevert' => 'Zurücksetzen von $1',
 1120+'filerevert-legend' => 'Datei zurücksetzen',
 1121+'filerevert-intro' => '<span class="plainlinks">Du setzt die Datei \'\'\'[[Media:$1|$1]]\'\'\' auf die [$4 Version vom $2, $3 Uhr] zurück.</span>',
 1122+'filerevert-comment' => 'Grund:',
 1123+'filerevert-defaultcomment' => 'zurückgesetzt auf die Version vom $1, $2 Uhr',
 1124+'filerevert-submit' => 'Zurücksetzen',
 1125+'filerevert-success' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\' wurde auf die [$4 Version vom $2, $3 Uhr] zurückgesetzt.</span>',
 1126+'filerevert-badversion' => 'Es gibt keine Version der Datei zu dem angegebenen Zeitpunkt.',
 1127+
11131128 # MIME search
11141129 'mimesearch' => 'Suche nach MIME-Typ',
11151130 'mimesearch-summary' => 'Auf dieser Spezialseite können die Dateien nach dem MIME-Typ gefiltert werden. Die Eingabe muss immer den Medien- und Subtyp beinhalten: <tt>image/jpeg</tt> (siehe Bildbeschreibungsseite).',
@@ -1216,7 +1231,7 @@
12171232 'prefixindex' => 'Alle Seiten (mit Präfix)',
12181233 'prefixindex-summary' => 'Diese Spezialseite zeigt alle Seiten, die mit der eingegebenen Zeichenfolge („Präfix“) beginnen. Die Ausgabe kann auf einen Namensraum eingeschränkt werden.',
12191234 'randompage' => 'Zufällige Seite',
1220 -'randompage-nopages' => 'In diesem Namensraum sind keine Seiten vorhanden.',
 1235+'randompage-nopages' => 'In diesem Namensraum sind keine Seiten vorhanden.',
12211236 'shortpages' => 'Kurze Seiten',
12221237 'shortpages-summary' => 'Diese Liste zeigt die kürzesten Seiten im Hauptnamensraum an. Gezählt werden die Zeichen des Textes wie er im Bearbeitungsfenster dargestellt wird, also in Wiki-Syntax und ohne die Inhalte eingebundener Vorlagen. Grundlage der Zählung ist der UTF-8-kodierte Text, nach dem beispielsweise deutsche Umlaute als zwei Zeichen gelten.',
12231238 'longpages' => 'Lange Seiten',
@@ -1260,7 +1275,7 @@
12611276 'alphaindexline' => '$1 bis $2',
12621277 'version' => 'Version',
12631278
1264 -# Special:Logs
 1279+# Special:Log
12651280 'specialloguserlabel' => 'Benutzer:',
12661281 'speciallogtitlelabel' => 'Titel:',
12671282 'log' => 'Logbücher',
@@ -1312,7 +1327,7 @@
13131328
13141329 # Watchlist
13151330 'watchlist' => 'Beobachtungsliste',
1316 -'mywatchlist' => 'Beobachtungsliste',
 1331+'mywatchlist' => 'Beobachtungsliste',
13171332 'watchlistfor' => "(für '''$1''')",
13181333 'nowatchlist' => 'Sie haben keine Einträge auf Ihrer Beobachtungsliste.',
13191334 'watchlistanontext' => 'Sie müssen sich $1, um Ihre Beobachtungsliste zu sehen oder Einträge auf ihr zu bearbeiten.',
@@ -1408,7 +1423,6 @@
14091424 'deletionlog' => 'Lösch-Logbuch',
14101425 'reverted' => 'Auf eine alte Version zurückgesetzt',
14111426 'deletecomment' => 'Grund der Löschung',
1412 -'imagereverted' => 'Auf eine alte Version zurückgesetzt.',
14131427 'rollback' => 'Zurücksetzen der Änderungen',
14141428 'rollback_short' => 'Zurücksetzen',
14151429 'rollbacklink' => 'Zurücksetzen',
@@ -1463,50 +1477,52 @@
14641478 'restriction-level-all' => 'alle',
14651479
14661480 # Undelete
1467 -'undelete' => 'Gelöschte Seite wiederherstellen',
1468 -'undeletepage' => 'Gelöschte Seite wiederherstellen',
1469 -'viewdeletedpage' => 'Gelöschte Seiten anzeigen',
1470 -'undeletepagetext' => 'Die folgenden Seiten wurden gelöscht und können von Administratoren wiederhergestellt werden:',
1471 -'undeleteextrahelp' => '* Um die Seite komplett mit allen Versionen wiederherzustellen, geben Sie bitte eine Begründung an und klicken auf „Wiederherstellen“.
 1481+'undelete' => 'Gelöschte Seite wiederherstellen',
 1482+'undeletepage' => 'Gelöschte Seite wiederherstellen',
 1483+'viewdeletedpage' => 'Gelöschte Seiten anzeigen',
 1484+'undeletepagetext' => 'Die folgenden Seiten wurden gelöscht und können von Administratoren wiederhergestellt werden:',
 1485+'undeleteextrahelp' => '* Um die Seite komplett mit allen Versionen wiederherzustellen, geben Sie bitte eine Begründung an und klicken auf „Wiederherstellen“.
14721486 * Möchten Sie nur bestimmte Versionen wiederherstellen, so wählen Sie diese bitte einzeln an Hand der Markierungen aus, geben eine Begründung an und klicken dann auf „Wiederherstellen“.
14731487 * „Abbrechen“ leert das Kommentarfeld und entfernt alle Markierungen bei den Versionen.',
1474 -'undeleterevisions' => '{{PLURAL:$1|1 Version|$1 Versionen}} archiviert',
1475 -'undeletehistory' => 'Wenn Sie diese Seite wiederherstellen, werden auch alle alten
 1488+'undeleterevisions' => '{{PLURAL:$1|1 Version|$1 Versionen}} archiviert',
 1489+'undeletehistory' => 'Wenn Sie diese Seite wiederherstellen, werden auch alle alten
14761490 Versionen wiederhergestellt. Wenn seit der Löschung eine neue Seite gleichen
14771491 Namens erstellt wurde, werden die wiederhergestellten Versionen chronologisch in die Versionsgeschichte eingeordnet.
14781492 Die aktuelle Version, die gegenwärtig live angezeigt wird, wird nicht automatisch durch eine wiederhergestellte Version ersetzt, falls diese jünger ist.
14791493 Sichtbarkeits-Einschränkungen an Dateiversionen gehen bei einer Wiederherstellung verloren.',
1480 -'undeleterevdel' => 'Die Wiederherstellung wird nicht durchgeführt, wenn die aktuellste Version versteckt ist oder versteckte Teile enthält.
 1494+'undeleterevdel' => 'Die Wiederherstellung wird nicht durchgeführt, wenn die aktuellste Version versteckt ist oder versteckte Teile enthält.
14811495 In diesem Fall darf die aktuellste Version nicht markiert werden oder ihr Status muss auf den einer normalen Version geändert werden.
14821496 Versionen von Dateien, auf die Sie keinen Zugriff haben, werden nicht wiederhergestellt.',
1483 -'undeletehistorynoadmin' => 'Diese Seite wurde gelöscht. Der Grund für die Löschung ist in der Zusammenfassung angegeben,
 1497+'undeletehistorynoadmin' => 'Diese Seite wurde gelöscht. Der Grund für die Löschung ist in der Zusammenfassung angegeben,
14841498 genauso wie Details zum letzten Benutzer der diese Seite vor der Löschung bearbeitet hat.
14851499 Der aktuelle Text der gelöschten Seite ist nur Administratoren zugänglich.',
1486 -'undelete-revision' => 'Gelöschte Version von $1 vom $2:',
1487 -'undeleterevision-missing' => 'Ungültige oder fehlende Version. Entweder ist der Link falsch oder die Version wurde aus dem Archiv wiederhergestellt oder entfernt.',
1488 -'undeletebtn' => 'Wiederherstellen',
1489 -'undeletereset' => 'Abbrechen',
1490 -'undeletecomment' => 'Begründung:',
1491 -'undeletedarticle' => 'hat „[[$1]]“ wiederhergestellt',
1492 -'undeletedrevisions' => '$1 Version(en) wurde(n) wiederhergestellt',
1493 -'undeletedrevisions-files' => '$1 Version(en) und $2 Datei(en) wurden wiederhergestellt',
1494 -'undeletedfiles' => '$1 Datei(en) wurde(n) wiederhergestellt',
1495 -'cannotundelete' => 'Wiederherstellung fehlgeschlagen; jemand anderes hat die Seite bereits wiederhergestellt.',
1496 -'undeletedpage' => "'''$1''' wurde wiederhergestellt.
 1500+'undelete-revision' => 'Gelöschte Version von $1 vom $2:',
 1501+'undeleterevision-missing' => 'Ungültige oder fehlende Version. Entweder ist der Link falsch oder die Version wurde aus dem Archiv wiederhergestellt oder entfernt.',
 1502+'undeletebtn' => 'Wiederherstellen',
 1503+'undeletereset' => 'Abbrechen',
 1504+'undeletecomment' => 'Begründung:',
 1505+'undeletedarticle' => 'hat „[[$1]]“ wiederhergestellt',
 1506+'undeletedrevisions' => '$1 Version(en) wurde(n) wiederhergestellt',
 1507+'undeletedrevisions-files' => '$1 Version(en) und $2 Datei(en) wurden wiederhergestellt',
 1508+'undeletedfiles' => '$1 Datei(en) wurde(n) wiederhergestellt',
 1509+'cannotundelete' => 'Wiederherstellung fehlgeschlagen; jemand anderes hat die Seite bereits wiederhergestellt.',
 1510+'undeletedpage' => "'''$1''' wurde wiederhergestellt.
14971511
14981512 Im [[Special:Log/delete|Lösch-Logbuch]] finden Sie eine Übersicht der gelöschten und wiederhergestellten Seiten.",
1499 -'undelete-header' => 'Siehe das [[{{ns:special}}:Log/delete|Lösch-Logbuch]] für kürzlich gelöschte Seiten.',
1500 -'undelete-search-box' => 'Suche nach gelöschten Seiten',
1501 -'undelete-search-prefix' => 'Suchbegriff (Wortanfang ohne Wildcards):',
1502 -'undelete-search-submit' => 'Suche',
1503 -'undelete-no-results' => 'Es wurde im Archiv keine zum Suchbegriff passende Seite gefunden.',
1504 -'undelete-filename-mismatch' => 'Die Dateiversion mit dem Zeitstempel $1 konnte nicht wiederhergestellt werden: Die Dateinamen passen nicht zueinander.',
1505 -'undelete-bad-store-key' => 'Die Dateiversion mit dem Zeitstempel $1 konnte nicht wiederhergestellt werden: Die Datei war bereits vor dem Löschen nicht mehr vorhanden.',
1506 -'undelete-cleanup-error' => 'Fehler beim Löschen der unbenutzten Archiv-Version $1.',
 1513+'undelete-header' => 'Siehe das [[{{ns:special}}:Log/delete|Lösch-Logbuch]] für kürzlich gelöschte Seiten.',
 1514+'undelete-search-box' => 'Suche nach gelöschten Seiten',
 1515+'undelete-search-prefix' => 'Suchbegriff (Wortanfang ohne Wildcards):',
 1516+'undelete-search-submit' => 'Suche',
 1517+'undelete-no-results' => 'Es wurde im Archiv keine zum Suchbegriff passende Seite gefunden.',
 1518+'undelete-filename-mismatch' => 'Die Dateiversion mit dem Zeitstempel $1 konnte nicht wiederhergestellt werden: Die Dateinamen passen nicht zueinander.',
 1519+'undelete-bad-store-key' => 'Die Dateiversion mit dem Zeitstempel $1 konnte nicht wiederhergestellt werden: Die Datei war bereits vor dem Löschen nicht mehr vorhanden.',
 1520+'undelete-cleanup-error' => 'Fehler beim Löschen der unbenutzten Archiv-Version $1.',
15071521 'undelete-missing-filearchive' => 'Die Datei mit der Archiv-ID $1 kann nicht wiederhergestellt werden, da sie nicht in der Datenbank vorhanden ist. Möglicherweise wurde sie bereits wiederhergestellt.',
1508 -'undelete-error-short' => 'Fehler beim Wiederherstellen der Datei $1',
1509 -'undelete-error-long' => "Es wurden Fehler beim Wiederherstellen einer Datei festgestellt:\n\n$1\n",
 1522+'undelete-error-short' => 'Fehler beim Wiederherstellen der Datei $1',
 1523+'undelete-error-long' => 'Es wurden Fehler beim Wiederherstellen einer Datei festgestellt:
15101524
 1525+$1',
 1526+
15111527 # Namespace form on various pages
15121528 'namespace' => 'Namensraum:',
15131529 'invert' => 'Auswahl umkehren',
@@ -1519,7 +1535,6 @@
15201536 'ucnote' => 'Dies sind die letzten <b>$1</b> Beiträge des Benutzers in den letzten <b>$2</b> Tagen.',
15211537 'uclinks' => 'Zeige die letzten $1 Beiträge; zeige die letzten $2 Tage.',
15221538 'uctop' => ' (aktuell)',
1523 -
15241539 'month' => 'ab Monat (und vorher):',
15251540 'year' => 'ab Jahr (und vorher):',
15261541
@@ -1581,7 +1596,7 @@
15821597 'ipboptions' => '1 Stunde:1 hour,2 Stunden:2 hours,6 Stunden:6 hours,1 Tag:1 day,3 Tage:3 days,1 Woche:1 week,2 Wochen:2 weeks,1 Monat:1 month,3 Monate:3 months,1 Jahr:1 year,Unbeschränkt:infinite',
15831598 'ipbotheroption' => 'Andere Dauer',
15841599 'ipbotherreason' => 'Andere/ergänzende Begründung:',
1585 -'ipbhidename' => 'Benutzername/IP-Adresse im Sperr-Logbuch, der Liste aktiver Sperren und dem Benutzerverzeichnis verstecken.',
 1600+'ipbhidename' => 'Benutzername/IP-Adresse im Sperr-Logbuch, der Liste aktiver Sperren und dem Benutzerverzeichnis verstecken.',
15861601 'badipaddress' => 'Die IP-Adresse hat ein falsches Format.',
15871602 'blockipsuccesssub' => 'Sperre erfolgreich',
15881603 'blockipsuccesstext' => 'Der Benutzer/die IP-Adresse [[{{ns:special}}:Contributions/$1|$1]] wurde gesperrt und die Aktion im [[{{ns:special}}:Log/block|Benutzersperr-Logbuch]] protokolliert
@@ -1665,7 +1680,7 @@
16661681 'move-watch' => 'Diese Seite beobachten',
16671682 'movepagebtn' => 'Seite verschieben',
16681683 'pagemovedsub' => 'Verschiebung erfolgreich',
1669 -'movepage-moved' => "<big>'''Die Seite „$1“ wurde nach „$2“ verschoben.'''</big>", # The two titles are passed in plain text as $3 and $4 to allow additional goodies in the message
 1684+'movepage-moved' => "<big>'''Die Seite „$1“ wurde nach „$2“ verschoben.'''</big>", # The two titles are passed in plain text as $3 and $4 to allow additional goodies in the message.
16701685 'articleexists' => 'Unter diesem Namen existiert bereits eine Seite.
16711686 Bitte wählen Sie einen anderen Namen.',
16721687 'talkexists' => 'Die Seite selbst wurde erfolgreich verschoben, aber die zugehörige Diskussions-Seite nicht, da bereits eine mit dem neuen Titel existiert. Bitte gleichen Sie die Inhalte von Hand ab.',
@@ -1892,8 +1907,16 @@
18931908 'patrol-log-diff' => 'Version $1',
18941909
18951910 # Image deletion
1896 -'deletedrevision' => 'Alte Version $1 gelöscht.',
 1911+'deletedrevision' => 'alte Version $1 gelöscht.',
 1912+'filedeleteerror-short' => 'Fehler beim Datei-Löschen: $1',
 1913+'filedeleteerror-long' => 'Beim Datei-Löschen wurden Fehler festgestellt:
18971914
 1915+$1',
 1916+'filedelete-missing' => 'Die Datei „$1“ kann nicht gelöscht werden, da sie nicht vorhanden ist.',
 1917+'filedelete-old-unregistered' => 'Die angegebene Datei-Version „$1“ ist nicht in der Datenbank vorhanden.',
 1918+'filedelete-current-unregistered' => 'Die angegebene Datei „$1“ ist nicht in der Datenbank vorhanden.',
 1919+'filedelete-archive-read-only' => 'Das Archiv-Verzeichnis „$1“ ist für den Webserver nicht beschreibbar.',
 1920+
18981921 # Browsing diffs
18991922 'previousdiff' => '← Zum vorherigen Versionsunterschied',
19001923 'nextdiff' => 'Zum nächsten Versionsunterschied →',
@@ -2280,7 +2303,7 @@
22812304 # Auto-summaries
22822305 'autosumm-blank' => 'Die Seite wurde geleert.',
22832306 'autosumm-replace' => "Der Seiteninhalt wurde durch einen anderen Text ersetzt: '$1'",
2284 -'autoredircomment' => 'Weiterleitung nach [[$1]] erstellt', # This should be changed to the new naming convention, but existed beforehand
 2307+'autoredircomment' => 'Weiterleitung nach [[$1]] erstellt',
22852308 'autosumm-new' => 'Die Seite wurde neu angelegt: $1',
22862309
22872310 # Size units
Index: branches/liquidthreads/languages/messages/MessagesLo.php
@@ -3,7 +3,6 @@
44 *
55 * @addtogroup Language
66 *
7 - * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
87 */
98 $digitTransformTable = array(
109 '0' => '໐', # &#x0ed0;
@@ -18,4 +17,676 @@
1918 '9' => '໙', # &#x0ed9;
2019 );
2120
 21+$messages = array(
 22+# User preference toggles
 23+'tog-hideminor' => 'ເຊື່ອງການດັດແກ້ເລັກນ້ອຍ ໃນ ການປ່ຽນແປງຫຼ້າສຸດ',
 24+'tog-extendwatchlist' => 'ຂະຫຍາຍ ລາຍການຕິດຕາມ ເພື່ອ ສະແດງທຸກໆການປ່ຽນແປງ',
 25+'tog-usenewrc' => 'ສະແດງ ການປ່ຽນແປງຫຼ້າສຸດ ເປັນສີເຂັ້ມ (JavaScript)',
 26+'tog-showtoolbar' => 'ສະແດງ ທູລບາດັດແກ້ (JavaScript)',
 27+'tog-editondblclick' => 'ໃຫ້ສາມາດດັດແກ້ ໂດຍ ດັບເບິລ໌ ຄລິກ (JavaScript)',
 28+'tog-editsection' => 'ໃຫ້ສາມາດ ດັດແກ້ເປັນພາກ ໂດຍ ກົດລິ້ງຄ໌ [ດັດແກ້]',
 29+'tog-editsectiononrightclick' => 'ໃຫ້ສາມາດ ດັດແກ້ ໂດຍກົດປຸ່ມຂວາ ຂອງເມົາສ໌ ຢູ່ <br /> ຫົວຂໍ້ຂອງພາກ (JavaScript)',
 30+'tog-rememberpassword' => 'ຈົດຈໍາການເຊັນເຂົ້າຂອງຂ້ອຍ ຢູ່ ຄອມພິວເຕີໜ່ວຍນີ້',
 31+'tog-editwidth' => 'ໃຫ້ ຊ່ອງດັດແກ້ ກ້ວາງທີ່ສຸດ',
 32+'tog-watchcreations' => 'ເພີ່ມ ໜ້າທີ່ຂ້ອຍສ້າງ ເຂົ້າໃນ ລາຍການຕິດຕາມ ຂອງ ຂ້ອຍ',
 33+'tog-watchdefault' => 'ເພີ່ມໜ້າ ທີ່ ຂ້ອຍດັດແກ້ ໃສ່ ລາຍຕິດຕາມ ຂອງ ຂ້ອຍ',
 34+'tog-watchmoves' => 'ເພີ່ມ ໜ້າທີ່ຂອ້ຍຍ້າຍ ໃສ່ ລາຍການຕິດຕາມຂອງຂ້ອຍ',
 35+'tog-watchdeletion' => 'ເພີ່ມ ໜ້າ ທີ່ຂ້ອຍລຶບ ໃສ່ ລາຍການຕິດຕາມ ຂອງ ຂ້ອຍ',
 36+'tog-minordefault' => 'ຖ້າບໍ່ມີການຕັ້ງ ກຳໜົດໃຫ້ທຸກໆການດັດແກ້ ເປັນ ການດັດແກ້ເລັກນ້ອຍ',
 37+'tog-previewontop' => 'ສະແດງ ຜົນການດັດແກ້ ເທິງ ຊ່ອງດັດແກ້',
 38+'tog-previewonfirst' => 'ສະແດງ ຜົນການດັດແກ້ ໃນ ເວລາດັດແກ້ເທື່ອທຳອິດ',
 39+'tog-enotifwatchlistpages' => 'ສົ່ງອີເມລມາໃຫ້ຂ້ອຍ ເມື່ອ ໜ້າທີ່ຂ້ອຍຕິດຕາມໄດ້ຖືກປ່ຽນແປງ',
 40+'tog-enotifusertalkpages' => 'ສົ່ງ ອີເມລ ມາໃຫ້ ຂ້ອຍ ເວລາ ໜ້າສົນທະນາຂ້ອຍ ມີການປ່ຽນແປງ',
 41+'tog-externaleditor' => 'ໃຊ້ ເອດິດເຕີທາງນອກ ຖ້າບໍ່ມີການຕັ້ງ',
 42+'tog-externaldiff' => 'ໃຊ້ ສ່ວນຕ່າງທາງນອກ ຖ້າບໍ່ມີ ການກຳໜົດ',
 43+'tog-forceeditsummary' => 'ເຕື່ອນຂ້ອຍ ຖ້າບໍ່ໄດ້ຂຽນຫຍັງໃສ່ ຊ່ອງ ສະຫຼຸບການດັດແກ້',
 44+'tog-watchlisthideown' => 'ເຊື່ອງ ການດັດແກ້ໂດຍຂ້ອຍ ໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ',
 45+'tog-watchlisthidebots' => 'ເຊື່ອງ ການດັດແກ້ ໂດຍ ບອທ໌ ໃນລາຍການຕິດຕາມຂອງຂ້ອຍ',
 46+'tog-watchlisthideminor' => 'ເຊື່ອງ ການດັດແກ້ເລັກນ້ອຍ ໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ',
 47+'tog-ccmeonemails' => 'ສົ່ງສຳເນົາ ອີເມລ ທີ່ ຂ້ອຍສົ່ງຫາຜູ້ອື່ນ ໃຫ້ ຂ້ອຍ',
2248
 49+'skinpreview' => '(ລອງເບິ່ງ)',
 50+
 51+# Dates
 52+'january' => 'ມັງກອນ',
 53+'february' => 'ກຸມພາ',
 54+'march' => 'ມີນາ',
 55+'april' => 'ເມສາ',
 56+'may_long' => 'ພຶດສະພາ',
 57+'june' => 'ມີຖຸນາ',
 58+'july' => 'ກໍລະກົດ',
 59+'august' => 'ສິງຫາ',
 60+'september' => 'ກັນຍາ',
 61+'october' => 'ຕຸລາ',
 62+'november' => 'ພະຈິກ',
 63+'december' => 'ທັນວາ',
 64+'may-gen' => 'ພຶດສະພາ',
 65+'jan' => 'ມັງກອນ',
 66+'feb' => 'ກຸມພາ',
 67+'may' => 'ພຶດສະພາ',
 68+
 69+# Bits of text used by many pages
 70+'categories' => 'ໝວດ',
 71+'pagecategories' => 'ໝວດ',
 72+'category_header' => 'ບົດຄວາມໃນໝວດ "$1"',
 73+'subcategories' => 'ໝວດຍ່ອຍ',
 74+
 75+'about' => 'ກ່ຽວກັບ',
 76+'article' => 'ໜ້າເນື້ອໃນ',
 77+'newwindow' => '(ເປີດເປັນ ປ່ອງຢ້ຽມ(ວິນໂດ)ໃໝ່ )',
 78+'cancel' => 'ລົບລ້າງ',
 79+'qbspecialpages' => 'ໜ້າພິເສດ',
 80+'mypage' => 'ໜ້າຂ້ອຍ',
 81+'mytalk' => 'ສົນທະນາຂ້ອຍ',
 82+'anontalk' => 'ສົນທະນາ ສຳຫຼັບ IP ນີ້',
 83+'navigation' => 'ນຳທິດ',
 84+
 85+'returnto' => 'ກັບໄປ $1.',
 86+'help' => 'ຊ່ອຍເຫຼືອ',
 87+'search' => 'ຊອກຫາ',
 88+'searchbutton' => 'ຊອກຫາ',
 89+'searcharticle' => 'ໄປ',
 90+'history' => 'ປະຫວັດການດັດແກ້',
 91+'history_short' => 'ປະຫວັດການດັດແກ້',
 92+'printableversion' => 'ສະບັບພິມໄດ້',
 93+'permalink' => 'ລິ້ງຄ໌ຖາວອນ',
 94+'edit' => 'ດັດແກ້',
 95+'editthispage' => 'ດັດແກ້ໜ້ານີ້',
 96+'delete' => 'ລຶບ',
 97+'deletethispage' => 'ລຶບໜ້ານີ້',
 98+'protect' => 'ປົກປ້ອງ',
 99+'newpage' => 'ໜ້າໃໝ່',
 100+'talkpage' => 'ປຶກສາຫາລືໜ້ານີ້',
 101+'talkpagelinktext' => 'ສົນທະນາ',
 102+'articlepage' => 'ເບິ່ງໜ້າເນື້ອໃນ',
 103+'talk' => 'ສົນທະນາ',
 104+'toolbox' => 'ກັບອຸບປະກອນ',
 105+'templatepage' => 'ເບິ່ງໜ້າແມ່ແບບ',
 106+'categorypage' => 'ເບິ່ງ ໜ້າ ໝວດ',
 107+'otherlanguages' => 'ເປັນພາສາອື່ນໆ',
 108+'redirectedfrom' => '(ໂອນມາຈາກ $1)',
 109+'viewcount' => 'ໜ້ານີ້ຖືກເຂົ້າເບິ່ງ {{plural:$1|ເທື່ອໜຶ່ງ|$1 ເທື່ອ}}.',
 110+'protectedpage' => 'ໜ້າຖືກປົກປ້ອງ',
 111+'jumptonavigation' => 'ນຳທິດ',
 112+'jumptosearch' => 'ຄົ້ນຫາ',
 113+
 114+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 115+'aboutsite' => 'ກ່ຽວກັບ {{SITENAME}}',
 116+'aboutpage' => '{{ns:project}}:ກ່ຽວກັບ',
 117+'copyright' => 'ເນື້ອໃນ ສະໜອງໃຫ້ ພາຍໃຕ້ $1.',
 118+'copyrightpage' => '{{ns:project}}:ລິຂະສິດ',
 119+'edithelppage' => '{{ns:project}}:ການດັດແກ້',
 120+'helppage' => '{{ns:project}}:ເນື້ອໃນ',
 121+'mainpage' => 'ໜ້າຫຼັກ',
 122+'sitesupport' => 'ບໍລິຈາກ',
 123+
 124+'badaccess' => 'ການອະນຸມັດບໍ່ຖືກຕ້ອງ',
 125+'badaccess-group0' => 'ທ່ານ ບໍ່ໄດ້ຮັບອະນຸຍາດ ໃຫ້ປະຕິບັດການ ທີ່ ທ່ານ ສັ່ງ.',
 126+
 127+'youhavenewmessages' => 'ທ່ານ ມີ $1 ($2).',
 128+'newmessageslink' => 'ຂໍ້ຄວາມໃໝ່',
 129+'newmessagesdifflink' => 'ການປ່ຽນແປງຫຼ້າສຸດ',
 130+'editsection' => 'ດັດແກ້',
 131+'editold' => 'ດັດແກ້',
 132+'editsectionhint' => 'ດັດແກ້ ພາກ: $1',
 133+'toc' => 'ເນື້ອໃນ',
 134+'showtoc' => 'ສະແດງ',
 135+'hidetoc' => 'ເຊື່ອງ',
 136+'viewdeleted' => 'ເບິ່ງ $1 ບໍ?',
 137+
 138+# Short words for each namespace, by default used in the 'article' tab in monobook
 139+'nstab-main' => 'ບົດຄວາມ',
 140+'nstab-user' => 'ໜ້າຜູ້ໃຊ້',
 141+'nstab-special' => 'ພິເສດ',
 142+'nstab-project' => 'ໜ້າໂຄງການ',
 143+'nstab-image' => 'ໄຟລ໌',
 144+'nstab-mediawiki' => 'ຂໍ້ຄວາມ',
 145+'nstab-template' => 'ແມ່ແບບ',
 146+'nstab-help' => 'ໜ້າຊ່ອຍເຫຼືອ',
 147+'nstab-category' => 'ໝວດ',
 148+
 149+# General errors
 150+'noconnect' => 'ຂໍອະໄພ! ວິກີ ພວມປະສົບບັນຫາ ທາງດ້ານເຕັກນິກ ແລະ ບໍ່ສາມາດເຂົ້າຫາ ຖານຂໍ້ມູນ.<br />$1',
 151+'filerenameerror' => 'ບໍ່ສາມາດ ປ່ຽນ ຊື່ໄຟລ໌ "$1" ໄປເປັນ "$2" ໄດ້.',
 152+'cannotdelete' => 'ບໍ່ສາມາດລຶບໜ້າ ຫຼື ໄຟລ໌ ໄດ້. (ມັນອາດຈະຖືກລຶບໂດຍໃຜຜູ້ໜຶ່ງແລ້ວ.)',
 153+'badtitle' => 'ຫົວຂໍ້ບໍ່ຖືກຕ້ອງ',
 154+'viewsource' => 'ເບິ່ງ ຊອສ໌',
 155+'editinginterface' => "'''ເຕືອນ:''' ທ່ານ ພວມດັດແກ້ ໜ້າ ທີ່ ສະໜອງ ອິນເຕີເຟສ ໂຕໜັງສື ໃຫ້ ຊອຟແວ. ການປ່ຽນແປງ ຂອງ ໜ້ານີ້​ ຈະມີຜົນກະທົບ ຕໍ່ ການປະກົດ ຂອງ ອິນເຕີເຟສ ຂອງ ຜູ້ໃຊ້ອື່ນ.",
 156+'namespaceprotected' => "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດ ໃຫ້ ດັດແກ້ ໜ້າ ໃນ '''$1'''.",
 157+
 158+# Login and logout pages
 159+'logouttitle' => 'ຜູ້ໃຊ້ ເຊັນອອກ',
 160+'logouttext' => '<strong>ທ່່ານ ໄດ້ ເຊັນອອກແລ້ວ.</strong><br />
 161+ທ່ານ ສາມາດສືບຕໍ່ໃຊ້ {{SITENAME}} ແບບບໍ່ສະແດງຊື່, ຫຼື ທ່ານ ສາມາດ ເຊັນເຂົ້າ
 162+ອີກ ໂດຍ ຊື່ຜູ້ໃຊ້ ເກົ່າ ຫຼື ໃໝ່ ກໍ່ໄດ້. ກະລຸນາ ຮັບຊາບວ່າ ບາງໜ້າ ອາດຈະສືບຕໍ່ ສະແດງ
 163+ຄືວ່າ ທ່ານ ຍັງເຊັນເຂົ້າຢູ່ ຈົນກວ່າ ທ່ານ ຂໍ້ມູນບັນທຶກຊົ່ວຄາວ ໃນ ໂປຣແກຣມທ່ອງເວັບ
 164+ຂອງ ທ່ານ ຈະຖືກລຶບ.',
 165+'welcomecreation' => '== ຍິນດີຕ້ອນຮັບ, $1! ==
 166+
 167+ບັນຊີ ຂອງທ່ານ ຖືກສ້າງຂຶ້ນແລ້ວ. ຢ່າລືມ ຕັ້ງຄ່າ ທ່ານ ຢູ່ {{SITENAME}}.',
 168+'loginpagetitle' => 'ຜູ້ໃຊ້ ເຊັນເຂົ້າ',
 169+'yourname' => 'ຊື່ຜູ້ໃຊ້',
 170+'yourpassword' => 'ລະຫັດຜ່ານ',
 171+'yourpasswordagain' => 'ພິມລະຫັດຜ່ານອີກ',
 172+'remembermypassword' => 'ຈົດຈໍາການເຊັນເຂົ້າຂອງຂ້ອຍ ຢູ່ ຄອມພິວເຕີໜ່ວຍນີ້',
 173+'yourdomainname' => 'ໂດເມນ ຂອງ ທ່ານ',
 174+'alreadyloggedin' => '<strong>ຜູ້ໃຊ້ $1, ທ່ານ ໄດ້ເຊັນເຂົ້າແລ້ວ!</strong><br />',
 175+'login' => 'ເຊັນເຂົ້າ',
 176+'loginprompt' => 'ທ່ານ ຕ້ອງ ອະນຸຍາດ cookies ເພື່ອ ຈະເຊັນເຂົ້າ {{SITENAME}}.',
 177+'userlogin' => 'ເຊັນເຂົ້າ / ສ້າງບັນຊີ',
 178+'logout' => 'ເຊັນອອກ',
 179+'userlogout' => 'ເຊັນອອກ',
 180+'nologin' => 'ບໍ່ມີບັນຊີເທື່ອບໍ? $1.',
 181+'nologinlink' => 'ສ້າງບັນຊີໃໝ່',
 182+'createaccount' => 'ສ້າງບັນຊີ',
 183+'gotaccount' => 'ມີ ບັນຊີແລ້ວບໍ? $1.',
 184+'gotaccountlink' => 'ເຊັນເຂົ້າ',
 185+'createaccountmail' => 'ໂດຍ ອີເມລ',
 186+'badretype' => 'ລະຫັດຜ່ານ ທີ່ ທ່ານພິມຄືນ ບໍ່ຖືກກັບ ທີ່ພິມກ່ອນ.',
 187+'youremail' => 'ອີເມລ *:',
 188+'username' => 'ຊື່ຜູ້ໃຊ້:',
 189+'uid' => 'ເລກປະຈຳໂຕຜູ້ໃຊ້:',
 190+'yourrealname' => 'ຊື່ແທ້ *:',
 191+'yourlanguage' => 'ພາສາ:',
 192+'yournick' => 'ຊື່ຫຼິ້ນ:',
 193+'email' => 'ອີເມລ',
 194+'loginerror' => 'ມີບັນຫາໃນການເຊັນເຂົ້າ',
 195+'prefs-help-email' => '* ອີເມລ (ເລືອກໄດ້): ໃຫ້ຜູ້ອື່ນ ສາມາດຕິດຕໍ່ຫາ ທ່ານ ຜ່ານ ໜ້າຜູ້ໃຊ້ ຫຼື ໜ້າສົນທະນາຜູ້ໃຊ້ ຂອງ ທ່ານ ໂດຍ ບໍ່ຈຳເປັນຕ້ອງ ເປີດເຜີຍ ອີເມລຂອງທ່ານ.',
 196+'loginsuccesstitle' => 'ເຊັນເຂົ້າສຳເລັດ',
 197+'loginsuccess' => "'''ທ່ານ ເຊັນເຂົ້າ {{SITENAME}} ໃນນາມ \"\$1\".'''",
 198+'wrongpassword' => 'ລະຫັດຜ່ານບໍ່ຖືກ. ກະລຸນາເຮັດຄືນໃໝ່.',
 199+'wrongpasswordempty' => 'ບໍ່ມີລະຫັດຜ່ານຖືກພິມເຂົ້າ. ກະລຸນາເຮັດຄືນໃໝ່.',
 200+'mailmypassword' => 'ຂໍລະຫັດຜ່ານທາງອີເມລ',
 201+'acct_creation_throttle_hit' => 'ຂໍໂທດຫຼາຍໆ, ທ່ານ ໄດ້ສ້າງ $1 ບັນຊີແລ້ວ. ທ່ານ ບໍ່ສາມາດ ສ້ງບັນຊີໄດ້ອີກ.',
 202+'emailauthenticated' => 'ອີເມລ ຂອງ ທ່ານ ຖືກຢືນຢັນ ເມື່ອ $1.',
 203+'emailconfirmlink' => 'ຢືນຢັນ ທີ່ຢູ່ ອີເມລ ຂອງ ທ່ານ',
 204+'accountcreated' => 'ບັນຊີ ໄດ້ຖືກສ້າງ ແລ້ວ',
 205+'accountcreatedtext' => 'ບັນຊີ ຂອງ $1 ໄດ້ ຖືກສ້າງແລ້ວ.',
 206+
 207+# Password reset dialog
 208+'resetpass_submit' => 'ຕັ້ງລະຫັດຜ່ານ ແລະ ເຊັນເຂົ້າ',
 209+'resetpass_success' => 'ສຳເລັດການປ່ຽນແປງ ລະຫັດຜ່ານຂອງທ່ານແລ້ວ! ດຽວນີ້ ທ່ານ ເຊັ່ນເຂົ້າ ໃນ ...',
 210+
 211+# Edit page toolbar
 212+'bold_sample' => 'ໂຕໜັງສືເຂັ້ມ',
 213+'bold_tip' => 'ໂຕໜັງສືເຂັ້ມ',
 214+'extlink_tip' => 'ລິ້ງຄ໌ພາຍນອກ (remember http:// prefix)',
 215+'headline_sample' => 'ສຳຄັນ',
 216+'math_tip' => '
 217+== Headline text ==
 218+ສູດ ຄະນິດສາດ (LaTeX)',
 219+
 220+# Edit pages
 221+'minoredit' => 'ນີ້ແມ່ນການດັດແກ້ເລັກນ້ອຍ',
 222+'watchthis' => 'ຕິດຕາມໜ້ານີ້',
 223+'savearticle' => 'ບັນທຶກ',
 224+'preview' => 'ລອງເບິ່ງຜົນ',
 225+'showpreview' => 'ລອງເບິ່ງຜົນ',
 226+'showdiff' => 'ສະແດງສ່ວນຕ່າງ',
 227+'anoneditwarning' => "'''ເຕືອນ:''' ທ່ານ ບໍ່ໄດ້ເຊັນເຂົ້າ. ທີ່ຢູ່ IP ຂອງ ທ່ານ ຈະຖືກບັນທຶກໄວ້ ໃນ ປະຫວັດການດັດແກ້ ຂອງ ໜ້ານີ້.",
 228+'blockedtitle' => 'ຜູ້ໃຊ້ຖືກຫ້າມ',
 229+'blockededitsource' => "ເນື້ອໃນ ຂອງ '''ການດັດແປງໂດຍທ່ານ '''ຕໍ່ກັບ '''$1''' ມີດັ່ງລຸ່ມນີ້:",
 230+'whitelistedittext' => 'ທ່ານ ຈະຕ້ອງ $1 ເພື່ອ ຈະດັດແກ້.',
 231+'whitelistreadtitle' => 'ຈະຕ້ອງ ເຊັນເຂົ້າ ເພື່ອອ່ານໜ້ານີ້',
 232+'confirmedittitle' => 'ຕ້ອງຢືນຢັນ ທີ່ຢູ່ ອີເມລ ຈຶ່ງຈະສາມາດ ດັດແກ້',
 233+'confirmedittext' => 'ທ່ານ ຕ້ອງຢືນຢັນ ທີ່ຢູ່ອີເມລ ກ່ອນການດັດແກ້ບົດຄວາມຕ່າງໆ. ກະລຸນາ ຂຽນ ທີ່ຢູ່ ອີເມລ ທີ່ໃຊ້ໄດ້ ຢູ່ [[Special:Preferences|user preferences]].',
 234+'loginreqtitle' => 'ຈຳເປັນຕ້ອງ ເຊັນເຂົ້າ',
 235+'loginreqlink' => 'ເຊັນເຂົ້າ',
 236+'accmailtitle' => 'ໄດ້ສົ່ງ ລະຫັດຜ່ານ ໄປແລ້ວ.',
 237+'accmailtext' => 'ລະຫັດຜ່ານ ຂອງ "$1" ໄດ້ຖືກສົ່ງໄປ $2 ແລ້ວ.',
 238+'newarticle' => '(ໃໝ່)',
 239+'newarticletext' => "== Headline text ==
 240+ທ່ານ ໄດ້ມາຮອດ ໜ້າທີ່ຍັງບໍ່ໄດ້ຖືກສ້າງຂຶ້ນເທື່ອ.
 241+ທ່ານ ສາມາດເລີ່ມ ສ້າງໜ້າ ໂດຍ ພິມໃສ່ ກັບ ຂ້າງລຸ່ມ.
 242+(ເບິ່ງລາຍລະອຽດຕື່ມ ທີ່ [[{{MediaWiki:helppage}}|help page]]).
 243+ຖ້າ ທ່ານ ມາຮອດນີ້ ໂດຍຄວາມຜິດພາດ, ກະລຸນາ ກົດ ປຸ່ມ '''ກັບຄືນ''', ຢູ່ ໂປຣແກຣມ ທ່ອງເວັບ ຂອງທ່ານ.",
 244+'noarticletext' => 'ຍັງບໍ່ມີເນື້ອໃນ ຢູ່ ໜ້ານີ້, ທ່ານ ສາມາດ [[Special:Search/{{PAGENAME}}|ຊອກຫາຫົວຂໍ້ໜ້ານີ້​]] ຢູ່ ໜ້າອື່ນ ຫຼື [{{fullurl:{{FULLPAGENAME}}|action=edit}} ຂຽນໜ້ານີ້].',
 245+'clearyourcache' => "'''ເອົາໃຈໃສ່:''' ຫຼັງຈາກບັນທຶກ, ທ່ານອາດຈຳເປັນຕ້ອງເວັ້ນຜ່ານ ຂໍ້ມູນເກົ່າທີ່ ໂປແກມທ່ອງເວັບ ຂອງ ທ່ານບັນທຶກໄວ້ເພື່ອເບິ່ງຜົນການປ່ຽນແປງ. '''Mozilla / Firefox / Safari:''' ກົດ ''Shift'' ໃນເວລາຄລິກ ''Reload'', ຫຼືກົດ ''Ctrl-Shift-R'' (''Cmd-Shift-R'' ໃນ ເມັກຄິນທົສ); '''IE:''' ກົດ ''Ctrl'' ໃນເວລາຄລິກ ''Refresh'', ຫຼືກົດ ''Ctrl-F5''; '''Konqueror:''': ກົດປຸ່ມ ''Reload'' , ຫຼື ກົດ ''F5''; '''Opera''' ຜູ້ໃຊ້ອາດຈຳເປັນຕ້ອງລຶບ ຂໍ້ມູນບັນທຶກໂດຍສິ້ນເຊີງ ໃນ ''Tools→Preferences''.",
 246+'previewnote' => '<strong>ນີ້ ແມ່ນ ການລອງເບິ່ງຜົນເທົ່ານັ້ນ; ການດັດແກ້ຍັງບໍ່ທັນຖືກບັນທຶກ!</strong>',
 247+'editing' => 'ພວມດັດແກ້ $1',
 248+'editinguser' => 'ຜູ້ໃຊ້ <b>$1</b> ພວມດັດແກ້',
 249+'editingsection' => 'ພວມດັດແກ້ $1 (ພາກ)',
 250+'editingcomment' => 'ພວມດັດແກ້ $1 (comment)',
 251+'yourtext' => 'ເນື້ອໃນ',
 252+'yourdiff' => 'ສ່ວນຕ່າງ',
 253+'copyrightwarning' => 'ກະລຸນາ ເຂົ້າໃຈວ່າ ທຸກໆ ການປະກອບສ່ວນຕໍ່ກັບ {{SITENAME}} ຈະຖືກ ເປີດເຜີຍ ພາຍໃຕ້ $2 (ເບິ່ງ ລາຍລະອຽດ ທີ່ $1). ຖ້າ ທ່ານ ບໍ່ປະສົງ ໃຫ້ ສິ່ງທີ່ ທ່ານ ຂຽນ ຖືກດັດແກ້ ຫຼື ແຈກຢາຍ ອີກ ຕາມຊອບໃຈ, ທ່ານ ບໍ່ຄວນ ຂຽນຢູ່ນີ້. <br />
 254+ທ່ານ ຈະຕ້ອງ ສັນຍາອີກວ່າ, ທ່ານ ຂຽນມັນຂຶ້ນມາເອງ ຫຼື ກ່າຍມັນມາຈາກ ໂດເມນ ສາທາລະນະ ຫຼື ສິ່ງບໍ່ເສຍຄ່າ ຄ້າຍຄືກັນ.
 255+<strong>ກະລຸນາ ຢ່າ ສົ່ງສິ່ງທີ່ ຖືກສະຫງວນ ລິຂະສິດ ໂດຍ ບໍ່ໄດ້ຮັບອະນຸຍາດ!</strong>',
 256+'copyrightwarning2' => 'ກະລຸນາ ເຂົ້າໃຈວ່າ ທຸກໆ ການປະກອນສ່ວນ ຕໍ່ {{SITENAME}} ອາດຖືກ ດັດແກ້, ປ່ຽນແປງ, ຫຼື ລຶບ ໂດຍ ຜູ້ປະກອບສ່ວນອື່ນ. ຖ້າ ທ່ານ ບໍ່ປະສົງ ໃຫ້ ສິ່ງທີ່ ທ່ານ ຂຽນ ຖືກດັດແກ້ ຫຼື ແຈກຢາຍ ອີກ ຕາມຊອບໃຈ, ທ່ານ ບໍ່ຄວນ ຂຽນຢູ່ນີ້. <br />
 257+ທ່ານ ຈະຕ້ອງ ສັນຍາອີກວ່າ, ທ່ານ ຂຽນມັນຂຶ້ນມາເອງ ຫຼື ກ່າຍມັນມາຈາກ ໂດເມນ ສາທາລະນະ ຫຼື ສິ່ງບໍ່ເສຍຄ່າ ຄ້າຍຄືກັນ. (ເບິ່ງ ລາຍລະອຽດ ທີ່ $1).
 258+<strong>ກະລຸນາ ຢ່າ ສົ່ງສິ່ງທີ່່ ຖືກສະຫງວນ ລິຂະສິດ ໂດຍ ບໍ່ໄດ້ຮັບອະນຸຍາດ!</strong>',
 259+'templatesused' => 'ແມ່ແບບໄດ້ໃຊ້ໃນໜ້ານີ້:',
 260+'templatesusedpreview' => 'ແມ່ແບບໃຊ້ໃນການລອງເບິ່ງຜົນນີ້:',
 261+'templatesusedsection' => 'ແມ່ແບບໄດ້ໃຊ້ໃນພາກນີ້:',
 262+'template-protected' => '(ປົກປ້ອງ)',
 263+'template-semiprotected' => '(ເຄິ່ງປົກປ້ອງ)',
 264+
 265+# Account creation failure
 266+'cantcreateaccounttitle' => 'ບໍ່ສາມາດສ້າງ ບັນຊີ ໄດ້',
 267+'cantcreateaccounttext' => 'ການສ້າງບັນຊີ ຈາກ ທີ່ຢູ່ IP (<b>$1</b>) ນີ້​ໄດ້ຖືກຫ້າມ.
 268+ອັນນີ້​ ອາດແມ່ນຍ້ອນມີການສ້າງບັນຫາ ຫຼື ຂຽນໂລເລ ຈາກ ໂຮງຮຽນ ຫຼື ຜູ້ສະໜອງການເຂົ້າຫາ ອິນເຕີເນັດ ທີ່ທ່ານໃຊ້.',
 269+
 270+# History pages
 271+'nohistory' => 'ຍັງບໍ່ມີ ປະຫວັດການດັດແກ້ໜ້ານີ້ເທື່ອ.',
 272+'next' => 'ຕໍ່ໄປ',
 273+'page_first' => 'ທຳອິດ',
 274+'page_last' => 'ສຸດທ້າຍ',
 275+
 276+# Revision deletion
 277+'rev-delundel' => 'ສະແດງ/ເຊື່ອງ',
 278+
 279+# Diffs
 280+'compareselectedversions' => 'ສົມທຽບ ລະຫວ່າງ ສະບັບເລືອກ',
 281+
 282+# Search results
 283+'searchresulttext' => 'ສຳຫຼັບ ຂໍ້ມູນເພີ່ມເຕີມ ກ່ຽວກັບ ການຊອກຫາ ຢູ່ {{SITENAME}}, ກະລຸນາເບິ່ງ [[{{MediaWiki:helppage}}|{{int:help}}]].',
 284+'searchsubtitle' => "ທ່ານ ຊອກຫາ '''[[:$1]]'''",
 285+'badquerytext' => 'ບໍ່ສາມາດດຳເນີນ ການຄົ້ນຫາ ທີ່ທ່ານກຳນົດໄດ້.
 286+ອັນນີ້​ ອາດແມ່ນຍ້ອນ ທ່ານພະຍາຍາມ ຄົ້ນຫາໂດຍຄຳສັບທີ່ໜ້ອຍກ່ວາ 3​ ໂຕໜັງສື, ທີ່ພວກເຮົາຍັງບໍ່ສາມາດຕອບສະໜອງໄດ້ເທື່ອ..
 287+ຫຼື ທ່ານອາດຈະພິມຜິດ ເຊັ່ນ "ປາ ແລະ ແລະ ຂະໜາດ".
 288+ກະລຸນາ ທົດລອງ ໂດຍ ຄຳສັບອື່ນໆ.',
 289+'noexactmatch' => "'''ຍັງບໍ່ມີໜ້າ ຊື່ວ່າ \"\$1\".''' ທ່ານ ສາມາດ [[:\$1|ສ້າງໜ້ານີ້ໄດ້]].",
 290+'nextn' => '$1 ຕໍ່ໄປ',
 291+'viewprevnext' => 'ເບິ່ງ ($1) ($2) ($3).',
 292+'powersearch' => 'ຊອກຫາ',
 293+'blanknamespace' => '(ຫຼັກ)',
 294+
 295+# Preferences page
 296+'preferences' => 'ການຕັ້ງຄ່າ',
 297+'mypreferences' => 'ຕັ້ງຄ່າຂອງຂ້ອຍ',
 298+'changepassword' => 'ປ່ຽນລະຫັດຜ່ານ',
 299+'skin' => 'ລວດລາຍ',
 300+'math' => 'ຄະນິດສາດ',
 301+'dateformat' => 'ແບບວັນເດືອນປີ',
 302+'datedefault' => 'ແນວໃດກໍ່ໄດ້',
 303+'datetime' => 'ວັນ ແລະ ເວລາ',
 304+'math_syntax_error' => 'ຜິດຫຼັກໄວຍະກອນ',
 305+'prefs-personal' => 'ຂໍ້ມູນຫຼັກຜູ້ໃຊ້',
 306+'prefs-rc' => 'ການດັດແກ້ຫຼ້າສຸດ',
 307+'prefs-watchlist' => 'ລາຍການຕິດຕາມ',
 308+'prefs-watchlist-days' => 'ຈຳນວນມື້ສະແດງ ໃນ ລາຍການຕິດຕາມ:',
 309+'prefs-watchlist-edits' => 'ຈຳນວນການດັດແກ້ ສະແດງ ໃນ ລາຍການຕິດຕາມທີ່ຂະຫຍາຍອອກ:',
 310+'prefs-misc' => 'ແລະອື່ນໆ',
 311+'saveprefs' => 'ບັນທຶກ',
 312+'resetprefs' => 'ເລີ່ມຄືນໃໝ່',
 313+'oldpassword' => 'ລະຫັດຜ່ານເກົ່າ:',
 314+'newpassword' => 'ລະຫັດຜ່ານໃໝ່:',
 315+'retypenew' => 'ພິມລະຫັດຜ່ານໃໝ່ອີກ:',
 316+'textboxsize' => 'ການດັດແກ້',
 317+'rows' => 'ແຖວ:',
 318+'columns' => 'ຖັນ:',
 319+'searchresultshead' => 'ຊອກຫາ',
 320+'resultsperpage' => 'ຈຳນວນຜົນການຊອກເຫັນ ຕໍ່ ໜ້າ:',
 321+'contextlines' => 'ຈຳນວນແຖວ ຕໍ່ ຜົນການຊອກເຫັນ:',
 322+'recentchangesdays' => 'ຈຳນວນມື້ສະແດງໃນການປ່ຽນແປງຫຼ້າສຸດ:',
 323+'recentchangescount' => 'ຈຳນວນການດັດແກ້ສະແດງໃນການປ່ຽນແປງຫຼ້າສຸດ:',
 324+'savedprefs' => 'ການຕັ້ງຄ່າຂອງທ່ານໄດ້ຖືກບັນທຶກແລ້ວ.',
 325+'timezonelegend' => 'ເຂດເວລາ',
 326+'timezonetext' => 'ຈຳນວນຊົ່ວໂມງແຕກຕ່າງ ລະຫວ່າງເວລາທ້ອງຖິ່ນ ແລະ ເວລາ ຂອງ ເຊີບເວີ (UTC).',
 327+'localtime' => 'ເວລາທ້ອງຖິ່ນ',
 328+'timezoneoffset' => 'ຫ່າງກັນ¹',
 329+'servertime' => 'ເວລາເຊີເວີ',
 330+'guesstimezone' => 'ເອົາເວລາຈາກໂປຣແກຣມທ່ອງເວັບ',
 331+'allowemail' => 'ອະນຸຍາດ ໃຫ້ຜູ້ໃຊ້ອື່ນ ສົ່ງອີເມລຫາຂ້ອຍ',
 332+'defaultns' => 'ຄົ້ນຫາ ໃນ ຂອບເຂດຊື່ ນີ້ ເວລາບໍ່ມີການລະບຸ:',
 333+'files' => 'ໄຟລ໌',
 334+
 335+# Recent changes
 336+'nchanges' => '$1 {{PLURAL:$1|ການປ່ຽນແປງ|ການປ່ຽນແປງ}}',
 337+'recentchanges' => 'ການດັດແກ້ຫຼ້າສຸດ',
 338+'recentchangestext' => 'ເບິ່ງ ການປ່ຽນແປງ ຫຼ້າສຸດ ຢູ່ ໜ້າວິກີນີ້.',
 339+'rcnote' => 'ຂ້າງລຸ່ມ ແມ່ນ <strong>$1</strong>ການປ່ຽນແປງ ຫຼ້າສຸດ ໃນ <strong>$2</strong>ມື້ຫຼ້າສຸດ, ມື້ນີ້​ ແມ່ນ $3.',
 340+'rclistfrom' => 'ສະແດງ ການປ່ຽນແປງ ເລີ່ມແຕ່ $1',
 341+'rcshowhideminor' => '$1 ການດັດແກ້ເລັກນ້ອຍ',
 342+'rcshowhideliu' => '$1 ຜູ້ໃຊ້ໄດ້ເຊັນເຂົ້າ',
 343+'rcshowhideanons' => '$1 ຜູ້ໃຊ້ບໍ່ສະແດງຊື່',
 344+'rcshowhidemine' => '$1 ການດັດແກ້ໂດຍຂ້ອຍ',
 345+'rclinks' => 'ສະແດງ $1ການປ່ຽນແປງ ຫຼ້າສຸດ ໃນ $2ມື້ຫຼ້າສຸດ<br />$3',
 346+'diff' => 'ສ່ວນຕ່າງ',
 347+'hist' => 'ປະຫວັດ',
 348+'hide' => 'ເຊື່ອງ',
 349+'show' => 'ສະແດງ',
 350+'newpageletter' => 'ໃໝ່',
 351+
 352+# Recent changes linked
 353+'recentchangeslinked' => 'ການດັດແກ້ທີ່ກ່ຽວຂ້ອງ',
 354+
 355+# Upload
 356+'upload' => 'ອັບໂຫຼດໄຟລ໌',
 357+'filedesc' => 'ສະຫຼຸບ',
 358+'fileuploadsummary' => 'ສະຫຼຸບ:',
 359+'badfilename' => 'ຊື່ໄຟລ໌ ໄດ້ຖືກປ່ຽນເປັນ "$1".',
 360+'savefile' => 'ບັນທຶກໄຟລ໌',
 361+'watchthisupload' => 'ຕິດຕາມໜ້ານີ້',
 362+
 363+# Image list
 364+'imagelist' => 'ລາຍຊື່ໄຟລ໌',
 365+'ilsubmit' => 'ຄົ້ນຫາ',
 366+'byname' => 'ຕາມຊື່',
 367+'bydate' => 'ຕາມວັນເວລາ',
 368+'bysize' => 'ຕາມ ຂະໜາດ',
 369+'nolinkstoimage' => 'ບໍ່ມີໜ້າໃດ ລິ້ງຄ໌ ຫາ ໄຟລ໌ນີ້.',
 370+'noimage' => 'ຍັງບໍ່ມີ ໄຟລ໌ຊື່ນີ້ ເທື່ອ, ທ່ານ ສາມາດ $1.',
 371+'noimage-linktext' => 'ອັບໂຫຼດມັນ',
 372+
 373+# List redirects
 374+'listredirects' => 'ລາຍການການໂອນໜ້າ',
 375+
 376+# Unused templates
 377+'unusedtemplates' => 'ແມ່ແບບບໍ່ໄດ້ໃຊ້',
 378+
 379+# Random redirect
 380+'randomredirect' => 'ໂອນໄປໜ້າໃດໜຶ່ງ',
 381+
 382+# Statistics
 383+'statistics' => 'ສະຖິຕິ',
 384+
 385+'doubleredirects' => 'ໂອນໜ້າ 2 ຄັ້ງ',
 386+
 387+'brokenredirects' => 'ການໂອນບໍ່ມີໜ້າປາຍທາງ',
 388+'brokenredirectstext' => 'ການໂອນໜ້ານີ້ ເຊື່ອມຕໍ່ໄປຫາໜ້າ ທີ່ ຍັງບໍ່ມີເທື່ອ:',
 389+'brokenredirects-edit' => '(ດັດແກ້)',
 390+'brokenredirects-delete' => '(ລຶບ)',
 391+
 392+'withoutinterwiki-header' => 'ໜ້າ ຕໍ່ໄປນີ້ ບໍ່ມີ ລິ້ງຄ໌ ຫາ ບົດຄວາມສະບັບພາສາອື່ນໆ:',
 393+
 394+# Miscellaneous special pages
 395+'nbytes' => '$1 {{PLURAL:$1|ໄບຕ໌|ໄບຕ໌}}',
 396+'ncategories' => '$1 {{PLURAL:$1|ໝວດ|ໝວດ}}',
 397+'nlinks' => '$1 {{PLURAL:$1|ລິ້ງຄ໌|ລິ້ງຄ໌}}',
 398+'lonelypages' => 'ໜ້າບໍ່ມີໜ້າໃດເຊື່ອມຕໍ່ຫາ',
 399+'uncategorizedpages' => 'ໜ້າບໍ່ໄດ້ຈັດໝວດ',
 400+'uncategorizedcategories' => 'ໝວດບໍ່ໄດ້ຈັດໝວດ',
 401+'uncategorizedimages' => 'ຮູບບໍ່ໄດ້ຈັດໝວດ',
 402+'unusedcategories' => 'ໝວດບໍ່ໄດ້ໃຊ້',
 403+'unusedimages' => 'ໄຟລ໌ບໍ່ໄດ້ໃຊ້',
 404+'wantedcategories' => 'ໝວດ ພວມຕ້ອງການ',
 405+'wantedpages' => 'ໜ້າ ພວມຕ້ອງການ',
 406+'mostlinked' => 'ໜ້າທີ່ມີການເຊື່ອມຕໍ່ຫາຫຼາຍທີ່ສຸດ',
 407+'mostlinkedcategories' => 'ໝວດທີ່ມີການເຊື່ອມຕໍ່ຫາຫຼາຍທີ່ສຸດ',
 408+'mostcategories' => 'ບົດຄວາມ ທີ່ມີຫຼາຍ ໝວດ ທີ່ສຸດ',
 409+'mostimages' => 'ຮູບທີ່ມີການເຊື່ອມຕໍ່ຫາຫຼາຍທີ່ສຸດ',
 410+'mostrevisions' => 'ບົດຄວາມ ທີ່ມີການດັດແກ້ຫຼາຍເທື່ອທີ່ສຸດ',
 411+'allpages' => 'ທຸກໆໜ້າ',
 412+'prefixindex' => 'ດັດຊະນີຄຳນຳໜ້າ',
 413+'randompage' => 'ໜ້າໃດໜຶ່ງ',
 414+'shortpages' => 'ໜ້າເນື້ອໃນສັ້ນ',
 415+'longpages' => 'ໜ້າເນື້ອໃນຍາວ',
 416+'deadendpages' => 'ໜ້າບໍ່ການເຊື່ອມຕໍ່ຫາໜ້າອື່ນ',
 417+'protectedpages' => 'ບັນດາໜ້າຖືກປົກປ້ອງ',
 418+'listusers' => 'ລາຍຊື່ຜູ້ໃຊ້',
 419+'specialpages' => 'ໜ້າພິເສດ',
 420+'spheading' => 'ໜ້າພິເສດ ສຳຫຼັບ ຜູ້ໃຊ້ທຸກໆທ່ານ',
 421+'newpages' => 'ໜ້າສ້າງໃໝ່',
 422+'newpages-username' => 'ຊື່ຜູ້ໃຊ້:',
 423+'ancientpages' => 'ບັນດາໜ້າເກົ່າທີ່ສຸດ',
 424+'move' => 'ຍ້າຍ',
 425+
 426+# Book sources
 427+'booksources' => 'ປຶ້ມອ້າງອີງ',
 428+'booksources-go' => 'ໄປ',
 429+
 430+'categoriespagetext' => 'ມີ ບັນດາ ໝວດ ຕໍ່ໄປນີ້ ຢູ່ ວິກີ.',
 431+'alphaindexline' => '$1 ຫາ $2',
 432+'version' => 'ສະບັບ',
 433+
 434+# Special:Log
 435+'log' => 'ບັນທຶກ',
 436+'all-logs-page' => 'ທຸກໆຂໍ້ມູນບັນທຶກການນຳໃຊ້',
 437+'log-search-legend' => 'ຊອກຫາ ໃນ ບັນທຶກການນຳໃຊ້',
 438+'log-search-submit' => 'ໄປ',
 439+'alllogstext' => 'ສະແດງ ບັນທຶກ ການອັບໂຫຼດ, ການລຶບ, ການປົກປ້ອງ, ການຫ້າມ ແລະ sysop.
 440+ທ່ານ ສາມາດຄັດຈ້ອນ ການສະແດງ ໂດຍ ເລືອກ ປະເພດການບັນທຶກ, ຊື່ຜູ້ໃຊ້ ຫຼື ໜ້າທີ່ມີຜົນກະທົບ.',
 441+
 442+# Special:Allpages
 443+'nextpage' => 'ໜ້າຕໍ່ໄປ ($1)',
 444+'allpagesfrom' => 'ສະແດງທຸກໆໜ້າ ເລີ່ມແຕ່:',
 445+'allarticles' => 'ທຸກໆບົດຄວາມ',
 446+'allinnamespace' => 'ທຸກໆໜ້າ ຂອງ ($1 namespace)',
 447+'allnotinnamespace' => 'ທຸກໆໜ້າ (ນອກຈາກ ໃນ $1 namespace)',
 448+'allpagesprev' => 'ກ່ອນໜ້າ',
 449+'allpagesnext' => 'ຕໍ່ໄປ',
 450+'allpagessubmit' => 'ໄປ',
 451+'allpagesprefix' => 'ສະແດງ ໜ້າ ຂຶ້ນຕົ້ນດ້ວຍ:',
 452+'allpagesbadtitle' => 'ຫົວຂໍ້ ຂອງ ໜ້າດັງກ່າວ ບໍ່ຖືກຕ້ອງ ຫຼື ອາດໃຊ້ ຄຳນຳໜ້າ ທີ່ inter-language ຫຼື inter-wiki ໄດ້ສະຫງວນໄວ້. ມັນອາດຈະມີ ໜຶ່ງ ຫຼື ຫຼາຍໂຕໜັງສື ທີ່ ບໍ່ສາມາດໃຊ້ ໃນ ຫົວຂໍ້ໄດ້.',
 453+
 454+# Special:Listusers
 455+'listusers-submit' => 'ສະແດງ',
 456+
 457+# E-mail user
 458+'mailnologintext' => 'ທ່ານ ຈະຕ້ອງ [[Special:Userlogin|logged in]]
 459+ແລະ ມີ ອີເມລ ທີ່ໃຊ້ໄດ້ ຢູ່ [[Special:Preferences|preferences]]
 460+ຂອງ ທ່ານ ເພື່ອຈະ ສົ່ງ ອີເມລ ຫາ ຜູ້ໃຊ້ອື່ນ.',
 461+'emailuser' => 'ສົ່ງອີເມລ ຫາ ຜູ້ໃຊ້ນີ້',
 462+'emailpage' => 'ສົ່ງອີເມລ ຫາ ຜູ້ໃຊ້',
 463+'emailpagetext' => 'ຖ້າຜູ້ໃຊ້ນີ້ ຂຽນທີ່ຢູ່ອີເມລຢ່າງຖືກຕ້ອງຢູ່ການຕັ້ງຄ່າຂອງລາວ, ຟອມທາງລຸ່ມນີ້​ ຈະສົ່ງຂໍ້ຄວາມໜຶ່ງຫາທີ່ຢູ່ອີເມລນັ້ນ.
 464+ທີ່ຢູ່ອີເມລ ທີ່ທ່ານຂຽນຢູ່ການຕັ້ງຄ່າຂອງທ່ານ, ຈະປະກົດຂຶ້ນ ຢູ່ຊ່ອງ "From" ຂອງ ອີເມລ ເພື່ອໃຫ້ ຜູ້ຮັບສາມາດທຳການຕອບໄດ້.',
 465+'noemailtitle' => 'ບໍ່ມີ ທີ່ຢູ່ອີເມລ',
 466+'emailfrom' => 'ຈາກ',
 467+'emailto' => 'ຫາ',
 468+'emailsubject' => 'ຫົວເລື້ອງ',
 469+'emailmessage' => 'ຂໍ້ຄວາມ',
 470+'emailsend' => 'ສົ່ງ',
 471+'emailccme' => 'ສົ່ງສຳເນົາ ຂໍ້ຄວາມ ມາໃຫ້ ຂ້ອຍ.',
 472+'emailccsubject' => 'ສຳເນົາ ຂໍ້ຄວາມທ່ານ ຫາ $1: $2',
 473+'emailsent' => 'ອີເມລ ໄດ້ຖືກສົ່ງໄປແລ້ວ',
 474+'emailsenttext' => 'ອີເມລ ຂອງ ທ່ານ ໄດ້ຖືກສົ່ງໄປແລ້ວ.',
 475+
 476+# Watchlist
 477+'watchlist' => 'ລາຍການຕິດຕາມ',
 478+'mywatchlist' => 'ລາຍການຕິດຕາມຂອງຂ້ອຍ',
 479+'watchnologin' => 'ບໍ່ໄດ້ເຊັນເຂົ້າ',
 480+'addedwatch' => 'ເພີ່ມໃສ່ລາຍການຕິດຕາມແລ້ວ',
 481+'addedwatchtext' => "ໜ້າ \"[[:\$1]]\" ໄດ້ຖືກເພີ່ມໃສ່ [[Special:Watchlist|ລາຍການຕິດຕາມ]] ຂອງ ທ່ານ.
 482+ການປ່ຽນແປງ ໃນໜ້ານີ້ ແລະ ໜ້າສົນທະນາ ຂອງ ມັນ ຈະຖືກ ສະແດງຢູ່ຫັ້ນ,
 483+ແລະ ໜ້າ ຈະປະກົດ '''ເຂັ້ມ'''ຂຶ້ນ ໃນ [[Special:Recentchanges|ລາຍການການດັດແກ້ຫຼ້າສຸດ]] ເພື່ອ ໃຫ້ ສາມາດຈຳແນກໄດ້ງ່າຍຂຶ້ນ.
 484+
 485+ຖ້າ ທ່ານ ຢາກເອົາມັນອອກ ຈາກ ລາຍການຕິດຕາມ ຂອງ ທ່ານ, ທ່ານ ສາມາດ ກົດ \"ເຊົາຕິດຕາມ\" ຢູ່ ທາງຂ້າງ.",
 486+'removedwatch' => 'ເອົາອອກຈາກລາຍການຕິດຕາມ',
 487+'removedwatchtext' => 'ໜ້າ "[[:$1]]" ໄດ້ຖືກເອົາອອກຈາກ ລາຍການຕິດຕາມ ຂອງ ທ່ານ.',
 488+'watch' => 'ຕິດຕາມ',
 489+'watchthispage' => 'ຕິດຕາມໜ້ານີ້',
 490+'unwatch' => 'ເຊົາຕິດຕາມ',
 491+'watchnochange' => 'ບໍ່ມີໜ້າທີ່ທ່ານຕິດຕາມໃດໆ ຖືກດັດແປງໃນໄລຍະສະແດງຂ້າງເທິງນີ້.',
 492+'wlheader-showupdated' => "* ບັນດາ ໜ້າ ທີ່ມີການປ່ຽນແປງ ຫຼັງຈາກທີ່ທ່ານ ເຂົ້າຊົມຫຼ້າສຸດ ຈະຖືກສະແດງເປັນ ໂຕໜັງສື '''ເຂັ້ມ'''",
 493+'wlnote' => 'ຂ້າງລຸ່ມ ແມ່ນ $1 ການປ່ຽນແປງຫຼ້າສຸດ ໃນ <b>$2</b> ຊົ່ວໂມງຫຼ້າສຸດ.',
 494+'wlshowlast' => 'ສະແດງ $1 ຊົ່ວໂມງຫຼ້າສຸດ $2 ມື້ຫຼ້າສຸດ $3',
 495+'watchlist-show-bots' => 'ສະແດງການດັດແກ້ ໂດຍ ບອທ໌',
 496+'watchlist-hide-bots' => 'ເຊື່ອງການດັດແກ້ ໂດຍ ບອທ໌',
 497+'watchlist-show-own' => 'ສະແດງການດັດແກ້ໂດຍຂ້ອຍ',
 498+'watchlist-hide-own' => 'ເຊື່ອງການດັດແກ້ ໂດຍ ຂ້ອຍ',
 499+'watchlist-show-minor' => 'ສະແດງການດັດແກ້ເລັກນ້ອຍ',
 500+'watchlist-hide-minor' => 'ເຊື່ອງການດັດແກ້ເລັກນ້ອຍ',
 501+
 502+# Displayed when you click the "watch" button and it's in the process of watching
 503+'watching' => 'ພວມຕິດຕາມ...',
 504+
 505+'enotif_newpagetext' => 'ນີ້ແມ່ນໜ້າໃໝ່.',
 506+'changed' => 'ປ່ຽນແລ້ວ',
 507+'created' => 'ສ້າງແລ້ວ',
 508+'enotif_lastvisited' => 'ເບິ່ງ $1 ເພື່ອ ທຸກໆການປ່ຽນແປງ ຕັ້ງແຕ່ເທື່ອສຸດທ້າຍ ທີ່ ທ່ານເຂົ້າຫາ.',
 509+
 510+# Delete/protect/revert
 511+'confirm' => 'ຢືນຢັນ',
 512+'confirmdelete' => 'ຢືນຢັນການລຶບ',
 513+'deletesub' => '(ພວມລຶບ "$1")',
 514+'actioncomplete' => 'ສຳເລັດ',
 515+'dellogpage' => 'ບັນທຶກ ການລຶບ',
 516+'dellogpagetext' => 'ຂ້າງລຸ່ມ ແມ່ນ ລາຍການ ການລຶບຫຼ້າສຸດ.',
 517+'deletionlog' => 'ບັນທຶກ ການລຶບ',
 518+'deletecomment' => 'ເຫດຜົນໃນການລຶບ',
 519+'cantrollback' => 'ບໍ່ສາມາດ ປ່ຽນການດັດແກ້ກັບຄືນໄດ້; ຜູ້ປະກອບສ່ວນຫຼ້າສຸດ ແມ່ນ ຜູ້ຂຽນພຽງຜູ້ດຽວ ຂອງ ໜ້ານີ້.',
 520+'alreadyrolled' => 'ບໍ່ສາມາດປ່ຽນກັບຄືນ ຫາ ສະບັບຫຼ້າສຸດ ຂອງ [[:$1]]
 521+ໂດຍ [[User:$2|$2]] ([[User talk:$2|Talk]]); ບາງຄົນ ອາດຈະດັດແກ້ ຫຼື ປ່ຽນກັບຄືນແລ້ວ.
 522+
 523+ການດັດແກ້ຫຼ້າສຸດ ແມ່ນ ເຮັດໂດຍ [[User:$3|$3]] ([[User talk:$3|Talk]]).',
 524+'confirmprotect' => 'ຢືນຢັນ ການປົກປ້ອງ',
 525+
 526+# Undelete
 527+'viewdeletedpage' => 'ເບິ່ງໜ້າທີ່ຖືກລຶບ',
 528+'cannotundelete' => 'ບໍ່ສາມາດ ກັບຄືນ ຫາສະບັບກ່ອນການລຶບ; ບາງຄົນອາດເຮັດກ່ອນແລ້ວ.',
 529+'undelete-search-submit' => 'ຊອກຫາ',
 530+
 531+# Namespace form on various pages
 532+'namespace' => 'ຂອບເຂດຊື່:',
 533+
 534+# Contributions
 535+'contributions' => 'ການປະກອບສ່ວນຂອງຜູ້ໃຊ້ນີ້',
 536+'mycontris' => 'ປະກອບສ່ວນຂອງຂ້ອຍ',
 537+'contribsub2' => 'ສຳຫຼັບ $1 ($2)',
 538+'nocontribs' => 'ຍັງບໍ່ມີການປ່ຽນແປງ ໃນນີ້.',
 539+'year' => 'ແຕ່ປີ (ແລະກ່ອນໜ້ານັ້ນ):',
 540+
 541+'sp-contributions-newest' => 'ໃໝ່ສຸດ',
 542+'sp-contributions-oldest' => 'ເກົ່າສຸດ',
 543+'sp-contributions-newer' => 'ໃໝ່ກວ່າ $1',
 544+'sp-contributions-older' => 'ເກົ່າກວ່າ $1',
 545+'sp-contributions-newbies' => 'ສະແດງສະເພາະ ການປະກອບສ່ວນ ໂດຍ ບັນຊີໃໝ່',
 546+'sp-contributions-blocklog' => 'ບັນທຶກການຫ້າມ',
 547+'sp-contributions-search' => 'ຊອກຫາ ການປະກອບສ່ວນ',
 548+'sp-contributions-username' => 'ທີ່ຢູ່ IP ຫຼື ຊື່ຜູ້ໃຊ້:',
 549+'sp-contributions-submit' => 'ຊອກຫາ',
 550+
 551+# What links here
 552+'whatlinkshere' => 'ໜ້າທີ່ເຊື່ອມຕໍ່ມາໜ້ານີ້',
 553+'nolinkshere' => "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''[[:$1]]'''.",
 554+'nolinkshere-ns' => "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''[[:$1]]''' ໃນ ຂອບເຂດຊື່ ທີ່ ທ່ານເລືອກ.",
 555+
 556+# Block/unblock
 557+'blockip' => 'ຫ້າມຜູ້ໃຊ້ນີ້',
 558+'ipbsubmit' => 'ຫ້າມຜູ້ໃຊ້ນີ້',
 559+'badipaddress' => 'ທີ່ຢູ່ IP ບໍ່ຖືກຕ້ອງ',
 560+'blockipsuccesssub' => 'ຫ້າມສຳເລັດ',
 561+'ipblocklist' => 'ລາຍການ ທີ່ຢູ່ IP ແລະ ຊື່ຜູ້ໃຊ້ ທີ່ຖືກຫ້າມ',
 562+'blocklistline' => '$1, $2 ຫ້າມ $3 ($4)',
 563+'blocklink' => 'ຫ້າມ',
 564+'contribslink' => 'ປະກອບສ່ວນ',
 565+'autoblocker' => 'ຫ້າມໂດຍອັດຕາໂນມັດ ຍ້ອນ ທີ່ຢູ່ IP ຂອງທ່ານ ຖືກໃຊ້ໂດຍ "[[User:$1|$1]]" ໃນໄລຍະຫຼັງ. ເຫດຜົນໃນການຫ້າມ $1 ແມ່ນ : "$2"',
 566+'blocklogpage' => 'ບັນທຶກການຫ້າມ',
 567+'blocklogentry' => 'ໄດ້ຫ້າມ "[[$1]]" ຈົນຮອດ $2 $3',
 568+
 569+# Move page
 570+'newtitle' => 'ຫາ ຫົວຂໍ້ໃໝ່',
 571+'move-watch' => 'ຕິດຕາມໜ້ານີ້',
 572+'articleexists' => 'ມີໜ້າຊືນີ້ແລ້ວ, ຫຼື
 573+ຊື່ ທີ່ທ່ານເລືອກບໍ່ຖືກຕ້ອງ.
 574+ກະລຸນາເລືອກຊື່ໃໝ່.',
 575+'talkpagemoved' => 'ໜ້າສົນທະນາ ໄດ້ຖືກຍ້າຍແລ້ວ ເຊັ່ນດຽວກັນ.',
 576+'1movedto2' => '[[$1]] ຍ້າຍໄປ [[$2]]',
 577+'1movedto2_redir' => '[[$1]] ຍ້າຍໄປ [[$2]] ທັບ ການໂອນໜ້າ',
 578+'delete_and_move' => 'ລຶບ ແລະ ຍ້າຍ',
 579+'delete_and_move_confirm' => 'ແມ່ນແລ້ວ, ລຶບໜ້ານີ້',
 580+'delete_and_move_reason' => 'ລຶບແລ້ວ ເພື່ອ ຍ້າຍໜ້າອື່ນ ມານີ້',
 581+
 582+# Namespace 8 related
 583+'allmessages' => 'ຂໍ້ຄວາມ ຂອງ ລະບົບ',
 584+'allmessagesname' => 'ຊື່',
 585+'allmessagesdefault' => 'ຂໍ້ຄວາມເດີມ',
 586+'allmessagescurrent' => 'ຂໍ້ຄວາມປະຈຸບັນ',
 587+'allmessagestext' => 'ນີ້ ແມ່ນ ລາຍການຂໍ້ຄວາມລະບົບ ໃນ MediaWiki namespace.',
 588+'allmessagesmodified' => 'ສະແດງແຕ່ອັນທີ່ຖືກດັດແປງ',
 589+
 590+# Tooltip help for the actions
 591+'tooltip-pt-mytalk' => 'ໜ້າສົນທະນາຂ້ອຍ',
 592+'tooltip-ca-addsection' => 'ເພີ່ມ ຄຳເຫັນ ໃສ່ ການສົນທະນານີ້.',
 593+'tooltip-ca-move' => 'ຍ້າຍໜ້ານີ້',
 594+'tooltip-search' => 'ຄົ້ນຫາ {{SITENAME}}',
 595+'tooltip-p-logo' => 'ໜ້າຫຼັກ',
 596+'tooltip-ca-nstab-category' => 'ເບິ່ງ ໜ້າໝວດ',
 597+
 598+# Attribution
 599+'anonymous' => 'ຜູ້ໃຊ້ ບໍ່ສະແດງຊື່ ຈາກ {{SITENAME}}',
 600+'and' => 'ແລະ',
 601+
 602+# Spam protection
 603+'subcategorycount' => 'ມີ $1 ໝວດຍ່ອຍ ໃນ ໝວດນີ້.',
 604+'categoryarticlecount' => 'ມີ $1 ບົດຄວາມ ໃນ ໝວດນີ້.',
 605+'category-media-count' => 'ມີ $1 ບົດຄວາມ ໃນ ໝວດນີ້.',
 606+
 607+# Browsing diffs
 608+'nextdiff' => 'ສ່ວນຕ່າງຕໍ່ໄປ →',
 609+
 610+# Media information
 611+'imagemaxsize' => 'ກຳນົດຄວາມໃຫຍ່ຂອງ ຮູບ ຫຼື ໜ້າອະທິບາຍຮູບ ບໍ່ໃຫ້ກາຍ:',
 612+'thumbsize' => 'ຂະໜາດສະແດງ:',
 613+
 614+'newimages' => 'ໄຟລ໌ຮູບໃໝ່',
 615+
 616+# EXIF tags
 617+'exif-imagewidth' => 'ຄວາມກ້ວາງ',
 618+'exif-imagelength' => 'ຄວາມສູງ',
 619+'exif-imagedescription' => 'ຫົວຂໍ້ຮູບ',
 620+'exif-artist' => 'ຜູ້ຂຽນ',
 621+'exif-copyright' => 'ເຈົ້າຂອງລິຂະສິດ',
 622+
 623+# 'all' in various places, this might be different for inflected languages
 624+'recentchangesall' => 'ທັງໝົດ',
 625+'imagelistall' => 'ທັງໝົດ',
 626+'namespacesall' => 'ທັງໝົດ',
 627+
 628+# E-mail address confirmation
 629+'confirmemail' => 'ຢືນຢັນ ທີ່ຢູ່ ອີເມລ',
 630+'confirmemail_noemail' => 'ທ່ານ ບໍ່ໄດ້ຕັ້ງ ທີ່ຢູ່ອີເມລ ທີ່ໃຊ້ໄດ້ ຢູ່ [[Special:Preferences|user preferences]] ຂອງທ່ານ.',
 631+'confirmemail_pending' => '<div class="error">
 632+ລະຫັດຢືນຢັນ ໄດ້ຖືກສົ່ງໄປ ທີ່ຢູ່ ອີເມລ ຂອງ ທ່ານ; ຖ້າ ທ່ານ ຫາກໍ່ສ້າງບັນຊີ
 633+, ທ່ານ ຄວນຈະລໍຖ້າໜ້ອຍໜຶ່ງ ກ່ອນຈະ ພະຍາຍາມ
 634+ຂໍລະຫັດຢືນຢັນໃໝ່.
 635+</div>',
 636+'confirmemail_send' => 'ສົ່ງ ລະຫັດ ຢືນຢັນ',
 637+'confirmemail_sent' => 'ອີເມລຢືນຢັນ ໄດ້ຖືກສົ່ງໄປແລ້ວ.',
 638+'confirmemail_oncreate' => 'ລະຫັດ ຢືນຢັນ ໄດ້ຖືກສົງໄປ ຫາ ທີ່ຢູ່ ອີເມລ ຂອງ ທ່ານແລ້ວ.
 639+ລະຫັດດັ່ງກ່າວ ບໍ່ຈຳເປັນ ສຳຫຼັບ ການເຊັນເຂົ້າ, ແຕ່ ທ່ານ ຕ້ອງໃຊ້ມັນ ເພື່ອ ໃຊ້
 640+ການບໍລິການຕ່າງໆ ທີ່ ອີງໃສ່ ອີເມລ ຢູ່ ວິກີ.',
 641+'confirmemail_sendfailed' => 'ບໍ່ສາມາດ ສົ່ງອີເມລ ຢືນຢັນ. ກະລຸນາກວດເບິ່ງວ່າ ມີໂຕໜັງສືບໍ່ຖືກຕ້ອງ ໃນ ທີ່ຢູ່ອີເມລບໍ່.
 642+
 643+ອີເມລ ຖືກສົ່ງກັບຄືນ: $1',
 644+'confirmemail_invalid' => 'ລະຫັດຢືນຢັນ ບໍ່ຖືກຕ້ອງ. ລະຫັດຢືນຢັນ ອາດຈະກາຍກຳນົດເວລາແລ້ວ.',
 645+'confirmemail_needlogin' => 'ທ່ານ ຈະຕ້ອງ $1 ເພື່ອ ຢືນຢັນ ທີ່ຢູ່ ອີເມລ ຂອງ ທ່ານ.',
 646+'confirmemail_success' => 'ທີ່ຢູ່ ອີເມລ ຂອງ ທ່ານ ໄດ້ຮັບການຢືນຢັນແລ້ວ. ທ່ານ ສາມາດ ເຊັນເຂົ້າ ແລະ ມ່ວນຊື່ນກັບ ວີກີ ໄດ້.',
 647+'confirmemail_loggedin' => 'ທີ່ຢູ່ ອີເມລ ຂອງ ທ່ານໄດ້ຖືກຢືນຢັນແລ້ວ.',
 648+'confirmemail_error' => 'ມີອັນໃດອັນໜຶ່ງຜິດພາດ ໃນ ເວລາບັນທຶກ ການຢືນຢັນຂອງທ່ານ.',
 649+'confirmemail_subject' => '{{SITENAME}} ຢືນຢັນ ທີ່ຢູ່ ອີເມລ',
 650+'confirmemail_body' => 'ຜູ້ໃດຜູ້ໜຶ່ງ, ຈາກ ທີ່ຢູ່ IP $1 ຫຼື ອາດຈະແມ່ນ ທ່ານເອງ ໄດ້ທຳການ ຈົດທະບຽນ
 651+ບັນຊີ "$2" ໂດຍ ທີ່ຢູ່ ອີເມລນີ້ ຢູ່ {{SITENAME}}.
 652+
 653+Someone, probably you from IP address $1, has registered an
 654+account "$2" with this e-mail address on {{SITENAME}}.
 655+
 656+ເພື່ອ ຈະຢືນຢັນ ວ່າ ທີ່ຢູ່ ອີເມລນີ້ ແມ່ນ ຂອງ ທ່ານແທ້ ແລະ ເປີດນຳໃຊ້ສິ່ງ ທີ່ ຈຳເປັນ ຕ້ອງ
 657+ມີ ອີເມລ ຢູ່ {{SITENAME}}, ກະລຸນາ ກົດ ລິ້ງຄ໌ ຕໍ່ໄປນີ້:
 658+
 659+$3
 660+
 661+To confirm that this account really does belong to you and activate
 662+e-mail features on {{SITENAME}}, open this link in your browser:
 663+
 664+$3
 665+
 666+ຖ້າ ທ່ານ ບໍ່ໄດ້ທຳການ ຈົດທະບຽນນີ້, ຢ່າ ກົດລິ້ງຄ໌ນີ້. ລະຫັດລິ້ງຄ໌ນີ້ ຈະໝົດ ຜົນບັງຄັບ ໃນ $4.
 667+
 668+If this is *not* you, don\'t follow the link. This confirmation code
 669+will expire at $4.',
 670+
 671+# Inputbox extension, may be useful in other contexts as well
 672+'createarticle' => 'ສ້າງບົດຄວາມ',
 673+
 674+# action=purge
 675+'confirm_purge_button' => 'ຕົກລົງ',
 676+
 677+'youhavenewmessagesmulti' => 'ທ່ານມີຂໍ້ຄວາມໃໝ່ ຢູ່ $1',
 678+
 679+'searchcontaining' => "ຊອກຫາ ບົດຄວາມ ທີ່ປະກອບມີ ''$1''.",
 680+'searchnamed' => "ຊອກຫາ ບົດຄວາມ ຊື່ ''$1''.",
 681+'articletitles' => "ບົດຄວາມ ເລີ່ມດ້ວຍ ''$1''",
 682+
 683+# Multipage image navigation
 684+'imgmultigo' => 'ໄປ!',
 685+'imgmultigotopre' => 'ໄປ ຫາ ໜ້າ',
 686+
 687+# Auto-summaries
 688+'autosumm-blank' => 'ພວມລຶບ ທຸກໆເນື້ອໃນ ຈາກ ໜ້ານີ້',
 689+'autosumm-replace' => "ປ່ຽນ ໜ້ານີ້ ໂດຍ '$1'",
 690+'autoredircomment' => 'ພວມໂອນໄປ ຫາ [[$1]]',
 691+'autosumm-new' => 'ໜ້າໃໝ່: $1',
 692+
 693+);
Index: branches/liquidthreads/languages/messages/MessagesEn.php
@@ -771,7 +771,7 @@
772772 'filedeleteerror' => 'Could not delete file "$1".',
773773 'directorycreateerror' => 'Could not create directory "$1".',
774774 'filenotfound' => 'Could not find file "$1".',
775 -'fileexists' => 'Unable to write to file "$1": file exists',
 775+'fileexistserror' => 'Unable to write to file "$1": file exists',
776776 'unexpected' => 'Unexpected value: "$1"="$2".',
777777 'formerror' => 'Error: could not submit form',
778778 'badarticleerror' => 'This action cannot be performed on this page.',
@@ -1443,14 +1443,17 @@
14441444 'imgdelete' => 'del',
14451445 'imgdesc' => 'desc',
14461446 'imgfile' => 'file',
1447 -'imglegend' => 'Legend: (desc) = show/edit file description.',
1448 -'imghistory' => 'File history',
1449 -'revertimg' => 'rev',
1450 -'deleteimg' => 'del',
1451 -'deleteimgcompletely' => 'Delete all revisions of this file',
1452 -'imghistlegend' => 'Legend: (cur) = this is the current file, (del) = delete
1453 -this old version, (rev) = revert to this old version.
1454 -<br /><i>Click on date to see the file uploaded on that date</i>.',
 1447+'filehist' => 'File history',
 1448+'filehist-help' => 'Click on a date/time to view the file as it appeared at that time.',
 1449+'filehist-deleteall' => 'delete all',
 1450+'filehist-deleteone' => 'delete this',
 1451+'filehist-revert' => 'revert',
 1452+'filehist-current' => 'current',
 1453+'filehist-datetime' => 'Date/Time',
 1454+'filehist-user' => 'User',
 1455+'filehist-dimensions' => 'Dimensions',
 1456+'filehist-filesize' => 'File size',
 1457+'filehist-comment' => 'Comment',
14551458 'imagelinks' => 'Links',
14561459 'linkstoimage' => 'The following pages link to this file:',
14571460 'nolinkstoimage' => 'There are no pages that link to this file.',
@@ -1468,6 +1471,16 @@
14691472 'imagelist_description' => 'Description',
14701473 'imagelist_search_for' => 'Search for image name:',
14711474
 1475+# File reversion
 1476+'filerevert' => 'Revert $1',
 1477+'filerevert-legend' => 'Revert file',
 1478+'filerevert-intro' => "<span class=\"plainlinks\">You are reverting '''[[Media:$1|$1]]''' to the [$4 version as of $2, $3].</span>",
 1479+'filerevert-comment' => 'Comment:',
 1480+'filerevert-defaultcomment' => 'Reverted to version as of $1, $2',
 1481+'filerevert-submit' => 'Revert',
 1482+'filerevert-success' => "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' has been reverted to the [$4 version as of $2, $3].</span>",
 1483+'filerevert-badversion' => 'There is no previous local version of this file with the provided timestamp.',
 1484+
14721485 # MIME search
14731486 'mimesearch' => 'MIME search',
14741487 'mimesearch-summary' => 'This page enables the filtering of files for its MIME-type. Input: contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
@@ -1794,7 +1807,6 @@
17951808 'deletionlog' => 'deletion log',
17961809 'reverted' => 'Reverted to earlier revision',
17971810 'deletecomment' => 'Reason for deletion',
1798 -'imagereverted' => 'Revert to earlier version was successful.',
17991811 'rollback' => 'Roll back edits',
18001812 'rollback_short' => 'Rollback',
18011813 'rollbacklink' => 'rollback',
Index: branches/liquidthreads/includes/Title.php
@@ -2126,7 +2126,7 @@
21272127 * be a redirect
21282128 */
21292129 private function moveOverExistingRedirect( &$nt, $reason = '' ) {
2130 - global $wgUseSquid;
 2130+ global $wgUseSquid, $wgContLang;
21312131 $fname = 'Title::moveOverExistingRedirect';
21322132 $comment = wfMsgForContent( '1movedto2_redir', $this->getPrefixedText(), $nt->getPrefixedText() );
21332133
@@ -2156,6 +2156,7 @@
21572157 'page_touched' => $dbw->timestamp($now),
21582158 'page_namespace' => $nt->getNamespace(),
21592159 'page_title' => $nt->getDBkey(),
 2160+ 'page_key' => $wgContLang->caseFold($nt->getDBkey()),
21602161 'page_latest' => $nullRevId,
21612162 ),
21622163 /* WHERE */ array( 'page_id' => $oldid ),
@@ -2203,7 +2204,7 @@
22042205 * @param Title &$nt the new Title
22052206 */
22062207 private function moveToNewTitle( &$nt, $reason = '' ) {
2207 - global $wgUseSquid;
 2208+ global $wgUseSquid, $wgContLang;
22082209 $fname = 'MovePageForm::moveToNewTitle';
22092210 $comment = wfMsgForContent( '1movedto2', $this->getPrefixedText(), $nt->getPrefixedText() );
22102211 if ( $reason ) {
@@ -2226,6 +2227,7 @@
22272228 'page_touched' => $now,
22282229 'page_namespace' => $nt->getNamespace(),
22292230 'page_title' => $nt->getDBkey(),
 2231+ 'page_key' => $wgContLang->caseFold($nt->getDBkey()),
22302232 'page_latest' => $nullRevId,
22312233 ),
22322234 /* WHERE */ array( 'page_id' => $oldid ),
Index: branches/liquidthreads/includes/ImagePage.php
@@ -105,7 +105,7 @@
106106 global $wgLang;
107107 $r = '<ul id="filetoc">
108108 <li><a href="#file">' . $wgLang->getNsText( NS_IMAGE ) . '</a></li>
109 - <li><a href="#filehistory">' . wfMsgHtml( 'imghistory' ) . '</a></li>
 109+ <li><a href="#filehistory">' . wfMsgHtml( 'filehist' ) . '</a></li>
110110 <li><a href="#filelinks">' . wfMsgHtml( 'imagelinks' ) . '</a></li>' .
111111 ($metadata ? ' <li><a href="#metadata">' . wfMsgHtml( 'metadata' ) . '</a></li>' : '') . '
112112 </ul>';
@@ -554,7 +554,7 @@
555555 $wgOut->showUnexpectedValueError( 'oldimage', htmlspecialchars($oldimage) );
556556 return;
557557 }
558 - if ( strstr( $oldimage, "/" ) || strstr( $oldimage, "\\" ) ) {
 558+ if( strpos( $oldimage, '/' ) !== false || strpos( $oldimage, '\\' ) !== false ) {
559559 $wgOut->showUnexpectedValueError( 'oldimage', htmlspecialchars($oldimage) );
560560 return;
561561 }
@@ -610,56 +610,12 @@
611611 return $status;
612612 }
613613
 614+ /**
 615+ * Revert the file to an earlier version
 616+ */
614617 function revert() {
615 - global $wgOut, $wgRequest, $wgUser;
616 -
617 - $oldimage = $wgRequest->getText( 'oldimage' );
618 - if ( strlen( $oldimage ) < 16 ) {
619 - $wgOut->showUnexpectedValueError( 'oldimage', htmlspecialchars($oldimage) );
620 - return;
621 - }
622 - if ( strstr( $oldimage, "/" ) || strstr( $oldimage, "\\" ) ) {
623 - $wgOut->showUnexpectedValueError( 'oldimage', htmlspecialchars($oldimage) );
624 - return;
625 - }
626 -
627 - if ( wfReadOnly() ) {
628 - $wgOut->readOnlyPage();
629 - return;
630 - }
631 - if( $wgUser->isAnon() ) {
632 - $wgOut->showErrorPage( 'uploadnologin', 'uploadnologintext' );
633 - return;
634 - }
635 - if ( ! $this->mTitle->userCan( 'edit' ) ) {
636 - $wgOut->readOnlyPage( $this->getContent(), true );
637 - return;
638 - }
639 - if ( $wgUser->isBlocked() ) {
640 - $wgOut->blockedPage();
641 - return;
642 - }
643 - if( !$wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ), $oldimage ) ) {
644 - $wgOut->showErrorPage( 'internalerror', 'sessionfailure' );
645 - return;
646 - }
647 -
648 - $sourcePath = $this->img->getArchiveVirtualUrl( $oldimage );
649 - $comment = wfMsg( "reverted" );
650 - // TODO: preserve file properties from DB instead of reloading from file
651 - $status = $this->img->upload( $sourcePath, $comment, $comment );
652 -
653 - if ( !$status->isGood() ) {
654 - $this->showError( $status->getWikiText() );
655 - return;
656 - }
657 -
658 - $wgOut->setPagetitle( wfMsg( 'actioncomplete' ) );
659 - $wgOut->setRobotpolicy( 'noindex,nofollow' );
660 - $wgOut->addHTML( wfMsg( 'imagereverted' ) );
661 -
662 - $descTitle = $this->img->getTitle();
663 - $wgOut->returnToMain( false, $descTitle->getPrefixedText() );
 618+ $reverter = new FileRevertForm( $this->img );
 619+ $reverter->execute();
664620 }
665621
666622 /**
@@ -693,85 +649,109 @@
694650 }
695651
696652 /**
697 - * @todo document
 653+ * Builds the image revision log shown on image pages
 654+ *
698655 * @addtogroup Media
699656 */
700657 class ImageHistoryList {
701 - var $img, $skin;
702 - function ImageHistoryList( $skin, $img ) {
 658+
 659+ protected $img, $skin, $title;
 660+
 661+ public function __construct( $skin, $img ) {
703662 $this->skin = $skin;
704663 $this->img = $img;
 664+ $this->title = $img->getTitle();
705665 }
706666
707 - function beginImageHistoryList() {
708 - $s = "\n" .
709 - Xml::element( 'h2', array( 'id' => 'filehistory' ), wfMsg( 'imghistory' ) ) .
710 - "\n<p>" . wfMsg( 'imghistlegend' ) . "</p>\n".'<ul class="special">';
711 - return $s;
 667+ public function beginImageHistoryList() {
 668+ global $wgOut, $wgUser;
 669+ return Xml::element( 'h2', array( 'id' => 'filehistory' ), wfMsg( 'filehist' ) )
 670+ . $wgOut->parse( wfMsgNoTrans( 'filehist-help' ) )
 671+ . Xml::openElement( 'table', array( 'class' => 'filehistory' ) ) . "\n"
 672+ . '<tr><td></td>'
 673+ . ( $this->img->isLocal() && $wgUser->isAllowed( 'delete' ) ? '<td></td>' : '' )
 674+ . '<th>' . wfMsgHtml( 'filehist-datetime' ) . '</th>'
 675+ . '<th>' . wfMsgHtml( 'filehist-user' ) . '</th>'
 676+ . '<th>' . wfMsgHtml( 'filehist-dimensions' ) . '</th>'
 677+ . '<th class="mw-imagepage-filesize">' . wfMsgHtml( 'filehist-filesize' ) . '</th>'
 678+ . '<th>' . wfMsgHtml( 'filehist-comment' ) . '</th>'
 679+ . "</tr>\n";
712680 }
713681
714 - function endImageHistoryList() {
715 - $s = "</ul>\n";
716 - return $s;
 682+ public function endImageHistoryList() {
 683+ return "</table>\n";
717684 }
718685
719 - function imageHistoryLine( $iscur, $timestamp, $img, $user, $usertext, $size, $description, $width, $height ) {
 686+ public function imageHistoryLine( $iscur, $timestamp, $img, $user, $usertext, $size, $description, $width, $height ) {
720687 global $wgUser, $wgLang, $wgTitle, $wgContLang;
721 -
722 - $datetime = $wgLang->timeanddate( $timestamp, true );
723 - $del = wfMsgHtml( 'deleteimg' );
724 - $delall = wfMsgHtml( 'deleteimgcompletely' );
725 - $cur = wfMsgHtml( 'cur' );
726688 $local = $this->img->isLocal();
 689+ $row = '';
727690
728 - if ( $iscur ) {
729 - $url = htmlspecialchars( $this->img->getURL() );
730 - $rlink = $cur;
731 - if ( $local && $wgUser->isAllowed('delete') ) {
732 - $link = $wgTitle->escapeLocalURL( 'image=' . $wgTitle->getPartialURL() .
733 - '&action=delete' );
734 - $style = $this->skin->getInternalLinkAttributes( $link, $delall );
 691+ // Deletion link
 692+ if( $local && $wgUser->isAllowed( 'delete' ) ) {
 693+ $row .= '<td>';
 694+ $q = array();
 695+ $q[] = 'action=delete';
 696+ $q[] = ( $iscur ? 'image=' . $this->title->getPartialUrl() : 'oldimage=' . urlencode( $img ) );
 697+ if( !$iscur )
 698+ $q[] = 'wpEditToken=' . urlencode( $wgUser->editToken( $img ) );
 699+ $row .= '(' . $this->skin->makeKnownLinkObj(
 700+ $this->title,
 701+ wfMsgHtml( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' ),
 702+ implode( '&', $q )
 703+ ) . ')';
 704+ $row .= '</td>';
 705+ }
735706
736 - $dlink = '<a href="'.$link.'"'.$style.'>'.$delall.'</a>';
737 - } else {
738 - $dlink = $del;
739 - }
740 - } else {
741 - $url = htmlspecialchars( $this->img->getArchiveUrl( $img ) );
742 - if( $local && $wgUser->getID() != 0 && $wgTitle->userCan( 'edit' ) ) {
743 - $token = urlencode( $wgUser->editToken( $img ) );
744 - $rlink = $this->skin->makeKnownLinkObj( $wgTitle,
745 - wfMsgHtml( 'revertimg' ), 'action=revert&oldimage=' .
746 - urlencode( $img ) . "&wpEditToken=$token" );
747 - $dlink = $this->skin->makeKnownLinkObj( $wgTitle,
748 - $del, 'action=delete&oldimage=' . urlencode( $img ) .
749 - "&wpEditToken=$token" );
750 - } else {
751 - # Having live active links for non-logged in users
752 - # means that bots and spiders crawling our site can
753 - # inadvertently change content. Baaaad idea.
754 - $rlink = wfMsgHtml( 'revertimg' );
755 - $dlink = $del;
756 - }
 707+ // Reversion link/current indicator
 708+ $row .= '<td>';
 709+ if( $iscur ) {
 710+ $row .= '(' . wfMsgHtml( 'filehist-current' ) . ')';
 711+ } elseif( $local && $wgUser->isLoggedIn() && $this->title->userCan( 'edit' ) ) {
 712+ $q = array();
 713+ $q[] = 'action=revert';
 714+ $q[] = 'oldimage=' . urlencode( $img );
 715+ $q[] = 'wpEditToken=' . urlencode( $wgUser->editToken( $img ) );
 716+ $row .= '(' . $this->skin->makeKnownLinkObj(
 717+ $this->title,
 718+ wfMsgHtml( 'filehist-revert' ),
 719+ implode( '&', $q )
 720+ ) . ')';
757721 }
 722+ $row .= '</td>';
758723
759 - if ( $local ) {
760 - $userlink = $this->skin->userLink( $user, $usertext ) . $this->skin->userToolLinks( $user, $usertext );
 724+ // Date/time and image link
 725+ $row .= '<td>';
 726+ $url = $iscur ? $this->img->getUrl() : $this->img->getArchiveUrl( $img );
 727+ $row .= Xml::element(
 728+ 'a',
 729+ array( 'href' => $url ),
 730+ $wgLang->timeAndDate( $timestamp, true )
 731+ );
 732+ $row .= '</td>';
 733+
 734+ // Uploading user
 735+ $row .= '<td>';
 736+ if( $local ) {
 737+ $row .= $this->skin->userLink( $user, $usertext ) . $this->skin->userToolLinks( $user, $usertext );
761738 } else {
762 - $userlink = htmlspecialchars( $usertext );
 739+ $row .= htmlspecialchars( $usertext );
763740 }
764 - $nbytes = wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ),
765 - $wgLang->formatNum( $size ) );
766 - $widthheight = wfMsgHtml( 'widthheight', $width, $height );
767 - $style = $this->skin->getInternalLinkAttributes( $url, $datetime );
 741+ $row .= '</td>';
768742
769 - $s = "<li> ({$dlink}) ({$rlink}) <a href=\"{$url}\"{$style}>{$datetime}</a> . . {$userlink} . . {$widthheight} ({$nbytes})";
 743+ // Image dimensions
 744+ // FIXME: It would be nice to show the duration (sound files) or
 745+ // width/height/duration (video files) here, but this needs some
 746+ // additional media handler work
 747+ $row .= '<td>' . wfMsgHtml( 'widthheight', $width, $height ) . '</td>';
770748
771 - $s .= $this->skin->commentBlock( $description, $wgTitle );
772 - $s .= "</li>\n";
773 - return $s;
774 - }
775 -}
 749+ // File size
 750+ $row .= '<td class="mw-imagepage-filesize">' . $this->skin->formatSize( $size ) . '</td>';
776751
 752+ // Comment
 753+ $row .= '<td>' . $this->skin->formatComment( $description, $this->title ) . '</td>';
777754
 755+ return "<tr>{$row}</tr>\n";
 756+ }
778757
 758+}
\ No newline at end of file
Index: branches/liquidthreads/includes/DatabasePostgres.php
@@ -105,6 +105,9 @@
106106 function searchableIPs() {
107107 return true;
108108 }
 109+ function functionalIndexes() {
 110+ return true;
 111+ }
109112
110113 static function newFromParams( $server, $user, $password, $dbName, $failFunction = false, $flags = 0)
111114 {
Index: branches/liquidthreads/includes/Article.php
@@ -262,6 +262,7 @@
263263 'page_id',
264264 'page_namespace',
265265 'page_title',
 266+ 'page_key',
266267 'page_restrictions',
267268 'page_counter',
268269 'page_is_redirect',
@@ -1001,6 +1002,7 @@
10021003 * @private
10031004 */
10041005 function insertOn( $dbw ) {
 1006+ global $wgContLang;
10051007 wfProfileIn( __METHOD__ );
10061008
10071009 $page_id = $dbw->nextSequenceValue( 'page_page_id_seq' );
@@ -1008,6 +1010,7 @@
10091011 'page_id' => $page_id,
10101012 'page_namespace' => $this->mTitle->getNamespace(),
10111013 'page_title' => $this->mTitle->getDBkey(),
 1014+ 'page_key' => $wgContLang->caseFold($this->mTitle->getDBkey()),
10121015 'page_counter' => 0,
10131016 'page_restrictions' => '',
10141017 'page_is_redirect' => 0, # Will set this shortly...
Index: branches/liquidthreads/includes/filerepo/FSRepo.php
@@ -166,10 +166,10 @@
167167 $hashSource = sha1_file( $srcPath );
168168 $hashDest = sha1_file( $dstPath );
169169 if ( $hashSource != $hashDest ) {
170 - $status->fatal( 'fileexists', $dstPath );
 170+ $status->fatal( 'fileexistserror', $dstPath );
171171 }
172172 } else {
173 - $status->fatal( 'fileexists', $dstPath );
 173+ $status->fatal( 'fileexistserror', $dstPath );
174174 }
175175 }
176176 }
Index: branches/liquidthreads/includes/filerepo/File.php
@@ -975,7 +975,8 @@
976976 }
977977
978978 /**
979 - * Get the 14-character timestamp of the file upload, or false if
 979+ * Get the 14-character timestamp of the file upload, or false if
 980+ * it doesn't exist
980981 */
981982 function getTimestamp() {
982983 $path = $this->getPath();
Index: branches/liquidthreads/includes/media/Bitmap.php
@@ -274,11 +274,11 @@
275275 // Sort fields into visible and collapsed
276276 $visibleFields = $this->visibleMetadataFields();
277277 foreach ( $formatted as $name => $value ) {
278 - $tag = strtolower( $k );
 278+ $tag = strtolower( $name );
279279 self::addMeta( $result,
280280 in_array( $tag, $visibleFields ) ? 'visible' : 'collapsed',
281281 'exif',
282 - "exif-$tag",
 282+ $tag,
283283 $value
284284 );
285285 }
Index: branches/liquidthreads/includes/media/BMP.php
@@ -1,8 +1,8 @@
22 <?php
 3+
34 /**
4 - * Handler for Microsoft bitmap format (bmp). It inherits most of the methods
5 - * from ImageHandler, some of them had to be overriden cause gd does not
6 - * support this format.
 5+ * Handler for Microsoft's bitmap format; getimagesize() doesn't
 6+ * support these files
77 *
88 * @addtogroup Media
99 */
@@ -26,6 +26,4 @@
2727 $h = unpack( 'V' , $h );
2828 return array( $w[1], $h[1] );
2929 }
30 -}
31 -
32 -
 30+}
\ No newline at end of file
Index: branches/liquidthreads/includes/Database.php
@@ -448,6 +448,13 @@
449449 return false;
450450 }
451451
 452+ /**
 453+ * Returns true if this database can use functional indexes
 454+ */
 455+ function functionalIndexes() {
 456+ return false;
 457+ }
 458+
452459 /**#@+
453460 * Get function
454461 */
Index: branches/liquidthreads/includes/api/ApiQueryAllpages.php
@@ -63,7 +63,7 @@
6464 if (!is_null($params['from']))
6565 $this->addWhere('page_title>=' . $db->addQuotes(ApiQueryBase :: titleToKey($params['from'])));
6666 if (isset ($params['prefix']))
67 - $this->addWhere("page_title LIKE '" . $db->strencode(ApiQueryBase :: titleToKey($params['prefix'])) . "%'");
 67+ $this->addWhere("page_title LIKE '" . $db->escapeLike(ApiQueryBase :: titleToKey($params['prefix'])) . "%'");
6868
6969 if (is_null($resultPageSet)) {
7070 $this->addFields(array (
Index: branches/liquidthreads/includes/api/ApiQueryImageInfo.php
@@ -71,8 +71,11 @@
7272
7373 if ($fld_timestamp)
7474 $vals['timestamp'] = wfTimestamp(TS_ISO_8601, $line->img_timestamp);
75 - if ($fld_user)
 75+ if ($fld_user) {
7676 $vals['user'] = $line->img_user_text;
 77+ if(!$line->img_user)
 78+ $vals['anon'] = '';
 79+ }
7780 if ($fld_size) {
7881 $vals['size'] = $line->img_size;
7982 $vals['width'] = $line->img_width;
Index: branches/liquidthreads/includes/api/ApiQueryBase.php
@@ -52,11 +52,16 @@
5353 $this->options = array ();
5454 }
5555
56 - protected function addTables($value) {
57 - if (is_array($value))
58 - $this->tables = array_merge($this->tables, $value);
59 - else
60 - $this->tables[] = $value;
 56+ protected function addTables($tables, $alias = null) {
 57+ if (is_array($tables)) {
 58+ if (!is_null($alias))
 59+ ApiBase :: dieDebug(__METHOD__, 'Multiple table aliases not supported');
 60+ $this->tables = array_merge($this->tables, $tables);
 61+ } else {
 62+ if (!is_null($alias))
 63+ $tables = $this->getDB()->tableName($tables) . ' ' . $alias;
 64+ $this->tables[] = $tables;
 65+ }
6166 }
6267
6368 protected function addFields($value) {
Index: branches/liquidthreads/includes/api/ApiQueryRevisions.php
@@ -219,7 +219,6 @@
220220
221221 if ($this->fld_ids) {
222222 $vals['revid'] = intval($row->rev_id);
223 - $vals['pageid'] = intval($row->rev_page);
224223 // $vals['oldid'] = intval($row->rev_text_id); // todo: should this be exposed?
225224 }
226225
Index: branches/liquidthreads/includes/api/ApiQueryAllUsers.php
@@ -5,7 +5,7 @@
66 *
77 * API for MediaWiki 1.8+
88 *
9 - * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
 9+ * Copyright (C) 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com
1010 *
1111 * This program is free software; you can redistribute it and/or modify
1212 * it under the terms of the GNU General Public License as published by
@@ -47,42 +47,107 @@
4848 if (!is_null($prop)) {
4949 $prop = array_flip($prop);
5050 $fld_editcount = isset($prop['editcount']);
 51+ $fld_groups = isset($prop['groups']);
5152 } else {
52 - $fld_editcount = false;
 53+ $fld_editcount = $fld_groups = false;
5354 }
5455
55 - $this->addTables('user');
 56+ $limit = $params['limit'];
 57+ $tables = $db->tableName('user');
5658
5759 if (!is_null($params['from']))
5860 $this->addWhere('user_name>=' . $db->addQuotes(ApiQueryBase :: titleToKey($params['from'])));
5961
 62+ if (isset($params['prefix']))
 63+ $this->addWhere("user_name LIKE '" . $db->escapeLike(ApiQueryBase :: titleToKey($params['prefix'])) . "%'");
 64+
 65+ if (!is_null($params['group'])) {
 66+ // Filter only users that belong to a given group
 67+ $tblName = $db->tableName('user_groups');
 68+ $tables = "$tables INNER JOIN $tblName ug1 ON ug1.ug_user=user_id";
 69+ $this->addWhereFld('ug1.ug_group', $params['group']);
 70+ }
 71+
 72+ if ($fld_groups) {
 73+ // Show the groups the given users belong to
 74+ // request more than needed to avoid not getting all rows that belong to one user
 75+ $groupCount = count(User::getAllGroups());
 76+ $sqlLimit = $limit+$groupCount+1;
 77+
 78+ $tblName = $db->tableName('user_groups');
 79+ $tables = "$tables LEFT JOIN $tblName ug2 ON ug2.ug_user=user_id";
 80+ $this->addFields('ug2.ug_group ug_group2');
 81+ } else {
 82+ $sqlLimit = $limit+1;
 83+ }
 84+
 85+ $this->addOption('LIMIT', $sqlLimit);
 86+ $this->addTables($tables);
 87+
6088 $this->addFields('user_name');
6189 $this->addFieldsIf('user_editcount', $fld_editcount);
6290
63 - $limit = $params['limit'];
64 - $this->addOption('LIMIT', $limit+1);
6591 $this->addOption('ORDER BY', 'user_name');
6692
6793 $res = $this->select(__METHOD__);
6894
6995 $data = array ();
7096 $count = 0;
71 - while ($row = $db->fetchObject($res)) {
72 - if (++ $count > $limit) {
73 - // We've reached the one extra which shows that there are additional pages to be had. Stop here...
74 - $this->setContinueEnumParameter('from', ApiQueryBase :: keyToTitle($row->user_name));
75 - break;
76 - }
 97+ $lastUserData = false;
 98+ $lastUser = false;
 99+ $result = $this->getResult();
 100+
 101+ //
 102+ // This loop keeps track of the last entry.
 103+ // For each new row, if the new row is for different user then the last, the last entry is added to results.
 104+ // Otherwise, the group of the new row is appended to the last entry.
 105+ // The setContinue... is more complex because of this, and takes into account the higher sql limit
 106+ // to make sure all rows that belong to the same user are received.
 107+ //
 108+ while (true) {
 109+
 110+ $row = $db->fetchObject($res);
 111+ $count++;
 112+
 113+ if (!$row || $lastUser != $row->user_name) {
 114+ // Save the last pass's user data
 115+ if (is_array($lastUserData))
 116+ $data[] = $lastUserData;
 117+
 118+ // No more rows left
 119+ if (!$row)
 120+ break;
77121
78 - $vals = array( 'name' => $row->user_name );
79 - if ($fld_editcount) {
80 - $vals['editcount'] = intval($row->user_editcount);
 122+ if ($count > $limit) {
 123+ // We've reached the one extra which shows that there are additional pages to be had. Stop here...
 124+ $this->setContinueEnumParameter('from', ApiQueryBase :: keyToTitle($row->user_name));
 125+ break;
 126+ }
 127+
 128+ // Record new user's data
 129+ $lastUser = $row->user_name;
 130+ $lastUserData = array( 'name' => $lastUser );
 131+ if ($fld_editcount)
 132+ $lastUserData['editcount'] = intval($row->user_editcount);
 133+
81134 }
82 - $data[] = $vals;
 135+
 136+ if ($sqlLimit == $count) {
 137+ // BUG! database contains group name that User::getAllGroups() does not return
 138+ // TODO: should handle this more gracefully
 139+ ApiBase :: dieDebug(__METHOD__,
 140+ 'MediaWiki configuration error: the database contains more user groups than known to User::getAllGroups() function');
 141+ }
 142+
 143+ // Add user's group info
 144+ if ($fld_groups && !is_null($row->ug_group2)) {
 145+ $lastUserData['groups'][] = $row->ug_group2;
 146+ $result->setIndexedTagName($lastUserData['groups'], 'g');
 147+ }
83148 }
 149+
84150 $db->freeResult($res);
85151
86 - $result = $this->getResult();
87152 $result->setIndexedTagName($data, 'u');
88153 $result->addValue('query', $this->getModuleName(), $data);
89154 }
@@ -90,10 +155,15 @@
91156 protected function getAllowedParams() {
92157 return array (
93158 'from' => null,
 159+ 'prefix' => null,
 160+ 'group' => array(
 161+ ApiBase :: PARAM_TYPE => User::getAllGroups()
 162+ ),
94163 'prop' => array (
95164 ApiBase :: PARAM_ISMULTI => true,
96165 ApiBase :: PARAM_TYPE => array (
97 - 'editcount'
 166+ 'editcount',
 167+ 'groups',
98168 )
99169 ),
100170 'limit' => array (
@@ -109,8 +179,12 @@
110180 protected function getParamDescription() {
111181 return array (
112182 'from' => 'The user name to start enumerating from.',
113 - 'prop' => 'What pieces of information to include',
114 - 'limit' => 'How many total user names to return.'
 183+ 'prefix' => 'Search for all page titles that begin with this value.',
 184+ 'group' => 'Limit users to a given group name',
 185+ 'prop' => array(
 186+ 'What pieces of information to include.',
 187+ '`groups` property uses more server resources and may return fewer results than the limit.'),
 188+ 'limit' => 'How many total user names to return.',
115189 );
116190 }
117191
Index: branches/liquidthreads/includes/api/ApiQuerySearch.php
@@ -0,0 +1,151 @@
 2+<?php
 3+
 4+/*
 5+ * Created on July 30, 2007
 6+ *
 7+ * API for MediaWiki 1.8+
 8+ *
 9+ * Copyright (C) 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com
 10+ *
 11+ * This program is free software; you can redistribute it and/or modify
 12+ * it under the terms of the GNU General Public License as published by
 13+ * the Free Software Foundation; either version 2 of the License, or
 14+ * (at your option) any later version.
 15+ *
 16+ * This program is distributed in the hope that it will be useful,
 17+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
 18+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 19+ * GNU General Public License for more details.
 20+ *
 21+ * You should have received a copy of the GNU General Public License along
 22+ * with this program; if not, write to the Free Software Foundation, Inc.,
 23+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 24+ * http://www.gnu.org/copyleft/gpl.html
 25+ */
 26+
 27+if (!defined('MEDIAWIKI')) {
 28+ // Eclipse helper - will be ignored in production
 29+ require_once ('ApiQueryBase.php');
 30+}
 31+
 32+/**
 33+ * Query module to perform full text search within wiki titles and content
 34+ *
 35+ * @addtogroup API
 36+ */
 37+class ApiQuerySearch extends ApiQueryGeneratorBase {
 38+
 39+ public function __construct($query, $moduleName) {
 40+ parent :: __construct($query, $moduleName, 'sr');
 41+ }
 42+
 43+ public function execute() {
 44+ $this->run();
 45+ }
 46+
 47+ public function executeGenerator($resultPageSet) {
 48+ $this->run($resultPageSet);
 49+ }
 50+
 51+ private function run($resultPageSet = null) {
 52+
 53+ $params = $this->extractRequestParams();
 54+
 55+ $limit = $params['limit'];
 56+ $query = $params['search'];
 57+ if (is_null($query) || empty($query))
 58+ $this->dieUsage("empty search string is not allowed", 'param-search');
 59+
 60+ $search = SearchEngine::create();
 61+ $search->setLimitOffset( $limit+1, $params['offset'] );
 62+ $search->setNamespaces( $params['namespace'] );
 63+ $search->showRedirects = $params['redirects'];
 64+
 65+ if ($params['what'] == 'text')
 66+ $matches = $search->searchText( $query );
 67+ else
 68+ $matches = $search->searchTitle( $query );
 69+
 70+ $data = array ();
 71+ $count = 0;
 72+ while( $result = $matches->next() ) {
 73+ if (++ $count > $limit) {
 74+ // We've reached the one extra which shows that there are additional items to be had. Stop here...
 75+ $this->setContinueEnumParameter('offset', $params['offset'] + $params['limit']);
 76+ break;
 77+ }
 78+
 79+ $title = $result->getTitle();
 80+ if (is_null($resultPageSet)) {
 81+ $data[] = array(
 82+ 'ns' => intval($title->getNamespace()),
 83+ 'title' => $title->getPrefixedText());
 84+ } else {
 85+ $data[] = $title;
 86+ }
 87+ }
 88+
 89+ if (is_null($resultPageSet)) {
 90+ $result = $this->getResult();
 91+ $result->setIndexedTagName($data, 'p');
 92+ $result->addValue('query', $this->getModuleName(), $data);
 93+ } else {
 94+ $resultPageSet->populateFromTitles($data);
 95+ }
 96+ }
 97+
 98+ protected function getAllowedParams() {
 99+ return array (
 100+ 'search' => null,
 101+ 'namespace' => array (
 102+ ApiBase :: PARAM_DFLT => 0,
 103+ ApiBase :: PARAM_TYPE => 'namespace',
 104+ ApiBase :: PARAM_ISMULTI => true,
 105+ ),
 106+ 'what' => array (
 107+ ApiBase :: PARAM_DFLT => 'title',
 108+ ApiBase :: PARAM_TYPE => array (
 109+ 'title',
 110+ 'text',
 111+ )
 112+ ),
 113+ 'redirects' => false,
 114+ 'offset' => 0,
 115+ 'limit' => array (
 116+ ApiBase :: PARAM_DFLT => 10,
 117+ ApiBase :: PARAM_TYPE => 'limit',
 118+ ApiBase :: PARAM_MIN => 1,
 119+ ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,
 120+ ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
 121+ )
 122+ );
 123+ }
 124+
 125+ protected function getParamDescription() {
 126+ return array (
 127+ 'search' => 'Search for all page titles (or content) that has this value.',
 128+ 'namespace' => 'The namespace(s) to enumerate.',
 129+ 'what' => 'Search inside the text or titles.',
 130+ 'redirects' => 'Include redirect pages in the search.',
 131+ 'offset' => 'Use this value to continue paging (return by query)',
 132+ 'limit' => 'How many total pages to return.'
 133+ );
 134+ }
 135+
 136+ protected function getDescription() {
 137+ return 'Perform a full text search';
 138+ }
 139+
 140+ protected function getExamples() {
 141+ return array (
 142+ 'api.php?action=query&list=search&srsearch=meaning',
 143+ 'api.php?action=query&list=search&srwhat=text&srsearch=meaning',
 144+ 'api.php?action=query&generator=search&gsrsearch=meaning&prop=info',
 145+ );
 146+ }
 147+
 148+ public function getVersion() {
 149+ return __CLASS__ . ': $Id$';
 150+ }
 151+}
 152+
Property changes on: branches/liquidthreads/includes/api/ApiQuerySearch.php
___________________________________________________________________
Added: svn:eol-style
1153 + native
Added: svn:keywords
2154 + Id
Index: branches/liquidthreads/includes/api/ApiQueryAllLinks.php
@@ -70,7 +70,7 @@
7171 if (!is_null($params['from']))
7272 $this->addWhere('pl_title>=' . $db->addQuotes(ApiQueryBase :: titleToKey($params['from'])));
7373 if (isset ($params['prefix']))
74 - $this->addWhere("pl_title LIKE '" . $db->strencode(ApiQueryBase :: titleToKey($params['prefix'])) . "%'");
 74+ $this->addWhere("pl_title LIKE '" . $db->escapeLike(ApiQueryBase :: titleToKey($params['prefix'])) . "%'");
7575
7676 if (is_null($resultPageSet)) {
7777 $this->addFields(array (
Index: branches/liquidthreads/includes/api/ApiQuery.php
@@ -67,6 +67,7 @@
6868 'imageusage' => 'ApiQueryBacklinks',
6969 'logevents' => 'ApiQueryLogEvents',
7070 'recentchanges' => 'ApiQueryRecentChanges',
 71+ 'search' => 'ApiQuerySearch',
7172 'usercontribs' => 'ApiQueryContributions',
7273 'watchlist' => 'ApiQueryWatchlist',
7374 'exturlusage' => 'ApiQueryExtLinksUsage',
Index: branches/liquidthreads/includes/OutputPage.php
@@ -1062,12 +1062,25 @@
10631063 }
10641064
10651065 /**
1066 - * return from error messages or notes
1067 - * @param $unused No longer used
1068 - * @param $returnto page title to return to. Default is Main Page.
 1066+ * Add a "return to" link pointing to a specified title
 1067+ *
 1068+ * @param Title $title Title to link
10691069 */
 1070+ public function addReturnTo( $title ) {
 1071+ global $wgUser;
 1072+ $link = wfMsg( 'returnto', $wgUser->getSkin()->makeLinkObj( $title ) );
 1073+ $this->addHtml( "<p>{$link}</p>\n" );
 1074+ }
 1075+
 1076+ /**
 1077+ * Add a "return to" link pointing to a specified title,
 1078+ * or the title indicated in the request, or else the main page
 1079+ *
 1080+ * @param null $unused No longer used
 1081+ * @param Title $returnto Title to return to
 1082+ */
10701083 public function returnToMain( $unused = null, $returnto = NULL ) {
1071 - global $wgUser, $wgOut, $wgRequest;
 1084+ global $wgRequest;
10721085
10731086 if ( $returnto == NULL ) {
10741087 $returnto = $wgRequest->getText( 'returnto' );
@@ -1086,11 +1099,7 @@
10871100 $titleObj = Title::newMainPage();
10881101 }
10891102
1090 - $sk = $wgUser->getSkin();
1091 - $link = $sk->makeLinkObj( $titleObj, '' );
1092 -
1093 - $r = wfMsg( 'returnto', $link );
1094 - $wgOut->addHTML( "\n<p>$r</p>\n" );
 1103+ $this->addReturnTo( $titleObj );
10951104 }
10961105
10971106 /**
Index: branches/liquidthreads/includes/SpecialUndelete.php
@@ -799,7 +799,7 @@
800800
801801
802802 if( $haveFiles ) {
803 - $wgOut->addHtml( "<h2>" . wfMsgHtml( 'imghistory' ) . "</h2>\n" );
 803+ $wgOut->addHtml( "<h2>" . wfMsgHtml( 'filehist' ) . "</h2>\n" );
804804 $wgOut->addHtml( "<ul>" );
805805 while( $row = $files->fetchObject() ) {
806806 $ts = wfTimestamp( TS_MW, $row->fa_timestamp );
Index: branches/liquidthreads/includes/FileRevertForm.php
@@ -0,0 +1,183 @@
 2+<?php
 3+
 4+/**
 5+ * File reversion user interface
 6+ *
 7+ * @addtogroup Media
 8+ * @author Rob Church <robchur@gmail.com>
 9+ */
 10+class FileRevertForm {
 11+
 12+ private $title = null;
 13+ private $file = null;
 14+ private $oldimage = '';
 15+
 16+ /**
 17+ * Constructor
 18+ *
 19+ * @param File $file File we're reverting
 20+ */
 21+ public function __construct( $file ) {
 22+ $this->title = $file->getTitle();
 23+ $this->file = $file;
 24+ }
 25+
 26+ /**
 27+ * Fulfil the request; shows the form or reverts the file,
 28+ * pending authentication, confirmation, etc.
 29+ */
 30+ public function execute() {
 31+ global $wgOut, $wgRequest, $wgUser, $wgLang, $wgServer;
 32+ $this->setHeaders();
 33+
 34+ if( wfReadOnly() ) {
 35+ $wgOut->readOnlyPage();
 36+ return;
 37+ } elseif( !$wgUser->isLoggedIn() ) {
 38+ $wgOut->showErrorPage( 'uploadnologin', 'uploadnologintext' );
 39+ return;
 40+ } elseif( !$this->title->userCan( 'edit' ) ) {
 41+ // The standard read-only thing doesn't make a whole lot of sense
 42+ // here; surely it should show the image or something? -- RC
 43+ $article = new Article( $this->title );
 44+ $wgOut->readOnlyPage( $article->getContent(), true );
 45+ return;
 46+ } elseif( $wgUser->isBlocked() ) {
 47+ $wgOut->blockedPage();
 48+ return;
 49+ }
 50+
 51+ $this->oldimage = $wgRequest->getText( 'oldimage' );
 52+ $token = $wgRequest->getText( 'wpEditToken' );
 53+ if( !$this->isValidOldSpec() ) {
 54+ $wgOut->showUnexpectedValueError( 'oldimage', htmlspecialchars( $this->oldimage ) );
 55+ return;
 56+ }
 57+
 58+ if( !$this->haveOldVersion() ) {
 59+ $wgOut->addHtml( wfMsgExt( 'filerevert-badversion', 'parse' ) );
 60+ $wgOut->returnToMain( false, $this->title );
 61+ return;
 62+ }
 63+
 64+ // Perform the reversion if appropriate
 65+ if( $wgRequest->wasPosted() && $wgUser->matchEditToken( $token, $this->oldimage ) ) {
 66+ $source = $this->file->getArchiveVirtualUrl( $this->oldimage );
 67+ $comment = $wgRequest->getText( 'wpComment' );
 68+ // TODO: Preserve file properties from database instead of reloading from file
 69+ $status = $this->file->upload( $source, $comment, $comment );
 70+ if( $status->isGood() ) {
 71+ $wgOut->addHtml( wfMsgExt( 'filerevert-success', 'parse', $this->title->getText(),
 72+ $wgLang->date( $this->getTimestamp() ),
 73+ $wgLang->time( $this->getTimestamp() ),
 74+ $wgServer . $this->file->getArchiveUrl( $this->oldimage ) ) );
 75+ $wgOut->returnToMain( false, $this->title );
 76+ } else {
 77+ $wgOut->addWikiText( $status->getWikiText() );
 78+ }
 79+ return;
 80+ }
 81+
 82+ // Show the form
 83+ $this->showForm();
 84+ }
 85+
 86+ /**
 87+ * Show the confirmation form
 88+ */
 89+ private function showForm() {
 90+ global $wgOut, $wgUser, $wgRequest, $wgLang, $wgContLang, $wgServer;
 91+
 92+ /*
 93+ $cur = wfFindFile( $this->title );
 94+ $old = wfFindFile( $this->title, substr( $this->oldimage, 0, 14 ) );
 95+ */
 96+ $timestamp = $this->getTimestamp();
 97+
 98+ $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getAction() ) );
 99+ $form .= Xml::hidden( 'wpEditToken', $wgUser->editToken( $this->oldimage ) );
 100+ $form .= '<fieldset><legend>' . wfMsgHtml( 'filerevert-legend' ) . '</legend>';
 101+ $form .= wfMsgExt( 'filerevert-intro', 'parse', $this->title->getText(),
 102+ $wgLang->date( $timestamp ), $wgLang->time( $timestamp ), $wgServer . $this->file->getArchiveUrl( $this->oldimage ) );
 103+
 104+ /*
 105+ * I was going to do a little comparison (current vs. old) here,
 106+ * but realised it wasn't too straightforward to do a media transform
 107+ * with an *old* file version using the current mechanism. Leaving
 108+ * this here in case it becomes possible in the future. -- RC
 109+ *
 110+ $form .= '<table class="compare-files">';
 111+ $form .= '<tr>';
 112+ $form .= '<th>' . wfMsgHtml( 'filerevert-current' ) . '</th>';
 113+ $form .= '<th>' . wfMsgHtml( 'filerevert-old', $old->getTimestamp() ) . '</th>';
 114+ $form .= '</tr><tr>';
 115+ // FIXME: Hard-coding magic numbers makes baby Jesus cry...
 116+ $form .= '<td>' . $this->getThumbnail( $cur, 180 ) . '</td>';
 117+ $form .= '<td>' . $this->getThumbnail( $old, 180 ) . '</td>';
 118+ $form .= '</tr>';
 119+ $form .= '</table>';
 120+ */
 121+
 122+ $form .= '<p>' . Xml::inputLabel( wfMsg( 'filerevert-comment' ), 'wpComment', 'wpComment',
 123+ 60, wfMsgForContent( 'filerevert-defaultcomment',
 124+ $wgContLang->date( $timestamp, false, false ), $wgContLang->time( $timestamp, false, false ) ) ) . '</p>';
 125+ $form .= '<p>' . Xml::submitButton( wfMsg( 'filerevert-submit' ) ) . '</p>';
 126+ $form .= '</fieldset>';
 127+ $form .= '</form>';
 128+
 129+ $wgOut->addHtml( $form );
 130+ }
 131+
 132+ /**
 133+ * Set headers, titles and other bits
 134+ */
 135+ private function setHeaders() {
 136+ global $wgOut;
 137+ $wgOut->setPageTitle( wfMsg( 'filerevert', $this->title->getText() ) );
 138+ $wgOut->setRobotPolicy( 'noindex,nofollow' );
 139+ }
 140+
 141+ /**
 142+ * Is the provided `oldimage` value valid?
 143+ *
 144+ * @return bool
 145+ */
 146+ private function isValidOldSpec() {
 147+ return strlen( $this->oldimage ) >= 16
 148+ && strpos( $this->oldimage, '/' ) === false
 149+ && strpos( $this->oldimage, '\\' ) === false;
 150+ }
 151+
 152+ /**
 153+ * Does the provided `oldimage` value correspond
 154+ * to an existing, local, old version of this file?
 155+ *
 156+ * @return bool
 157+ */
 158+ private function haveOldVersion() {
 159+ $file = wfFindFile( $this->title, $this->oldimage );
 160+ return $file && $file->exists() && $file->isLocal();
 161+ }
 162+
 163+ /**
 164+ * Prepare the form action
 165+ *
 166+ * @return string
 167+ */
 168+ private function getAction() {
 169+ $q = array();
 170+ $q[] = 'action=revert';
 171+ $q[] = 'oldimage=' . urlencode( $this->oldimage );
 172+ return $this->title->getLocalUrl( implode( '&', $q ) );
 173+ }
 174+
 175+ /**
 176+ * Extract the timestamp of the old version
 177+ *
 178+ * @return string
 179+ */
 180+ private function getTimestamp() {
 181+ return substr( $this->oldimage, 0, 14 );
 182+ }
 183+
 184+}
\ No newline at end of file
Property changes on: branches/liquidthreads/includes/FileRevertForm.php
___________________________________________________________________
Added: svn:eol-style
1185 + native
Index: branches/liquidthreads/includes/AutoLoader.php
@@ -101,6 +101,7 @@
102102 'ImagePage' => 'includes/ImagePage.php',
103103 'ImageHistoryList' => 'includes/ImagePage.php',
104104 'ImageRemote' => 'includes/ImageRemote.php',
 105+ 'FileRevertForm' => 'includes/FileRevertForm.php',
105106 'Job' => 'includes/JobQueue.php',
106107 'EmaillingJob' => 'includes/EmaillingJob.php',
107108 'EnotifNotifyJob' => 'includes/EnotifNotifyJob.php',
@@ -327,6 +328,7 @@
328329 'ApiQueryLogEvents' => 'includes/api/ApiQueryLogEvents.php',
329330 'ApiQueryRecentChanges'=> 'includes/api/ApiQueryRecentChanges.php',
330331 'ApiQueryRevisions' => 'includes/api/ApiQueryRevisions.php',
 332+ 'ApiQuerySearch' => 'includes/api/ApiQuerySearch.php',
331333 'ApiQuerySiteinfo' => 'includes/api/ApiQuerySiteinfo.php',
332334 'ApiQueryWatchlist' => 'includes/api/ApiQueryWatchlist.php',
333335 'ApiResult' => 'includes/api/ApiResult.php',
Index: branches/liquidthreads/includes/DefaultSettings.php
@@ -1195,7 +1195,7 @@
11961196 * to ensure that client-side caches don't keep obsolete copies of global
11971197 * styles.
11981198 */
1199 -$wgStyleVersion = '90';
 1199+$wgStyleVersion = '94';
12001200
12011201
12021202 # Server-side caching:
Index: branches/liquidthreads/includes/EditPage.php
@@ -1714,7 +1714,7 @@
17151715 array( 'image' => 'button_image.png',
17161716 'id' => 'mw-editbutton-image',
17171717 'open' => '[['.$wgContLang->getNsText(NS_IMAGE).":",
1718 - 'close' => '|thumb]]',
 1718+ 'close' => ']]',
17191719 'sample'=> wfMsg('image_sample'),
17201720 'tip' => wfMsg('image_tip'),
17211721 'key' => 'D'
Index: branches/liquidthreads/includes/SpecialPreferences.php
@@ -97,6 +97,8 @@
9898 if ( !preg_match( '/^[a-z\-]*$/', $this->mUserLanguage ) ) {
9999 $this->mUserLanguage = 'nolanguage';
100100 }
 101+
 102+ wfRunHooks( "InitPreferencesForm", array( $this, $request ) );
101103 }
102104
103105 function execute() {
@@ -298,9 +300,17 @@
299301 $wgUser->setOption( $tname, $tvalue );
300302 }
301303 if (!$wgAuth->updateExternalDB($wgUser)) {
302 - $this->mainPrefsForm( wfMsg( 'externaldberror' ) );
 304+ $this->mainPrefsForm( 'error', wfMsg( 'externaldberror' ) );
303305 return;
304306 }
 307+
 308+ $msg = '';
 309+ if ( !wfRunHooks( "SavePreferences", array( $this, $wgUser, &$msg ) ) ) {
 310+ print "(($msg))";
 311+ $this->mainPrefsForm( 'error', $msg );
 312+ return;
 313+ }
 314+
305315 $wgUser->setCookies();
306316 $wgUser->saveSettings();
307317
@@ -395,6 +405,8 @@
396406 $this->mSearchNs[$i] = $wgUser->getOption( 'searchNs'.$i );
397407 }
398408 }
 409+
 410+ wfRunHooks( "ResetPreferences", array( $this, $wgUser ) );
399411 }
400412
401413 /**
@@ -994,6 +1006,8 @@
9951007 }
9961008 $wgOut->addHTML( '</fieldset>' );
9971009
 1010+ wfRunHooks( "RenderPreferencesForm", array( $this, $wgOut ) );
 1011+
9981012 $token = htmlspecialchars( $wgUser->editToken() );
9991013 $skin = $wgUser->getSkin();
10001014 $wgOut->addHTML( "
Index: branches/liquidthreads/RELEASE-NOTES
@@ -159,6 +159,8 @@
160160 * Skip the difference engine cache when 'action=purge' is used while requesting
161161 a difference page, to allow refreshing the cache in case of errors
162162 * (bug 10701) Link to Special:Listusers in default Special:Statistics messages
 163+* Improved file history presentation
 164+* (bug 10739) Users can now enter comments when reverting files
163165
164166 == Bugfixes since 1.10 ==
165167
@@ -330,6 +332,8 @@
331333 * Improved error reporting and robustness for file delete/undelete.
332334 * Improved speed of file delete by storing the SHA-1 hash in image/oldimage
333335 * Fixed leading zero in base 36 SHA-1 hash
 336+* Protection form no longer produces JavaScript errors
 337+* (bug 10741) File histories show "delete" links for non-sysops
334338
335339 == API changes since 1.10 ==
336340
@@ -376,6 +380,9 @@
377381 * Added external url search within wiki pages (list=exturlusage)
378382 * Added link enumeration (list=alllinks)
379383 * Added registered users enumeration (list=allusers)
 384+* Added full text search in titles and content (list=search)
 385+* (bug 10684) Expanded list=allusers functionality
 386+* Possible breaking change: prop=revisions no longer includes pageid for rvprop=ids
380387
381388 == Maintenance script changes since 1.10 ==
382389
@@ -386,6 +393,9 @@
387394 to $wgFileExtensions)
388395 * Add option to maintenance/createAndPromote.php to give the user bureaucrat
389396 permissions (--bureaucrat)
 397+* Allow overwriting existing files with a conflicting name using
 398+ maintenance/importImages.php
 399+* (bug 10266) Use native newlines when rebuilding a messages file.
390400
391401 == Languages updated since 1.10 ==
392402
@@ -412,6 +422,7 @@
413423 * Kazakh (kk)
414424 * Kurdish (ku)
415425 * Latin (la)
 426+* Lao (lo)
416427 * Lithuanian (lt)
417428 * Malayalam (ml)
418429 * Burmese (my)
Index: branches/liquidthreads/maintenance/language/messages.inc
@@ -304,7 +304,7 @@
305305 'filedeleteerror',
306306 'directorycreateerror',
307307 'filenotfound',
308 - 'fileexists',
 308+ 'fileexistserror',
309309 'unexpected',
310310 'formerror',
311311 'badarticleerror',
@@ -319,12 +319,12 @@
320320 'viewsource',
321321 'viewsourcefor',
322322 'protectedpagetext',
323 - 'namespaceprotected',
324323 'viewsourcetext',
325324 'protectedinterface',
326325 'editinginterface',
327326 'sqlhidden',
328327 'cascadeprotected',
 328+ 'namespaceprotected',
329329 ),
330330 'login' => array(
331331 'logouttitle',
@@ -849,12 +849,17 @@
850850 'imgdelete',
851851 'imgdesc',
852852 'imgfile',
853 - 'imglegend',
854 - 'imghistory',
855 - 'revertimg',
856 - 'deleteimg',
857 - 'deleteimgcompletely',
858 - 'imghistlegend',
 853+ 'filehist',
 854+ 'filehist-help',
 855+ 'filehist-deleteall',
 856+ 'filehist-deleteone',
 857+ 'filehist-revert',
 858+ 'filehist-current',
 859+ 'filehist-datetime',
 860+ 'filehist-user',
 861+ 'filehist-dimensions',
 862+ 'filehist-filesize',
 863+ 'filehist-comment',
859864 'imagelinks',
860865 'linkstoimage',
861866 'nolinkstoimage',
@@ -872,6 +877,16 @@
873878 'imagelist_description',
874879 'imagelist_search_for',
875880 ),
 881+ 'filerevert' => array(
 882+ 'filerevert',
 883+ 'filerevert-legend',
 884+ 'filerevert-intro',
 885+ 'filerevert-comment',
 886+ 'filerevert-defaultcomment',
 887+ 'filerevert-submit',
 888+ 'filerevert-success',
 889+ 'filerevert-badversion',
 890+ ),
876891 'mimesearch' => array(
877892 'mimesearch',
878893 'mimesearch-summary',
@@ -1150,7 +1165,6 @@
11511166 'deletionlog',
11521167 'reverted',
11531168 'deletecomment',
1154 - 'imagereverted',
11551169 'rollback',
11561170 'rollback_short',
11571171 'rollbacklink',
@@ -2219,6 +2233,7 @@
22202234 'upload-curl-errors' => 'Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>',
22212235 'licenses' => '',
22222236 'imagelist' => 'Image list',
 2237+ 'filerevert' => 'File reversion',
22232238 'mimesearch' => 'MIME search',
22242239 'unwatchedpages' => 'Unwatched pages',
22252240 'listredirects' => 'List redirects',
Index: branches/liquidthreads/maintenance/language/writeMessagesArray.inc
@@ -1,8 +1,6 @@
22 <?php
33 /**
44 * Write a messages array as a PHP text.
5 - * TODO: make it possible to use Windows endlines
6 - * TODO: remove PHP ending tags recently removed from MediaWiki files
75 *
86 * @addtogroup Maintenance
97 */
@@ -75,7 +73,8 @@
7674 }
7775
7876 # Write all the messages
79 - $messagesText = "\$messages = array(\n";
 77+ $messagesText = "\$messages = array(
 78+";
8079 foreach( $sortedMessages as $block => $messages ) {
8180 # Skip if it's the block of unknown messages - handle that in the end of file
8281 if ( $block == 'unknown' ) {
@@ -87,7 +86,8 @@
8887 }
8988 ksort( $sortedMessages['unknown'] );
9089 $messagesText .= writeMessagesBlock( 'unknown', 'Unknown messages', $sortedMessages['unknown'], $ignoredComments ); # Write the unknown messages, alphabetically sorted
91 - $messagesText .= ");\n";
 90+ $messagesText .= ");
 91+";
9292
9393 return array( $messagesText, $sortedMessages );
9494 }
@@ -115,9 +115,13 @@
116116 # Format the block comment (if exists); check for multiple lines comments
117117 if ( !empty( $comment ) ) {
118118 if ( strpos( $comment, "\n" ) === false ) {
119 - $blockText .= "# $comment\n";
 119+ $blockText .= "# $comment
 120+";
120121 } else {
121 - $blockText .= "/*\n$comment\n*/\n";
 122+ $blockText .= "/*
 123+$comment
 124+*/
 125+";
122126 }
123127 }
124128
@@ -173,11 +177,13 @@
174178 }
175179
176180 # Newline
177 - $blockText .= "\n";
 181+ $blockText .= "
 182+";
178183 }
179184
180185 # Newline to end the block
181 - $blockText .= "\n";
 186+ $blockText .= "
 187+";
182188
183189 return $blockText;
184190 }
Index: branches/liquidthreads/maintenance/updaters.inc
@@ -82,6 +82,7 @@
8383 array( 'oldimage', 'oi_metadata', 'patch-oi_metadata.sql'),
8484 array( 'archive', 'ar_page', 'patch-archive-ar_page.sql'),
8585 array( 'image', 'img_sha1', 'patch-img_sha1.sql' ),
 86+ array( 'page', 'page_key', 'patch-page_key.sql' ),
8687 );
8788
8889 # For extensions only, should be populated via hooks
Index: branches/liquidthreads/maintenance/importImages.inc.php
@@ -45,6 +45,4 @@
4646 unset( $parts[ count( $parts ) - 1 ] );
4747 $fname = implode( '.', $parts );
4848 return array( $fname, $ext );
49 -}
50 -
51 -
 49+}
\ No newline at end of file
Index: branches/liquidthreads/maintenance/archives/patch-page_key.sql
@@ -0,0 +1,5 @@
 2+ALTER TABLE /*$wgDBprefix*/page
 3+ ADD page_key VARCHAR(255) BINARY NOT NULL;
 4+ALTER TABLE /*$wgDBprefix*/page
 5+ ADD INDEX name_key (page_namespace, page_key);
 6+
Index: branches/liquidthreads/maintenance/importImages.php
@@ -8,9 +8,11 @@
99 * @author Rob Church <robchur@gmail.com>
1010 */
1111
12 -$optionsWithArguments = array( 'extensions' );
 12+$optionsWithArguments = array( 'extensions', 'overwrite' );
1313 require_once( 'commandLine.inc' );
1414 require_once( 'importImages.inc.php' );
 15+$added = $skipped = $overwritten = 0;
 16+
1517 echo( "Import Images\n\n" );
1618
1719 # Need a path
@@ -44,8 +46,7 @@
4547 $license = isset( $options['license'] ) ? $options['license'] : '';
4648
4749 # Batch "upload" operation
48 - global $wgUploadDirectory;
49 - if( count( $files ) > 0 ) {
 50+ if( ( $count = count( $files ) ) > 0 ) {
5051
5152 foreach( $files as $file ) {
5253 $base = wfBaseName( $file );
@@ -60,28 +61,44 @@
6162 # Check existence
6263 $image = wfLocalFile( $title );
6364 if( $image->exists() ) {
64 - echo( "{$base} could not be imported; a file with this name exists in the wiki\n" );
65 - continue;
 65+ if( isset( $options['overwrite'] ) ) {
 66+ echo( "{$base} exists, overwriting..." );
 67+ $svar = 'overwritten';
 68+ } else {
 69+ echo( "{$base} exists, skipping\n" );
 70+ $skipped++;
 71+ continue;
 72+ }
 73+ } else {
 74+ echo( "Importing {$base}..." );
 75+ $svar = 'added';
6676 }
67 -
68 - # Stash the file
69 - echo( "Saving {$base}..." );
70 -
 77+
 78+ # Import the file
7179 $archive = $image->publish( $file );
72 - if ( WikiError::isError( $archive ) ) {
 80+ if( WikiError::isError( $archive ) || !$archive->isGood() ) {
7381 echo( "failed.\n" );
7482 continue;
7583 }
76 - echo( "importing..." );
77 -
78 - if ( $image->recordUpload( $archive, $comment, $license ) ) {
 84+
 85+ $$svar++;
 86+ if ( $image->recordUpload( $archive->value, $comment, $license ) ) {
7987 # We're done!
8088 echo( "done.\n" );
8189 } else {
8290 echo( "failed.\n" );
8391 }
 92+
8493 }
8594
 95+ # Print out some statistics
 96+ echo( "\n" );
 97+ foreach( array( 'count' => 'Found', 'added' => 'Added',
 98+ 'skipped' => 'Skipped', 'overwritten' => 'Overwritten' ) as $var => $desc ) {
 99+ if( $$var > 0 )
 100+ echo( "{$desc}: {$$var}\n" );
 101+ }
 102+
86103 } else {
87104 echo( "No suitable files could be found for import.\n" );
88105 }
@@ -98,18 +115,18 @@
99116 }
100117
101118 echo <<<END
 119+Imports images and other media files into the wiki
102120 USAGE: php importImages.php [options] <dir>
103121
104122 <dir> : Path to the directory containing images to be imported
105123
106124 Options:
 125+--extensions=<exts> Comma-separated list of allowable extensions, defaults to \$wgFileExtensions
 126+--overwrite Overwrite existing images if a conflicting-named image is found
107127 --user=<username> Set username of uploader, default 'Maintenance script'
108128 --comment=<text> Set upload summary comment, default 'Importing image file'
109129 --license=<code> Use an optional license template
110130
111131 END;
112132 exit();
113 -}
114 -
115 -
 133+}
\ No newline at end of file
Index: branches/liquidthreads/maintenance/tables.sql
@@ -190,6 +190,9 @@
191191 -- Spaces are transformed into underscores in title storage.
192192 page_title varchar(255) binary NOT NULL,
193193
 194+ -- page_title in uppercase. Used for case-insensitive title searching.
 195+ page_key varchar(255) binary NOT NULL,
 196+
194197 -- Comma-separated set of permission keys indicating who
195198 -- can move or edit the page.
196199 page_restrictions tinyblob NOT NULL,
@@ -224,6 +227,7 @@
225228
226229 PRIMARY KEY page_id (page_id),
227230 UNIQUE INDEX name_title (page_namespace,page_title),
 231+ INDEX name_key (page_namespace, page_key),
228232
229233 -- Special-purpose indexes
230234 INDEX (page_random),
Index: branches/liquidthreads/skins/common/protect.js
@@ -1,89 +1,94 @@
2 -function protectInitialize(tableId, labelText) {
3 - if (document.createTextNode) {
4 - var box = document.getElementById(tableId);
5 - if (!box)
6 - return false;
 2+/**
 3+ * Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
 4+ * on the protection form
 5+ *
 6+ * @param String tableId Identifier of the table containing UI bits
 7+ * @param String labelText Text to use for the checkbox label
 8+ */
 9+function protectInitialize( tableId, labelText ) {
 10+ if( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) )
 11+ return false;
 12+
 13+ var box = document.getElementById( tableId );
 14+ if( !box )
 15+ return false;
 16+
 17+ var tbody = box.getElementsByTagName( 'tbody' )[0];
 18+ var row = document.createElement( 'tr' );
 19+ tbody.appendChild( row );
 20+
 21+ row.appendChild( document.createElement( 'td' ) );
 22+ var col = document.createElement( 'td' );
 23+ row.appendChild( col );
 24+
 25+ var check = document.createElement( 'input' );
 26+ check.id = 'mwProtectUnchained';
 27+ check.type = 'checkbox';
 28+ col.appendChild( check );
 29+ addClickHandler( check, protectChainUpdate );
730
8 - var tbody = box.getElementsByTagName('tbody')[0];
9 - var row = document.createElement('tr');
10 - tbody.appendChild(row);
 31+ col.appendChild( document.createTextNode( ' ' ) );
 32+ var label = document.createElement( 'label' );
 33+ label.setAttribute( 'for', 'mwProtectUnchained' );
 34+ label.appendChild( document.createTextNode( labelText ) );
 35+ col.appendChild( label );
1136
12 - row.appendChild(document.createElement('td'));
13 - var col2 = document.createElement('td');
14 - row.appendChild(col2);
15 -
16 - var check = document.createElement('input');
17 - check.id = "mwProtectUnchained";
18 - check.type = "checkbox";
19 - check.onclick = protectChainUpdate;
20 - col2.appendChild(check);
21 -
22 - var space = document.createTextNode(" ");
23 - col2.appendChild(space);
24 -
25 - var label = document.createElement('label');
26 - label.setAttribute("for", "mwProtectUnchained");
27 - label.appendChild(document.createTextNode(labelText));
28 - col2.appendChild(label);
29 -
30 - if (protectAllMatch()) {
31 - check.checked = false;
32 - protectEnable(false);
33 - } else {
34 - check.checked = true;
35 - protectEnable(true);
36 - }
37 -
38 - allowCascade();
39 -
40 - return true;
41 - }
42 - return false;
 37+ check.checked = !protectAllMatch();
 38+ protectEnable( check.checked );
 39+
 40+ allowCascade();
 41+
 42+ return true;
4343 }
4444
4545 function allowCascade() {
46 - var pr_types = document.getElementsByTagName("select");
47 - for (var i = 0; i < pr_types.length; i++) {
48 - if (pr_types[i].id.match(/^mwProtect-level-/)) {
49 - var selected_level = pr_types[i].getElementsByTagName("option")[pr_types[i].selectedIndex].value;
50 - if ( !isCascadeableLevel(selected_level) ) {
51 - document.getElementById('mwProtect-cascade').checked=false;
52 - document.getElementById('mwProtect-cascade').disabled=true;
 46+ var lists = protectSelectors();
 47+ for( var i = 0; i < lists.length; i++ ) {
 48+ if( lists[i].selectedIndex > -1 ) {
 49+ var items = lists[i].getElementsByTagName( 'option' );
 50+ var selected = items[ lists[i].selectedIndex ].value;
 51+ if( wgCascadeableLevels.indexOf( selected ) == -1 ) {
 52+ document.getElementById( 'mwProtect-cascade' ).checked = false;
 53+ document.getElementById( 'mwProtect-cascade' ).disabled = true;
5354 return false;
5455 }
5556 }
5657 }
57 - document.getElementById('mwProtect-cascade').disabled=false;
 58+ document.getElementById( 'mwProtect-cascade' ).disabled = false;
5859 return true;
5960 }
6061
61 -function isCascadeableLevel( level ) {
62 - for (var k = 0; k < wgCascadeableLevels.length; k++) {
63 - if ( wgCascadeableLevels[k] == level ) {
64 - return true;
65 - }
66 - }
67 - return false;
68 -}
69 -
 62+/**
 63+ * When protection levels are locked together, update the rest
 64+ * when one action's level changes
 65+ *
 66+ * @param Element source Level selector that changed
 67+ */
7068 function protectLevelsUpdate(source) {
71 - if (!protectUnchained()) {
72 - protectUpdateAll(source.selectedIndex);
73 - }
 69+ if( !protectUnchained() )
 70+ protectUpdateAll( source.selectedIndex );
7471 allowCascade();
7572 }
7673
 74+/**
 75+ * Update chain status and enable/disable various bits of the UI
 76+ * when the user changes the "unlock move permissions" checkbox
 77+ */
7778 function protectChainUpdate() {
78 - if (protectUnchained()) {
79 - protectEnable(true);
 79+ if( protectUnchained() ) {
 80+ protectEnable( true );
8081 } else {
8182 protectChain();
82 - protectEnable(false);
 83+ protectEnable( false );
8384 }
8485 allowCascade();
8586 }
8687
87 -
 88+/**
 89+ * Are all actions protected at the same level?
 90+ *
 91+ * @return boolean
 92+ */
8893 function protectAllMatch() {
8994 var values = new Array();
9095 protectForSelectors(function(set) {
@@ -97,17 +102,22 @@
98103 return true;
99104 }
100105
 106+/**
 107+ * Is protection chaining on or off?
 108+ *
 109+ * @return bool
 110+ */
101111 function protectUnchained() {
102 - var unchain = document.getElementById("mwProtectUnchained");
103 - if (!unchain) {
104 - alert("This shouldn't happen");
105 - return false;
106 - }
107 - return unchain.checked;
 112+ var unchain = document.getElementById( 'mwProtectUnchained' );
 113+ return unchain
 114+ ? unchain.checked
 115+ : true; // No control, so we need to let the user set both levels
108116 }
109117
 118+/**
 119+ * Find the highest-protected action and set all others to that level
 120+ */
110121 function protectChain() {
111 - // Find the highest-protected action and bump them all to this level
112122 var maxIndex = -1;
113123 protectForSelectors(function(set) {
114124 if (set.selectedIndex > maxIndex) {
@@ -117,6 +127,11 @@
118128 protectUpdateAll(maxIndex);
119129 }
120130
 131+/**
 132+ * Protect all actions at the specified level
 133+ *
 134+ * @param int index Protection level
 135+ */
121136 function protectUpdateAll(index) {
122137 protectForSelectors(function(set) {
123138 if (set.selectedIndex != index) {
@@ -125,6 +140,11 @@
126141 });
127142 }
128143
 144+/**
 145+ * Apply a callback to each protection selector
 146+ *
 147+ * @param callable func Callback function
 148+ */
129149 function protectForSelectors(func) {
130150 var selectors = protectSelectors();
131151 for (var i = 0; i < selectors.length; i++) {
@@ -132,6 +152,11 @@
133153 }
134154 }
135155
 156+/**
 157+ * Get a list of all protection selectors on the page
 158+ *
 159+ * @return Array
 160+ */
136161 function protectSelectors() {
137162 var all = document.getElementsByTagName("select");
138163 var ours = new Array();
@@ -144,6 +169,11 @@
145170 return ours;
146171 }
147172
 173+/**
 174+ * Enable/disable protection selectors
 175+ *
 176+ * @param boolean val Enable?
 177+ */
148178 function protectEnable(val) {
149179 // fixme
150180 var first = true;
Index: branches/liquidthreads/skins/common/shared.css
@@ -27,3 +27,25 @@
2828 float: right;
2929 margin-left: 5px;
3030 }
 31+
 32+/**
 33+ * File histories
 34+ */
 35+table.filehistory {
 36+ border:1px solid #ccc;
 37+ border-collapse:collapse;
 38+}
 39+
 40+table.filehistory th,
 41+table.filehistory td {
 42+ padding: 0 0.2em 0 0.2em;
 43+ vertical-align:top;
 44+ border:1px solid #ccc;
 45+}
 46+table.filehistory th {
 47+ text-align: left;
 48+}
 49+table.filehistory td.mw-imagepage-filesize,
 50+table.filehistory th.mw-imagepage-filesize {
 51+ white-space:nowrap;
 52+}
Index: branches/liquidthreads/skins/common/wikibits.js
@@ -1302,8 +1302,31 @@
13031303 }
13041304 }
13051305
 1306+/**
 1307+ * Add an event handler to an element
 1308+ *
 1309+ * @param Element element Element to add handler to
 1310+ * @param String attach Event to attach to
 1311+ * @param callable handler Event handler callback
 1312+ */
 1313+function addHandler( element, attach, handler ) {
 1314+ if( window.addEventListener ) {
 1315+ element.addEventListener( attach, handler, false );
 1316+ } else if( window.attachEvent ) {
 1317+ element.attachEvent( 'on' + attach, handler );
 1318+ }
 1319+}
 1320+
 1321+/**
 1322+ * Add a click event handler to an element
 1323+ *
 1324+ * @param Element element Element to add handler to
 1325+ * @param callable handler Event handler callback
 1326+ */
 1327+function addClickHandler( element, handler ) {
 1328+ addHandler( element, 'click', handler );
 1329+}
13061330 //note: all skins should call runOnloadHook() at the end of html output,
13071331 // so the below should be redundant. It's there just in case.
13081332 hookEvent("load", runOnloadHook);
1309 -
1310 -hookEvent("load", mwSetupToolbar);
 1333+hookEvent("load", mwSetupToolbar);
\ No newline at end of file
Index: branches/liquidthreads/skins/monobook/main.css
@@ -1904,4 +1904,4 @@
19051905 text-align: center;
19061906 vertical-align: middle;
19071907 font-size: 90%;
1908 -}
 1908+}
\ No newline at end of file
Property changes on: branches/liquidthreads
___________________________________________________________________
Modified: svnmerge-integrated
19091909 - /trunk/phase3:1-24414
19101910 + /trunk/phase3:1-24479

Past revisions this follows-up on

RevisionCommit summaryAuthorDate
r24272* (bug 10642) Fix shift-click checkbox behavior for Opera 9.0+ and 6.0...brion15:33, 19 July 2007
r24274rename checkboxMouseupHandler to checkboxClickHandler for the feel-good value...brion15:49, 19 July 2007
r24313* Introduced FileRepoStatus -- result class for file repo operations....tstarling14:45, 22 July 2007
r24394Adding "thumb" to the image editbutton. In this way it's mainly used....raymond11:05, 26 July 2007
r24418* Allow overwriting existing files with conflicting names using the --overrid...robchurch22:21, 28 July 2007
r24419* (bug 10732) Protection chaining checkbox broken - this appears to have regr...robchurch23:09, 28 July 2007
r24420Bump $wgStyleVersionrobchurch23:10, 28 July 2007
r24421Whee, turns out the error-puking JavaScript made it into 1.10, so this needs ...robchurch23:13, 28 July 2007
r24422Fix.rotem01:57, 29 July 2007
r24423Use native newlines when rebuilding a messages file.rotem02:04, 29 July 2007
r24424A message (fileexists) with the same name of another one was introduced in r2...rotem02:18, 29 July 2007
r24425Use the same order as in the English messages file.rotem02:22, 29 July 2007
r24426Rebuild.rotem02:25, 29 July 2007
r24427(bug 10732 and others) Further fixes to protect chaining JavaScript; introduc...robchurch14:32, 29 July 2007
r24428Tweak commentrobchurch14:32, 29 July 2007
r24429Document this file all overrobchurch15:21, 29 July 2007
r24430strpos() !== false is faster than strstr()robchurch16:50, 29 July 2007
r24432* Use a table to present file histories...robchurch18:41, 29 July 2007
r24433* More precise comment...robchurch18:48, 29 July 2007
r24434Whoops, missed this one...robchurch18:51, 29 July 2007
r24435Noterobchurch18:53, 29 July 2007
r24436Refactor addClickHandler() and introduce addHandler()robchurch19:53, 29 July 2007
r24437Lucky bugrobchurch20:12, 29 July 2007
r24438What is this, Blankety Blank?robchurch20:45, 29 July 2007
r24439* (bug 10739) Users can now enter comments when reverting files...robchurch22:00, 29 July 2007
r24440Left in a commentrobchurch22:03, 29 July 2007
r24441Longer comment boxrobchurch22:05, 29 July 2007
r24442fix an immediate php error, but result is still wrong -- we get 'exif-exif-ma...brion23:37, 29 July 2007
r24443Hopefully fix the problem with EXIF field names being listed as <exif-exif-ma...brion23:39, 29 July 2007
r24444Introduce OutputPage::addReturnTo(), with a view to replacing OutputPage::ret...robchurch23:53, 29 July 2007
r24445Update.rotem00:40, 30 July 2007
r24446Fix.rotem00:42, 30 July 2007
r24447Some style tweaks, per Brionrobchurch00:46, 30 July 2007
r24448- new field: page_key, stores page_title in uppercase....river01:56, 30 July 2007
r24449Undo r24394; not really comfortable with this change. Probably not ideal for ...brion03:06, 30 July 2007
r24453API:...yurik08:09, 30 July 2007
r24454Fix regression: message 'imghistory' was deleted in r24432 but still used in ...raymond08:38, 30 July 2007
r24455add missing fileriver10:07, 30 July 2007
r24456need name_key index in tables.sql tooriver10:11, 30 July 2007
r24457* (bug 10724) Update Chinese translations...raymond10:39, 30 July 2007
r24458* (bug 10713) Message file for Lao language (lo)raymond12:16, 30 July 2007
r24460Add function to check if function-based indexes are supported by the backend DB.greg14:10, 30 July 2007
r24467Updates Germanraymond16:16, 30 July 2007
r24469Update for r24423 by Rotemraymond16:23, 30 July 2007
r24473Separate date and time in new 'filerevert-intro', 'filerevert-defaultcomment'...raymond19:08, 30 July 2007
r24474Update.rotem19:12, 30 July 2007
r24475* (bug 10724) Update Chinese translations...raymond20:12, 30 July 2007
r24476* Prettifying file history table a bit. Especially for histories with long co...raymond21:09, 30 July 2007
r24477adding generic hook points to SpecialPreferencesdaniel22:52, 30 July 2007

Status & tagging log