OSDN Git Service

#27617 言語名へのリンクを行わない設定を追加し、Wikitravelの設定に言語名を追加,
authorhoneplus <honeplus@users.osdn.me>
Mon, 27 Feb 2012 18:25:50 +0000 (18:25 +0000)
committerhoneplus <honeplus@users.osdn.me>
Mon, 27 Feb 2012 18:25:50 +0000 (18:25 +0000)
サーバーへのアクセス時に自動でRefererを設定するよう変更,
UserAgentを英語アプリ名にあわせたものに変更

git-svn-id: http://svn.osdn.net/svnroot/wptscs/trunk@26 7cc79d57-4d93-40a1-83d5-ec7b38613dec

28 files changed:
Wikipedia 翻訳支援ツール.asta
Wptscs/ConfigForm.Designer.cs
Wptscs/ConfigForm.cs
Wptscs/ConfigForm.ja.resx
Wptscs/ConfigForm.resx
Wptscs/Logics/MediaWikiTranslator.cs
Wptscs/Logics/Translator.cs
Wptscs/Properties/Settings.Designer.cs
Wptscs/Properties/Settings.settings
Wptscs/Readme.txt
Wptscs/Utilities/AppConfigWebProxy.cs [moved from Wptscs/Utilities/AppDefaultWebProxy.cs with 78% similarity]
Wptscs/Websites/MediaWiki.cs
Wptscs/Websites/MediaWikiPage.cs
Wptscs/Websites/Page.cs
Wptscs/Websites/Website.cs
Wptscs/Wikipedia.xml
Wptscs/Wikitravel.xml
Wptscs/Wptscs.csproj
Wptscs/app.config
WptscsTest/Data/MediaWiki/result/config.xml
WptscsTest/Data/config.xml
WptscsTest/Logics/MediaWikiTranslatorTest.cs
WptscsTest/Utilities/AppConfigWebProxyTest.cs [moved from WptscsTest/Utilities/AppDefaultWebProxyTest.cs with 74% similarity]
WptscsTest/Websites/MediaWikiPageTest.cs
WptscsTest/Websites/MediaWikiTest.cs
WptscsTest/Websites/PageTest.cs
WptscsTest/Websites/WebsiteTest.cs
WptscsTest/WptscsTest.csproj

index 2196921..3b7d2e0 100644 (file)
Binary files a/Wikipedia 翻訳支援ツール.asta and b/Wikipedia 翻訳支援ツール.asta differ
index eba3088..ccf4ddf 100644 (file)
@@ -58,6 +58,7 @@
             this.textBoxBracket = new System.Windows.Forms.TextBox();
             this.labelBracket = new System.Windows.Forms.Label();
             this.groupBoxServer = new System.Windows.Forms.GroupBox();
+            this.checkBoxHasLanguagePage = new System.Windows.Forms.CheckBox();
             this.textBoxLangFormat = new System.Windows.Forms.TextBox();
             this.labelLangFormat = new System.Windows.Forms.Label();
             this.textBoxLinkInterwikiFormat = new System.Windows.Forms.TextBox();
             // groupBoxServer
             // 
             resources.ApplyResources(this.groupBoxServer, "groupBoxServer");
+            this.groupBoxServer.Controls.Add(this.checkBoxHasLanguagePage);
             this.groupBoxServer.Controls.Add(this.textBoxLangFormat);
             this.groupBoxServer.Controls.Add(this.labelLangFormat);
             this.groupBoxServer.Controls.Add(this.textBoxLinkInterwikiFormat);
             this.groupBoxServer.Name = "groupBoxServer";
             this.groupBoxServer.TabStop = false;
             // 
+            // checkBoxHasLanguagePage
+            // 
+            resources.ApplyResources(this.checkBoxHasLanguagePage, "checkBoxHasLanguagePage");
+            this.checkBoxHasLanguagePage.Name = "checkBoxHasLanguagePage";
+            this.toolTip.SetToolTip(this.checkBoxHasLanguagePage, resources.GetString("checkBoxHasLanguagePage.ToolTip"));
+            this.checkBoxHasLanguagePage.UseVisualStyleBackColor = true;
+            // 
             // textBoxLangFormat
             // 
             resources.ApplyResources(this.textBoxLangFormat, "textBoxLangFormat");
         private System.Windows.Forms.DataGridViewTextBoxColumn ColumnName;
         private System.Windows.Forms.DataGridViewTextBoxColumn ColumnShortName;
         private System.Windows.Forms.Label labelApplicationConfigNote;
+        private System.Windows.Forms.CheckBox checkBoxHasLanguagePage;
     }
 }
\ No newline at end of file
index 1ad7237..26f7500 100644 (file)
@@ -780,6 +780,7 @@ namespace Honememo.Wptscs
             this.textBoxDocumentationTemplateDefaultPage.Text = StringUtils.DefaultString(site.DocumentationTemplateDefaultPage);
             this.textBoxLinkInterwikiFormat.Text = StringUtils.DefaultString(site.LinkInterwikiFormat);
             this.textBoxLangFormat.Text = StringUtils.DefaultString(site.LangFormat);
+            this.checkBoxHasLanguagePage.Checked = site.HasLanguagePage;
         }
 
         /// <summary>
@@ -888,6 +889,8 @@ namespace Honememo.Wptscs
                 site.LangFormat = str;
             }
 
+            site.HasLanguagePage = this.checkBoxHasLanguagePage.Checked;
+
             // 以下、数値へのparseは事前にチェックしてあるので、ここではチェックしない
             if (!String.IsNullOrWhiteSpace(this.textBoxTemplateNamespace.Text))
             {
index c09e889..c81d4f1 100644 (file)
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <data name="buttonCancel.Error" xml:space="preserve">
-    <value />
-  </data>
-  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-  <data name="buttonCancel.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-  <data name="buttonCancel.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="buttonCancel.Location" type="System.Drawing.Point, System.Drawing">
-    <value>335, 461</value>
+    <value>335, 481</value>
   </data>
   <data name="buttonCancel.Text" xml:space="preserve">
     <value>キャンセル</value>
   </data>
   <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
-    <value>624, 493</value>
-  </data>
-  <data name="labelItemsNote.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelItemsNote.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelItemsNote.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
+    <value>624, 513</value>
   </data>
   <data name="labelItemsNote.Location" type="System.Drawing.Point, System.Drawing">
-    <value>9, 399</value>
+    <value>9, 417</value>
   </data>
   <data name="labelItemsNote.Size" type="System.Drawing.Size, System.Drawing">
     <value>426, 12</value>
   <data name="labelItemsNote.Text" xml:space="preserve">
     <value>※ 一度に大量の行を削除すると、画面が長時間反応しなくなります(50行程度が限界)。</value>
   </data>
-  <data name="labelItemsNote.ToolTip" xml:space="preserve">
-    <value />
-  </data>
   <data name="ColumnFromCode.HeaderText" xml:space="preserve">
     <value>翻訳元</value>
   </data>
   <data name="ColumnTimestamp.HeaderText" xml:space="preserve">
     <value>取得日時</value>
   </data>
-  <data name="dataGridViewItems.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="dataGridViewItems.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="dataGridViewItems.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="dataGridViewItems.Size" type="System.Drawing.Size, System.Drawing">
-    <value>580, 390</value>
-  </data>
-  <data name="dataGridViewItems.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="tabPageItems.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="tabPageItems.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="tabPageItems.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
+    <value>580, 408</value>
   </data>
   <data name="tabPageItems.Size" type="System.Drawing.Size, System.Drawing">
-    <value>592, 417</value>
+    <value>592, 437</value>
   </data>
   <data name="tabPageItems.Text" xml:space="preserve">
     <value>記事の置き換え</value>
   </data>
-  <data name="tabPageItems.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="dataGridViewHeading.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="dataGridViewHeading.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="dataGridViewHeading.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="dataGridViewHeading.Size" type="System.Drawing.Size, System.Drawing">
-    <value>580, 405</value>
-  </data>
-  <data name="dataGridViewHeading.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="tabPageHeadings.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="tabPageHeadings.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="tabPageHeadings.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
+    <value>580, 425</value>
   </data>
   <data name="tabPageHeadings.Size" type="System.Drawing.Size, System.Drawing">
-    <value>592, 417</value>
+    <value>592, 437</value>
   </data>
   <data name="tabPageHeadings.Text" xml:space="preserve">
     <value>見出しの置き換え</value>
   </data>
-  <data name="tabPageHeadings.ToolTip" xml:space="preserve">
-    <value />
-  </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="buttonLanguageRemove.AutoSize" type="System.Boolean, mscorlib">
     <value>False</value>
   </data>
-  <data name="buttonLanguageRemove.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="buttonLanguageRemove.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="buttonLanguageRemove.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="buttonLanguageRemove.Location" type="System.Drawing.Point, System.Drawing">
     <value>209, 11</value>
   </data>
   <data name="buttonLanguageRemove.Text" xml:space="preserve">
     <value>削除</value>
   </data>
-  <data name="buttonLunguageAdd.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="buttonLunguageAdd.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="buttonLunguageAdd.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="buttonLunguageAdd.Location" type="System.Drawing.Point, System.Drawing">
     <value>156, 11</value>
   </data>
   <data name="ColumnShortName.Width" type="System.Int32, mscorlib">
     <value>51</value>
   </data>
-  <data name="dataGridViewLanguageName.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="dataGridViewLanguageName.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="dataGridViewLanguageName.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="dataGridViewLanguageName.Size" type="System.Drawing.Size, System.Drawing">
-    <value>260, 299</value>
-  </data>
-  <data name="dataGridViewLanguageName.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="groupBoxLanguageName.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="groupBoxLanguageName.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="groupBoxLanguageName.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
+    <value>260, 319</value>
   </data>
   <data name="groupBoxLanguageName.Size" type="System.Drawing.Size, System.Drawing">
-    <value>272, 323</value>
+    <value>272, 343</value>
   </data>
   <data name="groupBoxLanguageName.Text" xml:space="preserve">
     <value>各言語での言語名</value>
   </data>
-  <data name="textBoxBracket.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxBracket.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxBracket.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="labelBracket.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelBracket.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelBracket.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelBracket.Size" type="System.Drawing.Size, System.Drawing">
     <value>77, 12</value>
   </data>
   <data name="labelBracket.Text" xml:space="preserve">
     <value>括弧のスタイル:</value>
   </data>
-  <data name="groupBoxLanguage.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="groupBoxLanguage.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="groupBoxLanguage.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="groupBoxLanguage.Size" type="System.Drawing.Size, System.Drawing">
-    <value>286, 372</value>
+    <value>286, 392</value>
   </data>
   <data name="groupBoxLanguage.Text" xml:space="preserve">
     <value>言語の設定</value>
   </data>
-  <data name="groupBoxLanguage.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxLangFormat.Error" xml:space="preserve">
-    <value />
+  <data name="checkBoxHasLanguagePage.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 370</value>
   </data>
-  <data name="textBoxLangFormat.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
+  <data name="checkBoxHasLanguagePage.Size" type="System.Drawing.Size, System.Drawing">
+    <value>134, 16</value>
   </data>
-  <data name="textBoxLangFormat.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
+  <data name="checkBoxHasLanguagePage.Text" xml:space="preserve">
+    <value>言語名のページが存在</value>
   </data>
   <data name="textBoxLangFormat.Location" type="System.Drawing.Point, System.Drawing">
     <value>132, 344</value>
   <data name="textBoxLangFormat.Size" type="System.Drawing.Size, System.Drawing">
     <value>136, 19</value>
   </data>
-  <data name="labelLangFormat.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelLangFormat.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelLangFormat.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelLangFormat.Location" type="System.Drawing.Point, System.Drawing">
     <value>6, 347</value>
   </data>
   <data name="labelLangFormat.Text" xml:space="preserve">
     <value>言語指定用フォーマット:</value>
   </data>
-  <data name="textBoxLinkInterwikiFormat.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxLinkInterwikiFormat.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxLinkInterwikiFormat.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="textBoxLinkInterwikiFormat.Location" type="System.Drawing.Point, System.Drawing">
     <value>115, 316</value>
   </data>
   <data name="textBoxLinkInterwikiFormat.Size" type="System.Drawing.Size, System.Drawing">
     <value>153, 19</value>
   </data>
-  <data name="labelLinkInterwikiFormat.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelLinkInterwikiFormat.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelLinkInterwikiFormat.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelLinkInterwikiFormat.Location" type="System.Drawing.Point, System.Drawing">
     <value>6, 319</value>
   </data>
   <data name="labelLinkInterwikiFormat.Text" xml:space="preserve">
     <value>仮リンク用フォーマット:</value>
   </data>
-  <data name="textBoxDocumentationTemplateDefaultPage.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxDocumentationTemplateDefaultPage.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxDocumentationTemplateDefaultPage.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="textBoxDocumentationTemplateDefaultPage.Location" type="System.Drawing.Point, System.Drawing">
     <value>115, 288</value>
   </data>
   <data name="textBoxDocumentationTemplateDefaultPage.Size" type="System.Drawing.Size, System.Drawing">
     <value>90, 19</value>
   </data>
-  <data name="labelDocumentationTemplateDefaultPage.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelDocumentationTemplateDefaultPage.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelDocumentationTemplateDefaultPage.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelDocumentationTemplateDefaultPage.Location" type="System.Drawing.Point, System.Drawing">
     <value>6, 291</value>
   </data>
   <data name="labelDocumentationTemplateDefaultPage.Text" xml:space="preserve">
     <value>デフォルトページ名:</value>
   </data>
-  <data name="textBoxDocumentationTemplate.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxDocumentationTemplate.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxDocumentationTemplate.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="textBoxDocumentationTemplate.Location" type="System.Drawing.Point, System.Drawing">
     <value>115, 241</value>
   </data>
   <data name="textBoxDocumentationTemplate.Size" type="System.Drawing.Size, System.Drawing">
     <value>160, 39</value>
   </data>
-  <data name="labelDocumentationTemplate.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelDocumentationTemplate.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelDocumentationTemplate.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelDocumentationTemplate.Location" type="System.Drawing.Point, System.Drawing">
     <value>6, 244</value>
   </data>
   <data name="labelDocumentationTemplate.Text" xml:space="preserve">
     <value>解説用テンプレート:</value>
   </data>
-  <data name="textBoxFileNamespace.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxFileNamespace.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxFileNamespace.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="textBoxFileNamespace.Location" type="System.Drawing.Point, System.Drawing">
     <value>143, 185</value>
   </data>
-  <data name="textBoxCategoryNamespace.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxCategoryNamespace.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxCategoryNamespace.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="textBoxCategoryNamespace.Location" type="System.Drawing.Point, System.Drawing">
     <value>143, 160</value>
   </data>
-  <data name="labelCategoryNamespace.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelCategoryNamespace.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelCategoryNamespace.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelCategoryNamespace.Location" type="System.Drawing.Point, System.Drawing">
     <value>6, 163</value>
   </data>
   <data name="labelCategoryNamespace.Text" xml:space="preserve">
     <value>カテゴリ名前空間のID:</value>
   </data>
-  <data name="textBoxTemplateNamespace.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxTemplateNamespace.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxTemplateNamespace.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="textBoxTemplateNamespace.Location" type="System.Drawing.Point, System.Drawing">
     <value>143, 135</value>
   </data>
-  <data name="labelTemplateNamespace.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelTemplateNamespace.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelTemplateNamespace.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelTemplateNamespace.Location" type="System.Drawing.Point, System.Drawing">
     <value>6, 138</value>
   </data>
   <data name="labelTemplateNamespace.Text" xml:space="preserve">
     <value>テンプレート名前空間のID:</value>
   </data>
-  <data name="textBoxRedirect.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxRedirect.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxRedirect.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="textBoxRedirect.Location" type="System.Drawing.Point, System.Drawing">
     <value>115, 214</value>
   </data>
-  <data name="labelRedirect.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelRedirect.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelRedirect.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelRedirect.Location" type="System.Drawing.Point, System.Drawing">
     <value>6, 217</value>
   </data>
   <data name="labelRedirect.Text" xml:space="preserve">
     <value>リダイレクトの文字列:</value>
   </data>
-  <data name="textBoxExportPath.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxExportPath.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxExportPath.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="textBoxExportPath.Location" type="System.Drawing.Point, System.Drawing">
     <value>81, 66</value>
   </data>
-  <data name="labelExportPath.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelExportPath.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelExportPath.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelExportPath.Location" type="System.Drawing.Point, System.Drawing">
     <value>6, 51</value>
   </data>
   <data name="labelExportPath.Text" xml:space="preserve">
     <value>XMLエクスポート用のAPIパス:</value>
   </data>
-  <data name="textBoxMetaApi.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxMetaApi.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxMetaApi.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="textBoxMetaApi.Location" type="System.Drawing.Point, System.Drawing">
     <value>81, 109</value>
   </data>
-  <data name="labelMetaApi.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelMetaApi.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelMetaApi.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelMetaApi.Location" type="System.Drawing.Point, System.Drawing">
     <value>6, 94</value>
   </data>
   <data name="labelMetaApi.Text" xml:space="preserve">
     <value>メタ情報取得用のAPIパス:</value>
   </data>
-  <data name="textBoxLocation.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxLocation.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxLocation.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="labelLocation.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelLocation.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelLocation.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelLocation.Size" type="System.Drawing.Size, System.Drawing">
     <value>69, 12</value>
   </data>
   <data name="labelLocation.Text" xml:space="preserve">
     <value>サーバーURL:</value>
   </data>
-  <data name="labelFileNamespace.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelFileNamespace.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelFileNamespace.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelFileNamespace.Location" type="System.Drawing.Point, System.Drawing">
     <value>6, 188</value>
   </data>
   <data name="labelFileNamespace.Text" xml:space="preserve">
     <value>ファイル名前空間のID:</value>
   </data>
-  <data name="groupBoxServer.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="groupBoxServer.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="groupBoxServer.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="groupBoxServer.Size" type="System.Drawing.Size, System.Drawing">
-    <value>288, 372</value>
+    <value>288, 392</value>
   </data>
   <data name="groupBoxServer.Text" xml:space="preserve">
     <value>MediaWikiの設定</value>
   </data>
-  <data name="groupBoxServer.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="comboBoxLanguage.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="comboBoxLanguage.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="comboBoxLanguage.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="comboBoxLanguage.Location" type="System.Drawing.Point, System.Drawing">
     <value>57, 13</value>
   </data>
-  <data name="labelLanguage.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelLanguage.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelLanguage.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelLanguage.Size" type="System.Drawing.Size, System.Drawing">
     <value>31, 12</value>
   </data>
   <data name="labelLanguage.Text" xml:space="preserve">
     <value>言語:</value>
   </data>
-  <data name="tabPageServer.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="tabPageServer.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="tabPageServer.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="tabPageServer.Size" type="System.Drawing.Size, System.Drawing">
-    <value>592, 417</value>
+    <value>592, 437</value>
   </data>
   <data name="tabPageServer.Text" xml:space="preserve">
     <value>サーバー/言語</value>
   </data>
-  <data name="tabPageServer.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelWebsite.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelWebsite.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelWebsite.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelWebsite.Size" type="System.Drawing.Size, System.Drawing">
     <value>43, 12</value>
   </data>
   <data name="labelWebsite.Text" xml:space="preserve">
     <value>配布元:</value>
   </data>
-  <data name="labelWebsite.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="linkLabelWebsite.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="linkLabelWebsite.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="linkLabelWebsite.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="linkLabelWebsite.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelCopyright.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelCopyright.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelCopyright.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="labelCopyright.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelApplicationName.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelApplicationName.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelApplicationName.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="labelApplicationName.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="groupBoxInformation.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="groupBoxInformation.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="groupBoxInformation.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="groupBoxInformation.Size" type="System.Drawing.Size, System.Drawing">
-    <value>580, 145</value>
+    <value>580, 182</value>
   </data>
   <data name="groupBoxInformation.Text" xml:space="preserve">
     <value>バージョン情報</value>
   </data>
-  <data name="groupBoxInformation.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelApplicationConfigNote.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelApplicationConfigNote.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelApplicationConfigNote.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelApplicationConfigNote.Size" type="System.Drawing.Size, System.Drawing">
     <value>272, 12</value>
   </data>
   <data name="labelApplicationConfigNote.Text" xml:space="preserve">
     <value>※ このタブの設定はアプリケーション全体に適用されます。</value>
   </data>
-  <data name="labelApplicationConfigNote.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxConnectRetryTime.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxConnectRetryTime.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxConnectRetryTime.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="textBoxConnectRetryTime.Location" type="System.Drawing.Point, System.Drawing">
     <value>168, 125</value>
   </data>
-  <data name="labelConnectRetryTimeNote.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelConnectRetryTimeNote.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelConnectRetryTimeNote.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelConnectRetryTimeNote.Location" type="System.Drawing.Point, System.Drawing">
     <value>237, 128</value>
   </data>
   <data name="labelConnectRetryTimeNote.Text" xml:space="preserve">
     <value>(0:ウェイトしない)</value>
   </data>
-  <data name="labelConnectRetryTimeNote.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelConnectRetryTime.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelConnectRetryTime.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelConnectRetryTime.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelConnectRetryTime.Size" type="System.Drawing.Size, System.Drawing">
     <value>156, 12</value>
   </data>
   <data name="labelConnectRetryTime.Text" xml:space="preserve">
     <value>リトライ時のウェイト時間(ミリ秒):</value>
   </data>
-  <data name="textBoxMaxConnectRetries.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxMaxConnectRetries.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxMaxConnectRetries.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="labelMaxConnectRetriesNote.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelMaxConnectRetriesNote.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelMaxConnectRetriesNote.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelMaxConnectRetriesNote.Size" type="System.Drawing.Size, System.Drawing">
     <value>86, 12</value>
   </data>
   <data name="labelMaxConnectRetriesNote.Text" xml:space="preserve">
     <value>(0:リトライしない)</value>
   </data>
-  <data name="labelMaxConnectRetriesNote.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelMaxConnectRetries.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelMaxConnectRetries.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelMaxConnectRetries.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelMaxConnectRetries.Size" type="System.Drawing.Size, System.Drawing">
     <value>136, 12</value>
   </data>
   <data name="labelMaxConnectRetries.Text" xml:space="preserve">
     <value>通信エラー時のリトライ回数:</value>
   </data>
-  <data name="checkBoxIgnoreError.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="checkBoxIgnoreError.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="checkBoxIgnoreError.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="checkBoxIgnoreError.Size" type="System.Drawing.Size, System.Drawing">
     <value>199, 16</value>
   </data>
   <data name="checkBoxIgnoreError.Text" xml:space="preserve">
     <value>エラーを可能な限り無視して続行する</value>
   </data>
-  <data name="labelRefererNote.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelRefererNote.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelRefererNote.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelRefererNote.Size" type="System.Drawing.Size, System.Drawing">
-    <value>62, 12</value>
+    <value>91, 12</value>
   </data>
   <data name="labelRefererNote.Text" xml:space="preserve">
-    <value>(空欄:なし)</value>
-  </data>
-  <data name="labelRefererNote.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelUserAgentNote.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelUserAgentNote.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelUserAgentNote.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
+    <value>(空欄:自動設定)</value>
   </data>
   <data name="labelUserAgentNote.Size" type="System.Drawing.Size, System.Drawing">
     <value>162, 12</value>
   <data name="labelUserAgentNote.Text" xml:space="preserve">
     <value>(空欄:アプリケーション独自のUA)</value>
   </data>
-  <data name="labelUserAgentNote.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelChaceNote.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelChaceNote.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelChaceNote.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelChaceNote.Location" type="System.Drawing.Point, System.Drawing">
     <value>183, 18</value>
   </data>
   <data name="labelChaceNote.Text" xml:space="preserve">
     <value>(0:無効)</value>
   </data>
-  <data name="labelChaceNote.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxCacheExpire.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxCacheExpire.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxCacheExpire.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="textBoxCacheExpire.Location" type="System.Drawing.Point, System.Drawing">
     <value>134, 15</value>
   </data>
-  <data name="textBoxReferer.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxReferer.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxReferer.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="labelReferer.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelReferer.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelReferer.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="labelCacheExpire.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelCacheExpire.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelCacheExpire.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="labelCacheExpire.Size" type="System.Drawing.Size, System.Drawing">
     <value>122, 12</value>
   </data>
   <data name="labelCacheExpire.Text" xml:space="preserve">
     <value>キャッシュ有効期限(日):</value>
   </data>
-  <data name="textBoxUserAgent.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="textBoxUserAgent.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="textBoxUserAgent.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="labelUserAgent.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="labelUserAgent.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="labelUserAgent.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="groupBoxApplicationConfig.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="groupBoxApplicationConfig.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="groupBoxApplicationConfig.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="groupBoxApplicationConfig.Text" xml:space="preserve">
     <value>アプリケーションの設定</value>
   </data>
-  <data name="groupBoxApplicationConfig.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="tabPageApplication.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="tabPageApplication.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="tabPageApplication.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="tabPageApplication.Size" type="System.Drawing.Size, System.Drawing">
-    <value>592, 417</value>
+    <value>592, 437</value>
   </data>
   <data name="tabPageApplication.Text" xml:space="preserve">
     <value>その他</value>
   </data>
-  <data name="tabControl.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="tabControl.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="tabControl.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="tabControl.Size" type="System.Drawing.Size, System.Drawing">
-    <value>600, 443</value>
-  </data>
-  <data name="tabControl.ToolTip" xml:space="preserve">
-    <value />
+    <value>600, 463</value>
   </data>
   <data name="$this.MinimumSize" type="System.Drawing.Size, System.Drawing">
-    <value>640, 530</value>
+    <value>640, 550</value>
   </data>
   <data name="$this.Text" xml:space="preserve">
     <value>設定</value>
   </data>
-  <data name="$this.ToolTip" xml:space="preserve">
-    <value />
-  </data>
-  <data name="buttonOk.Error" xml:space="preserve">
-    <value />
-  </data>
-  <data name="buttonOk.IconAlignment" type="System.Windows.Forms.ErrorIconAlignment, System.Windows.Forms">
-    <value>MiddleRight</value>
-  </data>
-  <data name="buttonOk.IconPadding" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="buttonOk.Location" type="System.Drawing.Point, System.Drawing">
-    <value>215, 461</value>
+    <value>215, 481</value>
   </data>
 </root>
\ No newline at end of file
index 3c0106f..d1ac9fe 100644 (file)
   </data>
   <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="buttonOk.Location" type="System.Drawing.Point, System.Drawing">
-    <value>215, 491</value>
+    <value>215, 506</value>
   </data>
   <data name="buttonOk.Size" type="System.Drawing.Size, System.Drawing">
     <value>75, 23</value>
     <value>Bottom</value>
   </data>
   <data name="buttonCancel.Location" type="System.Drawing.Point, System.Drawing">
-    <value>335, 491</value>
+    <value>335, 506</value>
   </data>
   <data name="buttonCancel.Size" type="System.Drawing.Size, System.Drawing">
     <value>75, 23</value>
     <value>True</value>
   </data>
   <data name="labelItemsNote.Location" type="System.Drawing.Point, System.Drawing">
-    <value>9, 429</value>
+    <value>9, 443</value>
   </data>
   <data name="labelItemsNote.Size" type="System.Drawing.Size, System.Drawing">
     <value>281, 12</value>
     <value>6, 6</value>
   </data>
   <data name="dataGridViewItems.Size" type="System.Drawing.Size, System.Drawing">
-    <value>580, 420</value>
+    <value>580, 434</value>
   </data>
   <data name="dataGridViewItems.TabIndex" type="System.Int32, mscorlib">
     <value>0</value>
     <value>3, 3, 3, 3</value>
   </data>
   <data name="tabPageItems.Size" type="System.Drawing.Size, System.Drawing">
-    <value>592, 447</value>
+    <value>592, 462</value>
   </data>
   <data name="tabPageItems.TabIndex" type="System.Int32, mscorlib">
     <value>0</value>
     <value>6, 6</value>
   </data>
   <data name="dataGridViewHeading.Size" type="System.Drawing.Size, System.Drawing">
-    <value>580, 435</value>
+    <value>580, 450</value>
   </data>
   <data name="dataGridViewHeading.TabIndex" type="System.Int32, mscorlib">
     <value>0</value>
     <value>3, 3, 3, 3</value>
   </data>
   <data name="tabPageHeadings.Size" type="System.Drawing.Size, System.Drawing">
-    <value>592, 447</value>
+    <value>592, 462</value>
   </data>
   <data name="tabPageHeadings.TabIndex" type="System.Int32, mscorlib">
     <value>1</value>
     <value>6, 18</value>
   </data>
   <data name="dataGridViewLanguageName.Size" type="System.Drawing.Size, System.Drawing">
-    <value>260, 329</value>
+    <value>260, 344</value>
   </data>
   <data name="dataGridViewLanguageName.TabIndex" type="System.Int32, mscorlib">
     <value>0</value>
     <value>8, 43</value>
   </data>
   <data name="groupBoxLanguageName.Size" type="System.Drawing.Size, System.Drawing">
-    <value>272, 353</value>
+    <value>272, 368</value>
   </data>
   <data name="groupBoxLanguageName.TabIndex" type="System.Int32, mscorlib">
     <value>2</value>
     <value>300, 39</value>
   </data>
   <data name="groupBoxLanguage.Size" type="System.Drawing.Size, System.Drawing">
-    <value>286, 402</value>
+    <value>286, 417</value>
   </data>
   <data name="groupBoxLanguage.TabIndex" type="System.Int32, mscorlib">
     <value>5</value>
   <data name="groupBoxServer.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Bottom, Left</value>
   </data>
+  <data name="checkBoxHasLanguagePage.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="checkBoxHasLanguagePage.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 395</value>
+  </data>
+  <data name="checkBoxHasLanguagePage.Size" type="System.Drawing.Size, System.Drawing">
+    <value>144, 16</value>
+  </data>
+  <data name="checkBoxHasLanguagePage.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="checkBoxHasLanguagePage.Text" xml:space="preserve">
+    <value>Wiki has language page</value>
+  </data>
+  <data name="checkBoxHasLanguagePage.ToolTip" xml:space="preserve">
+    <value>言語名のページが存在する場合、言語名を出力する際に内部リンクの形で出力します。</value>
+  </data>
+  <data name="&gt;&gt;checkBoxHasLanguagePage.Name" xml:space="preserve">
+    <value>checkBoxHasLanguagePage</value>
+  </data>
+  <data name="&gt;&gt;checkBoxHasLanguagePage.Type" xml:space="preserve">
+    <value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;checkBoxHasLanguagePage.Parent" xml:space="preserve">
+    <value>groupBoxServer</value>
+  </data>
+  <data name="&gt;&gt;checkBoxHasLanguagePage.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
   <data name="textBoxLangFormat.Location" type="System.Drawing.Point, System.Drawing">
     <value>81, 368</value>
   </data>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;textBoxLangFormat.ZOrder" xml:space="preserve">
-    <value>0</value>
+    <value>1</value>
   </data>
   <data name="labelLangFormat.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;labelLangFormat.ZOrder" xml:space="preserve">
-    <value>1</value>
+    <value>2</value>
   </data>
   <data name="textBoxLinkInterwikiFormat.Location" type="System.Drawing.Point, System.Drawing">
     <value>81, 338</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;textBoxLinkInterwikiFormat.ZOrder" xml:space="preserve">
-    <value>2</value>
+    <value>3</value>
   </data>
   <data name="labelLinkInterwikiFormat.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;labelLinkInterwikiFormat.ZOrder" xml:space="preserve">
-    <value>3</value>
+    <value>4</value>
   </data>
   <data name="textBoxDocumentationTemplateDefaultPage.Location" type="System.Drawing.Point, System.Drawing">
     <value>81, 295</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;textBoxDocumentationTemplateDefaultPage.ZOrder" xml:space="preserve">
-    <value>4</value>
+    <value>5</value>
   </data>
   <data name="labelDocumentationTemplateDefaultPage.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;labelDocumentationTemplateDefaultPage.ZOrder" xml:space="preserve">
-    <value>5</value>
+    <value>6</value>
   </data>
   <data name="textBoxDocumentationTemplate.Location" type="System.Drawing.Point, System.Drawing">
     <value>81, 232</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;textBoxDocumentationTemplate.ZOrder" xml:space="preserve">
-    <value>6</value>
+    <value>7</value>
   </data>
   <data name="labelDocumentationTemplate.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;labelDocumentationTemplate.ZOrder" xml:space="preserve">
-    <value>7</value>
+    <value>8</value>
   </data>
   <data name="textBoxFileNamespace.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
     <value>Disable</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;textBoxFileNamespace.ZOrder" xml:space="preserve">
-    <value>8</value>
+    <value>9</value>
   </data>
   <data name="textBoxCategoryNamespace.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
     <value>Disable</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;textBoxCategoryNamespace.ZOrder" xml:space="preserve">
-    <value>9</value>
+    <value>10</value>
   </data>
   <data name="labelCategoryNamespace.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;labelCategoryNamespace.ZOrder" xml:space="preserve">
-    <value>10</value>
+    <value>11</value>
   </data>
   <data name="textBoxTemplateNamespace.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
     <value>Disable</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;textBoxTemplateNamespace.ZOrder" xml:space="preserve">
-    <value>11</value>
+    <value>12</value>
   </data>
   <data name="labelTemplateNamespace.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;labelTemplateNamespace.ZOrder" xml:space="preserve">
-    <value>12</value>
+    <value>13</value>
   </data>
   <data name="textBoxRedirect.Location" type="System.Drawing.Point, System.Drawing">
     <value>81, 185</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;textBoxRedirect.ZOrder" xml:space="preserve">
-    <value>13</value>
+    <value>14</value>
   </data>
   <data name="labelRedirect.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;labelRedirect.ZOrder" xml:space="preserve">
-    <value>14</value>
+    <value>15</value>
   </data>
   <data name="textBoxExportPath.Location" type="System.Drawing.Point, System.Drawing">
     <value>81, 46</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;textBoxExportPath.ZOrder" xml:space="preserve">
-    <value>15</value>
+    <value>16</value>
   </data>
   <data name="labelExportPath.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;labelExportPath.ZOrder" xml:space="preserve">
-    <value>16</value>
+    <value>17</value>
   </data>
   <data name="textBoxMetaApi.Location" type="System.Drawing.Point, System.Drawing">
     <value>81, 73</value>
@@ -1208,7 +1238,7 @@ http://www.mediawiki.org/wiki/API:Main_page/ja
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;textBoxMetaApi.ZOrder" xml:space="preserve">
-    <value>17</value>
+    <value>18</value>
   </data>
   <data name="labelMetaApi.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
@@ -1241,7 +1271,7 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;labelMetaApi.ZOrder" xml:space="preserve">
-    <value>18</value>
+    <value>19</value>
   </data>
   <data name="textBoxLocation.Location" type="System.Drawing.Point, System.Drawing">
     <value>81, 18</value>
@@ -1268,7 +1298,7 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;textBoxLocation.ZOrder" xml:space="preserve">
-    <value>19</value>
+    <value>20</value>
   </data>
   <data name="labelLocation.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
@@ -1298,7 +1328,7 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;labelLocation.ZOrder" xml:space="preserve">
-    <value>20</value>
+    <value>21</value>
   </data>
   <data name="labelFileNamespace.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
@@ -1328,7 +1358,7 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
     <value>groupBoxServer</value>
   </data>
   <data name="&gt;&gt;labelFileNamespace.ZOrder" xml:space="preserve">
-    <value>21</value>
+    <value>22</value>
   </data>
   <data name="groupBoxServer.Enabled" type="System.Boolean, mscorlib">
     <value>False</value>
@@ -1337,7 +1367,7 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
     <value>6, 39</value>
   </data>
   <data name="groupBoxServer.Size" type="System.Drawing.Size, System.Drawing">
-    <value>288, 402</value>
+    <value>288, 417</value>
   </data>
   <data name="groupBoxServer.TabIndex" type="System.Int32, mscorlib">
     <value>4</value>
@@ -1418,7 +1448,7 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
     <value>3, 3, 3, 3</value>
   </data>
   <data name="tabPageServer.Size" type="System.Drawing.Size, System.Drawing">
-    <value>592, 447</value>
+    <value>592, 462</value>
   </data>
   <data name="tabPageServer.TabIndex" type="System.Int32, mscorlib">
     <value>2</value>
@@ -1556,10 +1586,10 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
     <value>3</value>
   </data>
   <data name="groupBoxInformation.Location" type="System.Drawing.Point, System.Drawing">
-    <value>6, 266</value>
+    <value>6, 249</value>
   </data>
   <data name="groupBoxInformation.Size" type="System.Drawing.Size, System.Drawing">
-    <value>580, 175</value>
+    <value>580, 207</value>
   </data>
   <data name="groupBoxInformation.TabIndex" type="System.Int32, mscorlib">
     <value>2</value>
@@ -1827,11 +1857,14 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
     <value>342, 71</value>
   </data>
   <data name="labelRefererNote.Size" type="System.Drawing.Size, System.Drawing">
-    <value>0, 12</value>
+    <value>75, 12</value>
   </data>
   <data name="labelRefererNote.TabIndex" type="System.Int32, mscorlib">
     <value>9</value>
   </data>
+  <data name="labelRefererNote.Text" xml:space="preserve">
+    <value>(Empty: Auto)</value>
+  </data>
   <data name="&gt;&gt;labelRefererNote.Name" xml:space="preserve">
     <value>labelRefererNote</value>
   </data>
@@ -1946,9 +1979,7 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
   </data>
   <data name="textBoxReferer.ToolTip" xml:space="preserve">
     <value>Referer を固定で指定する場合、URLを入力します。
-空欄の場合、Refererは設定しません。
-
-※ 現状、Referer は動的には設定されません。</value>
+空欄の場合、Referer はアクセスしたページに応じて動的に設定されます。</value>
   </data>
   <data name="&gt;&gt;textBoxReferer.Name" xml:space="preserve">
     <value>textBoxReferer</value>
@@ -1979,9 +2010,7 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
   </data>
   <data name="labelReferer.ToolTip" xml:space="preserve">
     <value>Referer を固定で指定する場合、URLを入力します。
-空欄の場合、Refererは設定しません。
-
-※ 現状、Referer は動的には設定されません。</value>
+空欄の場合、Referer はアクセスしたページに応じて動的に設定されます。</value>
   </data>
   <data name="&gt;&gt;labelReferer.Name" xml:space="preserve">
     <value>labelReferer</value>
@@ -2089,7 +2118,7 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
     <value>6, 6</value>
   </data>
   <data name="groupBoxApplicationConfig.Size" type="System.Drawing.Size, System.Drawing">
-    <value>580, 254</value>
+    <value>580, 237</value>
   </data>
   <data name="groupBoxApplicationConfig.TabIndex" type="System.Int32, mscorlib">
     <value>1</value>
@@ -2116,7 +2145,7 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
     <value>3, 3, 3, 3</value>
   </data>
   <data name="tabPageApplication.Size" type="System.Drawing.Size, System.Drawing">
-    <value>592, 447</value>
+    <value>592, 462</value>
   </data>
   <data name="tabPageApplication.TabIndex" type="System.Int32, mscorlib">
     <value>3</value>
@@ -2146,7 +2175,7 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
     <value>True</value>
   </data>
   <data name="tabControl.Size" type="System.Drawing.Size, System.Drawing">
-    <value>600, 473</value>
+    <value>600, 488</value>
   </data>
   <data name="tabControl.TabIndex" type="System.Int32, mscorlib">
     <value>1</value>
@@ -2173,10 +2202,10 @@ http://www.mediawiki.org/wiki/API:Main_page/ja</value>
     <value>6, 12</value>
   </data>
   <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
-    <value>624, 523</value>
+    <value>624, 538</value>
   </data>
   <data name="$this.MinimumSize" type="System.Drawing.Size, System.Drawing">
-    <value>640, 560</value>
+    <value>640, 575</value>
   </data>
   <data name="$this.Text" xml:space="preserve">
     <value>Settings</value>
index 4e50bcf..9cf9997 100644 (file)
@@ -222,7 +222,7 @@ namespace Honememo.Wptscs.Logics
         protected virtual string CreateOpening(string title)
         {
             string langPart = String.Empty;
-            MediaWikiLink langLink = this.GetLanguageLink(this.From, this.To.Language.Code);
+            IElement langLink = this.GetLanguageLink();
             if (langLink != null)
             {
                 langPart = langLink.ToString() + ": ";
@@ -941,6 +941,12 @@ namespace Honememo.Wptscs.Logics
         /// </summary>
         /// <param name="title">翻訳支援対象の記事名。</param>
         /// <returns>取得したページ。取得失敗時は<c>null</c>。</returns>
+        /// <remarks>
+        /// ここで取得した記事のURIを、以後の翻訳支援処理で使用するRefererとして登録
+        /// (ここで処理しているのは、リダイレクトの場合のリダイレクト先への
+        /// アクセス時にもRefererを入れたかったから。
+        /// リダイレクトの場合は、最終的には転送先ページのURIとなる)。
+        /// </remarks>
         private MediaWikiPage GetTargetPage(string title)
         {
             // 指定された記事をWikipediaから取得、リダイレクトの場合その先まで探索
@@ -957,9 +963,14 @@ namespace Honememo.Wptscs.Logics
                     this.Logger.AddResponse(Resources.LogMessageTargetArticleNotFound);
                     break;
                 }
-                else if (!page.IsRedirect())
+
+                // 取得した記事のURIを以後のアクセスで用いるRefererとして登録
+                this.From.WebProxy.Referer = page.Uri.ToString();
+                this.To.WebProxy.Referer = page.Uri.ToString();
+
+                if (!page.IsRedirect())
                 {
-                    // ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88以å¤\96ã\82\82ã\81\93ã\81\93で終了
+                    // ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88以å¤\96ã\81ªã\82\89ã\81\93ã\82\8cで終了
                     break;
                 }
 
@@ -974,24 +985,48 @@ namespace Honememo.Wptscs.Logics
         /// <summary>
         /// 指定した言語での言語名称を [[言語名称|略称]]の内部リンクで取得。
         /// </summary>
-        /// <param name="site">サイト。</param>
-        /// <param name="code">言語のコード。</param>
-        /// <returns>[[言語名称|略称]]の内部リンク。登録されていない場合<c>null</c>。</returns>
-        private MediaWikiLink GetLanguageLink(Website site, string code)
+        /// <returns>
+        /// [[言語名称|略称]]の内部リンク。登録されていない場合<c>null</c>。
+        /// サーバーにそうした記事が存在しない場合、リンクではなく言語名称or略称の文字列を返す。
+        /// </returns>
+        private IElement GetLanguageLink()
         {
-            if (!site.Language.Names.ContainsKey(code))
+            // 言語情報を取得
+            Language.LanguageName name;
+            if (!this.From.Language.Names.TryGetValue(this.To.Language.Code, out name))
             {
                 return null;
             }
 
-            Language.LanguageName name = site.Language.Names[code];
-            MediaWikiLink link = new MediaWikiLink(name.Name);
+            // 略称を取得
+            IElement shortName = null;
             if (!String.IsNullOrEmpty(name.ShortName))
             {
-                link.PipeTexts.Add(new TextElement(name.ShortName));
+                shortName = new TextElement(name.ShortName);
             }
 
-            return link;
+            if (this.To.HasLanguagePage)
+            {
+                // サーバーにこの言語の記事が存在することが期待される場合、
+                // 内部リンクとして返す
+                MediaWikiLink link = new MediaWikiLink(name.Name);
+                if (shortName != null)
+                {
+                    link.PipeTexts.Add(shortName);
+                }
+
+                return link;
+            }
+            else if (shortName != null)
+            {
+                // 存在しない場合、まずあれば略称を返す
+                return shortName;
+            }
+            else
+            {
+                // 無ければ言語名を返す
+                return new TextElement(name.Name);
+            }
         }
 
         /// <summary>
index d58d37c..ed5bbc1 100644 (file)
@@ -274,40 +274,37 @@ namespace Honememo.Wptscs.Logics
                 throw new InvalidOperationException("From or To is null");
             }
 
-            // å¤\89æ\95°ã\82\92å\88\9dæ\9c\9få\8c\96ã\80\81å\87¦ç\90\86æ\99\82é\96\93ã\82\92測å®\9aé\96\8bå§\8b
+            // å\88\9dæ\9c\9få\8c\96ã\82\84ã\82¹ã\83\88ã\83\83ã\83\97ã\82¦ã\82©ã\83\83ã\83\81ã\81®èµ·å\8b\95ã\81¨ã\81\84ã\81£ã\81\9få\89\8då\87¦ç\90\86ã\82\92å®\9fæ\96½
             this.Initialize();
-            this.Stopwatch.Start();
-
-            // サーバー接続チェック
-            string host = new Uri(this.From.Location).Host;
-            if (!String.IsNullOrEmpty(host) && !Settings.Default.IgnoreError)
+            try
             {
-                if (!this.Ping(host))
+                // サーバー接続チェック
+                string host = new Uri(this.From.Location).Host;
+                if (!String.IsNullOrEmpty(host) && !Settings.Default.IgnoreError)
                 {
-                    throw new ApplicationException("ping failed");
+                    if (!this.Ping(host))
+                    {
+                        throw new ApplicationException("ping failed");
+                    }
                 }
-            }
 
-            // ここまでの間に終了要求が出ているかを確認
-            this.ThrowExceptionIfCanceled();
+                // ここまでの間に終了要求が出ているかを確認
+                this.ThrowExceptionIfCanceled();
 
-            // 翻訳支援処理実行部の本体を実行
-            // ※以降の処理は、継承クラスにて定義
-            try
-            {
+                // 翻訳支援処理実行部の本体を実行
+                // ※以降の処理は、継承クラスにて定義
                 this.RunBody(name);
             }
             finally
             {
-                // 終了後は処理状態をクリア、処理時間を測定終了
-                this.StatusManager.Clear();
-                this.Stopwatch.Stop();
+                // 状態のクリアやストップウォッチの停止といった後処理を実施
+                this.Terminate();
             }
         }
         
         #endregion
 
-        #region 実装が必要なテンプレートメソッド
+        #region テンプレートメソッド
 
         /// <summary>
         /// 翻訳支援処理実行部の本体。
@@ -317,6 +314,53 @@ namespace Honememo.Wptscs.Logics
         /// <remarks>テンプレートメソッド的な構造になっています。</remarks>
         protected abstract void RunBody(string name);
 
+        /// <summary>
+        /// 翻訳支援処理実行時の初期化処理。
+        /// </summary>
+        /// <remarks>
+        /// <para>
+        /// <see cref="RunBody"/>実行前の初期化のタイミングでコールされる。
+        /// 本メソッドで例外が発生した場合、<see cref="RunBody"/>, <see cref="Terminate"/>はコールされない。
+        /// </para>
+        /// <para>
+        /// オーバーライド時は必ず親のメソッドもコールすること。
+        /// </para>
+        /// </remarks>
+        protected virtual void Initialize()
+        {
+            // ロガーや処理状態などを初期化、処理時間の測定を開始
+            this.Logger.Clear();
+            this.StatusManager.Clear();
+            this.Stopwatch.Reset();
+            this.Text = String.Empty;
+            this.CancellationPending = false;
+            this.From.WebProxy.Referer = null;
+            this.To.WebProxy.Referer = null;
+            this.Stopwatch.Start();
+        }
+
+        /// <summary>
+        /// 翻訳支援処理実行時の終了処理。
+        /// </summary>
+        /// <remarks>
+        /// <para>
+        /// <see cref="RunBody"/>実行後の後処理のタイミングでコールされる。
+        /// ただし、サーバー接続チェックに失敗した場合などでは、
+        /// <see cref="RunBody"/>が実行されること無く本メソッドが呼ばれる場合もある。
+        /// </para>
+        /// <para>
+        /// オーバーライド時は必ず親のメソッドもコールすること。
+        /// </para>
+        /// </remarks>
+        protected virtual void Terminate()
+        {
+            // 終了後は処理状態やRefererをクリア、処理時間を測定終了
+            this.StatusManager.Clear();
+            this.From.WebProxy.Referer = null;
+            this.To.WebProxy.Referer = null;
+            this.Stopwatch.Stop();
+        }
+
         #endregion
 
         #region 実装支援用メソッド
@@ -373,19 +417,6 @@ namespace Honememo.Wptscs.Logics
         #region 内部処理用メソッド
 
         /// <summary>
-        /// 翻訳支援処理実行時の初期化処理。
-        /// </summary>
-        private void Initialize()
-        {
-            // 変数を初期化
-            this.Logger.Clear();
-            this.StatusManager.Clear();
-            this.Stopwatch.Reset();
-            this.Text = String.Empty;
-            this.CancellationPending = false;
-        }
-
-        /// <summary>
         /// サーバー接続チェック。
         /// </summary>
         /// <param name="server">サーバー名。</param>
index ad0f132..8c4307d 100644 (file)
@@ -1,7 +1,7 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     このコードはツールによって生成されました。
-//     ランタイム バージョン:4.0.30319.239
+//     ランタイム バージョン:4.0.30319.261
 //
 //     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
 //     コードが再生成されるときに損失したりします。
@@ -25,7 +25,7 @@ namespace Honememo.Wptscs.Properties {
         
         [global::System.Configuration.ApplicationScopedSettingAttribute()]
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("WikipediaTranslationSupportTool/{0}.{1:D2}")]
+        [global::System.Configuration.DefaultSettingValueAttribute("Translation Support for Wikipedia/{0}.{1:D2}")]
         public string DefaultUserAgent {
             get {
                 return ((string)(this["DefaultUserAgent"]));
index cc1d7cd..c885b65 100644 (file)
@@ -3,7 +3,7 @@
   <Profiles />
   <Settings>
     <Setting Name="DefaultUserAgent" Type="System.String" Scope="Application">
-      <Value Profile="(Default)">WikipediaTranslationSupportTool/{0}.{1:D2}</Value>
+      <Value Profile="(Default)">Translation Support for Wikipedia/{0}.{1:D2}</Value>
     </Setting>
     <Setting Name="WikipediaLocation" Type="System.String" Scope="Application">
       <Value Profile="(Default)">http://{0}.wikipedia.org</Value>
index d37497c..6967699 100644 (file)
@@ -169,6 +169,8 @@ Ver1.20  2012/03/xx Wiktionary/Wikitravelでの動作に対応。
                     言語間リンク取得時に<includeonly>, <noinclude>を考慮するよう修正。
                     見出しの置き換えに改行区切りで複数の語句を登録できるよう改良。
                     非常に複雑なテンプレートで極端に時間がかかっていたのを改善。
+                    サーバーへのアクセス時に自動でRefererを設定するよう変更。
+                    UserAgentを英語アプリ名にあわせたものに変更。
                     その他ソースの改善/小不具合を修正。
                     ※ 1.11とは設定ファイル名が変化しており、古い設定は自動で読み込まれません。
 
similarity index 78%
rename from Wptscs/Utilities/AppDefaultWebProxy.cs
rename to Wptscs/Utilities/AppConfigWebProxy.cs
index 989650f..6743632 100644 (file)
@@ -1,9 +1,9 @@
 // ================================================================================================
 // <summary>
-//      アプリケーションデフォルトの値を用いてウェブアクセスするプロキシクラスソース</summary>
+//      アプリケーション設定値を用いてウェブアクセスするプロキシクラスソース</summary>
 //
-// <copyright file="AppDefaultWebProxy.cs" company="honeplusのメモ帳">
-//      Copyright (C) 2011 Honeplus. All rights reserved.</copyright>
+// <copyright file="AppConfigWebProxy.cs" company="honeplusのメモ帳">
+//      Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
 // <author>
 //      Honeplus</author>
 // ================================================================================================
@@ -13,13 +13,15 @@ namespace Honememo.Wptscs.Utilities
     using System;
     using System.IO;
     using System.Net;
+    using System.Reflection;
     using System.Threading;
+    using Honememo.Utilities;
     using Honememo.Wptscs.Properties;
     
     /// <summary>
-    /// アプリケーションデフォルトの値を用いてウェブアクセスするプロキシクラスです。
+    /// アプリケーション設定値を用いてウェブアクセスするプロキシクラスです。
     /// </summary>
-    public class AppDefaultWebProxy : IWebProxy
+    public class AppConfigWebProxy : IWebProxy
     {
         #region private変数
 
@@ -40,31 +42,27 @@ namespace Honememo.Wptscs.Utilities
         /// <summary>
         /// このプロキシで使用するUserAgent。
         /// </summary>
-        /// <returns>UserAgent。</returns>
-        /// <remarks>プロパティ→アプリ設定値→アプリデフォルト値を生成 の順にあるものを返す。</remarks>
+        /// <remarks>アプリ設定値→プロパティ→アプリデフォルト値を生成 の順に見つけたものを返す。</remarks>
         public string UserAgent
         {
             get
             {
-                // プロパティを確認
-                if (this.userAgent != null)
+                // アプリ設定値を確認
+                string ua = Settings.Default.UserAgent;
+                if (!String.IsNullOrEmpty(ua))
                 {
-                    return this.userAgent;
+                    return ua;
                 }
 
-                // アプリ設定値を確認
-                string ua = Settings.Default.UserAgent;
-                if (String.IsNullOrEmpty(ua))
+                // 存在しない場合、このプロパティの値を確認
+                if (this.userAgent != null)
                 {
-                    // 特に設定が無い場合はデフォルトの値を設定
-                    Version ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
-                    ua = String.Format(
-                        Settings.Default.DefaultUserAgent,
-                        ver.Major,
-                        ver.Minor);
+                    return this.userAgent;
                 }
 
-                return ua;
+                // いずれも存在しない場合は、デフォルトの値を生成して返す
+                Version ver = Assembly.GetExecutingAssembly().GetName().Version;
+                return String.Format(Settings.Default.DefaultUserAgent, ver.Major, ver.Minor);
             }
 
             set
@@ -76,26 +74,20 @@ namespace Honememo.Wptscs.Utilities
         /// <summary>
         /// このプロキシで使用するReferer。
         /// </summary>
-        /// <returns>Referer。</returns>
-        /// <remarks>プロパティ→アプリ設定値 の順にあるものを返す。</remarks>
+        /// <remarks>アプリ設定値→プロパティ の順に見つけたものを返す。</remarks>
         public string Referer
         {
             get
             {
-                // プロパティを確認
-                if (this.referer != null)
-                {
-                    return this.referer;
-                }
-
                 // アプリ設定値を確認
                 string r = Settings.Default.Referer;
                 if (String.IsNullOrEmpty(r))
                 {
-                    r = String.Empty;
+                    // 存在しない場合、このプロパティの値を返す
+                    r = this.referer;
                 }
 
-                return r;
+                return StringUtils.DefaultString(r);
             }
 
             set
@@ -138,7 +130,7 @@ namespace Honememo.Wptscs.Utilities
                     }
 
                     // 時間を置いてからリトライする(0はスレッド停止のため除外)
-                    System.Diagnostics.Debug.WriteLine("AppDefaultWebProxy.GetStream > retry : " + e.Message);
+                    System.Diagnostics.Debug.WriteLine("AppConfigWebProxy.GetStream > retry : " + e.Message);
                     if (wait > 0)
                     {
                         Thread.Sleep(wait);
@@ -179,9 +171,9 @@ namespace Honememo.Wptscs.Utilities
         }
 
         /// <summary>
-        /// HttpWebRequest用の設定を行う。
+        /// <see cref="HttpWebRequest"/>用の設定を行う。
         /// </summary>
-        /// <param name="req">設定対象のHttpWebRequest。</param>
+        /// <param name="req">設定対象の<see cref="HttpWebRequest"/>。</param>
         private void InitializeHttpWebRequest(HttpWebRequest req)
         {
             // UserAgent設定
@@ -197,7 +189,7 @@ namespace Honememo.Wptscs.Utilities
         /// <summary>
         /// 渡された<see cref="WebException"/>がリトライ可能なものか?
         /// </summary>
-        /// <param name="e">発生した<c>WebException</c>。</param>
+        /// <param name="e">発生した<see cref="WebException"/>。</param>
         /// <returns>リトライ可能な場合<c>true</c>。</returns>
         private bool IsRetryable(WebException e)
         {
index 9cbb427..81b5861 100644 (file)
@@ -84,41 +84,44 @@ namespace Honememo.Wptscs.Websites
         /// </summary>
         private object lockLoadMetaApi = new object();
 
+        /// <summary>
+        /// Template:Documentation(言語間リンク等を別ページに記述するためのテンプレート)に相当するページ名。
+        /// </summary>
+        private IList<string> documentationTemplates = new List<string>();
+
         #endregion
 
         #region コンストラクタ
 
         /// <summary>
-        /// コンストラクタ(MediaWiki全般)
+        /// 指定された言語, サーバーのMediaWikiを表すインスタンスを作成
         /// </summary>
         /// <param name="language">ウェブサイトの言語。</param>
         /// <param name="location">ウェブサイトの場所。</param>
-        public MediaWiki(Language language, string location) : this()
+        /// <exception cref="ArgumentNullException"><paramref name="language"/>または<paramref name="location"/>が<c>null</c>の場合。</exception>
+        /// <exception cref="ArgumentException"><paramref name="location"/>が空の文字列の場合。</exception>
+        public MediaWiki(Language language, string location)
+            : base(language, location)
         {
-            // メンバ変数の初期設定
-            this.Language = language;
-            this.Location = location;
         }
 
         /// <summary>
-        /// コンストラクタ(Wikipedia用)
+        /// 指定された言語のWikipediaを表すインスタンスを作成
         /// </summary>
         /// <param name="language">ウェブサイトの言語。</param>
-        public MediaWiki(Language language) : this()
+        /// <exception cref="ArgumentNullException"><c>null</c>が指定された場合。</exception>
+        public MediaWiki(Language language)
         {
-            // メンバ変数の初期設定
-            // ※ オーバーロードメソッドを呼んでいないのは、languageがnullのときに先にエラーになるから
+            // 親で初期化していないのは、languageのnullチェックの前にnull参照でエラーになってしまうから
             this.Language = language;
             this.Location = String.Format(Settings.Default.WikipediaLocation, language.Code);
         }
 
         /// <summary>
-        /// コンストラクタ(シリアライズ or 拡張用)。
+        /// 空のインスタンスを作成(シリアライズ or 拡張用)。
         /// </summary>
         protected MediaWiki()
         {
-            this.WebProxy = new AppDefaultWebProxy();
-            this.DocumentationTemplates = new List<string>();
         }
 
         #endregion
@@ -362,8 +365,23 @@ namespace Honememo.Wptscs.Websites
         /// <remarks>空の場合、その言語版にはこれに相当する機能は無いものとして扱う。</remarks>
         public IList<string> DocumentationTemplates
         {
-            get;
-            protected set;
+            get
+            {
+                return this.documentationTemplates;
+            }
+
+            set
+            {
+                if (value == null)
+                {
+                    // nullの場合、空のリストを代入
+                    // ※ 例外にしてもよいが、このクラスにはnullで初期化としている
+                    //    プロパティが多数存在するので、動きをあわせる
+                    value = new List<string>();
+                }
+
+                this.documentationTemplates = value;
+            }
         }
 
         /// <summary>
@@ -400,12 +418,16 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// このクラスで使用するWebアクセス用Proxyインスタンス。
+        /// 言語名の記事が存在するようなサイトか?
         /// </summary>
-        /// <remarks>setterはユニットテスト用に公開。</remarks>
-        public IWebProxy WebProxy
+        /// <remarks>
+        /// そうした記事が存在する場合<c>true</c>。
+        /// Wikipediaには[[日本語]]といった記事が存在するが、Wikitravelであればそうした記事は存在し得ない。
+        /// 言語名をリンクにするかといった判断に用いる。
+        /// </remarks>
+        public bool HasLanguagePage
         {
-            protected get;
+            get;
             set;
         }
 
@@ -493,7 +515,7 @@ namespace Honememo.Wptscs.Websites
             }
 
             // ページ情報を作成して返す
-            return new MediaWikiPage(this, pageTitle, text, time);
+            return new MediaWikiPage(this, pageTitle, text, time, uri);
         }
 
         /// <summary>
@@ -617,7 +639,7 @@ namespace Honememo.Wptscs.Websites
         /// <summary>
         /// シリアライズするXMLのスキーマ定義を返す。
         /// </summary>
-        /// <returns>XML表現を記述するXmlSchema。</returns>
+        /// <returns>XML表現を記述する<see cref="System.Xml.Schema.XmlSchema"/>。</returns>
         public System.Xml.Schema.XmlSchema GetSchema()
         {
             return null;
@@ -626,7 +648,7 @@ namespace Honememo.Wptscs.Websites
         /// <summary>
         /// XMLからオブジェクトをデシリアライズする。
         /// </summary>
-        /// <param name="reader">デシリアライズ元のXmlReader</param>
+        /// <param name="reader">デシリアライズ元の<see cref="XmlReader"/></param>
         public void ReadXml(XmlReader reader)
         {
             XmlDocument xml = new XmlDocument();
@@ -647,22 +669,20 @@ namespace Honememo.Wptscs.Websites
             this.ExportPath = XmlUtils.InnerText(siteElement.SelectSingleNode("ExportPath"));
             this.Redirect = XmlUtils.InnerText(siteElement.SelectSingleNode("Redirect"));
 
-            string text = XmlUtils.InnerText(siteElement.SelectSingleNode("TemplateNamespace"));
-            if (!String.IsNullOrEmpty(text))
+            int namespaceId;
+            if (int.TryParse(XmlUtils.InnerText(siteElement.SelectSingleNode("TemplateNamespace")), out namespaceId))
             {
-                this.TemplateNamespace = int.Parse(text);
+                this.TemplateNamespace = namespaceId;
             }
 
-            text = XmlUtils.InnerText(siteElement.SelectSingleNode("CategoryNamespace"));
-            if (!String.IsNullOrEmpty(text))
+            if (int.TryParse(XmlUtils.InnerText(siteElement.SelectSingleNode("CategoryNamespace")), out namespaceId))
             {
-                this.CategoryNamespace = int.Parse(text);
+                this.CategoryNamespace = namespaceId;
             }
 
-            text = XmlUtils.InnerText(siteElement.SelectSingleNode("FileNamespace"));
-            if (!String.IsNullOrEmpty(text))
+            if (int.TryParse(XmlUtils.InnerText(siteElement.SelectSingleNode("FileNamespace")), out namespaceId))
             {
-                this.FileNamespace = int.Parse(text);
+                this.FileNamespace = namespaceId;
             }
 
             // システム定義変数
@@ -708,12 +728,17 @@ namespace Honememo.Wptscs.Websites
 
             this.LinkInterwikiFormat = XmlUtils.InnerText(siteElement.SelectSingleNode("LinkInterwikiFormat"));
             this.LangFormat = XmlUtils.InnerText(siteElement.SelectSingleNode("LangFormat"));
+            bool hasLanguagePage;
+            if (bool.TryParse(XmlUtils.InnerText(siteElement.SelectSingleNode("HasLanguagePage")), out hasLanguagePage))
+            {
+                this.HasLanguagePage = hasLanguagePage;
+            }
         }
 
         /// <summary>
         /// オブジェクトをXMLにシリアライズする。
         /// </summary>
-        /// <param name="writer">シリアライズ先のXmlWriter</param>
+        /// <param name="writer">シリアライズ先の<see cref="XmlWriter"/></param>
         public void WriteXml(XmlWriter writer)
         {
             writer.WriteElementString("Location", this.Location);
@@ -769,6 +794,7 @@ namespace Honememo.Wptscs.Websites
             writer.WriteEndElement();
             writer.WriteElementString("LinkInterwikiFormat", this.LinkInterwikiFormat);
             writer.WriteElementString("LangFormat", this.LangFormat);
+            writer.WriteElementString("HasLanguagePage", this.HasLanguagePage.ToString());
         }
 
         #endregion
index a076d55..734b69f 100644 (file)
@@ -36,35 +36,42 @@ namespace Honememo.Wptscs.Websites
         #region コンストラクタ
 
         /// <summary>
-        /// コンストラクタ
+        /// 指定されたMediaWikiの渡されたタイトル, 本文, タイムスタンプのページを作成
         /// </summary>
         /// <param name="website">ページが所属するウェブサイト。</param>
         /// <param name="title">ページタイトル。</param>
         /// <param name="text">ページの本文。</param>
         /// <param name="timestamp">ページのタイムスタンプ。</param>
-        public MediaWikiPage(MediaWiki website, string title, string text, DateTime? timestamp)
-            : base(website, title, text, timestamp)
+        /// <param name="uri">ページのURI。</param>
+        /// <exception cref="ArgumentNullException"><paramref name="website"/>または<paramref name="title"/>が<c>null</c>の場合。</exception>
+        /// <exception cref="ArgumentException"><paramref name="title"/>が空の文字列の場合。</exception>
+        public MediaWikiPage(MediaWiki website, string title, string text, DateTime? timestamp, Uri uri)
+            : base(website, title, text, timestamp, uri)
         {
         }
 
         /// <summary>
-        /// コンストラクタ。
-        /// ページのタイムスタンプには<c>null</c>を設定。
+        /// 指定されたMediaWikiの渡されたタイトル, 本文のページを作成。
         /// </summary>
         /// <param name="website">ページが所属するウェブサイト。</param>
         /// <param name="title">ページタイトル。</param>
         /// <param name="text">ページの本文。</param>
+        /// <remarks>ページのタイムスタンプ, URIには<c>null</c>を設定。</remarks>
+        /// <exception cref="ArgumentNullException"><paramref name="website"/>または<paramref name="title"/>が<c>null</c>の場合。</exception>
+        /// <exception cref="ArgumentException"><paramref name="title"/>が空の文字列の場合。</exception>
         public MediaWikiPage(MediaWiki website, string title, string text)
             : base(website, title, text)
         {
         }
 
         /// <summary>
-        /// コンストラクタ。
-        /// ページの本文, タイムスタンプには<c>null</c>を設定。
+        /// 指定されたMediaWikiの渡されたタイトルのページを作成。
         /// </summary>
         /// <param name="website">ページが所属するウェブサイト。</param>
         /// <param name="title">ページタイトル。</param>
+        /// <remarks>ページの本文, タイムスタンプ, URIには<c>null</c>を設定。</remarks>
+        /// <exception cref="ArgumentNullException"><paramref name="website"/>または<paramref name="title"/>が<c>null</c>の場合。</exception>
+        /// <exception cref="ArgumentException"><paramref name="title"/>が空の文字列の場合。</exception>
         public MediaWikiPage(MediaWiki website, string title)
             : base(website, title)
         {
index 6a370d7..6433949 100644 (file)
@@ -3,7 +3,7 @@
 //      ページ(Wikipediaの記事など)をあらわすモデルクラスソース</summary>
 //
 // <copyright file="Page.cs" company="honeplusのメモ帳">
-//      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+//      Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
 // <author>
 //      Honeplus</author>
 // ================================================================================================
@@ -11,8 +11,6 @@
 namespace Honememo.Wptscs.Websites
 {
     using System;
-    using System.Linq;
-    using System.Text;
     using Honememo.Utilities;
 
     /// <summary>
@@ -37,41 +35,49 @@ namespace Honememo.Wptscs.Websites
         #region コンストラクタ
 
         /// <summary>
-        /// コンストラクタ
+        /// 指定されたウェブサイトの渡されたタイトル, 本文, タイムスタンプのページを作成
         /// </summary>
         /// <param name="website">ページが所属するウェブサイト。</param>
         /// <param name="title">ページタイトル。</param>
         /// <param name="text">ページの本文。</param>
         /// <param name="timestamp">ページのタイムスタンプ。</param>
-        public Page(Website website, string title, string text, DateTime? timestamp)
+        /// <param name="uri">ページのURI。</param>
+        /// <exception cref="ArgumentNullException"><paramref name="website"/>または<paramref name="title"/>が<c>null</c>の場合。</exception>
+        /// <exception cref="ArgumentException"><paramref name="title"/>が空の文字列の場合。</exception>
+        public Page(Website website, string title, string text, DateTime? timestamp, Uri uri)
         {
-            // 初期値設定、基本的に以外から変更されることを想定しない
+            // 初期値設定、基本的に以外から変更されることを想定しない
             this.Website = website;
             this.Title = title;
             this.Text = text;
             this.Timestamp = timestamp;
+            this.Uri = uri;
         }
 
         /// <summary>
-        /// コンストラクタ。
-        /// ページのタイムスタンプには<c>null</c>を設定。
+        /// 指定されたウェブサイトの渡されたタイトル, 本文のページを作成。
         /// </summary>
         /// <param name="website">ページが所属するウェブサイト。</param>
         /// <param name="title">ページタイトル。</param>
         /// <param name="text">ページの本文。</param>
+        /// <remarks>ページのタイムスタンプ, URIには<c>null</c>を設定。</remarks>
+        /// <exception cref="ArgumentNullException"><paramref name="website"/>または<paramref name="title"/>が<c>null</c>の場合。</exception>
+        /// <exception cref="ArgumentException"><paramref name="title"/>が空の文字列の場合。</exception>
         public Page(Website website, string title, string text)
-            : this(website, title, text, null)
+            : this(website, title, text, null, null)
         {
         }
 
         /// <summary>
-        /// コンストラクタ。
-        /// ページの本文, タイムスタンプには<c>null</c>を設定。
+        /// 指定されたウェブサイトの渡されたタイトルのページを作成。
         /// </summary>
         /// <param name="website">ページが所属するウェブサイト。</param>
         /// <param name="title">ページタイトル。</param>
+        /// <remarks>ページの本文, タイムスタンプ, URIには<c>null</c>を設定。</remarks>
+        /// <exception cref="ArgumentNullException"><paramref name="website"/>または<paramref name="title"/>が<c>null</c>の場合。</exception>
+        /// <exception cref="ArgumentException"><paramref name="title"/>が空の文字列の場合。</exception>
         public Page(Website website, string title)
-            : this(website, title, null, null)
+            : this(website, title, null, null, null)
         {
         }
 
@@ -82,6 +88,7 @@ namespace Honememo.Wptscs.Websites
         /// <summary>
         /// ページが所属するウェブサイト。
         /// </summary>
+        /// <exception cref="ArgumentNullException"><c>null</c>が指定された場合。</exception>
         public virtual Website Website
         {
             get
@@ -91,14 +98,15 @@ namespace Honememo.Wptscs.Websites
 
             protected set
             {
-                // ウェブサイトは必須
-                this.website = Validate.NotNull(value, "website");
+                this.website = Validate.NotNull(value);
             }
         }
 
         /// <summary>
         /// ページタイトル。
         /// </summary>
+        /// <exception cref="ArgumentNullException"><c>null</c>が指定された場合。</exception>
+        /// <exception cref="ArgumentException">空文字列が指定された場合。</exception>
         public virtual string Title
         {
             get
@@ -108,8 +116,7 @@ namespace Honememo.Wptscs.Websites
 
             protected set
             {
-                // ページタイトルは必須
-                this.title = Validate.NotBlank(value, "title");
+                this.title = Validate.NotBlank(value);
             }
         }
         
@@ -130,6 +137,15 @@ namespace Honememo.Wptscs.Websites
             get;
             protected set;
         }
+
+        /// <summary>
+        /// ページのURI。
+        /// </summary>
+        public virtual Uri Uri
+        {
+            get;
+            protected set;
+        }
         
         #endregion
     }
index 516d146..cf244cf 100644 (file)
@@ -17,6 +17,7 @@ namespace Honememo.Wptscs.Websites
     using Honememo.Utilities;
     using Honememo.Wptscs.Models;
     using Honememo.Wptscs.Properties;
+    using Honememo.Wptscs.Utilities;
 
     /// <summary>
     /// ウェブサイトをあらわすモデルクラスです。
@@ -38,17 +39,38 @@ namespace Honememo.Wptscs.Websites
         /// </summary>
         private Language language;
 
+        /// <summary>
+        /// このウェブサイトへのアクセスで使用するProxyインスタンス。
+        /// </summary>
+        private Honememo.Wptscs.Utilities.IWebProxy webProxy = new AppConfigWebProxy();
+
         #endregion
 
         #region コンストラクタ
 
         /// <summary>
-        /// コンストラクタ
+        /// 指定された言語, サーバーのウェブサイトを表すインスタンスを作成
         /// </summary>
-        /// <remarks>継承クラスでは忘れずに
-        /// <see cref="Location"/>, <see cref="Language"/>
-        /// の設定を行ってください。</remarks>
-        public Website()
+        /// <param name="language">ウェブサイトの言語。</param>
+        /// <param name="location">ウェブサイトの場所。</param>
+        /// <exception cref="ArgumentNullException"><paramref name="language"/>または<paramref name="location"/>が<c>null</c>の場合。</exception>
+        /// <exception cref="ArgumentException"><paramref name="location"/>が空の文字列の場合。</exception>
+        public Website(Language language, string location)
+        {
+            this.Language = language;
+            this.Location = location;
+        }
+
+        /// <summary>
+        /// 空のインスタンスを作成(シリアライズ or 拡張用)。
+        /// </summary>
+        /// <remarks>
+        /// <see cref="Language"/>, <see cref="Location"/>
+        /// はウェブサイトでは必須扱いのため、通常はチェックが行われる
+        /// <see cref="Website(Language, string)"/>
+        /// のコンストラクタを使用してください。
+        /// </remarks>
+        protected Website()
         {
         }
 
@@ -60,7 +82,8 @@ namespace Honememo.Wptscs.Websites
         /// ウェブサイトの場所。
         /// </summary>
         /// <example>http://en.wikipedia.org</example>
-        /// <remarks>動作確認はhttpとfileスキームのみ。</remarks>
+        /// <exception cref="ArgumentNullException"><c>null</c>が指定された場合。</exception>
+        /// <exception cref="ArgumentException">空の文字列が指定された場合。</exception>
         public string Location
         {
             get
@@ -70,14 +93,14 @@ namespace Honememo.Wptscs.Websites
 
             set
             {
-                // ※必須な情報が設定されていない場合、例外を返す
-                this.location = Validate.NotBlank(value, "location");
+                this.location = Validate.NotBlank(value);
             }
         }
 
         /// <summary>
         /// ウェブサイトの言語。
         /// </summary>
+        /// <exception cref="ArgumentNullException"><c>null</c>が指定された場合。</exception>
         public Language Language
         {
             get
@@ -87,8 +110,24 @@ namespace Honememo.Wptscs.Websites
 
             protected set
             {
-                // ※必須な情報が設定されていない場合、例外を返す
-                this.language = Validate.NotNull(value, "language");
+                this.language = Validate.NotNull(value);
+            }
+        }
+
+        /// <summary>
+        /// このウェブサイトへのアクセスで使用するProxyインスタンス。
+        /// </summary>
+        /// <exception cref="ArgumentNullException"><c>null</c>が指定された場合。</exception>
+        public Honememo.Wptscs.Utilities.IWebProxy WebProxy
+        {
+            get
+            {
+                return this.webProxy;
+            }
+
+            set
+            {
+                this.webProxy = Validate.NotNull(value);
             }
         }
 
index d587a3d..d54b0ee 100644 (file)
@@ -29,6 +29,7 @@
       </DocumentationTemplates>
       <LinkInterwikiFormat>{{وإو|عر=$1|لغ=$2|تر=$3|نص=$4}}</LinkInterwikiFormat>
       <LangFormat>{{رمزلغة|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://bn.wikipedia.org</Location>
@@ -52,6 +53,7 @@
       <MagicWords />
       <InterwikiPrefixs />
       <DocumentationTemplates />
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://de.wikipedia.org</Location>
@@ -87,6 +89,7 @@
         <DocumentationTemplate DefaultPage="/Doku">Vorlage:Dokumentation</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://en.wikipedia.org</Location>
       </DocumentationTemplates>
       <LinkInterwikiFormat>{{link-interwiki|en=$1|en_text=$4|lang=$2|lang_title=$3}}</LinkInterwikiFormat>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://es.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/doc">Plantilla:Documentación</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://fr.wikipedia.org</Location>
       </DocumentationTemplates>
       <LinkInterwikiFormat>{{Lien|fr=$1|lang=$2|trad=$3|texte=$4}}</LinkInterwikiFormat>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://hi.wikipedia.org</Location>
       <InterwikiPrefixs />
       <DocumentationTemplates />
       <LangFormat>{{भाषा|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://it.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/man">Template:Man</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://ja.wikipedia.org</Location>
       </DocumentationTemplates>
       <LinkInterwikiFormat>{{仮リンク|$1|$2|$3|label=$4}}</LinkInterwikiFormat>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://ko.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/설명문서">틀:틀 설명문서</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://nl.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/doc">Sjabloon:Sjabdoc</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://pl.wikipedia.org</Location>
       <DocumentationTemplates>
         <DocumentationTemplate DefaultPage="/opis">Szablon:Dokumentacja</DocumentationTemplate>
       </DocumentationTemplates>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://pt.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/doc">Predefinição:Documentação</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://ru.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/doc">Шаблон:Doc</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://si.wikipedia.org</Location>
       <MagicWords />
       <InterwikiPrefixs />
       <DocumentationTemplates />
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://ta.wikipedia.org</Location>
       <MagicWords />
       <InterwikiPrefixs />
       <DocumentationTemplates />
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://zh.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/doc">Template:Template doc</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
   </Websites>
   <ItemTables>
index 44e9a80..03dec91 100644 (file)
@@ -5,7 +5,24 @@
     <MediaWiki>
       <Location>http://wikitravel.org</Location>
       <Language Code="de">
-        <Names />
+        <Names>
+          <LanguageName Code="de">
+            <Name>Deutsch</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>German</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>ドイツ語</Name>
+            <ShortName>独</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>德语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
       </Language>
       <MetaApi>/wiki/de/api.php?format=xml&amp;action=query&amp;meta=siteinfo&amp;siprop=namespaces|interwikimap</MetaApi>
       <ExportPath>/de/Spezial:Exportieren/$1</ExportPath>
     <MediaWiki>
       <Location>http://wikitravel.org</Location>
       <Language Code="en">
-        <Names />
+        <Names>
+          <LanguageName Code="de">
+            <Name>Englisch</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>English</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>英語</Name>
+            <ShortName>英</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>英語</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="fr">
+            <Name>Anglais</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="ru">
+            <Name>Английский язык</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
       </Language>
       <MetaApi>/wiki/en/api.php?format=xml&amp;action=query&amp;meta=siteinfo&amp;siprop=namespaces|interwikimap</MetaApi>
       <ExportPath>/en/Special:Export/$1</ExportPath>
     <MediaWiki>
       <Location>http://wikitravel.org</Location>
       <Language Code="fr">
-        <Names />
+        <Names>
+          <LanguageName Code="de">
+            <Name>Französisch</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>French</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="fr">
+            <Name>Français</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>フランス語</Name>
+            <ShortName>仏</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>法语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
       </Language>
       <MetaApi>/wiki/fr/api.php?format=xml&amp;action=query&amp;meta=siteinfo&amp;siprop=namespaces|interwikimap</MetaApi>
       <ExportPath>/fr/Special:Export/$1</ExportPath>
     <MediaWiki>
       <Location>http://wikitravel.org</Location>
       <Language Code="ja">
-        <Names />
+        <Names>
+          <LanguageName Code="de">
+            <Name>Japanisch</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>Japanese</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>日本語</Name>
+            <ShortName>日</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>日語</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
         <Bracket>($1)</Bracket>
       </Language>
       <MetaApi>/wiki/ja/api.php?format=xml&amp;action=query&amp;meta=siteinfo&amp;siprop=namespaces|interwikimap</MetaApi>
     <MediaWiki>
       <Location>http://wikitravel.org</Location>
       <Language Code="ru">
-        <Names />
+        <Names>
+          <LanguageName Code="en">
+            <Name>Russian</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>ロシア語</Name>
+            <ShortName>露</ShortName>
+          </LanguageName>
+          <LanguageName Code="ru">
+            <Name>русский язык</Name>
+            <ShortName>русский</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>俄语</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
       </Language>
       <MetaApi>/wiki/ru/api.php?format=xml&amp;action=query&amp;meta=siteinfo&amp;siprop=namespaces|interwikimap</MetaApi>
       <ExportPath>/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Export/$1</ExportPath>
     <MediaWiki>
       <Location>http://wikitravel.org</Location>
       <Language Code="zh">
-        <Names />
+        <Names>
+          <LanguageName Code="de">
+            <Name>Chinesisch</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="en">
+            <Name>Chinese</Name>
+            <ShortName />
+          </LanguageName>
+          <LanguageName Code="ja">
+            <Name>中国語</Name>
+            <ShortName>中</ShortName>
+          </LanguageName>
+          <LanguageName Code="zh">
+            <Name>中文</Name>
+            <ShortName />
+          </LanguageName>
+        </Names>
       </Language>
       <MetaApi>/wiki/zh/api.php?format=xml&amp;action=query&amp;meta=siteinfo&amp;siprop=namespaces|interwikimap</MetaApi>
       <ExportPath>/zh/Special:Export/$1</ExportPath>
index fdf5d79..00e829f 100644 (file)
     <Compile Include="Websites\Website.cs" />
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Utilities\AppDefaultWebProxy.cs" />
+    <Compile Include="Utilities\AppConfigWebProxy.cs" />
     <Compile Include="Utilities\IWebProxy.cs" />
     <Compile Include="Parsers\MediaWikiParser.cs" />
     <EmbeddedResource Include="ConfigForm.ja.resx">
index 48ff581..dad2ddf 100644 (file)
@@ -11,7 +11,7 @@
   <applicationSettings>
     <Honememo.Wptscs.Properties.Settings>
       <setting name="DefaultUserAgent" serializeAs="String">
-        <value>WikipediaTranslationSupportTool/{0}.{1:D2}</value>
+        <value>Translation Support for Wikipedia/{0}.{1:D2}</value>
       </setting>
       <setting name="WikipediaLocation" serializeAs="String">
         <value>http://{0}.wikipedia.org</value>
index 06691aa..3e58529 100644 (file)
Binary files a/WptscsTest/Data/MediaWiki/result/config.xml and b/WptscsTest/Data/MediaWiki/result/config.xml differ
index 3fcdd84..895ef48 100644 (file)
@@ -29,6 +29,7 @@
       </DocumentationTemplates>
       <LinkInterwikiFormat>{{وإو|عر=$1|لغ=$2|تر=$3|نص=$4}}</LinkInterwikiFormat>
       <LangFormat>{{رمزلغة|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://bn.wikipedia.org</Location>
@@ -52,6 +53,7 @@
       <MagicWords />
       <InterwikiPrefixs />
       <DocumentationTemplates />
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://de.wikipedia.org</Location>
@@ -87,6 +89,7 @@
         <DocumentationTemplate DefaultPage="/Doku">Vorlage:Dokumentation</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://en.wikipedia.org</Location>
       </DocumentationTemplates>
       <LinkInterwikiFormat>{{link-interwiki|en=$1|en_text=$4|lang=$2|lang_title=$3}}</LinkInterwikiFormat>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://es.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/doc">Plantilla:Documentación</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://fr.wikipedia.org</Location>
       </DocumentationTemplates>
       <LinkInterwikiFormat>{{Lien|fr=$1|lang=$2|trad=$3|texte=$4}}</LinkInterwikiFormat>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://hi.wikipedia.org</Location>
       <InterwikiPrefixs />
       <DocumentationTemplates />
       <LangFormat>{{भाषा|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://it.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/man">Template:Man</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://ja.wikipedia.org</Location>
       </DocumentationTemplates>
       <LinkInterwikiFormat>{{仮リンク|$1|$2|$3|label=$4}}</LinkInterwikiFormat>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://ko.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/설명문서">틀:틀 설명문서</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://nl.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/doc">Sjabloon:Sjabdoc</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://pl.wikipedia.org</Location>
       <DocumentationTemplates>
         <DocumentationTemplate DefaultPage="/opis">Szablon:Dokumentacja</DocumentationTemplate>
       </DocumentationTemplates>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://pt.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/doc">Predefinição:Documentação</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://ru.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/doc">Шаблон:Doc</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://si.wikipedia.org</Location>
       <MagicWords />
       <InterwikiPrefixs />
       <DocumentationTemplates />
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://ta.wikipedia.org</Location>
       <MagicWords />
       <InterwikiPrefixs />
       <DocumentationTemplates />
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
     <MediaWiki>
       <Location>http://zh.wikipedia.org</Location>
         <DocumentationTemplate DefaultPage="/doc">模板:Documentation</DocumentationTemplate>
       </DocumentationTemplates>
       <LangFormat>{{Lang|$1|$2}}</LangFormat>
+      <HasLanguagePage>True</HasLanguagePage>
     </MediaWiki>
   </Websites>
   <ItemTables>
index 4bb5add..32445af 100644 (file)
@@ -543,6 +543,75 @@ namespace Honememo.Wptscs.Logics
             Assert.AreEqual("===[[弾道飛行]]{{ref-en}}===", translator.ReplaceHeading(heading, parent).ToString());
         }
 
+        /// <summary>
+        /// <see cref="MediaWikiTranslator.CreateOpening"/>メソッドテストケース。
+        /// </summary>
+        [Test]
+        public void TestCreateOpening()
+        {
+            // From, Toの設定に応じて変換後記事の冒頭部を作り出す
+            TestMediaWikiTranslator translator = new TestMediaWikiTranslator();
+            MockFactory mock = new MockFactory();
+            translator.From = mock.GetMediaWiki("en");
+            translator.To = mock.GetMediaWiki("ja");
+
+            // 完全な形
+            Assert.AreEqual(
+                "'''xxx'''([[英語|英]]: '''{{Lang|en|English's title}}''')\n\n",
+                translator.CreateOpening("English's title"));
+
+            // リンクなし・略称あり
+            translator.To.HasLanguagePage = false;
+            Assert.AreEqual(
+                "'''xxx'''(英: '''{{Lang|en|English's title}}''')\n\n",
+                translator.CreateOpening("English's title"));
+
+            // リンクなし・略称なし
+            Language.LanguageName name = translator.From.Language.Names["ja"];
+            name.ShortName = null;
+            translator.From.Language.Names["ja"] = name;
+            Assert.AreEqual(
+                "'''xxx'''(英語: '''{{Lang|en|English's title}}''')\n\n",
+                translator.CreateOpening("English's title"));
+
+            // リンクあり・略称なし
+            translator.To.HasLanguagePage = true;
+            Assert.AreEqual(
+                "'''xxx'''([[英語]]: '''{{Lang|en|English's title}}''')\n\n",
+                translator.CreateOpening("English's title"));
+
+            // 言語名なし・リンク有り
+            translator.From.Language.Names.Remove("ja");
+            Assert.AreEqual(
+                "'''xxx'''('''{{Lang|en|English's title}}''')\n\n",
+                translator.CreateOpening("English's title"));
+
+            // 言語名なし・リンクなし
+            translator.To.HasLanguagePage = false;
+            Assert.AreEqual(
+                "'''xxx'''('''{{Lang|en|English's title}}''')\n\n",
+                translator.CreateOpening("English's title"));
+
+            // 仮リンクフォーマットなし
+            translator.To.LangFormat = null;
+            Assert.AreEqual(
+                "'''xxx'''('''English's title''')\n\n",
+                translator.CreateOpening("English's title"));
+
+            // 括弧のフォーマット変更
+            // ※ パラメータ上なしには出来ない
+            translator.To.Language.Bracket = "「$1」";
+            Assert.AreEqual(
+                "'''xxx'''「'''English's title'''」\n\n",
+                translator.CreateOpening("English's title"));
+
+            // 括弧のフォーマットの$1なし
+            translator.To.Language.Bracket = "後で消す";
+            Assert.AreEqual(
+                "'''xxx'''後で消す\n\n",
+                translator.CreateOpening("English's title"));
+        }
+
         #endregion
 
         #region 全体テストケース
@@ -855,6 +924,16 @@ namespace Honememo.Wptscs.Logics
                 return base.ReplaceHeading(heading, parent);
             }
 
+            /// <summary>
+            /// 変換後記事冒頭用の「'''日本語記事名'''([[英語|英]]: '''{{Lang|en|英語記事名}}''')」みたいなのを作成する。
+            /// </summary>
+            /// <param name="title">翻訳支援対象の記事名。</param>
+            /// <returns>冒頭部のテキスト。</returns>
+            public new string CreateOpening(string title)
+            {
+                return base.CreateOpening(title);
+            }
+
             #endregion
         }
 
@@ -1,8 +1,8 @@
 // ================================================================================================
 // <summary>
-//      AppDefaultWebProxyのテストクラスソース。</summary>
+//      AppConfigWebProxyのテストクラスソース。</summary>
 //
-// <copyright file="AppDefaultWebProxyTest.cs" company="honeplusのメモ帳">
+// <copyright file="AppConfigWebProxyTest.cs" company="honeplusのメモ帳">
 //      Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
 // <author>
 //      Honeplus</author>
@@ -17,10 +17,10 @@ namespace Honememo.Wptscs.Utilities
     using NUnit.Framework;
 
     /// <summary>
-    /// AppDefaultWebProxyのテストクラスです。
+    /// <see cref="AppConfigWebProxy"/>のテストクラスです。
     /// </summary>
     [TestFixture]
-    public class AppDefaultWebProxyTest
+    class AppConfigWebProxyTest
     {
         #region 定数
 
@@ -34,13 +34,13 @@ namespace Honememo.Wptscs.Utilities
         #region インタフェース実装プロパティテストケース
 
         /// <summary>
-        /// UserAgentプロパティテストケース。
+        /// <see cref="AppConfigWebProxy.UserAgent"/>プロパティテストケース。
         /// </summary>
         /// <remarks>アプリ設定部分はアクセス権の関係上試験できず。</remarks>
         [Test]
         public void TestUserAgent()
         {
-            IWebProxy proxy = new AppDefaultWebProxy();
+            IWebProxy proxy = new AppConfigWebProxy();
             ////Settings.Default.UserAgent = String.Empty;
 
             // 初期状態ではアプリ名を元に生成した値
@@ -49,14 +49,10 @@ namespace Honememo.Wptscs.Utilities
             ////    String.Format(Settings.Default.DefaultUserAgent, ver.Major, ver.Minor),
             ////    proxy.UserAgent);
             Assert.AreEqual(
-                String.Format("WikipediaTranslationSupportTool/{0}.{1:D2}", ver.Major, ver.Minor),
+                String.Format("Translation Support for Wikipedia/{0}.{1:D2}", ver.Major, ver.Minor),
                 proxy.UserAgent);
 
-            // アプリ設定時はアプリに格納された設定値
-            ////Settings.Default.UserAgent = "test setting useragent";
-            ////Assert.AreEqual("test setting useragent", proxy.UserAgent);
-
-            // プロパティ設定時はそれが最優先
+            // プロパティ設定時はその値が返る
             proxy.UserAgent = "test property useragent";
             Assert.AreEqual("test property useragent", proxy.UserAgent);
 
@@ -66,37 +62,32 @@ namespace Honememo.Wptscs.Utilities
 
             // nullなら無効
             proxy.UserAgent = null;
-            ////Assert.AreEqual("test setting useragent", proxy.UserAgent);
             Assert.IsNotEmpty(proxy.UserAgent);
+
+            // アプリ設定時はアプリに格納された設定値が最優先
+            ////Settings.Default.UserAgent = "test setting useragent";
+            ////Assert.AreEqual("test setting useragent", proxy.UserAgent);
         }
 
         /// <summary>
-        /// Refererプロパティテストケース。
+        /// <see cref="AppConfigWebProxy.Referer"/>プロパティテストケース。
         /// </summary>
         /// <remarks>アプリ設定部分はアクセス権の関係上試験できず。</remarks>
         [Test]
         public void TestReferer()
         {
-            IWebProxy proxy = new AppDefaultWebProxy();
+            IWebProxy proxy = new AppConfigWebProxy();
             ////Settings.Default.Referer = String.Empty;
 
             // 初期状態では空
             Assert.IsEmpty(proxy.Referer);
 
-            // アプリ設定時はアプリに格納された設定値
-            ////Settings.Default.Referer = "test setting referer";
-            ////Assert.AreEqual("test setting referer", proxy.Referer);
-
-            // プロパティ設定時はそちらが優先
+            // プロパティ設定時はその値が返る
             proxy.Referer = "test property referer";
             Assert.AreEqual("test property referer", proxy.Referer);
 
-            // 空でも有効
-            proxy.Referer = String.Empty;
-            Assert.IsEmpty(proxy.Referer);
-
-            // nullなら無効
-            ////proxy.Referer = null;
+            // アプリ設定時はアプリに格納された設定値
+            ////Settings.Default.Referer = "test setting referer";
             ////Assert.AreEqual("test setting referer", proxy.Referer);
         }
 
@@ -105,13 +96,13 @@ namespace Honememo.Wptscs.Utilities
         #region インタフェース実装メソッドテストケース
         
         /// <summary>
-        /// GetStreamメソッドテストケース。
+        /// <see cref="AppConfigWebProxy.GetStream"/>メソッドテストケース。
         /// </summary>
         /// <remarks>内容的に難しいため、fileプロトコルのみ確認。</remarks>
         [Test]
         public void TestGetStream()
         {
-            IWebProxy proxy = new AppDefaultWebProxy();
+            IWebProxy proxy = new AppConfigWebProxy();
 
             // テストファイルを読んで例外が発生しなければOKとする
             UriBuilder b = new UriBuilder("file", String.Empty);
index 6535861..493e340 100644 (file)
@@ -33,12 +33,14 @@ namespace Honememo.Wptscs.Websites
         public void TestConstructorWebsiteTitleTextTimestamp()
         {
             DateTime t = DateTime.Now;
+            Uri uri = new Uri("http://wikipedia.example");
             MediaWiki s = new MediaWiki(new Language("en"));
-            MediaWikiPage page = new MediaWikiPage(s, "TestTitle", "TestText", t);
+            MediaWikiPage page = new MediaWikiPage(s, "TestTitle", "TestText", t, uri);
             Assert.AreSame(s, page.Website);
             Assert.AreEqual("TestTitle", page.Title);
             Assert.AreEqual("TestText", page.Text);
             Assert.AreEqual(t, page.Timestamp);
+            Assert.AreSame(uri, page.Uri);
         }
 
         /// <summary>
@@ -53,6 +55,7 @@ namespace Honememo.Wptscs.Websites
             Assert.AreEqual("TestTitle", page.Title);
             Assert.AreEqual("TestText", page.Text);
             Assert.IsNull(page.Timestamp);
+            Assert.IsNull(page.Uri);
         }
 
         /// <summary>
@@ -67,6 +70,7 @@ namespace Honememo.Wptscs.Websites
             Assert.AreEqual("TestTitle", page.Title);
             Assert.IsNull(page.Text);
             Assert.IsNull(page.Timestamp);
+            Assert.IsNull(page.Uri);
         }
 
         /// <summary>
index 7d514df..7e6746d 100644 (file)
@@ -23,10 +23,10 @@ namespace Honememo.Wptscs.Websites
     using NUnit.Framework;
 
     /// <summary>
-    /// MediaWikiのテストクラスです。
+    /// <see cref="MediaWiki"/>のテストクラスです。
     /// </summary>
     [TestFixture]
-    public class MediaWikiTest
+    class MediaWikiTest
     {
         #region 定数
 
@@ -35,12 +35,27 @@ namespace Honememo.Wptscs.Websites
         /// </summary>
         private static readonly string testDir = "Data\\MediaWiki";
 
+        /// <summary>
+        /// XMLインポート/エクスポートで用いるテストデータ。
+        /// </summary>
+        private static readonly string testXml = "<MediaWiki><Location>http://ja.wikipedia.org</Location>"
+            + "<Language Code=\"ja\"><Names /><Bracket /></Language>"
+            + "<MetaApi>_api.xml</MetaApi><ExportPath>/export/$1</ExportPath><Redirect>#飛ばす</Redirect>"
+            + "<TemplateNamespace>100</TemplateNamespace><CategoryNamespace>101</CategoryNamespace><FileNamespace>200</FileNamespace>"
+            + "<MagicWords><Variable>特別</Variable><Variable>マジックワード</Variable></MagicWords>"
+            + "<InterwikiPrefixs><Prefix>外部ウィキ</Prefix><Prefix>ニュース</Prefix></InterwikiPrefixs>"
+            + "<DocumentationTemplates><DocumentationTemplate DefaultPage=\"/サブページ\">Template:ドキュメント</DocumentationTemplate>"
+            + "<DocumentationTemplate DefaultPage=\"/サブページ\">テンプレート:Doc</DocumentationTemplate></DocumentationTemplates>"
+            + "<LinkInterwikiFormat>{{仮リンク|$1|$2|$3|label=$4}}</LinkInterwikiFormat>"
+            + "<LangFormat>{{Lang|$1|$2}}</LangFormat>"
+            + "<HasLanguagePage>True</HasLanguagePage></MediaWiki>";
+
         #endregion
 
         #region テスト支援メソッド
 
         /// <summary>
-        /// テスト用の値を設定したMediaWikiオブジェクトを返す。
+        /// テスト用の値を設定した<see cref="MediaWiki"/>オブジェクトを返す。
         /// </summary>
         /// <param name="language">言語コード。</param>
         /// <returns>テスト用の値を設定したオブジェクト。</returns>
@@ -118,7 +133,7 @@ namespace Honememo.Wptscs.Websites
         #region 設定ファイルに初期値を持つプロパティテストケース
 
         /// <summary>
-        /// MetaApiプロパティテストケース。
+        /// <see cref="MediaWiki.MetaApi"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestMetaApi()
@@ -140,7 +155,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// ExportPathプロパティテストケース。
+        /// <see cref="MediaWiki.ExportPath"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestExportPath()
@@ -162,7 +177,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// Redirectプロパティテストケース。
+        /// <see cref="MediaWiki.Redirect"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestRedirect()
@@ -184,7 +199,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// TemplateNamespaceプロパティテストケース。
+        /// <see cref="MediaWiki.TemplateNamespace"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestTemplateNamespace()
@@ -200,7 +215,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// CategoryNamespaceプロパティテストケース。
+        /// <see cref="MediaWiki.CategoryNamespace"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestCategoryNamespace()
@@ -216,7 +231,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// FileNamespaceプロパティテストケース。
+        /// <see cref="MediaWiki.FileNamespace"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestFileNamespace()
@@ -232,7 +247,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// MagicWordsプロパティテストケース。
+        /// <see cref="MediaWiki.MagicWords"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestMagicWords()
@@ -256,7 +271,7 @@ namespace Honememo.Wptscs.Websites
         #region サーバーから値を取得するプロパティテストケース
 
         /// <summary>
-        /// Namespacesプロパティテストケース。
+        /// <see cref="MediaWiki.Namespaces"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestNamespaces()
@@ -272,7 +287,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// InterwikiPrefixsプロパティテストケース。
+        /// <see cref="MediaWiki.InterwikiPrefixs"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestInterwikiPrefixs()
@@ -306,7 +321,7 @@ namespace Honememo.Wptscs.Websites
         #region それ以外のプロパティテストケース
 
         /// <summary>
-        /// DocumentationTemplatesプロパティテストケース。
+        /// <see cref="MediaWiki.DocumentationTemplates"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestDocumentationTemplates()
@@ -317,14 +332,21 @@ namespace Honememo.Wptscs.Websites
             Assert.IsNotNull(site.DocumentationTemplates);
             Assert.AreEqual(0, site.DocumentationTemplates.Count);
 
-            // 値を追加
-            site.DocumentationTemplates.Add("Template:Documentation");
+            // 値を設定するとそのオブジェクトが返る
+            string[] templates = new string[] { "Template:Documentation" };
+            site.DocumentationTemplates = templates;
             Assert.AreEqual(1, site.DocumentationTemplates.Count);
             Assert.AreEqual("Template:Documentation", site.DocumentationTemplates[0]);
+            Assert.AreSame(templates, site.DocumentationTemplates);
+
+            // nullを設定すると初期化
+            site.DocumentationTemplates = null;
+            Assert.IsNotNull(site.DocumentationTemplates);
+            Assert.AreEqual(0, site.DocumentationTemplates.Count);
         }
 
         /// <summary>
-        /// DocumentationTemplateDefaultPageプロパティテストケース。
+        /// <see cref="MediaWiki.DocumentationTemplateDefaultPage"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestDocumentationTemplateDefaultPage()
@@ -342,7 +364,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// LinkInterwikiFormatプロパティテストケース。
+        /// <see cref="MediaWiki.LinkInterwikiFormat"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestLinkInterwikiFormat()
@@ -360,7 +382,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// LangFormatプロパティテストケース。
+        /// <see cref="MediaWiki.LangFormat"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestLangFormat()
@@ -377,12 +399,30 @@ namespace Honememo.Wptscs.Websites
             Assert.IsNullOrEmpty(site.LangFormat);
         }
 
+        /// <summary>
+        /// <see cref="MediaWiki.HasLanguagePage"/>プロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestHasLanguagePage()
+        {
+            MediaWiki site = new MediaWiki(new Language("ja"));
+
+            // デフォルトではfalse
+            Assert.IsFalse(site.HasLanguagePage);
+
+            // 値を設定するとその値が返る
+            site.HasLanguagePage = true;
+            Assert.IsTrue(site.HasLanguagePage);
+            site.HasLanguagePage = false;
+            Assert.IsFalse(site.HasLanguagePage);
+        }
+
         #endregion
 
         #region 公開メソッドテストケース
 
         /// <summary>
-        /// GetPageメソッドテストケース。
+        /// <see cref="MediaWiki.GetPage"/>メソッドテストケース。
         /// </summary>
         [Test]
         public void TestGetPage()
@@ -397,7 +437,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// IsMagicWordメソッドテストケース。
+        /// <see cref="MediaWiki.IsMagicWord"/>メソッドテストケース。
         /// </summary>
         [Test]
         public void TestIsMagicWord()
@@ -422,7 +462,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// IsInterwikiメソッドテストケース。
+        /// <see cref="MediaWiki.IsInterwiki"/>メソッドテストケース。
         /// </summary>
         [Test]
         public void TestIsInterwiki()
@@ -452,7 +492,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// IsNamespaceメソッドテストケース。
+        /// <see cref="MediaWiki.IsNamespace"/>メソッドテストケース。
         /// </summary>
         [Test]
         public void TestIsNamespace()
@@ -467,7 +507,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// FormatLinkInterwikiメソッドテストケース。
+        /// <see cref="MediaWiki.FormatLinkInterwiki"/>メソッドテストケース。
         /// </summary>
         [Test]
         public void TestFormatLinkInterwiki()
@@ -496,7 +536,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// FormatLangメソッドテストケース。
+        /// <see cref="MediaWiki.FormatLang"/>メソッドテストケース。
         /// </summary>
         [Test]
         public void TestFormatLang()
@@ -530,6 +570,7 @@ namespace Honememo.Wptscs.Websites
         [Test]
         public void TestReadXml()
         {
+            // ほぼ空の状態での読み込み
             MediaWiki site;
             using (XmlReader r = XmlReader.Create(
                 new StringReader("<MediaWiki><Location>http://ja.wikipedia.org</Location>"
@@ -541,9 +582,49 @@ namespace Honememo.Wptscs.Websites
             Assert.IsNotNull(site);
             Assert.AreEqual("http://ja.wikipedia.org", site.Location);
             Assert.AreEqual("ja", site.Language.Code);
+            Assert.AreEqual(0, site.DocumentationTemplates.Count);
+            Assert.IsNullOrEmpty(site.DocumentationTemplateDefaultPage);
+            Assert.IsNullOrEmpty(site.LinkInterwikiFormat);
+            Assert.IsNullOrEmpty(site.LangFormat);
+            Assert.IsFalse(site.HasLanguagePage);
+
+            // 下記プロパティは、空の場合デフォルト値が返る
+            // ※ Namespacesは空の場合サーバーからデフォルト値を取得するため、ここではテストしない
+            // ※ InterwikiPrefixsのgetは常にサーバーからも値を取得するため、ここではテストしない
+            Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases|interwikimap", site.MetaApi);
+            Assert.AreEqual("/wiki/Special:Export/$1", site.ExportPath);
+            Assert.AreEqual("#REDIRECT", site.Redirect);
+            Assert.AreEqual(10, site.TemplateNamespace);
+            Assert.AreEqual(14, site.CategoryNamespace);
+            Assert.AreEqual(6, site.FileNamespace);
+            Assert.IsTrue(site.MagicWords.Count > 10);
 
-            //// TODO: プロパティに値が設定されたパターンを追加すべき
-            //// TODO: プロパティが空の場合、きちんとデフォルト値が参照されることも確認すべき
+            // プロパティに値が設定された状態での読み込み
+            using (XmlReader r = XmlReader.Create(new StringReader(testXml)))
+            {
+                site = new XmlSerializer(typeof(MediaWiki)).Deserialize(r) as MediaWiki;
+            }
+
+            // ※ InterwikiPrefixsのgetは常にサーバーからも値を取得するため、ここではテストしない
+            Assert.IsNotNull(site);
+            Assert.AreEqual("http://ja.wikipedia.org", site.Location);
+            Assert.AreEqual("ja", site.Language.Code);
+            Assert.AreEqual("_api.xml", site.MetaApi);
+            Assert.AreEqual("/export/$1", site.ExportPath);
+            Assert.AreEqual("#飛ばす", site.Redirect);
+            Assert.AreEqual(100, site.TemplateNamespace);
+            Assert.AreEqual(101, site.CategoryNamespace);
+            Assert.AreEqual(200, site.FileNamespace);
+            Assert.AreEqual(2, site.MagicWords.Count);
+            Assert.IsTrue(site.MagicWords.Contains("特別"));
+            Assert.IsTrue(site.MagicWords.Contains("マジックワード"));
+            Assert.AreEqual(2, site.DocumentationTemplates.Count);
+            Assert.IsTrue(site.DocumentationTemplates.Contains("Template:ドキュメント"));
+            Assert.IsTrue(site.DocumentationTemplates.Contains("テンプレート:Doc"));
+            Assert.AreEqual("/サブページ", site.DocumentationTemplateDefaultPage);
+            Assert.AreEqual("{{仮リンク|$1|$2|$3|label=$4}}", site.LinkInterwikiFormat);
+            Assert.AreEqual("{{Lang|$1|$2}}", site.LangFormat);
+            Assert.IsTrue(site.HasLanguagePage);
         }
 
         /// <summary>
@@ -552,21 +633,48 @@ namespace Honememo.Wptscs.Websites
         [Test]
         public void TestWriteXml()
         {
-            Language lang = new Language("ja");
-            MediaWiki site = new MediaWiki(lang);
+            MediaWiki site = new MediaWiki(new Language("ja"));
+            StringBuilder b;
             XmlWriterSettings settings = new XmlWriterSettings();
             settings.OmitXmlDeclaration = true;
 
-            StringBuilder b = new StringBuilder();
+            // ほぼ空の状態での出力
+            // 設定ファイルに初期値を持つプロパティはデフォルト値の場合出力しないという動作あり
+            b = new StringBuilder();
             using (XmlWriter w = XmlWriter.Create(b, settings))
             {
                 new XmlSerializer(typeof(MediaWiki)).Serialize(w, site);
             }
 
-            // プロパティはデフォルト値の場合出力しないという動作あり
-            Assert.AreEqual("<MediaWiki><Location>http://ja.wikipedia.org</Location><Language Code=\"ja\"><Names /><Bracket /></Language><MetaApi /><ExportPath /><Redirect /><TemplateNamespace /><CategoryNamespace /><FileNamespace /><MagicWords /><InterwikiPrefixs /><DocumentationTemplates /><LinkInterwikiFormat /><LangFormat /></MediaWiki>", b.ToString());
+            Assert.AreEqual(
+                "<MediaWiki><Location>http://ja.wikipedia.org</Location><Language Code=\"ja\"><Names /><Bracket /></Language>"
+                + "<MetaApi /><ExportPath /><Redirect /><TemplateNamespace /><CategoryNamespace /><FileNamespace />"
+                + "<MagicWords /><InterwikiPrefixs /><DocumentationTemplates /><LinkInterwikiFormat /><LangFormat />"
+                + "<HasLanguagePage>False</HasLanguagePage></MediaWiki>",
+                b.ToString());
+
+            // プロパティに値が設定された場合の出力
+            site.MetaApi = "_api.xml";
+            site.ExportPath = "/export/$1";
+            site.Redirect = "#飛ばす";
+            site.TemplateNamespace = 100;
+            site.CategoryNamespace = 101;
+            site.FileNamespace = 200;
+            site.MagicWords = new HashSet<string>(new string[] { "特別", "マジックワード" });
+            site.InterwikiPrefixs = new IgnoreCaseSet(new string[] { "外部ウィキ", "ニュース" });
+            site.DocumentationTemplates = new string[] { "Template:ドキュメント", "テンプレート:Doc" };
+            site.DocumentationTemplateDefaultPage = "/サブページ";
+            site.LinkInterwikiFormat = "{{仮リンク|$1|$2|$3|label=$4}}";
+            site.LangFormat = "{{Lang|$1|$2}}";
+            site.HasLanguagePage = true;
+
+            b = new StringBuilder();
+            using (XmlWriter w = XmlWriter.Create(b, settings))
+            {
+                new XmlSerializer(typeof(MediaWiki)).Serialize(w, site);
+            }
 
-            //// TODO: プロパティに値が設定されたパターンを追加すべき
+            Assert.AreEqual(testXml, b.ToString());
         }
 
         #endregion
index 5df5333..36872ca 100644 (file)
@@ -17,10 +17,10 @@ namespace Honememo.Wptscs.Websites
     using NUnit.Framework;
 
     /// <summary>
-    /// Pageのテストクラスです。
+    /// <see cref="Page"/>のテストクラスです。
     /// </summary>
     [TestFixture]
-    public class PageTest
+    class PageTest
     {
         #region コンストラクタテストケース
 
@@ -32,11 +32,13 @@ namespace Honememo.Wptscs.Websites
         {
             DateTime t = DateTime.Now;
             Website s = new DummySite();
-            Page page = new Page(s, "TestTitle", "TestText", t);
+            Uri uri = new Uri("http://example.com/TestTitle");
+            Page page = new Page(s, "TestTitle", "TestText", t, uri);
             Assert.AreEqual(s, page.Website);
             Assert.AreEqual("TestTitle", page.Title);
             Assert.AreEqual("TestText", page.Text);
             Assert.AreEqual(t, page.Timestamp);
+            Assert.AreSame(uri, page.Uri);
         }
 
         /// <summary>
@@ -51,6 +53,7 @@ namespace Honememo.Wptscs.Websites
             Assert.AreEqual("TestTitle", page.Title);
             Assert.AreEqual("TestText", page.Text);
             Assert.IsNull(page.Timestamp);
+            Assert.IsNull(page.Uri);
         }
 
         /// <summary>
@@ -65,6 +68,7 @@ namespace Honememo.Wptscs.Websites
             Assert.AreEqual("TestTitle", page.Title);
             Assert.IsNull(page.Text);
             Assert.IsNull(page.Timestamp);
+            Assert.IsNull(page.Uri);
         }
 
         /// <summary>
@@ -92,7 +96,7 @@ namespace Honememo.Wptscs.Websites
         #region プロパティ
 
         /// <summary>
-        /// Websiteプロパティテストケース(正常系)。
+        /// <see cref="Page.Website"/>プロパティテストケース(正常系)。
         /// </summary>
         [Test]
         public void TestWebsite()
@@ -105,7 +109,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// Websiteプロパティテストケース(null値)。
+        /// <see cref="Page.Website"/>プロパティテストケース(null値)。
         /// </summary>
         [Test]
         [ExpectedException(typeof(ArgumentNullException))]
@@ -116,7 +120,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// Titleプロパティテストケース(正常系)。
+        /// <see cref="Page.Title"/>プロパティテストケース(正常系)。
         /// </summary>
         [Test]
         public void TestTitle()
@@ -128,7 +132,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// Titleプロパティテストケース(null値)。
+        /// <see cref="Page.Title"/>プロパティテストケース(null値)。
         /// </summary>
         [Test]
         [ExpectedException(typeof(ArgumentNullException))]
@@ -139,7 +143,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// Titleプロパティテストケース(空)。
+        /// <see cref="Page.Title"/>プロパティテストケース(空)。
         /// </summary>
         [Test]
         [ExpectedException(typeof(ArgumentException))]
@@ -150,7 +154,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// Textプロパティテストケース。
+        /// <see cref="Page.Text"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestText()
@@ -162,7 +166,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// Timestampプロパティテストケース。
+        /// <see cref="Page.Timestamp"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestTimestamp()
@@ -174,23 +178,35 @@ namespace Honememo.Wptscs.Websites
             Assert.AreEqual(t, page.Timestamp);
         }
 
+        /// <summary>
+        /// <see cref="Page.Uri"/>プロパティテストケース。
+        /// </summary>
+        [Test]
+        public void TestUri()
+        {
+            Page page = new Page(new DummySite(), "TestTitle");
+            PrivateAccessor<Page> acc = new PrivateAccessor<Page>(page);
+            Uri uri = new Uri("http://example.com/TestTitle");
+            acc.SetProperty("Uri", uri);
+            Assert.AreEqual(uri, page.Uri);
+        }
+
         #endregion
 
         #region モッククラス
 
         /// <summary>
-        /// Pageテスト用のモッククラスです。
+        /// <see cref="Page"/>テスト用のモッククラスです。
         /// </summary>
-        public class DummySite : Website
+        private class DummySite : Website
         {
             #region ダミーメソッド
 
             /// <summary>
-            /// ページを取得。
+            /// ページを取得。空実装。
             /// </summary>
             /// <param name="title">ページタイトル。</param>
-            /// <returns>取得したページ。</returns>
-            /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
+            /// <returns><c>null</c>。</returns>
             public override Page GetPage(string title)
             {
                 return null;
index c96503f..654c67c 100644 (file)
 namespace Honememo.Wptscs.Websites
 {
     using System;
-    using System.IO;
-    using System.Reflection;
-    using System.Text;
-    using System.Xml;
-    using System.Xml.Serialization;
-    using Honememo.Utilities;
     using Honememo.Wptscs.Models;
+    using Honememo.Wptscs.Utilities;
     using NUnit.Framework;
 
     /// <summary>
-    /// Websiteのテストクラスです。
+    /// <see cref="Website"/>のテストクラスです。
     /// </summary>
     [TestFixture]
-    public class WebsiteTest
+    class WebsiteTest
     {
         #region プロパティテストケース
 
         /// <summary>
-        /// Locationプロパティテストケース。
+        /// <see cref="Website.Location"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestLocation()
@@ -40,7 +35,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// Locationプロパティテストケース(null)。
+        /// <see cref="Website.Location"/>プロパティテストケース(null)。
         /// </summary>
         [Test]
         [ExpectedException(typeof(ArgumentNullException))]
@@ -50,7 +45,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// Locationプロパティテストケース(空)。
+        /// <see cref="Website.Location"/>プロパティテストケース(空)。
         /// </summary>
         [Test]
         [ExpectedException(typeof(ArgumentException))]
@@ -60,7 +55,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// Languageプロパティテストケース。
+        /// <see cref="Website.Language"/>プロパティテストケース。
         /// </summary>
         [Test]
         public void TestLanguage()
@@ -71,7 +66,7 @@ namespace Honememo.Wptscs.Websites
         }
 
         /// <summary>
-        /// Languageプロパティテストケース(null)。
+        /// <see cref="Website.Language"/>プロパティテストケース(null)。
         /// </summary>
         [Test]
         [ExpectedException(typeof(ArgumentNullException))]
@@ -80,49 +75,31 @@ namespace Honememo.Wptscs.Websites
             new DummySite().Language = null;
         }
 
-        #endregion
-
-        #region メソッドテストケース
-
         /// <summary>
-        /// XMLデシリアライズテストケース。
+        /// <see cref="Website.WebProxy"/>プロパティテストケース。
         /// </summary>
         [Test]
-        public void TestReadXml()
+        public void TestWebProxy()
         {
-            DummySite site;
-            using (XmlReader r = XmlReader.Create(
-                new StringReader("<DummySite><Location>http://ja.wikipedia.org</Location>"
-                    + "<Language Code=\"ja\"><Names /></Language></DummySite>")))
-            {
-                site = new XmlSerializer(typeof(DummySite)).Deserialize(r) as DummySite;
-            }
+            DummySite site = new DummySite();
 
-            Assert.IsNotNull(site);
-            Assert.AreEqual("http://ja.wikipedia.org", site.Location);
-            Assert.AreEqual("ja", site.Language.Code);
+            // デフォルトでオブジェクトが格納されている
+            Assert.IsNotNull(site.WebProxy);
+
+            // 値を設定するとそのオブジェクトが返る
+            IWebProxy proxy = new AppConfigWebProxy();
+            site.WebProxy = proxy;
+            Assert.AreSame(proxy, site.WebProxy);
         }
 
         /// <summary>
-        /// XMLシリアライズテストケース
+        /// <see cref="Website.WebProxy"/>プロパティテストケース(null)
         /// </summary>
         [Test]
-        public void TestWriteXml()
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TestWebProxyNull()
         {
-            Language lang = new Language("ja");
-            DummySite site = new DummySite();
-            site.Location = "http://ja.wikipedia.org";
-            site.Language = lang;
-            XmlWriterSettings settings = new XmlWriterSettings();
-            settings.OmitXmlDeclaration = true;
-
-            StringBuilder b = new StringBuilder();
-            using (XmlWriter w = XmlWriter.Create(b, settings))
-            {
-                new XmlSerializer(typeof(DummySite)).Serialize(w, site);
-            }
-
-            Assert.AreEqual("<DummySite><Location>http://ja.wikipedia.org</Location><Language Code=\"ja\"><Names /><Bracket /></Language></DummySite>", b.ToString());
+            new DummySite().WebProxy = null;
         }
 
         #endregion
@@ -130,29 +107,12 @@ namespace Honememo.Wptscs.Websites
         #region モッククラス
 
         /// <summary>
-        /// Websiteテスト用のモッククラスです。
+        /// <see cref="Website"/>テスト用のモッククラスです。
         /// </summary>
-        public class DummySite : Website, IXmlSerializable
+        private class DummySite : Website
         {
-            #region テスト用プロパティ
-
-            /// <summary>
-            /// ウェブサイトの場所。
-            /// </summary>
-            /// <remarks>動作確認はhttpとfileスキームのみ。</remarks>
-            public new string Location
-            {
-                get
-                {
-                    return base.Location;
-                }
-
-                set
-                {
-                    base.Location = value;
-                }
-            }
-
+            #region 非公開プロパティテスト用のオーラーライドプロパティ
+            
             /// <summary>
             /// ウェブサイトの言語。
             /// </summary>
@@ -174,61 +134,16 @@ namespace Honememo.Wptscs.Websites
             #region ダミーメソッド
 
             /// <summary>
-            /// ページを取得。
+            /// ページを取得。空実装。
             /// </summary>
             /// <param name="title">ページタイトル。</param>
-            /// <returns>取得したページ。</returns>
-            /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
+            /// <returns><c>null</c>。</returns>
             public override Page GetPage(string title)
             {
                 return null;
             }
 
             #endregion
-
-            #region テスト用XMLシリアライズ用メソッド
-
-            /// <summary>
-            /// シリアライズするXMLのスキーマ定義を返す。
-            /// </summary>
-            /// <returns>XML表現を記述するXmlSchema。</returns>
-            public System.Xml.Schema.XmlSchema GetSchema()
-            {
-                return null;
-            }
-
-            /// <summary>
-            /// XMLからオブジェクトをデシリアライズする。
-            /// </summary>
-            /// <param name="reader">デシリアライズ元のXmlReader</param>
-            public void ReadXml(XmlReader reader)
-            {
-                XmlDocument xml = new XmlDocument();
-                xml.Load(reader);
-
-                // Webサイト
-                // ※ 以下、基本的に無かったらNGの部分はいちいちチェックしない。例外飛ばす
-                XmlElement siteElement = xml.SelectSingleNode("DummySite") as XmlElement;
-                this.Location = siteElement.SelectSingleNode("Location").InnerText;
-
-                using (XmlReader r = XmlReader.Create(
-                    new StringReader(siteElement.SelectSingleNode("Language").OuterXml), reader.Settings))
-                {
-                    this.Language = new XmlSerializer(typeof(Language)).Deserialize(r) as Language;
-                }
-            }
-
-            /// <summary>
-            /// オブジェクトをXMLにシリアライズする。
-            /// </summary>
-            /// <param name="writer">シリアライズ先のXmlWriter</param>
-            public void WriteXml(XmlWriter writer)
-            {
-                writer.WriteElementString("Location", this.Location);
-                new XmlSerializer(typeof(Language)).Serialize(writer, this.Language);
-            }
-
-            #endregion
         }
 
         #endregion
index 3637932..b51ba9f 100644 (file)
@@ -68,7 +68,7 @@
     <Compile Include="Websites\WebsiteTest.cs" />
     <Compile Include="PrivateAccessor.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Utilities\AppDefaultWebProxyTest.cs" />
+    <Compile Include="Utilities\AppConfigWebProxyTest.cs" />
     <Compile Include="Utilities\FormUtilsTest.cs" />
   </ItemGroup>
   <ItemGroup>